FEATURE: make content list in admin nicer

This commit is contained in:
Michal Kváček
2017-04-05 01:40:47 +02:00
parent 2e8f8dca1f
commit 870ca540c4
5 changed files with 403 additions and 400 deletions
+5 -2
View File
@@ -1,13 +1,15 @@
<?php
namespace App\CMS\Widgets\Menu;
use App\CMS\Contracts\Repositories\Content as IContent;
use App\CMS\Contracts\Widgets\PublicWidget;
use App\CMS\Widgets\Contracts\WidgetRenderer;
use App\CMS\Contracts\Widgets\WidgetRenderer;
use App\CMS\Widgets\Exceptions\MissingParameterException;
use App\Http\Requests\Request;
use App\Models\Content\Content;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use App\CMS\Contracts\Repositories\Content as IContent;
use Modules\Blog\Article\Handlers\Article;
class Menu implements PublicWidget
{
@@ -76,6 +78,7 @@ class Menu implements PublicWidget
$pages = Content::where('language', LaravelLocalization::getCurrentLocale())
->whereIn('id', $ids)
->whereIn('status', $allowedStatuses)
->where('moduleHandler', '!=', Article::class)
->get();
$used = [];
foreach ($pages as $page) {
+3 -1
View File
@@ -1,4 +1,5 @@
<?php
namespace App\CMS\Widgets\Menu\Presenters;
use App\CMS\Contracts\Repositories\Content as ContentContract;
@@ -81,7 +82,8 @@ class Menu implements WidgetRenderer
$content = app(ContentContract::class);
// get list of all pages
$pages = $content->getOverview();
$pages = $content->getOverview()
->get();
$widget->settings = new \stdClass();
$widget->settings->links = [];
@@ -1,386 +1,377 @@
@import "../imports";
/* *******************************************
* Item List general styles
********************************************** */
.item-list {
list-style: none;
padding: 0;
margin: 0;
margin-bottom: 0;
line-height: $item-list-line-height;
@include media(lg) {
font-size: 1rem;
}
list-style: none;
padding: 0;
margin: 0;
line-height: $item-list-line-height;
@include media(md) {
font-size: 0.95rem;
}
@include media(lg) {
font-size: 1rem;
}
@include media-down(sm) {
font-size: 1.05rem;
}
@include media(md) {
font-size: 0.95rem;
}
display: flex;
flex-flow: column nowrap;
@include media-down(sm) {
font-size: 1.05rem;
}
&.striped {
& > li {
border-bottom: 1px solid $item-list-color-border;
}
display: flex;
flex-flow: column nowrap;
& > li:nth-child(2n + 1) {
background-color: lighten($color-divider, 12%);
&.striped {
& > div {
border-bottom: 1px solid $item-list-color-border;
}
@include media-down(sm) {
background-color: lighten($color-divider, 11%);
}
}
& > div:nth-child(2n + 1) {
background-color: lighten($color-divider, 12%);
.item-list-footer {
border-bottom: none;
}
}
@include media-down(sm) {
background-color: lighten($color-divider, 11%);
}
}
.item-list-footer {
border-bottom: none;
}
}
}
/* *******************************************
* Item general styles
********************************************** */
.item-list {
.item {
display: flex;
flex-direction: column;
}
.item {
display: flex;
flex-direction: column;
}
.item-row {
display: flex;
align-items: stretch;
flex-direction: row;
justify-content: space-between;
flex-wrap: wrap;
min-width: 100%;
.item-row {
display: flex;
align-items: stretch;
flex-direction: row;
justify-content: space-between;
flex-wrap: wrap;
min-width: 100%;
&.nowrap {
flex-wrap: nowrap;
}
}
&.nowrap {
flex-wrap: nowrap;
}
}
.item-col {
align-items: center;
display: flex;
padding: $item-list-padding-y $item-list-padding-x $item-list-padding-y 0;
flex-basis: 0;
flex-grow: $item-list-col-grow;
flex-shrink: $item-list-col-shrink;
margin-left: auto;
margin-right: auto;
min-width: 0;
.item-col {
align-items: center;
display: flex;
padding: $item-list-padding-y $item-list-padding-x $item-list-padding-y 0;
flex-basis: 0;
flex-grow: $item-list-col-grow;
flex-shrink: $item-list-col-shrink;
margin-left: auto;
margin-right: auto;
min-width: 0;
&.fixed {
flex-grow: 0;
flex-shrink: 0;
flex-basis: auto;
}
&.fixed {
flex-grow: 0;
flex-shrink: 0;
flex-basis: auto;
}
&.pull-left {
margin-right: auto;
}
&.pull-left {
margin-right: auto;
}
&.pull-right {
margin-left: auto;
}
&.pull-right {
margin-left: auto;
}
& > div {
width: 100%;
}
& > div {
width: 100%;
}
&:last-child {
padding-right: 0;
}
}
&:last-child {
padding-right: 0;
}
}
.no-overflow {
overflow: hidden;
}
.no-overflow {
overflow: hidden;
}
.no-wrap {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.no-wrap {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
/* *******************************************
* Item components
********************************************** */
.item-list {
/********************************************
* Header
*********************************************/
/********************************************
* Header
*********************************************/
.item-list-header {
.item-col.item-col-header {
span {
color: #999;
font-size: 0.8rem;
font-weight: 700 !important;
}
}
}
.item-list-header {
.item-col.item-col-header {
span {
color: #999;
font-size: 0.8rem;
font-weight: 700 !important;
}
}
}
/********************************************
* Heading
*********************************************/
/********************************************
* Heading
*********************************************/
.item-heading {
font-size: 0.9rem;
display: none;
color: #666;
font-weight: 700;
padding-right: $item-list-padding-x;
.item-heading {
font-size: 0.9rem;
display: none;
color: #666;
font-weight: 700;
padding-right: $item-list-padding-x;
@include media-down(sm) {
display: block;
}
@include media-down(sm) {
display: block;
}
@include media(sm) {
width: 100%;
}
@include media(sm) {
width: 100%;
}
@include media(xs) {
width: 40%;
}
}
@include media(xs) {
width: 40%;
}
}
/********************************************
* Checkbox
*********************************************/
/********************************************
* Checkbox
*********************************************/
.item-col.item-col-check {
flex-basis: 20px + $item-list-padding-x;
.item-col.item-col-check {
flex-basis: 20px + $item-list-padding-x;
@include media-down(sm) {
order: -8;
}
}
@include media-down(sm) {
order: -8;
}
}
.item-check {
margin-bottom: 0;
.item-check {
margin-bottom: 0;
.checkbox + span {
padding-right: 0;
.checkbox + span {
padding-right: 0;
&:before {
width: 20px;
}
}
}
&:before {
width: 20px;
}
}
}
/********************************************
* Image
*********************************************/
/********************************************
* Image
*********************************************/
.item-col.item-col-img {
display: flex;
flex-basis: 60px + $item-list-padding-x;
.item-col.item-col-img {
display: flex;
flex-basis: 60px + $item-list-padding-x;
&.xs{
flex-basis: 30px + $item-list-padding-x;
}
&.xs {
flex-basis: 30px + $item-list-padding-x;
}
&.sm {
flex-basis: 40px + $item-list-padding-x;
}
&.sm {
flex-basis: 40px + $item-list-padding-x;
}
&.lg {
flex-basis: 90px + $item-list-padding-x;
}
&.lg {
flex-basis: 90px + $item-list-padding-x;
}
&.xl {
flex-basis: 110px + $item-list-padding-x;
}
&.xl {
flex-basis: 110px + $item-list-padding-x;
}
a {
width: 100%;
// display: flex;
}
}
a {
width: 100%;
// display: flex;
}
}
.item-img {
flex-grow: 1;
align-self: stretch;
background-color: #efefef;
padding-bottom: 100%;
width: 100%;
height: 0;
.item-img {
flex-grow: 1;
align-self: stretch;
background-color: #EFEFEF;
padding-bottom: 100%;
width: 100%;
height: 0;
@include bg-cover();
}
@include bg-cover();
}
/********************************************
* Title
*********************************************/
/********************************************
* Title
*********************************************/
.item-col.item-col-title {
.item-col.item-col-title {
@include media-down(sm) {
order: -4;
}
@include media-down(sm) {
order: -4;
}
a {
display: block;
}
}
a {
display: block;
}
}
.item-title {
margin: 0;
font-size: inherit;
line-height: inherit;
font-weight: 600;
}
.item-title {
margin: 0;
font-size: inherit;
line-height: inherit;
font-weight: 600;
}
/********************************************
* Stats
*********************************************/
/********************************************
* Stats
*********************************************/
.item-stats {
height: $item-list-line-height;
}
.item-stats {
height: $item-list-line-height;
}
/********************************************
* Actions
*********************************************/
/********************************************
* Actions
*********************************************/
.item-col.item-col-actions-dropdown {
flex-basis: 30px + $item-list-padding-x;
text-align: center;
padding-left: 0 !important;
.item-col.item-col-actions-dropdown {
flex-basis: 30px + $item-list-padding-x;
text-align: center;
padding-left: 0 !important;
@include media-down(sm) {
order: -3;
@include media-down(sm) {
order: -3;
flex-basis: 30px + $item-list-padding-x !important;
padding-right: $item-list-padding-x;
}
}
flex-basis: 30px + $item-list-padding-x !important;
padding-right: $item-list-padding-x;
}
}
.item-actions-dropdown {
position: relative;
font-size: 1.1rem;
.item-actions-dropdown {
position: relative;
font-size: 1.1rem;
&.active {
.item-actions-block {
max-width: 120px;
}
&.active {
.item-actions-block {
max-width: 120px;
}
.item-actions-toggle-btn {
color: $color-primary;
.item-actions-toggle-btn {
color: $color-primary;
.active {
display: block;
}
.active {
display: block;
}
.inactive {
display: none;
}
}
}
.inactive {
display: none;
}
}
}
.item-actions-toggle-btn {
color: lighten($color-text-light, 10);
font-size: 1.2rem;
cursor: pointer;
width: 100%;
line-height: 30px;
text-align: center;
text-decoration: none;
.item-actions-toggle-btn {
color: lighten($color-text-light, 10);
font-size: 1.2rem;
cursor: pointer;
width: 100%;
line-height: 30px;
text-align: center;
text-decoration: none;
.active {
display: none;
}
}
.active {
display: none;
}
}
.item-actions-block {
height: 30px;
max-width: 0px;
line-height: 30px;
overflow: hidden;
position: absolute;
top: 0;
right: 100%;
background-color: $color-divider;
border-radius: 3px;
transition: all 0.15s ease-in-out;
.item-actions-block {
height: 30px;
max-width: 0px;
line-height: 30px;
overflow: hidden;
position: absolute;
top: 0;
right: 100%;
background-color: $color-divider;
border-radius: 3px;
transition: all 0.15s ease-in-out;
&.direction-right {
right: auto;
left: 100%;
}
&.direction-right {
right: auto;
left: 100%;
}
.item-actions-list {
padding: 0;
list-style: none;
white-space: nowrap;
padding: 0 5px;
.item-actions-list {
padding: 0;
list-style: none;
white-space: nowrap;
padding: 0 5px;
li {
display: inline-block;
padding: 0;
}
li{
display: inline-block;
padding: 0;
}
a {
display: block;
padding: 0 5px;
a {
display: block;
padding: 0 5px;
&.edit {
color: #38424C;
}
&.edit {
color: #38424C;
}
&.check {
color: #40B726;
}
&.check {
color: #40B726;
}
&.remove {
color: #DB0E1E;
}
}
}
}
&.remove {
color: #DB0E1E;
}
}
}
}
}
}
/********************************************
* Something else?
*********************************************/
/********************************************
* Something else?
*********************************************/
}
/* *******************************************
* Adjustments
********************************************** */
// Item which is located inside card inside item-list
.card > .item-list .item > .item-row {
padding: 0 $card-padding-x;
padding: 0 $card-padding-x;
@include media(xl) {
padding: 0 $card-padding-x-xl;
}
@include media(xl) {
padding: 0 $card-padding-x-xl;
}
@include media-down(sm) {
padding: 0 $card-padding-x-sm;
}
@include media-down(sm) {
padding: 0 $card-padding-x-sm;
}
}
@@ -1,5 +1,9 @@
@import "../../../imports";
.item-list {
}
.items-list-page {
.title-search-block {
@@ -313,12 +317,7 @@
text-align: left;
}
}
}
}
}
+114 -106
View File
@@ -22,132 +22,140 @@
@endif
@if (count($pages) > 0)
<div class="item-list rows-striped">
<div class="row bold p-tb-15">
<div class="col-md-1 hidden-sm-down"></div>
<div class="col-xs-10 col-md-3 col-lg-4">@lang('admin/contents.title')</div>
<div class="col-lg-2 col-md-3 hidden-sm-down">@lang('admin/contents.status')</div>
<div class="col-lg-2 col-md-3 hidden-sm-down">@lang('admin/contents.moduleName')</div>
<div class="col-lg-2 hidden-md-down">@lang('admin/contents.createdAt')</div>
<div class="col-xs-2 col-lg-1">@lang('admin/contents.actions')</div>
</div>
@foreach($pages as $page)
<div class="row p-tb-15">
<div class="col-md-1 hidden-sm-down text-center with-placeholder">
<a href="{{route('content.edit', ['id' => $page->id])}}">
@if(!view()->exists(template_name($page->template, false)))
<i class="fa fa-2x text-warning fa-warning" data-toggle="tooltip"
title="@lang('admin/contents.invalidTemplateSelected')"></i>
@else
@if(!empty($page->titlePhoto))
<img src="@thumbnail($page->titlePhoto)" class="placeholder"
alt="{{$page->title}}" />
@else
<img src="{{asset('resources/assets/admin/img/placeholder.png')}}"
class="placeholder"
alt="{{$page->title}}" />
@endif
@endif
</a>
<div class="card items">
<div class="card-block">
<div class="item-list striped rows-striped">
<div class="row bold p-tb-15">
<div class="col-md-1 hidden-sm-down"></div>
<div class="col-xs-10 col-md-3 col-lg-4">@lang('admin/contents.title')</div>
<div class="col-lg-2 col-md-3 hidden-sm-down">@lang('admin/contents.status')</div>
<div class="col-lg-2 col-md-3 hidden-sm-down">@lang('admin/contents.moduleName')</div>
<div class="col-lg-2 hidden-md-down">@lang('admin/contents.createdAt')</div>
<div class="col-xs-2 col-lg-1">@lang('admin/contents.actions')</div>
</div>
<div class="col-xs-10 col-md-3 col-lg-4">
<a href="{{route('content.edit', ['id' => $page->id])}}">
{{$page->title}}
</a>
@foreach($pages as $page)
<div class="row p-tb-15">
<div class="col-md-1 hidden-sm-down text-center with-placeholder">
<a href="{{route('content.edit', ['id' => $page->id])}}">
@if(!view()->exists(template_name($page->template, false)))
<i class="fa fa-2x text-warning fa-warning" data-toggle="tooltip"
title="@lang('admin/contents.invalidTemplateSelected')"></i>
@else
@if(!empty($page->titlePhoto))
<img src="@thumbnail($page->titlePhoto)" class="placeholder"
alt="{{$page->title}}" />
@else
<img src="{{asset('resources/assets/admin/img/placeholder.png')}}"
class="placeholder"
alt="{{$page->title}}" />
@endif
@endif
</a>
</div>
<div class="col-xs-10 col-md-3 col-lg-4">
<a href="{{route('content.edit', ['id' => $page->id])}}">
{{$page->title}}
</a>
@if($page->isHomepage) <span class="m-l-10 tag tag-primary">@lang('admin/contents.homepage')</span> @endif
</div>
<div class="col-lg-2 col-md-3 hidden-sm-down">
@if($page->isHomepage) <span
class="m-l-10 tag tag-primary">@lang('admin/contents.homepage')</span> @endif
</div>
<div class="col-lg-2 col-md-3 hidden-sm-down">
<span class="tag @if($page->isPublic()) tag-success
@elseif ($page->isDraft()) tag-danger
@else tag-warning @endif">{{$statuses[$page->status]}}</span>
</div>
<div class="col-lg-2 col-md-3 hidden-sm-down">
<a href="{{route('content.overview', ['moduleId' => $page->module_id])}}">
{{trans($page->module_name)}}
</a>
</div>
<div class="col-lg-2 hidden-md-down">@date($page->created_at)</div>
<div class="col-xs-2 col-lg-1 text-center">
<div class="item-actions-dropdown">
<a class="item-actions-toggle-btn">
</div>
<div class="col-lg-2 col-md-3 hidden-sm-down">
<a href="{{route('content.overview', ['moduleId' => $page->module_id])}}">
{{trans($page->module_name)}}
</a>
</div>
<div class="col-lg-2 hidden-md-down">@date($page->created_at)</div>
<div class="col-xs-2 col-lg-1 text-center">
<div class="item-actions-dropdown">
<a class="item-actions-toggle-btn">
<span class="inactive">
<i class="fa fa-cog"></i>
</span>
<span class="active">
<span class="active">
<i class="fa fa-chevron-circle-right"></i>
</span>
</a>
<div class="item-actions-block">
<ul class="item-actions-list">
</a>
<div class="item-actions-block">
<ul class="item-actions-list">
@if(!$page->isHomepage)
<li>
@if(!$page->isHomepage)
<li>
<a href="{{route('content.setHomepage', ['id' => $page->id])}}"
data-toggle="tooltip" title="@lang('admin/contents.setHomepage')">
<i class="fa fa-home"></i>
</a>
</li>
@endif
<a href="{{route('content.setHomepage', ['id' => $page->id])}}"
data-toggle="tooltip"
title="@lang('admin/contents.setHomepage')">
<i class="fa fa-home"></i>
</a>
</li>
@endif
<li>
<a class="edit" href="{{route('content.edit', ['id' => $page->id])}}"
data-toggle="tooltip" title="@lang('admin/contents.editPlain')">
<i class="fa fa-pencil"></i>
</a>
</li>
<li>
<a class="edit" href="{{route('content.edit', ['id' => $page->id])}}"
data-toggle="tooltip" title="@lang('admin/contents.editPlain')">
<i class="fa fa-pencil"></i>
</a>
</li>
@if($page->isDraft())
<li>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => 'public'])}}"
class="confirm" data-toggle="tooltip"
title="@lang('admin/contents.makePublic')">
<i class="fa fa-eye"></i>
</a>
</li>
<li>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => 'protected'])}}"
class="confirm" data-toggle="tooltip"
title="@lang('admin/contents.makeProtected')">
<i class="fa fa-lock"></i>
</a>
</li>
@else
<li>
<a href="{{route('page.content', ['url' => $page->url])}}" target="_blank"
data-toggle="tooltip" title="@lang('admin/contents.viewPage')"
class="button tiny secondary"><i class="fa fa-globe"></i>
</a>
</li>
<li>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => 'draft'])}}"
class="button tiny warning confirm" data-toggle="tooltip"
title="@lang('admin/contents.makeDraft')">
<i class="fa fa-eye-slash"></i>
</a>
</li>
@endif
@if($page->isDraft())
<li>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => 'public'])}}"
class="confirm" data-toggle="tooltip"
title="@lang('admin/contents.makePublic')">
<i class="fa fa-eye"></i>
</a>
</li>
<li>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => 'protected'])}}"
class="confirm" data-toggle="tooltip"
title="@lang('admin/contents.makeProtected')">
<i class="fa fa-lock"></i>
</a>
</li>
@else
<li>
<a href="{{route('page.content', ['url' => $page->url])}}"
target="_blank"
data-toggle="tooltip" title="@lang('admin/contents.viewPage')"
class="button tiny secondary"><i class="fa fa-globe"></i>
</a>
</li>
<li>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => 'draft'])}}"
class="button tiny warning confirm" data-toggle="tooltip"
title="@lang('admin/contents.makeDraft')">
<i class="fa fa-eye-slash"></i>
</a>
</li>
@endif
<li>
<a href="{{route('content.delete', ['id' => $page->id])}}"
class="button tiny alert remove confirm" data-toggle="tooltip"
title="@lang('admin/contents.deletePage')"><i
class="fa fa-trash-o"></i>
</a>
</li>
</ul>
</div>
</div>
<li>
<a href="{{route('content.delete', ['id' => $page->id])}}"
class="button tiny alert remove confirm" data-toggle="tooltip"
title="@lang('admin/contents.deletePage')"><i
class="fa fa-trash-o"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
@endforeach
</div>
@endforeach
</div>
<div class="card-footer">
{!! $pages->render() !!}
</div>
</div>
<div class="row">
{!! $pages->render() !!}
</div>
@else
<div class="alert alert-info">