FEATURE: add permissions into widgets and fix few bugs

This commit is contained in:
Michal Kváček
2017-08-24 01:54:58 +02:00
parent e0f5cba9a4
commit b35149ad67
23 changed files with 239 additions and 110 deletions
+5 -4
View File
@@ -71,13 +71,14 @@ abstract class BaseHandler implements BaseModuleHandler
}
}, 10, ['icon' => 'fa fa-fw fa-plus']);
}
$sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-fw fa-list']);
if ($user->can('manage', Widget::class)) {
$sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-fw fa-list']);
}
// menu for widget areas
if ($user->can('manage', WidgetArea::class)) {
$sub->dropdown(trans('admin/mainMenu.widgetAreas'), function ($sub) use ($user) {
if ($user->can('create-widgetareas', WidgetArea::class)) {
if ($user->can('create', WidgetArea::class)) {
$sub->route('widgetareas.new', trans('admin/mainMenu.newWidgetArea'), [], 1, ['icon' => 'fa fa-fw fa-plus']);
}
$sub->route('widgetareas.overview', trans('admin/mainMenu.widgetAreaOverview'), [], 2, ['icon' => 'fa fa-fw fa-list']);
@@ -126,7 +127,7 @@ abstract class BaseHandler implements BaseModuleHandler
if ($user->can('manage', Settings::class)) {
$sub->route('settings.overview', trans('admin/mainMenu.settings'), [], 80, ['icon' => 'fa fa-fw fa-gear']);
$sub->route('permissions.index', trans('admin/mainMenu.permissions'), [], 90, ['icon' => 'fa fa-fw fa-gear']);
$sub->route('permissions.index', trans('admin/mainMenu.permissions'), [], 90, ['icon' => 'fa fa-fw fa-key']);
}
}, 10000, ['icon' => 'fa fa-fw fa-gears']);
});
+9 -1
View File
@@ -1,7 +1,10 @@
<?php
namespace App\CMS\Handlers\Search;
use App\Models\Content\Content as ContentModel;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
class Content extends Search
{
@@ -10,10 +13,15 @@ class Content extends Search
*
* @param string $term searched word
*
* @return array list of found objects
* @return array|\Illuminate\Database\Eloquent\Collection|Collection|static[]
*/
public function search($term)
{
if (Auth::user()
->cannot('manage', ContentModel::class)) {
return new Collection();
}
$token = $this->tokenize($term);
return ContentModel::where('pageContent', 'LIKE', $token)
+7
View File
@@ -1,7 +1,9 @@
<?php
namespace App\CMS\Handlers\Search;
use App\Models\FileManager\File;
use Illuminate\Support\Collection;
class Files extends Search
{
@@ -24,6 +26,11 @@ class Files extends Search
*/
public function search($term)
{
if (\Auth::user()
->cannot('manage', File::class)) {
return new Collection();
}
$token = $this->tokenize($term);
return File::where('original_filename', 'LIKE', $token)
@@ -3,11 +3,17 @@ namespace App\CMS\Handlers\Search\Presenters;
use App\CMS\Enumerations\ContentStatuses;
use App\CMS\Handlers\Contracts\SearchPresenterHandler;
use App\Models\Content\Content;
class AdminContent implements SearchPresenterHandler
{
public function render($foundItems)
{
if (\Auth::user()
->cannot('manage', Content::class)) {
return null;
}
return view('admin.search.results.content', [
'pages' => $foundItems,
'statuses' => ContentStatuses::getWithTranslations(),
@@ -2,6 +2,7 @@
namespace App\CMS\Handlers\Search\Presenters;
use App\CMS\Handlers\Contracts\SearchPresenterHandler;
use App\Models\FileManager\File;
class AdminFiles implements SearchPresenterHandler
{
@@ -14,6 +15,11 @@ class AdminFiles implements SearchPresenterHandler
*/
public function render($foundItems)
{
if (\Auth::user()
->cannot('manage', File::class)) {
return null;
}
return view('admin.fileManager.filesTiles', ['files' => $foundItems, 'hideDelete' => true]);
}
}
+7 -3
View File
@@ -13,7 +13,6 @@ class Search extends Controller
{
/**
* Create form for searching
*
* @return $this|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getSearch()
@@ -37,7 +36,6 @@ class Search extends Controller
/**
* Method used for performing search.
*
* This method iterates over all registered search engines and returns results for each engine apart.
*
* @param string $term search text
@@ -60,10 +58,16 @@ class Search extends Controller
// try to find given term
$results = $search->search($term);
$content = $presenter->render($results);
if (is_null($content)) {
continue;
}
// create result object
$resultsParts[$search->getId()] = [
'name' => $search->getName(),
'content' => $presenter->render($results),
'content' => $content,
'count' => count($results)
];
}
@@ -1,17 +1,25 @@
<?php
namespace App\Http\Controllers\Admin\Widgets;
use App\Http\Controllers\Admin\Controller;
use App\Models\Widgets\Widget;
use App\Models\Widgets\WidgetType;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
class WidgetsOverview extends Controller
{
/**
* Display list of all widgets
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function index()
{
$widgets = Widget::where('language', LaravelLocalization::getCurrentLocale())
->paginate(25);
return view('admin.widgets.overview', ['widgets' => $widgets]);
$widgetTypes = WidgetType::all();
return view('admin.widgets.overview', compact('widgetTypes', 'widgets'));
}
}
+1 -1
View File
@@ -31,6 +31,6 @@ class WidgetAreaPolicy extends BasicPolicy
*/
public function update(User $user, WidgetArea $widgetArea)
{
return $user->hasAbility('edit-widgetareas');
return $user->id == $widgetArea->user_id || $user->hasAbility('edit-widgetareas');
}
}
+2 -2
View File
@@ -36,12 +36,12 @@ class WidgetsPolicy extends BasicPolicy
return $user->id == $widget->user_id || $user->hasAbility('edit-widgets');
}
public function assign(User $user, Widget $widget)
public function assign(User $user)
{
return $user->hasAbility('assign-widgets');
}
public function unassign(User $user, Widget $widget)
public function unassign(User $user)
{
return $user->hasAbility('unassign-widgets');
}
+4
View File
@@ -22,6 +22,10 @@ a:focus {
padding-bottom: 20px !important;
}
.blur {
-webkit-filter: blur(3px);
filter: blur(3px);
}
.text-center {
text-align: center;
+9
View File
@@ -392,12 +392,15 @@ $ (document).ready (function () {
$ ('#confirm-modal').modal ('show');
$('.main-wrapper').addClass('blur');
e.preventDefault ();
});
$ ('#confirm-modal').on ('hidden.bs.modal', function () {
$ ('#confirmation-title').text (previousTitle);
$ ('#confirmation-message').text (previousMessage);
$('.main-wrapper').removeClass('blur');
});
$ ('#lockUrl').change (function () {
@@ -444,4 +447,10 @@ $('.checkbox').change(function() {
var id = e.data('id');
$('.child-'+id).prop('checked', checked);
// check also parent
if (e.hasClass('child-checkbox') && checked){
var parent = e.data('parent');
$('#checkbox-parent-'+parent).prop('checked', true);
}
});
+1
View File
@@ -7,4 +7,5 @@ return [
"logoutSuccessfull" => "Odhlášení proběhlo úspěšně",
"no" => "Ne",
"yes" => "Ano",
"noSearchEngine" => 'Není dostupný žádný vyhledávač.'
];
+1
View File
@@ -20,4 +20,5 @@ return [
"successfullyCreated" => "Plocha pro widgety úspěšně vytvořena",
"successfullyDeleted" => "Úspěšně smazáno",
"uniqueCode" => "Unikátní kód",
'pageDescription' => 'Plochy pro widgety jsou oblasti, do kterých je možné přiřadit widgety a následně je zobrazovat na webu.'
];
@@ -12,7 +12,7 @@
<div>
<label>
<input class="checkbox" data-id="{{$permission->id}}" value="1"
<input class="checkbox" id="checkbox-parent-{{$permission->id}}" data-id="{{$permission->id}}" value="1"
@if($permission->default)
checked
@endif name="permissions[{{$permission->string_id}}]" type="checkbox">
@@ -25,7 +25,7 @@
<div>
<label>
<i class="fa fa-fw"></i>
<input class="checkbox child-{{$subpermission->parent_id}}" value="1"
<input class="checkbox child-checkbox child-{{$subpermission->parent_id}}" data-parent="{{$permission->id}}" value="1"
@if($permission->default && $subpermission->default)
checked
@endif name="permissions[{{$subpermission->string_id}}]" type="checkbox">
+10 -2
View File
@@ -6,8 +6,16 @@
@if ($search)
<div class="row">
<div class="col-lg-8">
<h3>@lang('search.results')</h3>
@include('admin.search.results')
@if(!empty($results))
<h3>@lang('search.results')</h3>
@include('admin.search.results')
@else
<div class="alert alert-info">
<em>@lang('admin/common.noSearchEngine')</em>
</div>
@endif
</div>
<div class="col-lg-4">
<h3>@lang('search.term')</h3>
@@ -4,12 +4,14 @@
@section('headerButtons')
<a class="btn rounded btn-primary" href="{{route('users.new')}}">
<i class="fa fa-plus"></i>
</a>
@can('create', \App\Models\User::class)
<a class="btn rounded btn-sm btn-secondary" href="{{route('users.new')}}">
<i class="fa fa-plus"></i>
</a>
@endcan
@foreach($statuses as $status => $translation)
<a class="btn rounded @if($status != $currentStatus) btn-secondary @else btn-primary @endif"
<a class="btn btn-sm rounded @if($status != $currentStatus) btn-secondary @else btn-primary @endif"
href="{{route('users.overview', ['status' => $status])}}">{{$translation}}</a>
@endforeach
@endsection
@@ -21,14 +23,18 @@
<div class="card card-default">
<div class="card-block container truncate sameheight-item">
<div class="col-xs-12 text-center">
<a href="{{route('users.edit', ['id' => $user->id])}}">
@can('view', $user)
<a href="{{route('users.detail', ['id' => $user->id])}}">
<img src="{{\App\CMS\Helpers\Gravatar::img($user->email, 100)}}" alt="" />
</a>
@else
<img src="{{\App\CMS\Helpers\Gravatar::img($user->email, 100)}}" alt="" />
</a>
@endcan
</div>
<div class="col-xs-12">
<ul>
@if(!empty($user->name))
<li><a href="{{route('users.edit', ['id' => $user->id])}}">{{$user->name}}</a></li>
<li><a href="{{route('users.edit', ['id' => $user->id])}}">{{$user->name}}</a></li>
@endif
<li><a href="{{route('users.edit', ['id' => $user->id])}}">{{$user->email}}</a></li>
<li><em>{{$roles[$user->role]}}</em></li>
@@ -36,9 +42,14 @@
</div>
</div>
<div class="card-footer text-right">
<a href="{{route('users.detail', ['id' => $user->id])}}" class="btn btn-secondary"><i class="fa fa-info"></i></a>
<a href="{{route('users.edit', ['id' => $user->id])}}" class="btn btn-primary"><i
class="fa fa-pencil edit"></i></a>
@can('view', $user)
<a href="{{route('users.detail', ['id' => $user->id])}}" class="btn btn-secondary"><i
class="fa fa-info"></i></a>
@endcan
@can('update', $user)
<a href="{{route('users.edit', ['id' => $user->id])}}" class="btn btn-primary"><i
class="fa fa-pencil edit"></i></a>
@endcan
</div>
</div>
</div>
@@ -1,11 +1,11 @@
a<form action="{{route('users.setPermissions', ['user' => $user])}}" method="post">
<form action="{{route('users.setPermissions', ['user' => $user])}}" method="post">
{!! csrf_field() !!}
@foreach($permissions as $permission)
<div>
<label>
<input class="checkbox" data-id="{{$permission->id}}" value="1"
<input class="checkbox" id="checkbox-parent-{{$permission->id}}" data-id="{{$permission->id}}" value="1"
@if($user->hasAbility($permission->string_id))
checked
@endif name="permissions[{{$permission->string_id}}]" type="checkbox">
@@ -18,7 +18,7 @@ a<form action="{{route('users.setPermissions', ['user' => $user])}}" method="pos
<div>
<label>
<i class="fa fa-fw"></i>
<input class="checkbox child-{{$subpermission->parent_id}}" value="1"
<input class="checkbox child-checkbox child-{{$subpermission->parent_id}}" data-parent="{{$permission->id}}" value="1"
@if($user->hasAbility($permission->string_id) && $user->hasAbility($subpermission->string_id))
checked
@endif name="permissions[{{$subpermission->string_id}}]" type="checkbox">
@@ -4,20 +4,13 @@
@section('content')
<div class="row">
<div class="col-lg-8">
<div class="col-lg-12">
@include('admin.widgets.area.form', ['action' => route('widgetareas.postEdit', ['id' => $area->id])])
<h2 class="m-t-15">@lang('admin/widgets.overview')</h2>
@include('admin.widgets.widgetsToAssociate', ['tileClass' => 'col-md-4 col-sm-6 col-xs-12', 'widgetArea' => $area])
</div>
<div class="col-lg-4">
<h3>@lang('admin/widgets.preview')</h3>
{{-- {{dd($area)}}--}}
@widgetArea($area->code)
</div>
</div>
@endsection
@@ -1,14 +1,23 @@
@extends('admin.layoutWithNavigation')
@section('pageHeading', @trans('admin/widgetAreas.overview'))
@section('pageDescription', @trans('admin/widgetAreas.pageDescription'))
@section('headerButtons')
@can('create', \App\Models\Widgets\WidgetArea::class)
<a class="btn rounded btn-sm btn-primary" href="{{route('widgetareas.new')}}">
<i class="fa fa-plus"></i>
</a>
@endcan
@endsection
@section('content')
<div class="row">
<div class="col-lg-8">
<div class="@cannot('create', \App\Models\Widgets\WidgetArea::class)col-lg-12 @else col-lg-8 @endcan">
@if (count($areas) > 0)
<div class="card items">
<div class="card-block">
<table class="table item-list table-striped">
<table class="table item-list table-striped full-width">
<tr>
<th>@lang('admin/widgetAreas.name')</th>
<th>@lang('admin/widgetAreas.uniqueCode')</th>
@@ -17,44 +26,62 @@
</tr>
@foreach($areas as $area)
<tr>
<td><a href="{{route('widgetareas.edit', ['id' => $area->id])}}">{{$area->name}}</a>
</td>
<td><a href="{{route('widgetareas.edit', ['id' => $area->id])}}">{{$area->code}}</a>
</td>
@can('update', $area)
<td>
<a href="{{route('widgetareas.edit', ['id' => $area->id])}}">{{$area->name}}</a>
</td>
<td>
<a href="{{route('widgetareas.edit', ['id' => $area->id])}}">{{$area->code}}</a>
</td>
@else
<td>{{$area->name}}</td>
<td>{{$area->code}}</td>
@endcan
<td>{{str_limit($area->description, 100)}}</td>
<td class="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"><i class="fa fa-chevron-circle-right"></i></span>
</a>
<div class="item-actions-block">
<ul class="item-actions-list">
<li>
<a class="edit" data-toggle="tooltip"
title="@lang('admin/widgetAreas.editTooltip')"
href="{{route('widgetareas.edit', ['id' => $area->id])}}"><i
class="fa fa-pencil"></i></a>
</li>
<li>
<a href="{{route('widgets.associate', ['widgetArea' => $area->id])}}"
data-toggle="tooltip"
title="@lang('admin/widgetAreas.associateWidgets')">
<i class="fa fa-plus"></i></a>
</li>
@if($area->deletable)
<li>
<a class="confirm remove" data-toggle="tooltip"
title="@lang('admin/widgetAreas.delete')"
href="{{route('widgetareas.delete', ['id' => $area->id])}}"><i
class="fa fa-trash"></i></a>
</li>
@endif
@if (Auth::user()->can('update', $area) || Auth::user()->can('assign', \App\Models\Widgets\Widget::class) || ($area->deletable && Auth::user()->can('delete', $area)))
</ul>
<div class="item-actions-dropdown">
<a class="item-actions-toggle-btn">
<span class="inactive"><i class="fa fa-cog"></i></span>
<span class="active"><i
class="fa fa-chevron-circle-right"></i></span>
</a>
<div class="item-actions-block">
<ul class="item-actions-list">
@can('update', $area)
<li>
<a class="edit" data-toggle="tooltip"
title="@lang('admin/widgetAreas.editTooltip')"
href="{{route('widgetareas.edit', ['id' => $area->id])}}"><i
class="fa fa-pencil"></i></a>
</li>
@endcan
@can('assign', \App\Models\Widgets\Widget::class)
<li>
<a href="{{route('widgets.associate', ['widgetArea' => $area->id])}}"
data-toggle="tooltip"
title="@lang('admin/widgetAreas.associateWidgets')">
<i class="fa fa-plus"></i></a>
</li>
@endcan
@can('delete', $area)
@if($area->deletable)
<li>
<a class="confirm remove" data-toggle="tooltip"
title="@lang('admin/widgetAreas.delete')"
href="{{route('widgetareas.delete', ['id' => $area->id])}}"><i
class="fa fa-trash"></i></a>
</li>
@endif
@endcan
</ul>
</div>
</div>
</div>
@endif
</td>
</tr>
@endforeach
@@ -21,13 +21,10 @@
<li>@lang('admin/widgets.updatedAt'): @date($widgetArea->updated_at)</li>
</ul>
<a href="{{route('widgetareas.edit', ['id' => $widgetArea->id])}}" class="btn btn-secondary col-sm-12">@lang('admin/widgetAreas.editButton')</a>
@if (!empty($associatedWidgetIds))
<h3>@lang('admin/widgets.preview')</h3>
@widgetArea($widgetArea->code)
@endif
@can('update', $widgetArea)
<a href="{{route('widgetareas.edit', ['id' => $widgetArea->id])}}"
class="btn btn-secondary col-sm-12">@lang('admin/widgetAreas.editButton')</a>
@endcan
</div>
</div>
@stop
@@ -4,10 +4,33 @@
@section('pageDescription', @trans('admin/widgets.descriptionOfWidgets'))
@section('headerButtons')
<a href="{{route('widgetareas.overview')}}" class="btn btn-secondary btn-sm rounded"
title="@lang('admin/widgetAreas.overview')">
<i class="fa fa-object-group"></i>
</a>
@can('create', \App\Models\Widgets\Widget::class)
@if (!empty($widgetTypes))
<div class="dropdown show d-inline">
<a class="btn btn-secondary rounded btn-sm dropdown-toggle" href="#" id="widgetTypesDropdown"
data-toggle="dropdown" aria-expanded="false"><i class="fa fa-plus"></i></a>
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
@foreach ($widgetTypes as $widgetType)
<a class="dropdown-item"
href="{{route('widgets.new', ['widgetType' => $widgetType->id])}}">{{trans($widgetType->name)}}</a>
@endforeach
</div>
</div>
@endif
@endcan
@can('manage', \App\Models\Widgets\WidgetArea::class)
<a href="{{route('widgetareas.overview')}}" class="btn btn-secondary btn-sm rounded"
title="@lang('admin/widgetAreas.overview')">
<i class="fa fa-object-group"></i>
</a>
@endcan
@endsection
@section('content')
@@ -33,9 +56,7 @@
<td>{{trans(call_user_func([$widget->widget_type_handler, 'getName']))}}</td>
<td>{{$widget->description}}</td>
<td class="text-center">
@if(\Auth::user()->can('update', $widget) || $widget->deletable)
@if(\Auth::user()->can('update', $widget) || ($widget->deletable && Auth::user()->can('delete', $widget)))
<div class="item-actions-dropdown">
<a class="item-actions-toggle-btn">
<span class="inactive"><i class="fa fa-cog"></i></span>
@@ -53,20 +74,22 @@
@endcan
@if($widget->deletable)
<li>
<a class="confirm remove" data-toggle="tooltip"
title="@lang('admin/widgets.delete')"
href="{{route('widgets.delete', ['id' => $widget->id])}}"><i
class="fa fa-trash"></i></a>
</li>
@can('delete', $widget)
<li>
<a class="confirm remove" data-toggle="tooltip"
title="@lang('admin/widgets.delete')"
href="{{route('widgets.delete', ['id' => $widget->id])}}"><i
class="fa fa-trash"></i></a>
</li>
@endcan
@endif
</ul>
</div>
</div>
@endif
</td>
</tr>
@endforeach
</table>
@@ -13,17 +13,23 @@
{{trans(call_user_func([$widget->widget_type_handler, 'getName']))}}
</div>
<div class="card-footer text-right">
<a href="{{route('widgets.edit', ['id' => $widget->id])}}" class="btn btn-sm btn-secondary"><i
class="fa fa-pencil"></i></a>
@can('update', $widget)
<a href="{{route('widgets.edit', ['id' => $widget->id])}}" class="btn btn-sm btn-secondary"><i
class="fa fa-pencil"></i></a>
@endcan
@if (in_array($widget->id, $associatedWidgetIds))
<a href="{{route('widgets.deleteAssociation', ['widgetId' => $widget->id, 'widgetArea' => $widgetArea->id])}}"
class="btn confirm btn-sm btn-danger">
<i class="fa fa-trash"></i>
</a>
@can('unassign', \App\Models\Widgets\Widget::class)
<a href="{{route('widgets.deleteAssociation', ['widgetId' => $widget->id, 'widgetArea' => $widgetArea->id])}}"
class="btn confirm btn-sm btn-danger">
<i class="fa fa-trash"></i>
</a>
@endcan
@else
<a href="{{route('widgets.makeAssociation', ['widgetId' => $widget->id, 'widgetArea' => $widgetArea->id])}}"
class="btn btn-sm btn-primary"><i class="fa fa-plus"></i></a>
@can('assign', \App\Models\Widgets\Widget::class)
<a href="{{route('widgets.makeAssociation', ['widgetId' => $widget->id, 'widgetArea' => $widgetArea->id])}}"
class="btn btn-sm btn-primary"><i class="fa fa-plus"></i></a>
@endcan
@endif
</div>
</div>
+18 -9
View File
@@ -32,35 +32,44 @@ Route::group(['namespace' => 'Widgets'], function () {
// display form for association of widget and widget area
Route::get('widgets/associate/{widgetArea}', 'AssociateWidget@getList')
->name('widgets.associate');
->name('widgets.associate')
->middleware('can:assign,' . \App\Models\Widgets\Widget::class);
Route::get('widgets/deassociate/{widget}/{widgetArea}', 'AssociateWidget@deleteAssociation')
->name('widgets.deleteAssociation');
->name('widgets.deleteAssociation')
->middleware('can:unassign,' . \App\Models\Widgets\Widget::class);
Route::get('widgets/associate/{widget}/{widgetArea}', 'AssociateWidget@makeAssociation')
->name('widgets.makeAssociation');
->name('widgets.makeAssociation')
->middleware('can:assign,' . \App\Models\Widgets\Widget::class);
Route::group(['namespace' => 'Areas'], function () {
Route::get('widgets/areas/overview', 'WidgetAreaOverview@getOverview')
->name('widgetareas.overview');
->name('widgetareas.overview')
->middleware('can:manage,' . \App\Models\Widgets\WidgetArea::class);
// form for new widget area
Route::get('widgets/areas/new', 'CreateNewWidgetArea@create')
->name('widgetareas.new');
->name('widgetareas.new')
->middleware('can:create,' . \App\Models\Widgets\WidgetArea::class);
// form for new widget area
Route::post('widgets/areas/new', 'CreateNewWidgetArea@store')
->name('widgetareas.postNew');
->name('widgetareas.postNew')
->middleware('can:create,' . \App\Models\Widgets\WidgetArea::class);
// edit form for widget area
Route::get('widgets/areas/edit/{widgetArea}', 'EditWidgetArea@edit')
->name('widgetareas.edit');
->name('widgetareas.edit')
->middleware('can:update,widgetArea');
Route::post('widgets/areas/edit/{widgetArea}', 'EditWidgetArea@update')
->name('widgetareas.postEdit');
->name('widgetareas.postEdit')
->middleware('can:update,widgetArea');
// edit form for widget area
Route::get('widgets/areas/delete/{widgetArea}', 'EditWidgetArea@delete')
->name('widgetareas.delete');
->name('widgetareas.delete')
->middleware('can:delete,widgetArea');
});
});