]> BookStack Code Mirror - bookstack/commitdiff
Added select-all helpers to permission tables
authorDan Brown <redacted>
Sat, 13 Apr 2019 11:07:27 +0000 (12:07 +0100)
committerDan Brown <redacted>
Sat, 13 Apr 2019 11:07:27 +0000 (12:07 +0100)
resources/assets/js/components/index.js
resources/assets/js/components/permissions-table.js [new file with mode: 0644]
resources/assets/sass/_components.scss
resources/lang/en/common.php
resources/views/form/entity-permissions.blade.php
resources/views/settings/roles/form.blade.php

index e2749797e0a1b862058fe23e5b7695d6e126e843..355b96473801f47a50d7d12f720c42fd706605b1 100644 (file)
@@ -22,6 +22,7 @@ import headerMobileToggle from "./header-mobile-toggle";
 import listSortControl from "./list-sort-control";
 import triLayout from "./tri-layout";
 import breadcrumbListing from "./breadcrumb-listing";
+import permissionsTable from "./permissions-table";
 
 const componentMapping = {
     'dropdown': dropdown,
@@ -48,6 +49,7 @@ const componentMapping = {
     'list-sort-control': listSortControl,
     'tri-layout': triLayout,
     'breadcrumb-listing': breadcrumbListing,
+    'permissions-table': permissionsTable,
 };
 
 window.components = {};
diff --git a/resources/assets/js/components/permissions-table.js b/resources/assets/js/components/permissions-table.js
new file mode 100644 (file)
index 0000000..96d95bb
--- /dev/null
@@ -0,0 +1,39 @@
+
+class PermissionsTable {
+
+    constructor(elem) {
+        this.container = elem;
+
+        // Handle toggle all event
+        const toggleAll = elem.querySelector('[permissions-table-toggle-all]');
+        toggleAll.addEventListener('click', this.toggleAllClick.bind(this));
+
+        // Handle toggle row event
+        const toggleRowElems = elem.querySelectorAll('[permissions-table-toggle-all-in-row]');
+        for (let toggleRowElem of toggleRowElems) {
+            toggleRowElem.addEventListener('click', this.toggleRowClick.bind(this));
+        }
+    }
+
+    toggleAllClick(event) {
+        event.preventDefault();
+        this.toggleAllInElement(this.container);
+    }
+
+    toggleRowClick(event) {
+        event.preventDefault();
+        this.toggleAllInElement(event.target.closest('tr'));
+    }
+
+    toggleAllInElement(domElem) {
+        const inputsToSelect = domElem.querySelectorAll('input[type=checkbox]');
+        const currentState = inputsToSelect.length > 0 ? inputsToSelect[0].checked : false;
+        for (let checkbox of inputsToSelect) {
+            checkbox.checked = !currentState;
+            checkbox.dispatchEvent(new Event('change'));
+        }
+    }
+
+}
+
+export default PermissionsTable;
\ No newline at end of file
index 044b8ec10f6408da68a5446a8124ecd0dbf4fc48..33bc5e71de38c2f1c86c0afbd278b05ef77b8a0d 100644 (file)
@@ -646,4 +646,11 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group {
 
 #tag-manager .drag-card {
   max-width: 500px;
+}
+
+.permissions-table [permissions-table-toggle-all-in-row] {
+  display: none;
+}
+.permissions-table tr:hover [permissions-table-toggle-all-in-row] {
+  display: inline;
 }
\ No newline at end of file
index 332a9a6d968a021428bdc0472bfa85063322953b..c821ecc7ec053858fa5f99b2bd904ce6e5105149 100644 (file)
@@ -11,6 +11,7 @@ return [
     'save' => 'Save',
     'continue' => 'Continue',
     'select' => 'Select',
+    'toggle_all' => 'Toggle All',
     'more' => 'More',
 
     // Form Labels
index bb7d992f7356082e42786b26615b4bd4f2943815..6bb4b51ada62824b103fce9604b43209db24ebc4 100644 (file)
         ])
     </div>
 
