]> BookStack Code Mirror - bookstack/commitdiff
Added ability to copy a role
authorDan Brown <redacted>
Sun, 19 Dec 2021 12:27:14 +0000 (12:27 +0000)
committerDan Brown <redacted>
Sun, 19 Dec 2021 12:27:14 +0000 (12:27 +0000)
- Copies via loading in model on create view.
- Updated role views while editing to bring up to similar format as
  that used for more modern app areas.
- Added tests to cover.

Related to #1123

app/Http/Controllers/RoleController.php
resources/views/settings/roles/create.blade.php
resources/views/settings/roles/edit.blade.php
resources/views/settings/roles/parts/form.blade.php
tests/Permissions/RolesTest.php

index 25b2a5851f88c6802964be60a113577d2fd46f8f..7c72b59707abc6b888c020bd680a9f91b47be541 100644 (file)
@@ -3,6 +3,7 @@
 namespace BookStack\Http\Controllers;
 
 use BookStack\Auth\Permissions\PermissionsRepo;
+use BookStack\Auth\Role;
 use BookStack\Exceptions\PermissionsException;
 use Exception;
 use Illuminate\Http\Request;
@@ -34,11 +35,21 @@ class RoleController extends Controller
     /**
      * Show the form to create a new role.
      */
-    public function create()
+    public function create(Request $request)
     {
         $this->checkPermission('user-roles-manage');
 
-        return view('settings.roles.create');
+        /** @var ?Role $role */
+        $role = null;
+        if ($request->has('copy_from')) {
+            $role = Role::query()->find($request->get('copy_from'));
+        }
+
+        if ($role) {
+            $role->display_name .= ' (' . trans('common.copy') . ')';
+        }
+
+        return view('settings.roles.create', ['role' => $role]);
     }
 
     /**
@@ -49,7 +60,7 @@ class RoleController extends Controller
         $this->checkPermission('user-roles-manage');
         $this->validate($request, [
             'display_name' => ['required', 'min:3', 'max:180'],
-            'description'  => 'max:180',
+            'description'  => ['max:180'],
         ]);
 
         $this->permissionsRepo->saveNewRole($request->all());
@@ -84,7 +95,7 @@ class RoleController extends Controller
         $this->checkPermission('user-roles-manage');
         $this->validate($request, [
             'display_name' => ['required', 'min:3', 'max:180'],
-            'description'  => 'max:180',
+            'description'  => ['max:180'],
         ]);
 
         $this->permissionsRepo->updateRole($id, $request->all());
index f2edfa1c573aa6c3b3749c343f819d107aef3fc4..72afc60a84f53368d564e20fc800bbd139130716 100644 (file)
@@ -8,9 +8,21 @@
             @include('settings.parts.navbar', ['selected' => 'roles'])
         </div>
 
-        <form action="{{ url("/settings/roles/new") }}" method="POST">
-            @include('settings.roles.parts.form', ['title' => trans('settings.role_create')])
-        </form>
+        <div class="card content-wrap">
+            <h1 class="list-heading">{{ trans('settings.role_create') }}</h1>
+
+            <form action="{{ url("/settings/roles/new") }}" method="POST">
+                {{ csrf_field() }}
+
+                @include('settings.roles.parts.form', ['role' => $role ?? null])
+
+                <div class="form-group text-right">
+                    <a href="{{ url("/settings/roles") }}" class="button outline">{{ trans('common.cancel') }}</a>
+                    <button type="submit" class="button">{{ trans('settings.role_save') }}</button>
+                </div>
+            </form>
+
+        </div>
     </div>
 
 @stop
index e2018d3e9b72a07692a54ceeabb9b74c9e968b83..dda8db39d8a70bc7616fe45ef9859046524b0e47 100644 (file)
@@ -7,10 +7,53 @@
             @include('settings.parts.navbar', ['selected' => 'roles'])
         </div>
 
-        <form action="{{ url("/settings/roles/{$role->id}") }}" method="POST">
-            <input type="hidden" name="_method" value="PUT">
-            @include('settings.roles.parts.form', ['model' => $role, 'title' => trans('settings.role_edit'), 'icon' => 'edit'])
-        </form>
+        <div class="card content-wrap">
+            <h1 class="list-heading">{{ trans('settings.role_edit') }}</h1>
+
+            <form action="{{ url("/settings/roles/{$role->id}") }}" method="POST">
+                {{ csrf_field() }}
+                {{ method_field('PUT') }}
+
+                @include('settings.roles.parts.form', ['role' => $role])
+
+                <div class="form-group text-right">
+                    <a href="{{ url("/settings/roles") }}" class="button outline">{{ trans('common.cancel') }}</a>
+                    <a href="{{ url("/settings/roles/new?copy_from={$role->id}") }}" class="button outline">{{ trans('common.copy') }}</a>
+                    <a href="{{ url("/settings/roles/delete/{$role->id}") }}" class="button outline">{{ trans('settings.role_delete') }}</a>
+                    <button type="submit" class="button">{{ trans('settings.role_save') }}</button>
+                </div>
+            </form>
+
+        </div>
+
+
+        <div class="card content-wrap auto-height">
+            <h2 class="list-heading">{{ trans('settings.role_users') }}</h2>
+            @if(count($role->users ?? []) > 0)
+                <div class="grid third">
+                    @foreach($role->users as $user)
+                        <div class="user-list-item">
+                            <div>
+                                <img class="avatar small" src="{{ $user->getAvatar(40) }}" alt="{{ $user->name }}">
+                            </div>
+                            <div>
+                                @if(userCan('users-manage') || user()->id == $user->id)
+                                    <a href="{{ url("/settings/users/{$user->id}") }}">
+                                        @endif
+                                        {{ $user->name }}
+                                        @if(userCan('users-manage') || user()->id == $user->id)
+                                    </a>
+                                @endif
+                            </div>
+                        </div>
+                    @endforeach
+                </div>
+            @else
+                <p class="text-muted">
+                    {{ trans('settings.role_users_none') }}
+                </p>
+            @endif
+        </div>
     </div>
 
 @stop
index 9cea9e1fb690eb5b293e5b3da84e64cd55bdbd56..a15117e5e8df0336ddb2d6eb658117a86d9c2bb3 100644 (file)
-{!! csrf_field() !!}
+<div class="setting-list">
 
-<div class="card content-wrap">
-    <h1 class="list-heading">{{ $title }}</h1>
-
-    <div class="setting-list">
-
-        <div class="grid half">
-            <div>
-                <label class="setting-list-label">{{ trans('settings.role_details') }}</label>
+    <div class="grid half">
+        <div>
+            <label class="setting-list-label">{{ trans('settings.role_details') }}</label>
+        </div>
+        <div>
+            <div class="form-group">
+                <label for="display_name">{{ trans('settings.role_name') }}</label>
+                @include('form.text', ['name' => 'display_name', 'model' => $role])
             </div>
-            <div>
-                <div class="form-group">
-                    <label for="display_name">{{ trans('settings.role_name') }}</label>
-                    @include('form.text', ['name' => 'display_name'])
-                </div>
-                <div class="form-group">
-                    <label for="description">{{ trans('settings.role_desc') }}</label>
-                    @include('form.text', ['name' => 'description'])
-                </div>
-                <div class="form-group">
-                    @include('form.checkbox', ['name' => 'mfa_enforced', 'label' => trans('settings.role_mfa_enforced') ])
-                </div>
-
-                @if(in_array(config('auth.method'), ['ldap', 'saml2', 'oidc']))
-                    <div class="form-group">
-                        <label for="name">{{ trans('settings.role_external_auth_id') }}</label>
-                        @include('form.text', ['name' => 'external_auth_id'])
-                    </div>
-                @endif
+            <div class="form-group">
+                <label for="description">{{ trans('settings.role_desc') }}</label>
+                @include('form.text', ['name' => 'description', 'model' => $role])
+            </div>
+            <div class="form-group">
+                @include('form.checkbox', ['name' => 'mfa_enforced', 'label' => trans('settings.role_mfa_enforced'), 'model' => $role ])
             </div>
-        </div>
-
-        <div permissions-table>
-            <label class="setting-list-label">{{ trans('settings.role_system') }}</label>
-            <a href="#" permissions-table-toggle-all class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 
-            <div class="toggle-switch-list grid half mt-m">
-                <div>
-                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'restrictions-manage-all', 'label' => trans('settings.role_manage_entity_permissions')])</div>
-                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'restrictions-manage-own', 'label' => trans('settings.role_manage_own_entity_permissions')])</div>
-                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'templates-manage', 'label' => trans('settings.role_manage_page_templates')])</div>
-                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'access-api', 'label' => trans('settings.role_access_api')])</div>
-                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'content-export', 'label' => trans('settings.role_export_content')])</div>
-                </div>
-                <div>
-                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'settings-manage', 'label' => trans('settings.role_manage_settings')])</div>
-                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'users-manage', 'label' => trans('settings.role_manage_users')])</div>
-                    <div>@include('settings.roles.parts.checkbox', ['permission' => 'user-roles-manage', 'label' => trans('settings.role_manage_roles')])</div>
-                    <p class="text-warn text-small mt-s mb-none">{{ trans('settings.roles_system_warning') }}</p>
+            @if(in_array(config('auth.method'), ['ldap', 'saml2', 'oidc']))
+                <div class="form-group">
+                    <label for="name">{{ trans('settings.role_external_auth_id') }}</label>
+                    @include('form.text', ['name' => 'external_auth_id', 'model' => $role])
                 </div>
-            </div>
+            @endif
         </div>
+    </div>
 
-        <div>
-            <label class="setting-list-label">{{ trans('settings.role_asset') }}</label>
-            <p>{{ trans('settings.role_asset_desc') }}</p>
-
-            @if (isset($role) && $role->system_name === 'admin')
-                <p class="text-warn">{{ trans('settings.role_asset_admins') }}</p>
-            @endif
+    <div permissions-table>
+        <label class="setting-list-label">{{ trans('settings.role_system') }}</label>
+        <a href="#" permissions-table-toggle-all class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
 
-            <table permissions-table class="table toggle-switch-list compact permissions-table">
-                <tr>
-                    <th width="20%">
-                        <a href="#" permissions-table-toggle-all class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
-                    </th>
-                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.create') }}</th>
-                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.view') }}</th>
-                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.edit') }}</th>
-                    <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.delete') }}</th>
-                </tr>
-                <tr>
-                    <td>
-                        <div>{{ trans('entities.shelves_long') }}</div>
-                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-create-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-view-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-view-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-update-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-update-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-delete-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-delete-all', 'label' => trans('settings.role_all')])
-                    </td>
-                </tr>
-                <tr>
-                    <td>
-                        <div>{{ trans('entities.books') }}</div>
-                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'book-create-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'book-view-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'book-view-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'book-update-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'book-update-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'book-delete-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'book-delete-all', 'label' => trans('settings.role_all')])
-                    </td>
-                </tr>
-                <tr>
-                    <td>
-                        <div>{{ trans('entities.chapters') }}</div>
-                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-create-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-create-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-view-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-view-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-update-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-update-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-delete-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'chapter-delete-all', 'label' => trans('settings.role_all')])
-                    </td>
-                </tr>
-                <tr>
-                    <td>
-                        <div>{{ trans('entities.pages') }}</div>
-                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'page-create-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'page-create-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'page-view-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'page-view-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'page-update-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'page-update-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'page-delete-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'page-delete-all', 'label' => trans('settings.role_all')])
-                    </td>
-                </tr>
-                <tr>
-                    <td>
-                        <div>{{ trans('entities.images') }}</div>
-                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
-                    </td>
-                    <td>@include('settings.roles.parts.checkbox', ['permission' => 'image-create-all', 'label' => ''])</td>
-                    <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'image-update-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'image-update-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'image-delete-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'image-delete-all', 'label' => trans('settings.role_all')])
-                    </td>
-                </tr>
-                <tr>
-                    <td>
-                        <div>{{ trans('entities.attachments') }}</div>
-                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
-                    </td>
-                    <td>@include('settings.roles.parts.checkbox', ['permission' => 'attachment-create-all', 'label' => ''])</td>
-                    <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'attachment-update-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'attachment-update-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'attachment-delete-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'attachment-delete-all', 'label' => trans('settings.role_all')])
-                    </td>
-                </tr>
-                <tr>
-                    <td>
-                        <div>{{ trans('entities.comments') }}</div>
-                        <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
-                    </td>
-                    <td>@include('settings.roles.parts.checkbox', ['permission' => 'comment-create-all', 'label' => ''])</td>
-                    <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'comment-update-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'comment-update-all', 'label' => trans('settings.role_all')])
-                    </td>
-                    <td>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'comment-delete-own', 'label' => trans('settings.role_own')])
-                        <br>
-                        @include('settings.roles.parts.checkbox', ['permission' => 'comment-delete-all', 'label' => trans('settings.role_all')])
-                    </td>
-                </tr>
-            </table>
+        <div class="toggle-switch-list grid half mt-m">
+            <div>
+                <div>@include('settings.roles.parts.checkbox', ['permission' => 'restrictions-manage-all', 'label' => trans('settings.role_manage_entity_permissions')])</div>
+                <div>@include('settings.roles.parts.checkbox', ['permission' => 'restrictions-manage-own', 'label' => trans('settings.role_manage_own_entity_permissions')])</div>
+                <div>@include('settings.roles.parts.checkbox', ['permission' => 'templates-manage', 'label' => trans('settings.role_manage_page_templates')])</div>
+                <div>@include('settings.roles.parts.checkbox', ['permission' => 'access-api', 'label' => trans('settings.role_access_api')])</div>
+                <div>@include('settings.roles.parts.checkbox', ['permission' => 'content-export', 'label' => trans('settings.role_export_content')])</div>
+            </div>
+            <div>
+                <div>@include('settings.roles.parts.checkbox', ['permission' => 'settings-manage', 'label' => trans('settings.role_manage_settings')])</div>
+                <div>@include('settings.roles.parts.checkbox', ['permission' => 'users-manage', 'label' => trans('settings.role_manage_users')])</div>
+                <div>@include('settings.roles.parts.checkbox', ['permission' => 'user-roles-manage', 'label' => trans('settings.role_manage_roles')])</div>
+                <p class="text-warn text-small mt-s mb-none">{{ trans('settings.roles_system_warning') }}</p>
+            </div>
         </div>
     </div>
 
-    <div class="form-group text-right">
-        <a href="{{ url("/settings/roles") }}" class="button outline">{{ trans('common.cancel') }}</a>
-        @if (isset($role) && $role->id)
-            <a href="{{ url("/settings/roles/delete/{$role->id}") }}" class="button outline">{{ trans('settings.role_delete') }}</a>
-        @endif
-        <button type="submit" class="button">{{ trans('settings.role_save') }}</button>
-    </div>
+    <div>
+        <label class="setting-list-label">{{ trans('settings.role_asset') }}</label>
+        <p>{{ trans('settings.role_asset_desc') }}</p>
 
-</div>
+        @if (isset($role) && $role->system_name === 'admin')
+            <p class="text-warn">{{ trans('settings.role_asset_admins') }}</p>
+        @endif
 
-<div class="card content-wrap auto-height">
-    <h2 class="list-heading">{{ trans('settings.role_users') }}</h2>
-    @if(count($role->users ?? []) > 0)
-        <div class="grid third">
-            @foreach($role->users as $user)
-                <div class="user-list-item">
-                    <div>
-                        <img class="avatar small" src="{{ $user->getAvatar(40) }}" alt="{{ $user->name }}">
-                    </div>
-                    <div>
-                        @if(userCan('users-manage') || user()->id == $user->id)
-                            <a href="{{ url("/settings/users/{$user->id}") }}">
-                                @endif
-                                {{ $user->name }}
-                                @if(userCan('users-manage') || user()->id == $user->id)
-                            </a>
-                        @endif
-                    </div>
-                </div>
-            @endforeach
-        </div>
-    @else
-        <p class="text-muted">
-            {{ trans('settings.role_users_none') }}
-        </p>
-    @endif
-</div>
+        <table permissions-table class="table toggle-switch-list compact permissions-table">
+            <tr>
+                <th width="20%">
+                    <a href="#" permissions-table-toggle-all class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
+                </th>
+                <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.create') }}</th>
+                <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.view') }}</th>
+                <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.edit') }}</th>
+                <th width="20%" permissions-table-toggle-all-in-column>{{ trans('common.delete') }}</th>
+            </tr>
+            <tr>
+                <td>
+                    <div>{{ trans('entities.shelves_long') }}</div>
+                    <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-create-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-view-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-view-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-update-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-update-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-delete-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'bookshelf-delete-all', 'label' => trans('settings.role_all')])
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    <div>{{ trans('entities.books') }}</div>
+                    <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'book-create-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'book-view-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'book-view-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'book-update-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'book-update-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'book-delete-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'book-delete-all', 'label' => trans('settings.role_all')])
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    <div>{{ trans('entities.chapters') }}</div>
+                    <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'chapter-create-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'chapter-create-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'chapter-view-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'chapter-view-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'chapter-update-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'chapter-update-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'chapter-delete-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'chapter-delete-all', 'label' => trans('settings.role_all')])
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    <div>{{ trans('entities.pages') }}</div>
+                    <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'page-create-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'page-create-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'page-view-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'page-view-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'page-update-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'page-update-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'page-delete-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'page-delete-all', 'label' => trans('settings.role_all')])
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    <div>{{ trans('entities.images') }}</div>
+                    <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
+                </td>
+                <td>@include('settings.roles.parts.checkbox', ['permission' => 'image-create-all', 'label' => ''])</td>
+                <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'image-update-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'image-update-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'image-delete-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'image-delete-all', 'label' => trans('settings.role_all')])
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    <div>{{ trans('entities.attachments') }}</div>
+                    <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
+                </td>
+                <td>@include('settings.roles.parts.checkbox', ['permission' => 'attachment-create-all', 'label' => ''])</td>
+                <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'attachment-update-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'attachment-update-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'attachment-delete-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'attachment-delete-all', 'label' => trans('settings.role_all')])
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    <div>{{ trans('entities.comments') }}</div>
+                    <a href="#" permissions-table-toggle-all-in-row class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
+                </td>
+                <td>@include('settings.roles.parts.checkbox', ['permission' => 'comment-create-all', 'label' => ''])</td>
+                <td style="line-height:1.2;"><small class="faded">{{ trans('settings.role_controlled_by_asset') }}</small></td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'comment-update-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'comment-update-all', 'label' => trans('settings.role_all')])
+                </td>
+                <td>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'comment-delete-own', 'label' => trans('settings.role_own')])
+                    <br>
+                    @include('settings.roles.parts.checkbox', ['permission' => 'comment-delete-all', 'label' => trans('settings.role_all')])
+                </td>
+            </tr>
+        </table>
+    </div>
+</div>
\ No newline at end of file
index c880bdd008938e9ea5ae4660ccf762b9e0add4c8..9368c716331d7c62914c05a0d89344aabd4a78f4 100644 (file)
@@ -163,6 +163,23 @@ class RolesTest extends TestCase
         $this->assertEquals($this->user->id, $roleA->users()->first()->id);
     }
 
+    public function test_copy_role_button_shown()
+    {
+        /** @var Role $role */
+        $role = Role::query()->first();
+        $resp = $this->asAdmin()->get("/settings/roles/{$role->id}");
+        $resp->assertElementContains('a[href$="/roles/new?copy_from=' . $role->id . '"]', 'Copy');
+    }
+
+    public function test_copy_from_param_on_create_prefills_with_other_role_data()
+    {
+        /** @var Role $role */
+        $role = Role::query()->first();
+        $resp = $this->asAdmin()->get("/settings/roles/new?copy_from={$role->id}");
+        $resp->assertOk();
+        $resp->assertElementExists('input[name="display_name"][value="' . ($role->display_name . ' (Copy)')  . '"]');
+    }
+
     public function test_manage_user_permission()
     {
         $this->actingAs($this->user)->get('/settings/users')->assertRedirect('/');