├── resources ├── views │ ├── layouts │ │ ├── partials │ │ │ ├── header.blade.php │ │ │ ├── topbar.blade.php │ │ │ ├── sidebar.blade.php │ │ │ └── footer.blade.php │ │ ├── master.blade.php │ │ └── app.blade.php │ ├── permissions │ │ ├── doc.blade.php │ │ └── index.blade.php │ └── users │ │ └── index.blade.php └── assets │ ├── dashboard │ ├── css │ │ ├── custom.css │ │ └── sweetalert2.min.css │ ├── js │ │ ├── admin.min.js │ │ └── custom.js │ └── vendor │ │ ├── datatables │ │ ├── dataTables.bootstrap4.min.js │ │ └── dataTables.bootstrap4.min.css │ │ └── jquery-easing │ │ └── jquery.easing.min.js │ ├── sass │ ├── app.scss │ └── _variables.scss │ ├── js │ ├── components │ │ ├── Menu.vue │ │ ├── ExampleComponent.vue │ │ ├── NestedRawDraggableMenu.vue │ │ ├── DraggableMenu.vue │ │ ├── NestedDraggableMenu.vue │ │ └── Users.vue │ ├── app.js │ └── bootstrap.js │ └── lang │ └── en │ ├── pagination.php │ ├── auth.php │ ├── passwords.php │ └── validation.php ├── .gitattributes ├── src ├── PermissionGenarator.php ├── Contracts │ ├── User.php │ ├── Role.php │ └── Permission.php ├── Permission.php ├── Facades │ └── Permission.php ├── Http │ ├── Controllers │ │ ├── Controller.php │ │ ├── UserController.php │ │ └── PermissionController.php │ └── Middleware │ │ └── RoleMiddleware.php ├── Models │ ├── Permission.php │ ├── Role.php │ └── User.php ├── Commands │ ├── PublishPermissionViews.php │ ├── PublishPermissionResources.php │ ├── InstallPermissionDemo.php │ └── InstallPermission.php ├── Helpers │ └── helpers.php ├── Traits │ ├── HasRoles.php │ └── HasPermissions.php └── PermissionServiceProvider.php ├── mix-manifest.json ├── routes ├── permission.php └── demo.php ├── webpack.mix.js ├── config └── permission.php ├── database ├── seeds │ ├── UsersSeeder.php │ ├── PermissionDatabaseSeeder.php │ ├── RolesSeeder.php │ └── PermissionsSeeder.php └── migrations │ ├── 2018_05_26_041218_create_roles_table.php │ ├── 2019_03_15_095532_create_permissions_table.php │ ├── 2018_05_26_041708_create_role_users_table.php │ └── 2019_03_15_095857_create_permission_role_table.php ├── LICENSE ├── composer.json ├── package.json └── README.md /resources/views/layouts/partials/header.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.php linguist-language=PHP 2 | *.js linguist-language=PHP -------------------------------------------------------------------------------- /resources/assets/dashboard/css/custom.css: -------------------------------------------------------------------------------- 1 | .permission-list { 2 | list-style: none; 3 | padding: 0px; 4 | margin: 0px; 5 | } -------------------------------------------------------------------------------- /src/PermissionGenarator.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
8 | 9 | -------------------------------------------------------------------------------- /src/Permission.php: -------------------------------------------------------------------------------- 1 | 2 |Sorry! There is no Doc at this moment. we will add it soon. Thanks
13 |{{ valueString }}
5 | You Can Browse
220 | @endcan 221 | 222 | @role('admin') 223 |You are admin
224 | @endrole 225 | 226 | @hasrole('admin') 227 |You have admin Permission
228 | @endhasrole 229 | 230 | @haspermission('edit') 231 |You have admin Permission
232 | @endhaspermission 233 | ``` 234 | ## Authors 235 | 236 | * **Md Abu Ahsan Basir** - *Main Developer & Maintainer* - [github](https://github.com/maab16) 237 | * **Mahabubul Alam** - *Main designer* - [github](https://github.com/mahabubul1) 238 | 239 | See also the list of [contributors](https://github.com/laravel-menu-builder/contributors) who participated in this project. 240 | 241 | ## License 242 | 243 | [](http://badges.mit-license.org) 244 | 245 | - **[MIT license](http://opensource.org/licenses/mit-license.php)** 246 | - Copyright 2019 © CodexShaper. 247 | -------------------------------------------------------------------------------- /src/Http/Controllers/UserController.php: -------------------------------------------------------------------------------- 1 | first()->permissions); 16 | $roles = Role::orderBy('updated_at', 'desc')->get(); 17 | $users = User::orderBy('updated_at', 'desc')->get(); 18 | return view('permission::users.index', compact('roles', 'users')); 19 | } 20 | 21 | public function all( Request $request ) 22 | { 23 | $users = User::orderBy('updated_at', 'desc')->get(); 24 | return response()->json([ 25 | 'success' => true, 26 | 'users' => $users 27 | ]); 28 | } 29 | 30 | public function addUser( Request $request ) { 31 | $validator = Validator::make($request->all(), [ 32 | 'name' => ['required', 'string', 'max:255'], 33 | 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 34 | 'password' => ['required', 'string', 'min:8', 'confirmed'], 35 | ]); 36 | if( $validator->fails() ){ 37 | return response()->json([ 38 | 'success' => false, 39 | 'errors' => $validator->messages() 40 | ]); 41 | } 42 | 43 | $user = User::create([ 44 | 'name' => $request->name, 45 | 'email' => $request->email, 46 | 'password' => Hash::make($request->password), 47 | ]); 48 | 49 | if( $user ) { 50 | if( count( $request->checkedRoles ) > 0 ) { 51 | $user->assignRoles($request->checkedRoles); 52 | return response()->json([ 53 | 'success' => true, 54 | 'user' => $user 55 | ]); 56 | } 57 | } 58 | return response()->json([ 59 | 'success' => false, 60 | ]); 61 | } 62 | 63 | public function getUser( Request $request ) { 64 | if( $request->ajax() && isset($request->id) ) { 65 | $user = User::find( $request->id ); 66 | $userRoles = $user->roles; 67 | $checkedRoles = $user->roles->pluck('id'); 68 | return response()->json([ 69 | 'success' => true, 70 | 'user' => $user, 71 | 'userRoles' => $userRoles, 72 | 'checkedRoles' => $checkedRoles 73 | ]); 74 | } 75 | 76 | return response()->json([ 77 | 'success' => false 78 | ]); 79 | } 80 | 81 | public function allRoles() 82 | { 83 | return response()->json([ 84 | 'success' => true, 85 | 'roles' => Role::all() 86 | ]); 87 | } 88 | 89 | public function updateUser( Request $request ) 90 | { 91 | if( isset( $request->id ) && $user = User::find($request->id) ) { 92 | $validator = Validator::make($request->all(), [ 93 | 'name' => 'required|string|max:255', 94 | 'email' => 'required|string|email|max:255|unique:users,email,'.$request->id, 95 | ]); 96 | if( $validator->fails() ){ 97 | return response()->json([ 98 | 'success' => false, 99 | 'errors' => $validator->messages() 100 | ]); 101 | } 102 | 103 | $user->name = $request->name; 104 | $user->email = $request->email; 105 | $user->updated_at = now(); 106 | if( $user->update() ) { 107 | $user->syncRoles($request->checkedRoles); 108 | } 109 | return response()->json([ 110 | 'success' => true, 111 | 'user' => $request->all() 112 | ]); 113 | } 114 | return response()->json([ 115 | 'success' => false 116 | ]); 117 | } 118 | 119 | public function deleteUser( Request $request ) 120 | { 121 | if(isset($request->id) && $user = User::find($request->id)){ 122 | $user->revokeRoles(); 123 | if( $user->delete() ){ 124 | return response()->json([ 125 | 'success' => true 126 | ]); 127 | } 128 | } 129 | 130 | return response()->json([ 131 | 'success' => false, 132 | ]); 133 | } 134 | 135 | public function addRole(Request $request) 136 | { 137 | if( $request->ajax() ) { 138 | if( !Role::where('slug', slug($request->role_name))->exists() ){ 139 | 140 | $role = new Role; 141 | $role->name = $request->role_name; 142 | $role->slug = slug($request->role_name); 143 | if($role->save()){ 144 | if( count( $request->permissions ) > 0 ) { 145 | $role->assignPermissions( $request->permissions ); 146 | return response()->json([ 147 | 'success' => true, 148 | 'role' => $role 149 | ]); 150 | } 151 | } 152 | }else { 153 | return response()->json([ 154 | 'success' => false, 155 | 'message' => 'Role Already Exists' 156 | ]); 157 | } 158 | } 159 | 160 | return response()->json(['success' => false]); 161 | } 162 | 163 | public function getRole( Request $request ) 164 | { 165 | if( $request->ajax() ) { 166 | if( $request->id ) { 167 | if( $role = Role::find( $request->id ) ){ 168 | $permissions = $role->permissions; 169 | return response()->json([ 170 | 'success' => true, 171 | 'role' => $role, 172 | 'permissions' => $permissions 173 | ]); 174 | } 175 | } 176 | } 177 | 178 | return response()->json([ 179 | 'success' => false, 180 | 'message' => 'There is no ajax request' 181 | ]); 182 | } 183 | 184 | public function updateRole( Request $request ) 185 | { 186 | if($request->ajax()){ 187 | if( isset( $request->role_id ) && $role = Role::find( $request->role_id ) ) { 188 | $role->name = $request->role_name; 189 | $role->slug = slug( $request->role_name ); 190 | if( $role->update() ) { 191 | if( count( $request->permissions ) > 0 ) { 192 | $role->updatePermissions( $request->permissions ); 193 | return response()->json([ 194 | 'success' => true, 195 | 'role' => $role 196 | ]); 197 | } 198 | } 199 | } 200 | } 201 | 202 | return response()->json([ 203 | 'success' => false, 204 | 'data' => $request->all() 205 | ]); 206 | } 207 | 208 | public function deleteRole( Request $request ) 209 | { 210 | if($request->ajax()){ 211 | if( isset( $request->role_id ) && $role = Role::find( $request->role_id ) ) { 212 | $role->revokePermissions(); 213 | if( $role->delete() ) { 214 | return response()->json([ 215 | 'success' => true, 216 | 'role' => $role 217 | ]); 218 | } 219 | } 220 | } 221 | 222 | return response()->json([ 223 | 'success' => false, 224 | 'data' => $request->all() 225 | ]); 226 | } 227 | } 228 | -------------------------------------------------------------------------------- /src/Http/Controllers/PermissionController.php: -------------------------------------------------------------------------------- 1 | first()->permissions); 20 | $roles = Role::orderBy('updated_at', 'desc')->get(); 21 | $permissions = Permission::orderBy('updated_at', 'desc')->get(); 22 | return view('permission::permissions.index', compact('roles', 'permissions')); 23 | } 24 | 25 | public function addPermission(Request $request) 26 | { 27 | if( $request->ajax() ) { 28 | if( !Permission::where('slug', slug($request->permission_name))->exists() ){ 29 | 30 | $permission = new Permission; 31 | $permission->name = $request->permission_name; 32 | $permission->slug = slug($request->permission_name); 33 | if($permission->save()){ 34 | $permission->givePermissionToRoles( $request->roles ); 35 | return response()->json([ 36 | 'success' => true, 37 | 'permission' => $permission, 38 | 'roles' => $permission->permission_roles 39 | ]); 40 | } 41 | }else { 42 | return response()->json([ 43 | 'success' => false, 44 | 'message' => 'Permission Already Exists' 45 | ]); 46 | } 47 | } 48 | 49 | return response()->json(['success' => false]); 50 | } 51 | 52 | public function getPermission( Request $request ) 53 | { 54 | if( $request->ajax() ) { 55 | if( $request->id ) { 56 | if( $permission = Permission::find( $request->id ) ){ 57 | $roles = $permission->permission_roles; 58 | return response()->json([ 59 | 'success' => true, 60 | 'permission' => $permission, 61 | 'roles' => $roles 62 | ]); 63 | } 64 | } 65 | } 66 | 67 | return response()->json([ 68 | 'success' => false, 69 | 'message' => 'There is no ajax request' 70 | ]); 71 | } 72 | 73 | public function updatePermission( Request $request ) 74 | { 75 | if($request->ajax()){ 76 | if( isset( $request->permission_id ) && $permission = Permission::find( $request->permission_id ) ) { 77 | $permission->name = $request->permission_name; 78 | $permission->slug = slug( $request->permission_name ); 79 | if( $permission->update() ) { 80 | if( count( $request->roles ) > 0 ) { 81 | $permission->syncPermissionToRoles( $request->roles ); 82 | return response()->json([ 83 | 'success' => true, 84 | 'permission' => $permission 85 | ]); 86 | } 87 | } 88 | } 89 | } 90 | 91 | return response()->json([ 92 | 'success' => false, 93 | 'data' => $request->all() 94 | ]); 95 | } 96 | 97 | public function deletePermission( Request $request ) 98 | { 99 | if($request->ajax()){ 100 | if( isset( $request->permission_id ) && $permission = Permission::find( $request->permission_id ) ) { 101 | $permission->revokePermissionsFromRoles(); 102 | if( $permission->delete() ) { 103 | return response()->json([ 104 | 'success' => true, 105 | 'permission' => $permission 106 | ]); 107 | } 108 | } 109 | } 110 | 111 | return response()->json([ 112 | 'success' => false, 113 | 'data' => $request->all() 114 | ]); 115 | } 116 | 117 | public function addRole(Request $request) 118 | { 119 | if( $request->ajax() ) { 120 | if( !Role::where('slug', slug($request->role_name))->exists() ){ 121 | 122 | $role = new Role; 123 | $role->name = $request->role_name; 124 | $role->slug = slug($request->role_name); 125 | if($role->save()){ 126 | if( count( $request->permissions ) > 0 ) { 127 | $role->assignPermissions( $request->permissions ); 128 | return response()->json([ 129 | 'success' => true, 130 | 'role' => $role 131 | ]); 132 | } 133 | } 134 | }else { 135 | return response()->json([ 136 | 'success' => false, 137 | 'message' => 'Role Already Exists' 138 | ]); 139 | } 140 | } 141 | 142 | return response()->json(['success' => false]); 143 | } 144 | 145 | public function getRole( Request $request ) 146 | { 147 | if( $request->ajax() ) { 148 | if( $request->id ) { 149 | if( $role = Role::find( $request->id ) ){ 150 | $permissions = $role->permissions; 151 | return response()->json([ 152 | 'success' => true, 153 | 'role' => $role, 154 | 'permissions' => $permissions 155 | ]); 156 | } 157 | } 158 | } 159 | 160 | return response()->json([ 161 | 'success' => false, 162 | 'message' => 'There is no ajax request' 163 | ]); 164 | } 165 | 166 | public function updateRole( Request $request ) 167 | { 168 | if($request->ajax()){ 169 | if( isset( $request->role_id ) && $role = Role::find( $request->role_id ) ) { 170 | $role->name = $request->role_name; 171 | $role->slug = slug( $request->role_name ); 172 | if( $role->update() ) { 173 | if( count( $request->permissions ) > 0 ) { 174 | $role->updatePermissions( $request->permissions ); 175 | return response()->json([ 176 | 'success' => true, 177 | 'role' => $role 178 | ]); 179 | } 180 | } 181 | } 182 | } 183 | 184 | return response()->json([ 185 | 'success' => false, 186 | 'data' => $request->all() 187 | ]); 188 | } 189 | 190 | public function deleteRole( Request $request ) 191 | { 192 | if($request->ajax()){ 193 | if( isset( $request->role_id ) && $role = Role::find( $request->role_id ) ) { 194 | $role->revokePermissions(); 195 | if( $role->delete() ) { 196 | return response()->json([ 197 | 'success' => true, 198 | 'role' => $role 199 | ]); 200 | } 201 | } 202 | } 203 | 204 | return response()->json([ 205 | 'success' => false, 206 | 'data' => $request->all() 207 | ]); 208 | } 209 | 210 | public function assets(Request $request) 211 | { 212 | $file = base_path(trim(config('permission.resources_path'), '/')."/".urldecode($request->path)); 213 | 214 | if (File::exists($file)) { 215 | 216 | switch ( $extension = pathinfo($file, PATHINFO_EXTENSION) ) { 217 | case 'js': 218 | $mimeType = 'text/javascript'; 219 | break; 220 | case 'css': 221 | $mimeType = 'text/css'; 222 | break; 223 | default: 224 | $mimeType = File::mimeType($file); 225 | break; 226 | } 227 | 228 | $response = Response::make(File::get($file), 200); 229 | $response->header('Content-Type', $mimeType); 230 | $response->setSharedMaxAge(31536000); 231 | $response->setMaxAge(31536000); 232 | $response->setExpires(new \DateTime('+1 year')); 233 | 234 | return $response; 235 | } 236 | 237 | return response('', 404); 238 | } 239 | } -------------------------------------------------------------------------------- /resources/assets/lang/en/validation.php: -------------------------------------------------------------------------------- 1 | 'The :attribute must be accepted.', 17 | 'active_url' => 'The :attribute is not a valid URL.', 18 | 'after' => 'The :attribute must be a date after :date.', 19 | 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', 20 | 'alpha' => 'The :attribute may only contain letters.', 21 | 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', 22 | 'alpha_num' => 'The :attribute may only contain letters and numbers.', 23 | 'array' => 'The :attribute must be an array.', 24 | 'before' => 'The :attribute must be a date before :date.', 25 | 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', 26 | 'between' => [ 27 | 'numeric' => 'The :attribute must be between :min and :max.', 28 | 'file' => 'The :attribute must be between :min and :max kilobytes.', 29 | 'string' => 'The :attribute must be between :min and :max characters.', 30 | 'array' => 'The :attribute must have between :min and :max items.', 31 | ], 32 | 'boolean' => 'The :attribute field must be true or false.', 33 | 'confirmed' => 'The :attribute confirmation does not match.', 34 | 'date' => 'The :attribute is not a valid date.', 35 | 'date_equals' => 'The :attribute must be a date equal to :date.', 36 | 'date_format' => 'The :attribute does not match the format :format.', 37 | 'different' => 'The :attribute and :other must be different.', 38 | 'digits' => 'The :attribute must be :digits digits.', 39 | 'digits_between' => 'The :attribute must be between :min and :max digits.', 40 | 'dimensions' => 'The :attribute has invalid image dimensions.', 41 | 'distinct' => 'The :attribute field has a duplicate value.', 42 | 'email' => 'The :attribute must be a valid email address.', 43 | 'ends_with' => 'The :attribute must end with one of the following: :values', 44 | 'exists' => 'The selected :attribute is invalid.', 45 | 'file' => 'The :attribute must be a file.', 46 | 'filled' => 'The :attribute field must have a value.', 47 | 'gt' => [ 48 | 'numeric' => 'The :attribute must be greater than :value.', 49 | 'file' => 'The :attribute must be greater than :value kilobytes.', 50 | 'string' => 'The :attribute must be greater than :value characters.', 51 | 'array' => 'The :attribute must have more than :value items.', 52 | ], 53 | 'gte' => [ 54 | 'numeric' => 'The :attribute must be greater than or equal :value.', 55 | 'file' => 'The :attribute must be greater than or equal :value kilobytes.', 56 | 'string' => 'The :attribute must be greater than or equal :value characters.', 57 | 'array' => 'The :attribute must have :value items or more.', 58 | ], 59 | 'image' => 'The :attribute must be an image.', 60 | 'in' => 'The selected :attribute is invalid.', 61 | 'in_array' => 'The :attribute field does not exist in :other.', 62 | 'integer' => 'The :attribute must be an integer.', 63 | 'ip' => 'The :attribute must be a valid IP address.', 64 | 'ipv4' => 'The :attribute must be a valid IPv4 address.', 65 | 'ipv6' => 'The :attribute must be a valid IPv6 address.', 66 | 'json' => 'The :attribute must be a valid JSON string.', 67 | 'lt' => [ 68 | 'numeric' => 'The :attribute must be less than :value.', 69 | 'file' => 'The :attribute must be less than :value kilobytes.', 70 | 'string' => 'The :attribute must be less than :value characters.', 71 | 'array' => 'The :attribute must have less than :value items.', 72 | ], 73 | 'lte' => [ 74 | 'numeric' => 'The :attribute must be less than or equal :value.', 75 | 'file' => 'The :attribute must be less than or equal :value kilobytes.', 76 | 'string' => 'The :attribute must be less than or equal :value characters.', 77 | 'array' => 'The :attribute must not have more than :value items.', 78 | ], 79 | 'max' => [ 80 | 'numeric' => 'The :attribute may not be greater than :max.', 81 | 'file' => 'The :attribute may not be greater than :max kilobytes.', 82 | 'string' => 'The :attribute may not be greater than :max characters.', 83 | 'array' => 'The :attribute may not have more than :max items.', 84 | ], 85 | 'mimes' => 'The :attribute must be a file of type: :values.', 86 | 'mimetypes' => 'The :attribute must be a file of type: :values.', 87 | 'min' => [ 88 | 'numeric' => 'The :attribute must be at least :min.', 89 | 'file' => 'The :attribute must be at least :min kilobytes.', 90 | 'string' => 'The :attribute must be at least :min characters.', 91 | 'array' => 'The :attribute must have at least :min items.', 92 | ], 93 | 'not_in' => 'The selected :attribute is invalid.', 94 | 'not_regex' => 'The :attribute format is invalid.', 95 | 'numeric' => 'The :attribute must be a number.', 96 | 'present' => 'The :attribute field must be present.', 97 | 'regex' => 'The :attribute format is invalid.', 98 | 'required' => 'The :attribute field is required.', 99 | 'required_if' => 'The :attribute field is required when :other is :value.', 100 | 'required_unless' => 'The :attribute field is required unless :other is in :values.', 101 | 'required_with' => 'The :attribute field is required when :values is present.', 102 | 'required_with_all' => 'The :attribute field is required when :values are present.', 103 | 'required_without' => 'The :attribute field is required when :values is not present.', 104 | 'required_without_all' => 'The :attribute field is required when none of :values are present.', 105 | 'same' => 'The :attribute and :other must match.', 106 | 'size' => [ 107 | 'numeric' => 'The :attribute must be :size.', 108 | 'file' => 'The :attribute must be :size kilobytes.', 109 | 'string' => 'The :attribute must be :size characters.', 110 | 'array' => 'The :attribute must contain :size items.', 111 | ], 112 | 'starts_with' => 'The :attribute must start with one of the following: :values', 113 | 'string' => 'The :attribute must be a string.', 114 | 'timezone' => 'The :attribute must be a valid zone.', 115 | 'unique' => 'The :attribute has already been taken.', 116 | 'uploaded' => 'The :attribute failed to upload.', 117 | 'url' => 'The :attribute format is invalid.', 118 | 'uuid' => 'The :attribute must be a valid UUID.', 119 | 120 | /* 121 | |-------------------------------------------------------------------------- 122 | | Custom Validation Language Lines 123 | |-------------------------------------------------------------------------- 124 | | 125 | | Here you may specify custom validation messages for attributes using the 126 | | convention "attribute.rule" to name the lines. This makes it quick to 127 | | specify a specific custom language line for a given attribute rule. 128 | | 129 | */ 130 | 131 | 'custom' => [ 132 | 'attribute-name' => [ 133 | 'rule-name' => 'custom-message', 134 | ], 135 | ], 136 | 137 | /* 138 | |-------------------------------------------------------------------------- 139 | | Custom Validation Attributes 140 | |-------------------------------------------------------------------------- 141 | | 142 | | The following language lines are used to swap our attribute placeholder 143 | | with something more reader friendly such as "E-Mail Address" instead 144 | | of "email". This simply helps us make our message more expressive. 145 | | 146 | */ 147 | 148 | 'attributes' => [], 149 | 150 | ]; 151 | -------------------------------------------------------------------------------- /resources/views/permissions/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('permission::layouts.app') 2 | 3 | @section('styles') 4 | 5 | 6 | @endsection 7 | @section('content') 8 | 9 |'+result.role.name+'
'+result.permission.name+'