mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-07-30 04:23:11 +03:00
Finished initial implementation of custom role system
This commit is contained in:
@ -43,7 +43,7 @@
|
||||
<div class="float right">
|
||||
<div class="links text-center">
|
||||
<a href="/books"><i class="zmdi zmdi-book"></i>Books</a>
|
||||
@if(isset($currentUser) && $currentUser->can('settings-update'))
|
||||
@if(isset($currentUser) && $currentUser->can('settings-manage'))
|
||||
<a href="/settings"><i class="zmdi zmdi-settings"></i>Settings</a>
|
||||
@endif
|
||||
@if(!isset($signedIn) || !$signedIn)
|
||||
|
@ -8,7 +8,7 @@
|
||||
<div class="col-xs-1"></div>
|
||||
<div class="col-xs-11 faded">
|
||||
<div class="action-buttons">
|
||||
@if($currentUser->can('book-create'))
|
||||
@if($currentUser->can('book-create-all'))
|
||||
<a href="/books/create" class="text-pos text-button"><i class="zmdi zmdi-plus"></i>Add new book</a>
|
||||
@endif
|
||||
</div>
|
||||
|
@ -7,17 +7,17 @@
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="action-buttons faded">
|
||||
@if($currentUser->can('page-create'))
|
||||
@if(userCan('page-create', $book))
|
||||
<a href="{{$book->getUrl() . '/page/create'}}" class="text-pos text-button"><i class="zmdi zmdi-plus"></i> New Page</a>
|
||||
@endif
|
||||
@if($currentUser->can('chapter-create'))
|
||||
@if(userCan('chapter-create', $book))
|
||||
<a href="{{$book->getUrl() . '/chapter/create'}}" class="text-pos text-button"><i class="zmdi zmdi-plus"></i> New Chapter</a>
|
||||
@endif
|
||||
@if($currentUser->can('book-update'))
|
||||
@if(userCan('book-update', $book))
|
||||
<a href="{{$book->getEditUrl()}}" class="text-primary text-button"><i class="zmdi zmdi-edit"></i>Edit</a>
|
||||
<a href="{{ $book->getUrl() }}/sort" class="text-primary text-button"><i class="zmdi zmdi-sort"></i>Sort</a>
|
||||
@endif
|
||||
@if($currentUser->can('book-delete'))
|
||||
@if(userCan('book-delete', $book))
|
||||
<a href="{{ $book->getUrl() }}/delete" class="text-neg text-button"><i class="zmdi zmdi-delete"></i>Delete</a>
|
||||
@endif
|
||||
</div>
|
||||
|
@ -12,13 +12,13 @@
|
||||
</div>
|
||||
<div class="col-md-8 faded">
|
||||
<div class="action-buttons">
|
||||
@if($currentUser->can('chapter-create'))
|
||||
@if(userCan('page-create', $chapter))
|
||||
<a href="{{$chapter->getUrl() . '/create-page'}}" class="text-pos text-button"><i class="zmdi zmdi-plus"></i>New Page</a>
|
||||
@endif
|
||||
@if($currentUser->can('chapter-update'))
|
||||
@if(userCan('chapter-update', $chapter))
|
||||
<a href="{{$chapter->getUrl() . '/edit'}}" class="text-primary text-button"><i class="zmdi zmdi-edit"></i>Edit</a>
|
||||
@endif
|
||||
@if($currentUser->can('chapter-delete'))
|
||||
@if(userCan('chapter-delete', $chapter))
|
||||
<a href="{{$chapter->getUrl() . '/delete'}}" class="text-neg text-button"><i class="zmdi zmdi-delete"></i>Delete</a>
|
||||
@endif
|
||||
</div>
|
||||
|
14
resources/views/form/role-checkboxes.blade.php
Normal file
14
resources/views/form/role-checkboxes.blade.php
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
@foreach($roles as $role)
|
||||
<label>
|
||||
<input value="{{ $role->id }}" id="{{$name}}-{{$role->name}}" type="checkbox" name="{{$name}}[{{$role->name}}]"
|
||||
@if($errors->has($name)) class="neg" @endif
|
||||
@if(old($name . '.' . $role->name) || (!old('name') && isset($model) && $model->hasRole($role->name))) checked="checked" @endif
|
||||
>
|
||||
{{ $role->display_name }}
|
||||
</label>
|
||||
@endforeach
|
||||
|
||||
@if($errors->has($name))
|
||||
<div class="text-neg text-small">{{ $errors->first($name) }}</div>
|
||||
@endif
|
@ -27,11 +27,11 @@
|
||||
<li><a href="{{$page->getUrl() . '/export/plaintext'}}" target="_blank">Plain Text File <span class="text-muted float right">.txt</span></a></li>
|
||||
</ul>
|
||||
</span>
|
||||
@if($currentUser->can('page-update'))
|
||||
@if(userCan('page-update', $page))
|
||||
<a href="{{$page->getUrl() . '/revisions'}}" class="text-primary text-button"><i class="zmdi zmdi-replay"></i>Revisions</a>
|
||||
<a href="{{$page->getUrl() . '/edit'}}" class="text-primary text-button" ><i class="zmdi zmdi-edit"></i>Edit</a>
|
||||
@endif
|
||||
@if($currentUser->can('page-delete'))
|
||||
@if(userCan('page-delete', $page))
|
||||
<a href="{{$page->getUrl() . '/delete'}}" class="text-neg text-button"><i class="zmdi zmdi-delete"></i>Delete</a>
|
||||
@endif
|
||||
</div>
|
||||
|
@ -54,7 +54,7 @@
|
||||
<select id="setting-registration-role" name="setting-registration-role" @if($errors->has('setting-registration-role')) class="neg" @endif>
|
||||
@foreach(\BookStack\Role::all() as $role)
|
||||
<option value="{{$role->id}}"
|
||||
@if(\Setting::get('registration-role', \BookStack\Role::getDefault()->id) == $role->id) selected @endif
|
||||
@if(\Setting::get('registration-role', \BookStack\Role::first()->id) == $role->id) selected @endif
|
||||
>
|
||||
{{ $role->display_name }}
|
||||
</option>
|
||||
|
3
resources/views/settings/roles/checkbox.blade.php
Normal file
3
resources/views/settings/roles/checkbox.blade.php
Normal file
@ -0,0 +1,3 @@
|
||||
<input type="checkbox" name="permissions[{{ $permission }}]"
|
||||
@if(old('permissions.'.$permission, false)|| (!old('display_name', false) && (isset($role) && $role->hasPermission($permission)))) checked="checked" @endif
|
||||
value="true">
|
15
resources/views/settings/roles/create.blade.php
Normal file
15
resources/views/settings/roles/create.blade.php
Normal file
@ -0,0 +1,15 @@
|
||||
@extends('base')
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('settings/navbar', ['selected' => 'roles'])
|
||||
|
||||
<div class="container">
|
||||
<h1>Create New Role</h1>
|
||||
|
||||
<form action="/settings/roles/new" method="POST">
|
||||
@include('settings/roles/form')
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@stop
|
28
resources/views/settings/roles/delete.blade.php
Normal file
28
resources/views/settings/roles/delete.blade.php
Normal file
@ -0,0 +1,28 @@
|
||||
@extends('base')
|
||||
|
||||
@section('content')
|
||||
|
||||
@include('settings/navbar', ['selected' => 'roles'])
|
||||
|
||||
<div class="container small" ng-non-bindable>
|
||||
<h1>Delete Role</h1>
|
||||
<p>This will delete the role with the name '{{$role->display_name}}'.</p>
|
||||
|
||||
<form action="/settings/roles/delete/{{$role->id}}" method="POST">
|
||||
{!! csrf_field() !!}
|
||||
<input type="hidden" name="_method" value="DELETE">
|
||||
|
||||
@if($role->users->count() > 0)
|
||||
<div class="form-group">
|
||||
<p>This role has {{$role->users->count()}} users assigned to it. If you would like to migrate the users from this role select a new role below.</p>
|
||||
@include('form/role-select', ['options' => $roles, 'name' => 'migration_role_id'])
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<p class="text-neg">Are you sure you want to delete this role?</p>
|
||||
<a href="/settings/roles/{{ $role->id }}" class="button">Cancel</a>
|
||||
<button type="submit" class="button neg">Confirm</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@stop
|
@ -5,59 +5,19 @@
|
||||
@include('settings/navbar', ['selected' => 'roles'])
|
||||
|
||||
<div class="container">
|
||||
<h1>Edit Role <small> {{ $role->display_name }}</small></h1>
|
||||
|
||||
<form action="">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6">
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Create</th>
|
||||
<th>Edit</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Books</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Chapters</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Pages</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Images</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="">Can only edit own content</label>
|
||||
<hr class="even">
|
||||
<label for="">Manage users</label>
|
||||
<hr class="even">
|
||||
<label for="">Manage user roles</label>
|
||||
<hr class="even">
|
||||
<label for="">Manage app settings</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<h1>Edit Role <small> {{ $role->display_name }}</small></h1>
|
||||
</div>
|
||||
<button type="submit" class="button pos">Save Role</button>
|
||||
<div class="col-sm-6">
|
||||
<p></p>
|
||||
<a href="/settings/roles/delete/{{ $role->id }}" class="button neg float right">Delete Role</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form action="/settings/roles/{{ $role->id }}" method="POST">
|
||||
<input type="hidden" name="_method" value="PUT">
|
||||
@include('settings/roles/form', ['model' => $role])
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
84
resources/views/settings/roles/form.blade.php
Normal file
84
resources/views/settings/roles/form.blade.php
Normal file
@ -0,0 +1,84 @@
|
||||
{!! csrf_field() !!}
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label for="name">Role Name</label>
|
||||
@include('form/text', ['name' => 'display_name'])
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="name">Short Role Description</label>
|
||||
@include('form/text', ['name' => 'description'])
|
||||
</div>
|
||||
<hr class="even">
|
||||
<div class="form-group">
|
||||
<label>Manage users @include('settings/roles/checkbox', ['permission' => 'users-manage'])</label>
|
||||
<hr class="even">
|
||||
<label>Manage user roles & Permissions @include('settings/roles/checkbox', ['permission' => 'user-roles-manage'])</label>
|
||||
<hr class="even">
|
||||
<label>Manage app settings @include('settings/roles/checkbox', ['permission' => 'settings-manage'])</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>Create</th>
|
||||
<th>Edit</th>
|
||||
<th>Delete</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Books</td>
|
||||
<td>@include('settings/roles/checkbox', ['permission' => 'book-create-all'])</td>
|
||||
<td>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'book-update-own']) Own</label>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'book-update-all']) All</label>
|
||||
</td>
|
||||
<td>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'book-delete-own']) Own</label>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'book-delete-all']) All</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Chapters</td>
|
||||
<td>@include('settings/roles/checkbox', ['permission' => 'chapter-create-all'])</td>
|
||||
<td>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'chapter-update-own']) Own</label>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'chapter-update-all']) All</label>
|
||||
</td>
|
||||
<td>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'chapter-delete-own']) Own</label>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'chapter-delete-all']) All</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Pages</td>
|
||||
<td>@include('settings/roles/checkbox', ['permission' => 'page-create-all'])</td>
|
||||
<td>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'page-update-own']) Own</label>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'page-update-all']) All</label>
|
||||
</td>
|
||||
<td>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'page-delete-own']) Own</label>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'page-delete-all']) All</label>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Images</td>
|
||||
<td>@include('settings/roles/checkbox', ['permission' => 'image-create-all'])</td>
|
||||
<td>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'image-update-own']) Own</label>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'image-update-all']) All</label>
|
||||
</td>
|
||||
<td>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'image-delete-own']) Own</label>
|
||||
<label>@include('settings/roles/checkbox', ['permission' => 'image-delete-all']) All</label>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<button type="submit" class="button pos">Save Role</button>
|
@ -7,6 +7,11 @@
|
||||
<div class="container">
|
||||
|
||||
<h1>User Roles</h1>
|
||||
|
||||
<p>
|
||||
<a href="/settings/roles/new" class="text-pos"><i class="zmdi zmdi-lock-open"></i>Add new role</a>
|
||||
</p>
|
||||
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>Role Name</th>
|
||||
|
@ -3,21 +3,21 @@
|
||||
@include('form.text', ['name' => 'name'])
|
||||
</div>
|
||||
|
||||
@if($currentUser->can('user-update'))
|
||||
@if(userCan('users-manage'))
|
||||
<div class="form-group">
|
||||
<label for="email">Email</label>
|
||||
@include('form.text', ['name' => 'email'])
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if($currentUser->can('user-update'))
|
||||
@if(userCan('users-manage'))
|
||||
<div class="form-group">
|
||||
<label for="role">User Role</label>
|
||||
@include('form.role-select', ['name' => 'role', 'options' => \BookStack\Role::all(), 'displayKey' => 'display_name'])
|
||||
@include('form/role-checkboxes', ['name' => 'roles', 'roles' => \BookStack\Role::all()])
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if($currentUser->can('user-update'))
|
||||
@if(userCan('users-manage'))
|
||||
<div class="form-group">
|
||||
<label for="external_auth_id">External Authentication ID</label>
|
||||
@include('form.text', ['name' => 'external_auth_id'])
|
||||
|
@ -8,10 +8,10 @@
|
||||
@include('form.text', ['name' => 'email'])
|
||||
</div>
|
||||
|
||||
@if($currentUser->can('user-update'))
|
||||
@if(userCan('users-manage'))
|
||||
<div class="form-group">
|
||||
<label for="role">User Role</label>
|
||||
@include('form.role-select', ['name' => 'role', 'options' => \BookStack\Role::all(), 'displayKey' => 'display_name'])
|
||||
@include('form/role-checkboxes', ['name' => 'roles', 'roles' => \BookStack\Role::all()])
|
||||
</div>
|
||||
@endif
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
<div class="container small" ng-non-bindable>
|
||||
<h1>Users</h1>
|
||||
@if($currentUser->can('user-create'))
|
||||
@if(userCan('users-manage'))
|
||||
<p>
|
||||
<a href="/settings/users/create" class="text-pos"><i class="zmdi zmdi-account-add"></i>Add new user</a>
|
||||
</p>
|
||||
@ -18,30 +18,32 @@
|
||||
<th></th>
|
||||
<th>Name</th>
|
||||
<th>Email</th>
|
||||
<th>User Type</th>
|
||||
<th>User Roles</th>
|
||||
</tr>
|
||||
@foreach($users as $user)
|
||||
<tr>
|
||||
<td style="line-height: 0;"><img class="avatar med" src="{{$user->getAvatar(40)}}" alt="{{$user->name}}"></td>
|
||||
<td>
|
||||
@if($currentUser->can('user-update') || $currentUser->id == $user->id)
|
||||
@if(userCan('users-manage') || $currentUser->id == $user->id)
|
||||
<a href="/settings/users/{{$user->id}}">
|
||||
@endif
|
||||
{{ $user->name }}
|
||||
@if($currentUser->can('user-update') || $currentUser->id == $user->id)
|
||||
@if(userCan('users-manage') || $currentUser->id == $user->id)
|
||||
</a>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if($currentUser->can('user-update') || $currentUser->id == $user->id)
|
||||
@if(userCan('users-manage') || $currentUser->id == $user->id)
|
||||
<a href="/settings/users/{{$user->id}}">
|
||||
@endif
|
||||
{{ $user->email }}
|
||||
@if($currentUser->can('user-update') || $currentUser->id == $user->id)
|
||||
@if(userCan('users-manage') || $currentUser->id == $user->id)
|
||||
</a>
|
||||
@endif
|
||||
</td>
|
||||
<td>{{ $user->role->display_name }}</td>
|
||||
<td>
|
||||
<small> {{ $user->roles->implode('display_name', ', ') }}</small>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</table>
|
||||
|
Reference in New Issue
Block a user