FEATURE #2048: prepare routes for ACL, add some more permissions

This commit is contained in:
Michal Kváček
2017-08-11 02:07:31 +02:00
parent cccdbda543
commit 335ec4a167
41 changed files with 836 additions and 489 deletions
+23 -17
View File
@@ -317,23 +317,6 @@ $ (function () {
});
$ (function () {
$ ("body").addClass ("loaded");
var notification = $ ('.notification');
if (notification.length) {
notification.click (function () {
$ (this).fadeOut ('fast');
});
setTimeout (function () {
notification.fadeOut (1500)
}, 5 * 1000)
}
});
/**
* Makes slug from input string
*
@@ -370,6 +353,21 @@ function slugify(text, trimSpaces) {
// bind some custom methods
$ (document).ready (function () {
$ ("body").addClass ("loaded");
var notification = $ ('.notification');
if (notification.length) {
notification.click (function () {
$ (this).fadeOut ('fast');
});
setTimeout (function () {
notification.fadeOut (1500)
}, 5 * 1000)
}
var previousTitle, previousMessage;
$ ('.confirm').click (function (e) {
@@ -439,3 +437,11 @@ $ (document).ready (function () {
$('form').areYouSure();
});
$('.checkbox').change(function() {
var e = $(this);
var checked = e.is(':checked');
var id = e.data('id');
$('.child-'+id).prop('checked', checked);
});
+64
View File
@@ -0,0 +1,64 @@
<?php
return [
'successfullySet' => 'Oprávnění úspěšně nastavena.',
'contents' => [
'management' => 'Správa obsahu',
'create' => 'Vytvořit novou stránku',
'update' => 'Upravovat své stránky',
'update-all' => 'Upravovat i cizí stránky',
'delete' => 'Mazat',
'set-homepage' => 'Nastavovat domovskou stránku',
'publish' => 'Publikovat',
'protect' => 'Publikovat jen pro přihlášené',
'draft' => 'Skrýt publikovanou stránku',
],
'users' => [
'management' => 'Správa uživatelů',
'create' => 'Vytvořit nového uživatele',
'update' => 'Upravovat ostatní uživatele',
'block' => 'Zablokovat',
'delete' => 'Mazat',
'unblock' => 'Odblokovat',
'set-permissions' => 'Nastavovat oprávnění',
'change-role' => 'Změnit roli',
'change-status' => 'Změnit status uživatele (zablokovat/odblokovat)'
],
'files' => [
'management' => 'Správa souborů',
'upload' => 'Nahrávání',
'update' => 'Úprava',
'delete' => 'Mazání',
'move-to-directories' => 'Přesouvat soubory mezi adresáři'
],
'directories' => [
'management' => 'Správa složek',
'create' => 'Vytváření',
'edit' => 'Úprava',
'delete' => 'Mazání'
],
'widgetareas' => [
'management' => 'Správa ploch pro widgety',
'create' => 'Vytváření',
'edit' => 'Úprava',
'delete' => 'Mazání'
],
'widgets' => [
'management' => 'Správa widgetů',
'create' => 'Vytváření',
'edit' => 'Úprava',
'delete' => 'Mazání',
'assign' => 'Přiřazování widgetů do plochy',
'unassign' => 'Odstraňování widgetů z plochy'
],
'templates' => [
'management' => 'Správa šablon',
'copy' => 'Kopírování',
'edit' => 'Úprava',
],
'actions' => [
'management' => 'Zobrazení přehledu akcí',
],
'settings' => [
'management' => 'Správa nastavení',
]
];
+28 -28
View File
@@ -1,32 +1,32 @@
<?php
return [
"addNewUser" => "Přidat nového uživatele",
"allStatuses" => "Všechny",
"detail" => "Detaily uživatele :name (:email)",
"edit" => "Upravit uživatele",
"editUser" => "Editace uživatele :name (:email)",
"email" => "E-mail",
"gravatarLink" => 'Nastavte si avatar na <a href="http://gravatar.com">gravatar.com</a>',
"moreUserActions" => "Zobrazit více...",
"name" => "Celé jméno",
"noActions" => "Uživatel zatím v systému nic neudělal.",
"noUsers" => "Žádní uživatelé.",
"overview" => "Seznam všech uživatelů",
"password" => "Heslo",
"passwordLeaveEmpty" => "Nevyplňujte, pokud nechcete změnit heslo.",
"profile" => "Profil uživatele",
"register" => "Vytvořit uživatele",
"addNewUser" => "Přidat nového uživatele",
"allStatuses" => "Všechny",
"detail" => "Detaily uživatele :name (:email)",
"edit" => "Upravit uživatele",
"editUser" => "Editace uživatele :name (:email)",
"email" => "E-mail",
"gravatarLink" => 'Nastavte si avatar na <a href="http://gravatar.com">gravatar.com</a>',
"moreUserActions" => "Zobrazit více...",
"name" => "Celé jméno",
"noActions" => "Uživatel zatím v systému nic neudělal.",
"noUsers" => "Žádní uživatelé.",
"overview" => "Seznam všech uživatelů",
"password" => "Heslo",
"passwordLeaveEmpty" => "Nevyplňujte, pokud nechcete změnit heslo.",
"profile" => "Profil uživatele",
"register" => "Vytvořit uživatele",
"registrationSuccessfull" => "Nový úživatel úspěšně přidán.",
"role_admin" => "Administrátor",
"role_editor" => "Editor",
"role_visitor" => "Návštěvník",
"roles" => "Prosím, zvolte roli uživatele",
"status" => "Stav",
"status_active" => "Aktivní",
"status_blocked" => "Zablokovaný",
"status_deleted" => "Smazaný",
"update" => "Upravit informace",
"userDetail" => "Informace",
"userSuccessfullyEdited" => "Uživatel úspěšně upraven.",
"usersActions" => "Akce uživatele",
"role_admin" => "Uživatel s přístupem do administrace",
"role_visitor" => "Návštěvník (bez přístupu do administrace)",
"roles" => "Prosím, zvolte roli uživatele",
"status" => "Stav",
"status_active" => "Aktivní",
"status_blocked" => "Zablokovaný",
"status_deleted" => "Smazaný",
"update" => "Upravit informace",
"userDetail" => "Informace",
"userSuccessfullyEdited" => "Uživatel úspěšně upraven.",
"usersActions" => "Akce uživatele",
'permissions' => 'Oprávnění'
];
+6 -3
View File
@@ -21,9 +21,12 @@
</div>
@if ($historySize > 0)
<div class="columns text-right col-lg-6">
<a class="btn btn-secondary" href="{{route('content.history', ['id' => $page->id])}}">@lang('admin/contents.showHistory', ['count' => $historySize])</a>
</div>
@can('viewHistory', $page)
<div class="columns text-right col-lg-6">
<a class="btn btn-secondary"
href="{{route('content.history', ['id' => $page->id])}}">@lang('admin/contents.showHistory', ['count' => $historySize])</a>
</div>
@endcan
@endif
</div>
</form>
@@ -4,9 +4,11 @@
@section('headerButtons')
@if($module->exists === true)
<a href="{{route('content.new', ['module' => $module])}}" class="btn btn-primary btn-sm rounded">
<i class="fa fa-plus"></i>
</a>
@can('create', $module)
<a href="{{route('content.new', ['module' => $module])}}" class="btn btn-primary btn-sm rounded">
<i class="fa fa-plus"></i>
</a>
@endcan
@endif
@endsection
@@ -36,26 +38,38 @@
@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', ['page' => $page])}}">
@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}}" />
@can('update', $page)
<a href="{{route('content.edit', ['page' => $page])}}">
@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
<img src="{{asset('resources/assets/admin/img/placeholder.png')}}"
class="placeholder"
alt="{{$page->title}}" />
@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>
@else
@if(!empty($page->titlePhoto))
<img src="@thumbnail($page->titlePhoto)" class="placeholder"
alt="{{$page->title}}" />
@endif
</a>
@endcannot
</div>
<div class="col-xs-10 col-md-3 col-lg-4">
<a href="{{route('content.edit', ['page' => $page])}}">
@can('update', $page)
<a href="{{route('content.edit', ['page' => $page])}}">
{{$page->title}}
</a>
@else
{{$page->title}}
</a>
@endcan
@if($page->isHomepage) <span
class="m-l-10 tag tag-primary">@lang('admin/contents.homepage')</span> @endif
@@ -85,38 +99,45 @@
<ul class="item-actions-list">
@if(!$page->isHomepage)
<li>
<a href="{{route('content.setHomepage', ['page' => $page])}}"
data-toggle="tooltip"
title="@lang('admin/contents.setHomepage')">
<i class="fa fa-home"></i>
</a>
</li>
@can('set-homepage', $page)
<li>
<a href="{{route('content.setHomepage', ['page' => $page])}}"
data-toggle="tooltip"
title="@lang('admin/contents.setHomepage')">
<i class="fa fa-home"></i>
</a>
</li>
@endcan
@endif
<li>
<a class="edit" href="{{route('content.edit', ['page' => $page])}}"
data-toggle="tooltip" title="@lang('admin/contents.editPlain')">
<i class="fa fa-pencil"></i>
</a>
</li>
@can('update', $page)
<li>
<a class="edit" href="{{route('content.edit', ['page' => $page])}}"
data-toggle="tooltip" title="@lang('admin/contents.editPlain')">
<i class="fa fa-pencil"></i>
</a>
</li>
@endcan
@if($page->isDraft())
<li>
<a href="{{route('content.changeStatus', ['page' => $page, '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', ['page' => $page, 'status' => 'protected'])}}"
class="confirm" data-toggle="tooltip"
title="@lang('admin/contents.makeProtected')">
<i class="fa fa-lock"></i>
</a>
</li>
@can('publish', $page)
<li>
<a href="{{route('content.changeStatus', ['page' => $page, 'status' => 'public'])}}"
class="confirm" data-toggle="tooltip"
title="@lang('admin/contents.makePublic')">
<i class="fa fa-eye"></i>
</a>
</li>
@endcan
@can('protect', $page)
<li>
<a href="{{route('content.changeStatus', ['page' => $page, 'status' => 'protected'])}}"
class="confirm" data-toggle="tooltip"
title="@lang('admin/contents.makeProtected')">
<i class="fa fa-lock"></i>
</a>
</li>
@endcan
@else
<li>
<a href="{{route('page.content', ['url' => $page->url])}}"
@@ -125,26 +146,30 @@
class="button tiny secondary"><i class="fa fa-globe"></i>
</a>
</li>
<li>
<a href="{{route('content.changeStatus', ['page' => $page, 'status' => 'draft'])}}"
class="button tiny warning confirm" data-toggle="tooltip"
title="@lang('admin/contents.makeDraft')">
<i class="fa fa-eye-slash"></i>
</a>
</li>
@can('draft', $page)
<li>
<a href="{{route('content.changeStatus', ['page' => $page, 'status' => 'draft'])}}"
class="button tiny warning confirm" data-toggle="tooltip"
title="@lang('admin/contents.makeDraft')">
<i class="fa fa-eye-slash"></i>
</a>
</li>
@endcan
@endif
<li>
<a href="{{route('content.delete', ['page' => $page])}}"
class="button tiny alert remove confirm" data-toggle="tooltip"
title="@lang('admin/contents.deletePage')"><i
class="fa fa-trash-o"></i>
</a>
</li>
@can('delete', $page)
<li>
<a href="{{route('content.delete', ['page' => $page])}}"
class="button tiny alert remove confirm" data-toggle="tooltip"
title="@lang('admin/contents.deletePage')"><i
class="fa fa-trash-o"></i>
</a>
</li>
@endcan
</ul>
</div>
</div>
</div>
</div>
@endforeach
@@ -2,10 +2,13 @@
@section('pageHeading', @trans('admin/fileManager.edit', ['name' => $file->original_filename]))
@section('headerButtons')
<a href="{{route('upload.delete', ['id' => $file->id])}}" class="btn btn-danger btn-sm confirm rounded" title="@lang('admin/fileManager.delete')">
<i class="fa fa-trash"></i>
</a>
@endsection
@can('delete', $file)
<a href="{{route('upload.delete', ['id' => $file->id])}}" class="btn btn-danger btn-sm confirm rounded"
title="@lang('admin/fileManager.delete')">
<i class="fa fa-trash"></i>
</a>
@endcan
@endsection
@section('content')
@@ -18,21 +21,24 @@
<div class="col-lg-4">
<div class="row callout secondary">
<h3>{{$file->original_filename}}</h3>
<h3>{{$file->original_filename}}</h3>
<ul>
<li>@lang('admin/fileManager.createdAt'): {{$file->created_at}}</li>
<li>@lang('admin/fileManager.updatedAt'): {{$file->updated_at}}</li>
<li>@lang('admin/fileManager.mime'): {{$file->mime_type}}</li>
<li>@lang('admin/fileManager.hash'): <span title="{{$file->file_hash}}">{{str_limit($file->file_hash, 10)}}</span></li>
<li>@lang('admin/fileManager.url'): <a href="{{config('app.upload_url')}}/{{$file->filename}}">{{$file->filename}}</a></li>
<li>@lang('admin/fileManager.fileSize'): {{\App\CMS\Helpers\FileManager::getFormattedSize($file)}}</li>
<ul>
<li>@lang('admin/fileManager.createdAt'): {{$file->created_at}}</li>
<li>@lang('admin/fileManager.updatedAt'): {{$file->updated_at}}</li>
<li>@lang('admin/fileManager.mime'): {{$file->mime_type}}</li>
<li>@lang('admin/fileManager.hash'): <span
title="{{$file->file_hash}}">{{str_limit($file->file_hash, 10)}}</span></li>
<li>@lang('admin/fileManager.url'): <a
href="{{config('app.upload_url')}}/{{$file->filename}}">{{$file->filename}}</a></li>
<li>@lang('admin/fileManager.fileSize')
: {{\App\CMS\Helpers\FileManager::getFormattedSize($file)}}</li>
@foreach($extraInfo as $column => $info)
<li>{{$column}}: {{$info}}</li>
@endforeach
@foreach($extraInfo as $column => $info)
<li>{{$column}}: {{$info}}</li>
@endforeach
</ul>
</ul>
</div>
<div class="row">
@@ -49,6 +55,6 @@
@section('javascripts')
<script type="text/javascript" src="{{asset('/resources/assets/js/vendor/highlightjs/highlight.min.js')}}"></script>
<script type="text/javascript">
hljs.initHighlightingOnLoad();
hljs.initHighlightingOnLoad ();
</script>
@stop
@@ -1,33 +1,34 @@
<form method="POST" action="{{route('upload.postEdit', ['id' => $file->id])}}" enctype="multipart/form-data">
{!! csrf_field() !!}
@can('update', $file)
<form method="POST" action="{{route('upload.postEdit', ['id' => $file->id])}}" enctype="multipart/form-data">
{!! csrf_field() !!}
<label class="control-label">
@lang('admin/fileManager.name')
</label>
<label class="control-label">
@lang('admin/fileManager.name')
</label>
<input class="form-control" type="text" name="name" id="name" value="{{$file->name}}" />
<input class="form-control" type="text" name="name" id="name" value="{{$file->name}}" />
<label class="control-label">
@lang('admin/fileManager.keywords')
</label>
<label class="control-label">
@lang('admin/fileManager.keywords')
</label>
<input class="form-control" type="text" name="keywords" id="keywords" value="{{$file->keywords}}" />
<input class="form-control" type="text" name="keywords" id="keywords" value="{{$file->keywords}}" />
<lavel class="control-label">
@lang('admin/fileManager.directory')
</lavel>
<lavel class="control-label">
@lang('admin/fileManager.directory')
</lavel>
<select name="directory_id" class="form-control">
@include('admin/fileManager.directories.subdirectoriesOptionList', ['directory' => $root, 'depth' => 0, 'file' => $file])
</select>
<select name="directory_id" class="form-control">
@include('admin/fileManager.directories.subdirectoriesOptionList', ['directory' => $root, 'depth' => 0, 'file' => $file])
</select>
<label class="control-label">
@lang('admin/fileManager.description')
</label>
<label class="control-label">
@lang('admin/fileManager.description')
</label>
<textarea class="form-control" rows="3" name="description" id="description">{{$file->description}}</textarea>
<button type="submit" class="btn btn-primary">@lang('admin/fileManager.editButton')</button>
</form>
<textarea class="form-control" rows="3" name="description" id="description">{{$file->description}}</textarea>
<button type="submit" class="btn btn-primary">@lang('admin/fileManager.editButton')</button>
</form>
@endcan
@@ -4,7 +4,7 @@
'body' => '<a href="'.route('upload.detail', ['id' => $file->id]).'">'.\App\CMS\Helpers\FileManager::getPreview($file).'</a>',
'footerClass' => 'text-right',
'cardClass' => 'file-preview',
'footer' => (!isset($hideDelete) || !$hideDelete) ? '<a href="'.route('upload.delete', ['id' => $file->id]).'" data-toggle="tooltip"
'footer' => \Auth::user()->can('delete', $file) && (!isset($hideDelete) || !$hideDelete) ? '<a href="'.route('upload.delete', ['id' => $file->id]).'" data-toggle="tooltip"
class="btn btn-sm btn-danger confirm"
title="'.trans('admin/fileManager.delete').'">
<i class="fa fa-trash"></i>
@@ -16,20 +16,24 @@
<div class="col-lg-4">
<div id="file-manager-controls" role="tablist" aria-multiselectable="true">
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="new-file-title">
<h5 class="panel-title">
<a class="collapsed" data-toggle="collapse" data-parent="#file-manager-controls"
href="#new-file" aria-expanded="false" aria-controls="new-file">
@lang('admin/fileManager.newFile')
</a>
</h5>
@can('upload', \App\Models\FileManager\File::class)
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="new-file-title">
<h5 class="panel-title">
<a class="collapsed" data-toggle="collapse" data-parent="#file-manager-controls"
href="#new-file" aria-expanded="false" aria-controls="new-file">
@lang('admin/fileManager.newFile')
</a>
</h5>
</div>
<div id="new-file" class="panel-collapse collapse" role="tabpanel"
aria-labelledby="new-file-title">
@include('admin.fileManager.newFileForm')
</div>
</div>
<div id="new-file" class="panel-collapse collapse" role="tabpanel"
aria-labelledby="new-file-title">
@include('admin.fileManager.newFileForm')
</div>
</div>
@endcan
@if (!$directory->is_root)
<div class="panel panel-default">
@@ -48,20 +52,22 @@
</div>
@endif
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="new-dir-title">
<h5 class="panel-title">
<a class="collapsed" data-toggle="collapse" data-parent="#file-manager-controls"
href="#new-dir" aria-expanded="false" aria-controls="new-dir">
@lang('admin/fileManager.newDirectory')
</a>
</h5>
@can('create', \App\Models\FileManager\Directory::class)
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="new-dir-title">
<h5 class="panel-title">
<a class="collapsed" data-toggle="collapse" data-parent="#file-manager-controls"
href="#new-dir" aria-expanded="false" aria-controls="new-dir">
@lang('admin/fileManager.newDirectory')
</a>
</h5>
</div>
<div id="new-dir" class="panel-collapse collapse" role="tabpanel"
aria-labelledby="new-dir-title">
@include('admin.fileManager.directories.form', ['directory' => $newDirectory, 'action' => route('upload.postNewDirectory')])
</div>
</div>
<div id="new-dir" class="panel-collapse collapse" role="tabpanel"
aria-labelledby="new-dir-title">
@include('admin.fileManager.directories.form', ['directory' => $newDirectory, 'action' => route('upload.postNewDirectory')])
</div>
</div>
@endcan
</div>
</div>
</div>
@@ -33,7 +33,9 @@
@endforeach
</ul>
<a href="{{route('content.edit', ['id' => $page->id])}}" class="btn btn-primary">
@lang('admin/history.backToEdit')
</a>
@can('update', $page)
<a href="{{route('content.edit', ['id' => $page->id])}}" class="btn btn-primary">
@lang('admin/history.backToEdit')
</a>
@endcan
@stop
@@ -32,12 +32,24 @@
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#user-edit" role="tab" id="user-edit-tab"
aria-controls="user-edit">
@lang('admin/userManagement.edit')
</a>
</li>
@can('update', $user)
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#user-edit" role="tab" id="user-edit-tab"
aria-controls="user-edit">
@lang('admin/userManagement.edit')
</a>
</li>
@endcan
@can('set-permissions', $user)
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#user-permissions" role="tab"
id="user-permissions-tab"
aria-controls="user-edit">
@lang('admin/userManagement.permissions')
</a>
</li>
@endcan
<li class="nav-item">
<a class="nav-link" data-toggle="tab" href="#user-actions" role="tab" id="user-actions-tab"
@@ -60,9 +72,17 @@
</div>
<div class="tab-pane" id="user-edit" role="tabpanel">
@include('admin.userManagement.editForm', ['states' => $statuses])
</div>
@can('update', $user)
<div class="tab-pane" id="user-edit" role="tabpanel">
@include('admin.userManagement.editForm', ['states' => $statuses])
</div>
@endcan
@can('set-permissions', $user)
<div class="tab-pane" id="user-permissions" role="tabpanel">
@include('admin.userManagement.permissions.form')
</div>
@endcan
<div class="tab-pane" id="user-actions" role="tabpanel">
@if (!empty($actions))
@@ -29,8 +29,9 @@
name="password"
value="">
@if (\Auth::user()->role == \App\Models\User::ROLE_ADMIN && \Auth::user()->id != $user->id)
<div class="row">
<div class="row">
@can('change-role', $user)
<div class="col-lg-6">
<label class="label-control">
@@ -43,7 +44,9 @@
@endforeach
</select>
</div>
@endcan
@can('change-status', $user)
<div class="col-lg-6">
<label class="label-control">
@lang('admin/userManagement.status')
@@ -55,8 +58,8 @@
@endforeach
</select>
</div>
</div>
@endif
@endcan
</div>
<button type="submit" class="btn btn-primary">@lang('admin/userManagement.update')</button>
</form>
@@ -0,0 +1,34 @@
<form action="{{route('permissions.update', ['user' => $user])}}" method="post">
{!! csrf_field() !!}
@foreach($permissions as $permission)
<div>
<label>
<input class="checkbox" data-id="{{$permission->id}}" value="1"
@if($user->hasAbility($permission->string_id))
checked
@endif name="permissions[{{$permission->string_id}}]" type="checkbox">
<span>{{trans($permission->name)}}</span>
</label>
</div>
@if($permission->subpermissions->count() > 0)
@foreach($permission->subpermissions as $subpermission)
<div>
<label>
<i class="fa fa-fw"></i>
<input class="checkbox child-{{$subpermission->parent_id}}" value="1"
@if($user->hasAbility($permission->string_id) && $user->hasAbility($subpermission->string_id))
checked
@endif name="permissions[{{$subpermission->string_id}}]" type="checkbox">
<span>{{trans($subpermission->name)}}</span>
</label>
</div>
@endforeach
@endif
@endforeach
<button class="btn btn-primary">Ulozit</button>
</form>