-    {{--TODO - Add global and role "Select All" options--}}
-
-    <table class="table toggle-switch-list">
+    <table permissions-table class="table permissions-table toggle-switch-list">
         <tr>
             <th>{{ trans('common.role') }}</th>
-            <th @if($model->isA('page')) colspan="3" @else colspan="4" @endif>{{ trans('common.actions') }}</th>
+            <th @if($model->isA('page')) colspan="3" @else colspan="4" @endif>
+                {{ trans('common.actions') }}
+                <a href="#" permissions-table-toggle-all class="text-small ml-m text-primary">{{ trans('common.toggle_all') }}</a>
+            </th>
         </tr>
         @foreach($roles as $role)
             <tr>
-                <td>{{ $role->display_name }}</td>
+                <td width="33%" class="pt-m">
+                    {{ $role->display_name }}
+                    <a href="#" permissions-table-toggle-all-in-row class="text-small float right ml-m text-primary">{{ trans('common.toggle_all') }}</a>
+                </td>
                 <td>@include('form.restriction-checkbox', ['name'=>'restrictions', 'label' => trans('common.view'), 'action' => 'view'])</td>
                 @if(!$model->isA('page'))
                     <td>@include('form.restriction-checkbox', ['name'=>'restrictions', 'label' => trans('common.create'), 'action' => 'create'])</td>
index 67b4ec05882e4310faa8c45cfd07bf352f492f14..d3c1d9070318904cb6de4e4bd92f78380b005af7 100644 (file)
@@ -1,7 +1,5 @@
 {!! csrf_field() !!}
 
-{{--TODO - Add select-all shortcuts--}}
-
 <div class="card content-wrap">
     <h1 class="list-heading">{{ $title }}</h1>
 
             </div>
         </div>
 
-        <div class="grid half">
+        <div class="grid half" permissions-table>
             <div>
                 <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>
             <div class="toggle-switch-list">
                 <div>@include('settings.roles.checkbox', ['permission' => 'users-manage', 'label' => trans('settings.role_manage_users')])</div>
                 <p class="text-warn">{{ trans('settings.role_asset_admins') }}</p>
             @endif
 
-            <table class="table toggle-switch-list compact">
+            <table permissions-table class="table toggle-switch-list compact permissions-table">
                 <tr>
-                    <th width="20%"></th>
+                    <th width="20%">
+                        <a href="#" permissions-table-toggle-all class="text-small text-primary">{{ trans('common.toggle_all') }}</a>
+                    </th>
                     <th width="20%">{{ trans('common.create') }}</th>
                     <th width="20%">{{ trans('common.view') }}</th>
                     <th width="20%">{{ trans('common.edit') }}</th>
                     <th width="20%">{{ trans('common.delete') }}</th>
                 </tr>
                 <tr>
-                    <td>{{ trans('entities.shelves_long') }}</td>
+                    <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.checkbox', ['permission' => 'bookshelf-create-all', 'label' => trans('settings.role_all')])
                     </td>
                     </td>
                 </tr>
                 <tr>
-                    <td>{{ trans('entities.books') }}</td>
+                    <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.checkbox', ['permission' => 'book-create-all', 'label' => trans('settings.role_all')])
                     </td>
                     </td>
                 </tr>
                 <tr>
-                    <td>{{ trans('entities.chapters') }}</td>
+                    <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.checkbox', ['permission' => 'chapter-create-own', 'label' => trans('settings.role_own')])
                         <br>
                     </td>
                 </tr>
                 <tr>
-                    <td>{{ trans('entities.pages') }}</td>
+                    <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.checkbox', ['permission' => 'page-create-own', 'label' => trans('settings.role_own')])
                         <br>
                     </td>
                 </tr>
                 <tr>
-                    <td>{{ trans('entities.images') }}</td>
+                    <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.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>
                     </td>
                 </tr>
                 <tr>
-                    <td>{{ trans('entities.attachments') }}</td>
+                    <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.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>
                     </td>
                 </tr>
                 <tr>
-                    <td>{{ trans('entities.comments') }}</td>
+                    <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.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>