├── .gitattributes ├── LICENSE ├── README.md ├── composer.json ├── config └── permission.php ├── database ├── migrations │ ├── 2018_05_26_041218_create_roles_table.php │ ├── 2018_05_26_041708_create_role_users_table.php │ ├── 2019_03_15_095532_create_permissions_table.php │ └── 2019_03_15_095857_create_permission_role_table.php └── seeds │ ├── PermissionDatabaseSeeder.php │ ├── PermissionsSeeder.php │ ├── RolesSeeder.php │ └── UsersSeeder.php ├── mix-manifest.json ├── package-lock.json ├── package.json ├── resources ├── assets │ ├── dashboard │ │ ├── css │ │ │ ├── admin.css │ │ │ ├── app.css │ │ │ ├── custom.css │ │ │ └── sweetalert2.min.css │ │ ├── js │ │ │ ├── admin.min.js │ │ │ ├── app.js │ │ │ ├── custom.js │ │ │ └── sweetalert2.min.js │ │ └── vendor │ │ │ ├── bootstrap │ │ │ └── js │ │ │ │ └── bootstrap.bundle.min.js │ │ │ ├── datatables │ │ │ ├── dataTables.bootstrap4.min.css │ │ │ ├── dataTables.bootstrap4.min.js │ │ │ └── jquery.dataTables.min.js │ │ │ ├── jquery-easing │ │ │ └── jquery.easing.min.js │ │ │ └── jquery │ │ │ └── jquery.min.js │ ├── js │ │ ├── app.js │ │ ├── bootstrap.js │ │ └── components │ │ │ ├── DraggableMenu.vue │ │ │ ├── ExampleComponent.vue │ │ │ ├── Menu.vue │ │ │ ├── NestedDraggableMenu.vue │ │ │ ├── NestedRawDraggableMenu.vue │ │ │ └── Users.vue │ ├── lang │ │ └── en │ │ │ ├── auth.php │ │ │ ├── pagination.php │ │ │ ├── passwords.php │ │ │ └── validation.php │ └── sass │ │ ├── _variables.scss │ │ └── app.scss └── views │ ├── layouts │ ├── app.blade.php │ ├── master.blade.php │ └── partials │ │ ├── footer.blade.php │ │ ├── header.blade.php │ │ ├── sidebar.blade.php │ │ └── topbar.blade.php │ ├── permissions │ ├── doc.blade.php │ └── index.blade.php │ └── users │ └── index.blade.php ├── routes ├── demo.php └── permission.php ├── src ├── Commands │ ├── InstallPermission.php │ ├── InstallPermissionDemo.php │ ├── PublishPermissionResources.php │ └── PublishPermissionViews.php ├── Contracts │ ├── Permission.php │ ├── Role.php │ └── User.php ├── Facades │ └── Permission.php ├── Helpers │ └── helpers.php ├── Http │ ├── Controllers │ │ ├── Controller.php │ │ ├── PermissionController.php │ │ └── UserController.php │ └── Middleware │ │ └── RoleMiddleware.php ├── Models │ ├── Permission.php │ ├── Role.php │ └── User.php ├── Permission.php ├── PermissionGenarator.php ├── PermissionServiceProvider.php └── Traits │ ├── HasPermissions.php │ └── HasRoles.php └── webpack.mix.js /.gitattributes: -------------------------------------------------------------------------------- 1 | *.php linguist-language=PHP 2 | *.js linguist-language=PHP -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Md Abu Ahsan Basir 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # laravel-permission 2 | Laravel Multi Authentication 3 | 4 | Installation video : [click here](https://www.youtube.com/watch?v=2ZmhpYwrGNA) or click below image 5 | 6 | [![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/2ZmhpYwrGNA/0.jpg)](https://www.youtube.com/watch?v=2ZmhpYwrGNA) 7 | 8 | ## Note : Before Install and use this package run below command 9 | Before Laravel version 6.0 10 | ``` 11 | php artisan make:auth 12 | ``` 13 | From Laravel Version 6.0 14 | 15 | ``` 16 | 1. composer require laravel/ui 17 | 2. php artisan ui vue --auth 18 | 3. npm install 19 | 4. npm run dev 20 | ``` 21 | 22 | #### Install the Package 23 | 24 | ``` 25 | composer require codexshaper/laravel-permission 26 | ``` 27 | ##### Publish Resource, Configs, Migration and Seeding Database in a single command 28 | 29 | ``` 30 | php artisan permission:install 31 | ``` 32 | ##### Or Publish Resource, Configs, Migration and Seeding Database Manually 33 | 1. Publish Configs 34 | ``` 35 | php artisan vendor:publish --tag=permission.config 36 | ``` 37 | 2. Publish Seeds 38 | ``` 39 | php artisan vendor:publish --tag=permission.seeds 40 | ``` 41 | 3. Migrate Database 42 | ``` 43 | php artisan migrate 44 | ``` 45 | 4. Run composer dump autoload 46 | ``` 47 | composer dump-autoload 48 | ``` 49 | 5. Seeding Database 50 | ``` 51 | php artisan db:seed --class=PermissionDatabaseSeeder 52 | ``` 53 | 6. Add Routes 54 | ``` 55 | Route::group(['prefix' => config('permission.prefix'),'middleware'=>['role:admin']], function () { 56 | Permission::routes(); 57 | }); 58 | ``` 59 | ##### Import `use CodexShaper\Permission\Traits\HasRoles` or simply `use HasRoles` Trait into your `App\User` Model 60 | ``` 61 | namespace App; 62 | 63 | use CodexShaper\Permission\Traits\HasRoles; 64 | 65 | class User extends Authenticatable 66 | { 67 | use HasRoles; 68 | } 69 | ``` 70 | ##### Check Permission go to ```/admin/laravel-permission``` 71 | 72 | ###### Install Demo 73 | ``` 74 | php artisan permission:install:demo 75 | ``` 76 | ##### Demo url ```/admin/permissions``` 77 | 78 | ###### Publish ```Views``` 79 | ``` 80 | php artisan permission:publish:views 81 | ``` 82 | 83 | ##### Publish ```Resources``` 84 | ``` 85 | php artisan permission:publish:resources 86 | ``` 87 | #### For Overriding Views and Resources, Change your config file ```/config/permission.php``` 88 | ``` 89 | 'resources_path' => 'resources/views/vendor/permissions/assets', 90 | 'views' => 'resources/views/vendor/permissions/views', 91 | ``` 92 | # Permission 93 | ``` 94 | use CodexShaper\Permission\Models\Permission; 95 | 96 | $permission = Permission::create([ 97 | 'name' => 'Browse', 98 | 'slug' => slug('browse'), 99 | 'created_at' => now(), 100 | 'updated_at' => now(), 101 | ]); 102 | ``` 103 | 104 | #### Give Permission to Roles 105 | ``` 106 | // Create Role before set permission 107 | // $roles = [role_slug_or_id] ex: ['admin',1,2,'author'] 108 | $permission->givePermissionToRoles( $roles ); 109 | ``` 110 | #### Update permission roles 111 | ``` 112 | $role_ids = [1,3,5] 113 | $permission->syncPermissionToRoles( $role_ids ); 114 | ``` 115 | #### Delete permission roles 116 | ``` 117 | // Delete specific Roles 118 | $role_ids = [1,3,5]; 119 | $permission->revokePermissionsFromRoles( $role_ids ); 120 | // Delete all roles for current permission 121 | $permission->revokePermissionsFromRoles(); 122 | ``` 123 | # Role 124 | ``` 125 | use CodexShaper\Permission\Models\Role; 126 | 127 | $admin = Role::create([ 128 | 'name' => 'Super Admin', 129 | 'slug' => 'admin', 130 | 'created_at' => now(), 131 | 'updated_at' => now(), 132 | ]); 133 | ``` 134 | #### Assign Permission 135 | ``` 136 | $admin->assignPermissions([ 137 | 'browse', 138 | 'read', 139 | 'edit', 140 | 'add', 141 | 'delete' 142 | ]); 143 | ``` 144 | #### Update Permission 145 | ``` 146 | $permission_ids = [1,3,5] 147 | $admin->syncPermissions( $permission_ids ); 148 | ``` 149 | #### Delete permission 150 | ``` 151 | // Delete specific Permissions 152 | $permission_ids = [1,3,5]; 153 | $admin->revokePermissions( $permission_ids ); 154 | // Delete all roles for current roles 155 | $admin->revokePermissions(); 156 | ``` 157 | #### Check Permission 158 | ``` 159 | $admin->hasPermission( $permission_slug ); 160 | ``` 161 | # User 162 | ``` 163 | use App\User; 164 | 165 | $user = new User; 166 | $user->name = 'John Doe'; 167 | $user->email = 'john@gmail.com'; 168 | $user->password = Hash::make('password'); 169 | $user->save(); 170 | $user->assignRoles('admin'); 171 | ``` 172 | #### Assign Roles into existing user 173 | ``` 174 | $user = User::find(1); 175 | $user->assignRoles('admin'); 176 | ``` 177 | #### Assign Multiple roles 178 | ``` 179 | $user = User::find(1); 180 | // Use pipe(|) 181 | $user->assignRoles('admin|client|customer'); 182 | // Or use comma(,) 183 | $user->assignRoles('admin,client,customer'); 184 | // Or use space 185 | $user->assignRoles('admin client customer'); 186 | // Or Mixed 187 | $user->assignRoles('admin client,customer|write'); 188 | // Pass custom separators 189 | $separators = ',.| '; 190 | $user->assignRoles('admin client,customer|write', $separators); 191 | ``` 192 | #### Update Roles 193 | ``` 194 | $role_ids = [1,2,3]; 195 | $user->syncRoles( $role_ids ); 196 | ``` 197 | #### Delete Roles 198 | ``` 199 | // Delete specific Roles for current User 200 | $role_ids = [1,3,5]; 201 | $user->revokeRoles( $role_ids ); 202 | // Delete all roles for current user 203 | $user->revokeRoles(); 204 | ``` 205 | #### Check Role 206 | ``` 207 | $user->hasRole( $role_slug ); 208 | ``` 209 | # Add Middleware on route 210 | ``` 211 | Route::group(['middleware'=>['role:admin']],function(){ 212 | // Routes 213 | }); 214 | ``` 215 | 216 | # View Directories 217 | ``` 218 | @can('browse') 219 |

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 | [![License](http://img.shields.io/:license-mit-blue.svg?style=flat-square)](http://badges.mit-license.org) 244 | 245 | - **[MIT license](http://opensource.org/licenses/mit-license.php)** 246 | - Copyright 2019 © CodexShaper. 247 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codexshaper/laravel-permission", 3 | "description": "Laravel Multiple Authentication", 4 | "type": "library", 5 | "require": {}, 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "Md Abu Ahsan Basir", 10 | "email": "maab.career@gmail.com" 11 | } 12 | ], 13 | "minimum-stability": "dev", 14 | "autoload": { 15 | "psr-4": { 16 | "CodexShaper\\Permission\\": "src/" 17 | } 18 | }, 19 | "extra": { 20 | "laravel": { 21 | "providers": [ 22 | "CodexShaper\\Permission\\PermissionServiceProvider" 23 | ], 24 | "aliases": { 25 | "Permission": "CodexShaper\\Permission\\Facades\\Permission", 26 | "Role": "CodexShaper\\Permission\\Models\\Role", 27 | "RolePermission": "CodexShaper\\Permission\\Models\\Permission", 28 | "HasRoles": "CodexShaper\\Permission\\Traits\\HasRoles", 29 | "HasPermissions": "CodexShaper\\Permission\\Traits\\HasPermissions" 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /config/permission.php: -------------------------------------------------------------------------------- 1 | '/admin', 5 | 'namespace' => '\CodexShaper\Permission', 6 | 'controller_namespace' => '\CodexShaper\Permission\Http\Controllers', 7 | 'models' => [ 8 | 'permission' => CodexShaper\Permission\Models\Permission::class, 9 | 'role' => CodexShaper\Permission\Models\Role::class, 10 | ], 11 | 'table_names' => [ 12 | 'roles' => 'roles', 13 | 'role_users' => 'role_users', 14 | 'permissions' => 'permissions', 15 | 'permission_role' => 'permission_role', 16 | ], 17 | 'resources_path' => 'vendor/codexshaper/laravel-permission/resources/assets/', 18 | 'views' => 'vendor/codexshaper/laravel-permission/resources/views', 19 | 20 | ]; -------------------------------------------------------------------------------- /database/migrations/2018_05_26_041218_create_roles_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('slug'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('roles'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/migrations/2018_05_26_041708_create_role_users_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->integer('role_id'); 19 | $table->integer('user_id'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('role_users'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/migrations/2019_03_15_095532_create_permissions_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('slug'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('permissions'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/migrations/2019_03_15_095857_create_permission_role_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->integer('permission_id'); 19 | $table->integer('role_id'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('permission_role'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/seeds/PermissionDatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | seedersPath.$class.'.php'; 23 | if ( file_exists( $file ) && !class_exists($class)) { 24 | require_once $file; 25 | } 26 | with(new $class())->run(); 27 | } 28 | 29 | // $this->call(PermissionsSeeder::class); 30 | // $this->call(RolesSeeder::class); 31 | // $this->call(UsersSeeder::class); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/seeds/PermissionsSeeder.php: -------------------------------------------------------------------------------- 1 | 'Browse', 18 | 'slug' => slug('browse'), 19 | 'created_at' => now(), 20 | 'updated_at' => now(), 21 | ]); 22 | 23 | Permission::create([ 24 | 25 | 'name' => 'Read', 26 | 'slug' => slug('read'), 27 | 'created_at' => now(), 28 | 'updated_at' => now(), 29 | ]); 30 | 31 | Permission::create([ 32 | 33 | 'name' => 'Edit', 34 | 'slug' => slug('edit'), 35 | 'created_at' => now(), 36 | 'updated_at' => now(), 37 | ]); 38 | 39 | Permission::create([ 40 | 41 | 'name' => 'Add', 42 | 'slug' => slug('add'), 43 | 'created_at' => now(), 44 | 'updated_at' => now(), 45 | ]); 46 | 47 | Permission::create([ 48 | 49 | 'name' => 'Delete', 50 | 'slug' => slug('delete'), 51 | 'created_at' => now(), 52 | 'updated_at' => now(), 53 | ]); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /database/seeds/RolesSeeder.php: -------------------------------------------------------------------------------- 1 | 'Super Admin', 20 | 'slug' => 'admin', 21 | 'created_at' => now(), 22 | 'updated_at' => now(), 23 | ]); 24 | $admin->assignPermissions([ 25 | 'browse', 26 | 'read', 27 | 'edit', 28 | 'add', 29 | 'delete' 30 | ]); 31 | 32 | $manager = Role::create([ 33 | 34 | 'name' => 'Manager', 35 | 'slug' => 'manager', 36 | 'created_at' => now(), 37 | 'updated_at' => now(), 38 | ])->assignPermissions([ 39 | 'browse', 40 | 'read', 41 | 'edit', 42 | 'add', 43 | ]); 44 | 45 | $user = Role::create([ 46 | 47 | 'name' => 'User', 48 | 'slug' => 'user', 49 | 'created_at' => now(), 50 | 'updated_at' => now(), 51 | ])->assignPermissions([ 52 | 'browse', 53 | 'read', 54 | ]); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /database/seeds/UsersSeeder.php: -------------------------------------------------------------------------------- 1 | name = "Admin"; 19 | $user->email = "admin@admin.com"; 20 | $user->password = Hash::make("123456789"); 21 | $user->save(); 22 | $user->assignRoles('admin,manager,user'); 23 | // $admin->role()->updateExistingPivot($admin_role, ['created_at'=>now(),'updated_at'=>now()]); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/resources/assets/dashboard/js/app.js": "/resources/assets/dashboard/js/app.js", 3 | "/resources/assets/dashboard/css/app.css": "/resources/assets/dashboard/css/app.css" 4 | } 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 6 | "watch": "npm run development -- --watch", 7 | "watch-poll": "npm run watch -- --watch-poll", 8 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 9 | "prod": "npm run production", 10 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.19", 14 | "bootstrap": "^4.1.0", 15 | "cross-env": "^5.1", 16 | "jquery": "^3.2", 17 | "laravel-mix": "^4.0.7", 18 | "lodash": "^4.17.13", 19 | "popper.js": "^1.12", 20 | "resolve-url-loader": "^2.3.1", 21 | "sass": "^1.15.2", 22 | "sass-loader": "^7.1.0", 23 | "vue": "^2.5.17", 24 | "vue-template-compiler": "^2.6.10" 25 | }, 26 | "dependencies": { 27 | "sweetalert2": "^8.16.3" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /resources/assets/dashboard/css/custom.css: -------------------------------------------------------------------------------- 1 | .permission-list { 2 | list-style: none; 3 | padding: 0px; 4 | margin: 0px; 5 | } -------------------------------------------------------------------------------- /resources/assets/dashboard/css/sweetalert2.min.css: -------------------------------------------------------------------------------- 1 | @charset "UTF-8";@-webkit-keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@-webkit-keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@-webkit-keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.875em;width:1.5625em}}@-webkit-keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@-webkit-keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@-webkit-keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@-webkit-keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}body.swal2-toast-shown .swal2-container{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-shown{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;right:0;bottom:auto;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{top:0;right:auto;bottom:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{top:50%;right:auto;bottom:auto;left:0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;right:0;bottom:auto;left:auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{top:auto;right:auto;bottom:0;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;right:0;bottom:0;left:auto}body.swal2-toast-column .swal2-toast{flex-direction:column;align-items:stretch}body.swal2-toast-column .swal2-toast .swal2-actions{flex:1;align-self:stretch;height:2.2em;margin-top:.3125em}body.swal2-toast-column .swal2-toast .swal2-loading{justify-content:center}body.swal2-toast-column .swal2-toast .swal2-input{height:2em;margin:.3125em auto;font-size:1em}body.swal2-toast-column .swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast{flex-direction:row;align-items:center;width:auto;padding:.625em;overflow-y:hidden;box-shadow:0 0 .625em #d9d9d9}.swal2-popup.swal2-toast .swal2-header{flex-direction:row}.swal2-popup.swal2-toast .swal2-title{flex-grow:1;justify-content:flex-start;margin:0 .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{position:static;width:.8em;height:.8em;line-height:.8}.swal2-popup.swal2-toast .swal2-content{justify-content:flex-start;font-size:1em}.swal2-popup.swal2-toast .swal2-icon{width:2em;min-width:2em;height:2em;margin:0}.swal2-popup.swal2-toast .swal2-icon::before{display:flex;align-items:center;font-size:2em;font-weight:700}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-popup.swal2-toast .swal2-icon::before{font-size:.25em}}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{flex-basis:auto!important;width:auto;height:auto;margin:0 .3125em}.swal2-popup.swal2-toast .swal2-styled{margin:0 .3125em;padding:.3125em .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-styled:focus{box-shadow:0 0 0 .0625em #fff,0 0 0 .125em rgba(50,100,150,.4)}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.8em;left:-.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast.swal2-show{-webkit-animation:swal2-toast-show .5s;animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{-webkit-animation:swal2-toast-hide .1s forwards;animation:swal2-toast-hide .1s forwards}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-toast-animate-success-line-tip .75s;animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-toast-animate-success-line-long .75s;animation:swal2-toast-animate-success-line-long .75s}@-webkit-keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@-webkit-keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@-webkit-keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@-webkit-keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-shown{top:auto;right:auto;bottom:auto;left:auto;max-width:calc(100% - .625em * 2);background-color:transparent}body.swal2-no-backdrop .swal2-shown>.swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}body.swal2-no-backdrop .swal2-shown.swal2-top{top:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-top-left,body.swal2-no-backdrop .swal2-shown.swal2-top-start{top:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-top-end,body.swal2-no-backdrop .swal2-shown.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-shown.swal2-center{top:50%;left:50%;transform:translate(-50%,-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-left,body.swal2-no-backdrop .swal2-shown.swal2-center-start{top:50%;left:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-center-end,body.swal2-no-backdrop .swal2-shown.swal2-center-right{top:50%;right:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom{bottom:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-shown.swal2-bottom-left,body.swal2-no-backdrop .swal2-shown.swal2-bottom-start{bottom:0;left:0}body.swal2-no-backdrop .swal2-shown.swal2-bottom-end,body.swal2-no-backdrop .swal2-shown.swal2-bottom-right{right:0;bottom:0}.swal2-container{display:flex;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:.625em;overflow-x:hidden;background-color:transparent;-webkit-overflow-scrolling:touch}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-left,.swal2-container.swal2-top-start{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-left,.swal2-container.swal2-center-start{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-left,.swal2-container.swal2-bottom-start{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-bottom-end>:first-child,.swal2-container.swal2-bottom-left>:first-child,.swal2-container.swal2-bottom-right>:first-child,.swal2-container.swal2-bottom-start>:first-child,.swal2-container.swal2-bottom>:first-child{margin-top:auto}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex!important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-bottom,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-top{align-items:center}.swal2-container.swal2-grow-column.swal2-bottom-left,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-top-start{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-bottom-right,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-top-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-container .swal2-modal{margin:0!important}}.swal2-container.swal2-fade{transition:background-color .1s}.swal2-container.swal2-shown{background-color:rgba(0,0,0,.4)}.swal2-popup{display:none;position:relative;box-sizing:border-box;flex-direction:column;justify-content:center;width:32em;max-width:100%;padding:1.25em;border:none;border-radius:.3125em;background:#fff;font-family:inherit;font-size:1rem}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-header{display:flex;flex-direction:column;align-items:center}.swal2-title{position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#595959;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-actions{display:flex;z-index:1;flex-wrap:wrap;align-items:center;justify-content:center;width:100%;margin:1.25em auto 0}.swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-actions.swal2-loading .swal2-styled.swal2-confirm{box-sizing:border-box;width:2.5em;height:2.5em;margin:.46875em;padding:0;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:.25em solid transparent;border-radius:100%;border-color:transparent;background-color:transparent!important;color:transparent;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-actions.swal2-loading .swal2-styled.swal2-cancel{margin-right:30px;margin-left:30px}.swal2-actions.swal2-loading :not(.swal2-styled).swal2-confirm::after{content:"";display:inline-block;width:15px;height:15px;margin-left:5px;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border:3px solid #999;border-radius:50%;border-right-color:transparent;box-shadow:1px 1px 1px #fff}.swal2-styled{margin:.3125em;padding:.625em 2em;box-shadow:none;font-weight:500}.swal2-styled:not([disabled]){cursor:pointer}.swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#3085d6;color:#fff;font-size:1.0625em}.swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#aaa;color:#fff;font-size:1.0625em}.swal2-styled:focus{outline:0;box-shadow:0 0 0 2px #fff,0 0 0 4px rgba(50,100,150,.4)}.swal2-styled::-moz-focus-inner{border:0}.swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#545454;font-size:1em}.swal2-image{max-width:100%;margin:1.25em auto}.swal2-close{position:absolute;z-index:2;top:0;right:0;justify-content:center;width:1.2em;height:1.2em;padding:0;overflow:hidden;transition:color .1s ease-out;border:none;border-radius:0;outline:initial;background:0 0;color:#ccc;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer}.swal2-close:hover{transform:none;background:0 0;color:#f27474}.swal2-content{z-index:1;justify-content:center;margin:0;padding:0;color:#545454;font-size:1.125em;font-weight:400;line-height:normal;text-align:center;word-wrap:break-word}.swal2-checkbox,.swal2-file,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:1em auto}.swal2-file,.swal2-input,.swal2-textarea{box-sizing:border-box;width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #d9d9d9;border-radius:.1875em;background:inherit;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);color:inherit;font-size:1.125em}.swal2-file.swal2-inputerror,.swal2-input.swal2-inputerror,.swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-file:focus,.swal2-input:focus,.swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:0 0 3px #c4e6f5}.swal2-file::-webkit-input-placeholder,.swal2-input::-webkit-input-placeholder,.swal2-textarea::-webkit-input-placeholder{color:#ccc}.swal2-file::-moz-placeholder,.swal2-input::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#ccc}.swal2-file:-ms-input-placeholder,.swal2-input:-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-file::-ms-input-placeholder,.swal2-input::-ms-input-placeholder,.swal2-textarea::-ms-input-placeholder{color:#ccc}.swal2-file::placeholder,.swal2-input::placeholder,.swal2-textarea::placeholder{color:#ccc}.swal2-range{margin:1em auto;background:inherit}.swal2-range input{width:80%}.swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}.swal2-range input,.swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}.swal2-input{height:2.625em;padding:0 .75em}.swal2-input[type=number]{max-width:10em}.swal2-file{background:inherit;font-size:1.125em}.swal2-textarea{height:6.75em;padding:.75em}.swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:inherit;color:inherit;font-size:1.125em}.swal2-checkbox,.swal2-radio{align-items:center;justify-content:center;background:inherit;color:inherit}.swal2-checkbox label,.swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-checkbox input,.swal2-radio input{margin:0 .4em}.swal2-validation-message{display:none;align-items:center;justify-content:center;padding:.625em;overflow:hidden;background:#f0f0f0;color:#666;font-size:1em;font-weight:300}.swal2-validation-message::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;zoom:normal;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}@supports (-ms-accelerator:true){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@-moz-document url-prefix(){.swal2-close:focus{outline:2px solid rgba(50,100,150,.4)}}.swal2-icon{position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:1.25em auto 1.875em;zoom:normal;border:.25em solid transparent;border-radius:50%;font-family:inherit;line-height:5em;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon::before{display:flex;align-items:center;height:92%;font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-warning::before{content:"!"}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-info::before{content:"i"}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-question::before{content:"?"}.swal2-icon.swal2-question.swal2-arabic-question-mark::before{content:"؟"}.swal2-icon.swal2-success{border-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-.25em;left:-.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.875em;width:1.5625em;transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}.swal2-progress-steps{align-items:center;margin:0 0 1.25em;padding:0;background:inherit;font-weight:600}.swal2-progress-steps li{display:inline-block;position:relative}.swal2-progress-steps .swal2-progress-step{z-index:20;width:2em;height:2em;border-radius:2em;background:#3085d6;color:#fff;line-height:2em;text-align:center}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#3085d6}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}.swal2-progress-steps .swal2-progress-step-line{z-index:10;width:2.5em;height:.4em;margin:0 -1px;background:#3085d6}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-show.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-hide.swal2-noanimation{-webkit-animation:none;animation:none}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-animate-success-icon .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-animate-success-icon .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-animate-success-icon .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-animate-error-icon{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-animate-error-icon .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}@-webkit-keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static!important}} 2 | 3 | -------------------------------------------------------------------------------- /resources/assets/dashboard/js/admin.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Start Bootstrap - SB Admin 2 v4.0.6 (https://startbootstrap.com/template-overviews/sb-admin-2) 3 | * Copyright 2013-2019 Start Bootstrap 4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-sb-admin-2/blob/master/LICENSE) 5 | */ 6 | 7 | !function(t){"use strict";t("#sidebarToggle, #sidebarToggleTop").on("click",function(o){t("body").toggleClass("sidebar-toggled"),t(".sidebar").toggleClass("toggled"),t(".sidebar").hasClass("toggled")&&t(".sidebar .collapse").collapse("hide")}),t(window).resize(function(){t(window).width()<768&&t(".sidebar .collapse").collapse("hide")}),t("body.fixed-nav .sidebar").on("mousewheel DOMMouseScroll wheel",function(o){if(768View '; 24 | var editBtn = 'Edit '; 25 | var deleteBtn = 'Delete '; 26 | 27 | $('#role_table').DataTable().row.add([ 28 | result.role.name, viewBtn + editBtn + deleteBtn 29 | ]).draw(); 30 | 31 | form.trigger("reset"); 32 | 33 | $("#addRoleModal").modal('hide'); 34 | $('body').removeClass('modal-open'); 35 | $('.modal-backdrop').fadeOut(); 36 | } 37 | }, 38 | error: function(err){ 39 | // console.log( err ); 40 | } 41 | }); 42 | }); 43 | 44 | $(document).on("click",".view_role", function(e){ 45 | e.preventDefault(); 46 | 47 | var id = $(this).data('id'); 48 | // var action = $(this).data('action'); 49 | 50 | $.ajax({ 51 | url: permission_prefix+'/role/'+id, 52 | method: 'GET', 53 | dataType: 'json', 54 | data: { 55 | 'id' : id 56 | }, 57 | success: function(result){ 58 | // console.log( result ); 59 | if( result.success == true ){ 60 | var form = $('#edit_role_form'); 61 | $("#role_id").val(id); 62 | 63 | var role_name_html = '

'+result.role.name+'

'; 64 | var permissions_html = '
'; 65 | 66 | if( result.permissions.length > 0 ) { 67 | var listItem = ''; 68 | $.each(result.permissions, function( index, permission ){ 69 | listItem = listItem + '
  • '; 70 | }); 71 | } 72 | 73 | var permissions_html = permissions_html + '
      '+listItem+'
  • ' 74 | 75 | $("#viewRoleModal").find(".modal-body").html(role_name_html+permissions_html); 76 | } 77 | }, 78 | error: function( err ){ 79 | // console.log(err); 80 | } 81 | }); 82 | }); 83 | 84 | $(document).on("click",".edit_role", function(e){ 85 | e.preventDefault(); 86 | 87 | var id = $(this).data('id'); 88 | var action = $(this).data('action'); 89 | 90 | $.ajax({ 91 | url: action, 92 | method: 'GET', 93 | dataType: 'json', 94 | data: { 95 | 'id' : id 96 | }, 97 | success: function(result){ 98 | // console.log( result ); 99 | if( result.success == true ){ 100 | document.getElementById("edit_role_form").reset(); 101 | var form = $('#edit_role_form'); 102 | form.find('#role_name').val(""); 103 | form.find(".edit_permissions").each(function(i, v){ 104 | $(this).removeAttr("checked"); 105 | }); 106 | $("#role_id").val(id); 107 | 108 | form.find('#role_name').val(result.role.name); 109 | 110 | if( result.permissions.length > 0 ) { 111 | $.each(result.permissions, function( index, permission ){ 112 | form.find(".edit_permissions").each(function(i, v){ 113 | if( $(this).val() == permission.id ) { 114 | $(this).attr('checked', 'checked'); 115 | } 116 | }); 117 | }); 118 | } 119 | } 120 | }, 121 | error: function( err ){ 122 | // console.log(err); 123 | } 124 | }); 125 | }); 126 | 127 | $(document).on("submit","#edit_role_form", function(e){ 128 | e.preventDefault(); 129 | var form = $(this); 130 | var id = $('#role_id').val(); 131 | var action = form.attr("action"); 132 | var method = form.find('input[name="_method"]').val(); 133 | 134 | var formData = new FormData(form[0]); 135 | 136 | $.ajax({ 137 | url: action, 138 | method: 'POST', 139 | dataType: 'json', 140 | data: formData, 141 | contentType: false, 142 | cache: false, 143 | processData: false, 144 | success: function( result ){ 145 | // console.log( result ); 146 | if( result.success == true ) { 147 | var row_id = $('#row_'+result.role.id).data("row"); 148 | 149 | var viewBtn = 'View '; 150 | var editBtn = 'Edit '; 151 | var deleteBtn = 'Delete '; 152 | 153 | $('#role_table').DataTable().row(row_id).data([ 154 | result.role.name, viewBtn + editBtn + deleteBtn 155 | ]).draw(); 156 | 157 | form.trigger("reset"); 158 | 159 | $("#editRoleModal").modal('hide'); 160 | $('body').removeClass('modal-open'); 161 | $('.modal-backdrop').fadeOut(); 162 | } 163 | }, 164 | error: function( err ) { 165 | // console.log( err ); 166 | } 167 | }); 168 | }); 169 | 170 | $(document).on("click",".delete_role", function(e){ 171 | e.preventDefault(); 172 | Swal.fire({ 173 | title: 'Are you sure?', 174 | text: 'You will not be able to recover this Role', 175 | type: 'warning', 176 | showCancelButton: true, 177 | confirmButtonText: 'Yes, delete it!', 178 | cancelButtonText: 'No, keep it' 179 | }).then((result) => { 180 | if (result.value) { 181 | $.ajax({ 182 | url: permission_prefix+'/role', 183 | method: 'POST', 184 | dataType: 'json', 185 | data: { 186 | "_method": 'DELETE', 187 | "_token": $('meta[name="csrf-token"]').attr('content'), 188 | 'role_id': $(this).data('id'), 189 | }, 190 | success: function(result){ 191 | // console.log( result ); 192 | if( result.success == true ) { 193 | // console.log( data ); 194 | Swal.fire( 195 | 'Deleted!', 196 | 'Role Deleted Successfully', 197 | 'success' 198 | ); 199 | 200 | var row_id = $('#row_'+result.role.id).data("row"); 201 | $('#role_table').DataTable().row(row_id).remove().draw(); 202 | 203 | // $(".menu-container").html(data.html); 204 | 205 | // $('body').removeClass('modal-open'); 206 | // $('.modal-backdrop').fadeOut(); 207 | } 208 | }, 209 | error: function(err){ 210 | // console.log( err ); 211 | } 212 | }); 213 | } else if (result.dismiss === Swal.DismissReason.cancel) { 214 | Swal.fire( 215 | 'Cancelled', 216 | 'Your imaginary file is safe :)', 217 | 'error' 218 | ) 219 | } 220 | }) 221 | }); 222 | 223 | /* 224 | * Permission 225 | */ 226 | 227 | $(document).on("submit","#add_permission_form",function(e){ 228 | e.preventDefault(); 229 | 230 | var form = $(this); 231 | var action = form.attr('action'); 232 | var method = form.attr('method'); 233 | 234 | var formData = new FormData(form[0]); 235 | 236 | $.ajax({ 237 | url: action, 238 | method: method, 239 | dataType: 'json', 240 | data: formData, 241 | contentType: false, 242 | cache: false, 243 | processData: false, 244 | success: function(result){ 245 | // console.log( result ); 246 | if( result.success == true ) { 247 | 248 | var viewBtn = 'View '; 249 | var editBtn = 'Edit '; 250 | var deleteBtn = 'Delete '; 251 | 252 | $('#permission_table').DataTable().row.add([ 253 | result.permission.name, viewBtn + editBtn + deleteBtn 254 | ]).draw(); 255 | 256 | form.trigger("reset"); 257 | 258 | $("#addPermissionModal").modal('hide'); 259 | $('body').removeClass('modal-open'); 260 | $('.modal-backdrop').fadeOut(); 261 | } 262 | }, 263 | error: function(err){ 264 | // console.log( err ); 265 | } 266 | }); 267 | }); 268 | 269 | $(document).on("click",".view_permission", function(e){ 270 | e.preventDefault(); 271 | 272 | var id = $(this).data('id'); 273 | // var action = $(this).data('action'); 274 | 275 | $.ajax({ 276 | url: permission_prefix+'/permission/'+id, 277 | method: 'GET', 278 | dataType: 'json', 279 | data: { 280 | 'id' : id 281 | }, 282 | success: function(result){ 283 | // console.log( result ); 284 | if( result.success == true ){ 285 | var form = $('#edit_permission_form'); 286 | $("#permission_id").val(id); 287 | 288 | var permission_html = '

    '+result.permission.name+'

    '; 289 | 290 | $("#viewPermissionModal").find(".modal-body").html(permission_html); 291 | } 292 | }, 293 | error: function( err ){ 294 | // console.log(err); 295 | } 296 | }); 297 | }); 298 | 299 | $(document).on("click",".edit_permission", function(e){ 300 | e.preventDefault(); 301 | 302 | var id = $(this).data('id'); 303 | var action = $(this).data('action'); 304 | 305 | $.ajax({ 306 | url: action, 307 | method: 'GET', 308 | dataType: 'json', 309 | data: { 310 | 'id' : id 311 | }, 312 | success: function(result){ 313 | // console.log( result ); 314 | if( result.success == true ){ 315 | 316 | document.getElementById("edit_permission_form").reset(); 317 | var form = $('#edit_permission_form'); 318 | form.find('#role_name').val(""); 319 | form.find(".edit_roles").each(function(i, v){ 320 | $(this).removeAttr("checked"); 321 | }); 322 | $("#permission_id").val(id); 323 | 324 | form.find('#permission_name').val(result.permission.name); 325 | 326 | if( result.roles.length > 0 ) { 327 | $.each(result.roles, function( index, role ){ 328 | form.find(".edit_roles").each(function(i, v){ 329 | if( $(this).val() == role.id ) { 330 | $(this).attr('checked', 'checked'); 331 | } 332 | }); 333 | }); 334 | } 335 | } 336 | }, 337 | error: function( err ){ 338 | // console.log(err); 339 | } 340 | }); 341 | }); 342 | 343 | $(document).on("submit","#edit_permission_form", function(e){ 344 | e.preventDefault(); 345 | var form = $(this); 346 | var id = $('#permission_id').val(); 347 | var action = form.attr("action"); 348 | var method = form.find('input[name="_method"]').val(); 349 | 350 | var formData = new FormData(form[0]); 351 | 352 | $.ajax({ 353 | url: action, 354 | method: 'POST', 355 | dataType: 'json', 356 | data: formData, 357 | contentType: false, 358 | cache: false, 359 | processData: false, 360 | success: function( result ){ 361 | // console.log( result ); 362 | if( result.success == true ) { 363 | var row_id = $('#row_'+result.permission.id).data("row"); 364 | 365 | var viewBtn = 'View '; 366 | var editBtn = 'Edit '; 367 | var deleteBtn = 'Delete '; 368 | 369 | $('#permission_table').DataTable().row(row_id).data([ 370 | result.permission.name, viewBtn + editBtn + deleteBtn 371 | ]).draw(); 372 | 373 | form.trigger("reset"); 374 | 375 | $("#editPermissionModal").modal('hide'); 376 | $('body').removeClass('modal-open'); 377 | $('.modal-backdrop').fadeOut(); 378 | } 379 | }, 380 | error: function( err ) { 381 | // console.log( err ); 382 | } 383 | }); 384 | }); 385 | 386 | $(document).on("click",".delete_permission", function(e){ 387 | e.preventDefault(); 388 | Swal.fire({ 389 | title: 'Are you sure?', 390 | text: 'You will not be able to recover this Permission', 391 | type: 'warning', 392 | showCancelButton: true, 393 | confirmButtonText: 'Yes, delete it!', 394 | cancelButtonText: 'No, keep it' 395 | }).then((result) => { 396 | if (result.value) { 397 | $.ajax({ 398 | url: permission_prefix+'/permission', 399 | method: 'POST', 400 | dataType: 'json', 401 | data: { 402 | "_method": 'DELETE', 403 | "_token": $('meta[name="csrf-token"]').attr('content'), 404 | 'permission_id': $(this).data('id'), 405 | }, 406 | success: function(result){ 407 | // console.log( result ); 408 | if( result.success == true ) { 409 | // console.log( data ); 410 | Swal.fire( 411 | 'Deleted!', 412 | 'Permission Deleted Successfully', 413 | 'success' 414 | ); 415 | 416 | var row_id = $('#row_'+result.permission.id).data("row"); 417 | $('#permission_table').DataTable().row(row_id).remove().draw(); 418 | 419 | // $(".menu-container").html(data.html); 420 | 421 | // $('body').removeClass('modal-open'); 422 | // $('.modal-backdrop').fadeOut(); 423 | } 424 | }, 425 | error: function(err){ 426 | // console.log( err ); 427 | } 428 | }); 429 | } else if (result.dismiss === Swal.DismissReason.cancel) { 430 | Swal.fire( 431 | 'Cancelled', 432 | 'Your imaginary file is safe :)', 433 | 'error' 434 | ) 435 | } 436 | }) 437 | }); 438 | })(jQuery); -------------------------------------------------------------------------------- /resources/assets/dashboard/vendor/datatables/dataTables.bootstrap4.min.css: -------------------------------------------------------------------------------- 1 | table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:0.85em;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:before,table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:0.9em;display:block;opacity:0.3}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;content:"\2191"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{right:0.5em;content:"\2193"}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-sm>thead>tr>th{padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:0.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} 2 | -------------------------------------------------------------------------------- /resources/assets/dashboard/vendor/datatables/dataTables.bootstrap4.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | DataTables Bootstrap 4 integration 3 | ©2011-2017 SpryMedia Ltd - datatables.net/license 4 | */ 5 | (function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(a){return b(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net")(a,d).$;return b(d,a,a.document)}:b(jQuery,window,document)})(function(b,a,d,m){var f=b.fn.dataTable;b.extend(!0,f.defaults,{dom:"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", 6 | renderer:"bootstrap"});b.extend(f.ext.classes,{sWrapper:"dataTables_wrapper dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"custom-select custom-select-sm form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});f.ext.renderer.pageButton.bootstrap=function(a,h,r,s,j,n){var o=new f.Api(a),t=a.oClasses,k=a.oLanguage.oPaginate,u=a.oLanguage.oAria.paginate||{},e,g,p=0,q=function(d,f){var l,h,i,c,m=function(a){a.preventDefault(); 7 | !b(a.currentTarget).hasClass("disabled")&&o.page()!=a.data.action&&o.page(a.data.action).draw("page")};l=0;for(h=f.length;l", 8 | {"class":t.sPageButton+" "+g,id:0===r&&"string"===typeof c?a.sTableId+"_"+c:null}).append(b("",{href:"#","aria-controls":a.sTableId,"aria-label":u[c],"data-dt-idx":p,tabindex:a.iTabIndex,"class":"page-link"}).html(e)).appendTo(d),a.oApi._fnBindAction(i,{action:c},m),p++)}},i;try{i=b(h).find(d.activeElement).data("dt-idx")}catch(v){}q(b(h).empty().html('