commit 911731a0e6c0901de53465f839504ad3eb606efc Author: Daeng Deni Mardaeni Date: Tue May 16 11:51:54 2023 +0700 Initial Commit diff --git a/Config/.gitkeep b/Config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Config/config.php b/Config/config.php new file mode 100644 index 0000000..c055c3f --- /dev/null +++ b/Config/config.php @@ -0,0 +1,5 @@ + 'UserManager' +]; diff --git a/DataTables/PermissionsDataTable.php b/DataTables/PermissionsDataTable.php new file mode 100644 index 0000000..41394e4 --- /dev/null +++ b/DataTables/PermissionsDataTable.php @@ -0,0 +1,103 @@ +eloquent($query) + ->filter(function ($query) { + if (request()->has('search')) { + $search = request()->get('search'); + $query->where('name', 'like', "%" . $search['value'] . "%"); + } + }) + ->rawColumns(['action','role']) + ->addIndexColumn() + ->addColumn('name', function (PermissionGroup $model) { + return $model->name; + }) + ->addColumn('role', function (PermissionGroup $model){ + $role = $model->roles($model); + return view('usermanager::users.permissions._checkbox', compact('role')); + }) + ->addColumn('action', function (PermissionGroup $model) { + return view('usermanager::users.permissions._action', compact('model')); + }); + } + + /** + * Get query source of dataTable. + * + * @param \Modules\UserManager\Entities\PermissionGroup $model + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function query(PermissionGroup $model) + { + return $model->newQuery(); + } + + /** + * Optional method if you want to use html builder. + * + * @return \Yajra\DataTables\Html\Builder + */ + public function html() + { + return $this->builder() + ->setTableId('user-permissions-table') + ->columns($this->getColumns()) + ->minifiedAjax() + ->orderBy(1,'asc') + ->stateSave(false) + ->responsive() + ->autoWidth(false) + ->parameters([ + 'scrollX' => true, + 'drawCallback' => 'function() { KTMenu.createInstances(); }', + ]) + ->addTableClass('align-middle table-row-dashed fs-6 gy-5'); + } + + /** + * Get columns. + * + * @return array + */ + protected function getColumns() + { + return [ + Column::make('DT_RowIndex')->title('No')->orderable(false)->searchable(false), + Column::make('name')->title('Name'), + Column::make('role')->title('Assign To'), + Column::computed('action') + ->exportable(false) + ->printable(false) + ->addClass('text-center') + ->responsivePriority(-1), + + ]; + } + + /** + * Get filename for export + * @return string + */ + protected function filename() : string + { + return 'Permissions_' . date('YmdHis'); + } + } diff --git a/DataTables/RolesDataTable.php b/DataTables/RolesDataTable.php new file mode 100644 index 0000000..98350ec --- /dev/null +++ b/DataTables/RolesDataTable.php @@ -0,0 +1,96 @@ +eloquent($query) + ->rawColumns(['action']) + ->addIndexColumn() + ->filter(function ($query) { + if (request()->has('search')) { + $search = request()->get('search'); + $query->where('name', 'like', "%" . $search['value'] . "%"); + } + }) + ->addColumn('action', function (Role $model) { + return view('usermanager::users.roles._action', compact('model')); + }); + } + + /** + * Get query source of dataTable. + * + * @param \Spatie\Permission\Models\Role $model + * @return \Illuminate\Database\Eloquent\Builder + */ + public function query(Role $model) + { + return $model->newQuery(); + } + + /** + * Optional method if you want to use html builder. + * + * @return \Yajra\DataTables\Html\Builder + */ + public function html() + { + return $this->builder() + ->setTableId('user-roles-table') + ->columns($this->getColumns()) + ->minifiedAjax() + ->orderBy(1,'asc') + ->stateSave(false) + ->responsive() + ->autoWidth(false) + ->parameters([ + 'scrollX' => true, + 'drawCallback' => 'function() { KTMenu.createInstances(); }', + ]) + ->addTableClass('align-middle table-row-dashed fs-6 gy-5'); + + } + + /** + * Get columns. + * + * @return array + */ + protected function getColumns() + { + return [ + Column::make('DT_RowIndex')->title('No')->orderable(false)->searchable(false), + Column::make('name'), + Column::computed('action') + ->exportable(false) + ->printable(false) + ->addClass('text-center') + ->responsivePriority(-1), + + ]; + } + + /** + * Get filename for export. + * + * @return string + */ + protected function filename() : string + { + return 'Roles_' . date('YmdHis'); + } +} diff --git a/DataTables/UsersDataTable.php b/DataTables/UsersDataTable.php new file mode 100644 index 0000000..7158974 --- /dev/null +++ b/DataTables/UsersDataTable.php @@ -0,0 +1,98 @@ +eloquent($query) + ->filter(function ($query) { + $search = request()->get('search'); + if ($search['value']!=="") { + $query->where('name', 'like', "%" . $search['value'] . "%") + ->orWhere('email', 'like', "%" . $search['value'] . "%"); + } + }) + ->rawColumns(['action']) + ->addIndexColumn() + ->addColumn('action', function (User $model) { + return view('usermanager::users.users._action', compact('model')); + }); + } + + /** + * Get query source of dataTable. + * + * @param \Modules\UserManager\Entities\User $model + * + * @return \Illuminate\Database\Eloquent\Builder + */ + public function query(User $model) + { + return $model->newQuery(); + } + + /** + * Optional method if you want to use html builder. + * + * @return \Yajra\DataTables\Html\Builder + */ + public function html() + { + return $this->builder() + ->setTableId('user-users-table') + ->columns($this->getColumns()) + ->minifiedAjax() + ->orderBy(1,'asc') + ->stateSave(false) + ->responsive() + ->autoWidth(false) + ->parameters([ + 'scrollX' => true, + 'drawCallback' => 'function() { KTMenu.createInstances(); }', + ]) + ->addTableClass('align-middle table-row-dashed fs-6 gy-5'); + } + + /** + * Get columns. + * + * @return array + */ + protected function getColumns() + { + return [ + Column::make('DT_RowIndex')->title('No')->orderable(false)->searchable(false), + Column::make('name')->title(__('Name')), + Column::make('email'), + Column::computed('action') + ->exportable(false) + ->printable(false) + ->addClass('text-center') + ->responsivePriority(-1), + ]; + } + + /** + * Get filename for export. + * + * @return string + */ + protected function filename() : string + { + return 'Users_' . date('YmdHis'); + } +} diff --git a/Database/Migrations/.gitkeep b/Database/Migrations/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Database/Migrations/2014_10_12_000000_create_users_table.php b/Database/Migrations/2014_10_12_000000_create_users_table.php new file mode 100644 index 0000000..17b28da --- /dev/null +++ b/Database/Migrations/2014_10_12_000000_create_users_table.php @@ -0,0 +1,43 @@ +id(); + $table->foreignIdFor('Modules\CetakLabel\Entities\Directorat', 'directorat_id')->nullable(); + $table->foreignIdFor('Modules\CetakLabel\Entities\SubDirectorat', 'sub_directorat_id')->nullable(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + $table->softDeletes(); + + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('users'); + } +}; diff --git a/Database/Migrations/2014_10_12_100000_create_password_resets_table.php b/Database/Migrations/2014_10_12_100000_create_password_resets_table.php new file mode 100644 index 0000000..3d3536e --- /dev/null +++ b/Database/Migrations/2014_10_12_100000_create_password_resets_table.php @@ -0,0 +1,37 @@ +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + $table->softDeletes(); + + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('password_resets'); + } +}; diff --git a/Database/Migrations/2019_08_19_000000_create_failed_jobs_table.php b/Database/Migrations/2019_08_19_000000_create_failed_jobs_table.php new file mode 100644 index 0000000..579b7f6 --- /dev/null +++ b/Database/Migrations/2019_08_19_000000_create_failed_jobs_table.php @@ -0,0 +1,41 @@ +id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + $table->softDeletes(); + + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/Database/Migrations/2019_12_14_000001_create_personal_access_tokens_table.php b/Database/Migrations/2019_12_14_000001_create_personal_access_tokens_table.php new file mode 100644 index 0000000..b1259f9 --- /dev/null +++ b/Database/Migrations/2019_12_14_000001_create_personal_access_tokens_table.php @@ -0,0 +1,42 @@ +id(); + $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamp('expires_at')->nullable(); + $table->timestamps(); + $table->softDeletes(); + + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('personal_access_tokens'); + } +}; diff --git a/Database/Migrations/2023_04_15_221620_create_permission_tables.php b/Database/Migrations/2023_04_15_221620_create_permission_tables.php new file mode 100644 index 0000000..04c3278 --- /dev/null +++ b/Database/Migrations/2023_04_15_221620_create_permission_tables.php @@ -0,0 +1,141 @@ +bigIncrements('id'); // permission id + $table->string('name'); // For MySQL 8.0 use string('name', 125); + $table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125); + $table->timestamps(); + + $table->unique(['name', 'guard_name']); + }); + + Schema::create($tableNames['roles'], function (Blueprint $table) use ($teams, $columnNames) { + $table->bigIncrements('id'); // role id + if ($teams || config('permission.testing')) { // permission.testing is a fix for sqlite testing + $table->unsignedBigInteger($columnNames['team_foreign_key'])->nullable(); + $table->index($columnNames['team_foreign_key'], 'roles_team_foreign_key_index'); + } + $table->string('name'); // For MySQL 8.0 use string('name', 125); + $table->string('guard_name'); // For MySQL 8.0 use string('guard_name', 125); + $table->timestamps(); + if ($teams || config('permission.testing')) { + $table->unique([$columnNames['team_foreign_key'], 'name', 'guard_name']); + } else { + $table->unique(['name', 'guard_name']); + } + }); + + Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use ($tableNames, $columnNames, $teams) { + $table->unsignedBigInteger(PermissionRegistrar::$pivotPermission); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_permissions_model_id_model_type_index'); + + $table->foreign(PermissionRegistrar::$pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->onDelete('cascade'); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_permissions_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], PermissionRegistrar::$pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } else { + $table->primary([PermissionRegistrar::$pivotPermission, $columnNames['model_morph_key'], 'model_type'], + 'model_has_permissions_permission_model_type_primary'); + } + + }); + + Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames, $teams) { + $table->unsignedBigInteger(PermissionRegistrar::$pivotRole); + + $table->string('model_type'); + $table->unsignedBigInteger($columnNames['model_morph_key']); + $table->index([$columnNames['model_morph_key'], 'model_type'], 'model_has_roles_model_id_model_type_index'); + + $table->foreign(PermissionRegistrar::$pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->onDelete('cascade'); + if ($teams) { + $table->unsignedBigInteger($columnNames['team_foreign_key']); + $table->index($columnNames['team_foreign_key'], 'model_has_roles_team_foreign_key_index'); + + $table->primary([$columnNames['team_foreign_key'], PermissionRegistrar::$pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } else { + $table->primary([PermissionRegistrar::$pivotRole, $columnNames['model_morph_key'], 'model_type'], + 'model_has_roles_role_model_type_primary'); + } + }); + + Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames) { + $table->unsignedBigInteger(PermissionRegistrar::$pivotPermission); + $table->unsignedBigInteger(PermissionRegistrar::$pivotRole); + + $table->foreign(PermissionRegistrar::$pivotPermission) + ->references('id') // permission id + ->on($tableNames['permissions']) + ->onDelete('cascade'); + + $table->foreign(PermissionRegistrar::$pivotRole) + ->references('id') // role id + ->on($tableNames['roles']) + ->onDelete('cascade'); + + $table->primary([PermissionRegistrar::$pivotPermission, PermissionRegistrar::$pivotRole], 'role_has_permissions_permission_id_role_id_primary'); + }); + + app('cache') + ->store(config('permission.cache.store') != 'default' ? config('permission.cache.store') : null) + ->forget(config('permission.cache.key')); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $tableNames = config('permission.table_names'); + + if (empty($tableNames)) { + throw new \Exception('Error: config/permission.php not found and defaults could not be merged. Please publish the package configuration before proceeding, or drop the tables manually.'); + } + + Schema::drop($tableNames['role_has_permissions']); + Schema::drop($tableNames['model_has_roles']); + Schema::drop($tableNames['model_has_permissions']); + Schema::drop($tableNames['roles']); + Schema::drop($tableNames['permissions']); + } +} diff --git a/Database/Migrations/2023_04_15_225705_create_permission_groups_table.php b/Database/Migrations/2023_04_15_225705_create_permission_groups_table.php new file mode 100644 index 0000000..7842625 --- /dev/null +++ b/Database/Migrations/2023_04_15_225705_create_permission_groups_table.php @@ -0,0 +1,38 @@ +id(); + $table->string('name'); + $table->timestamps(); + $table->softDeletes(); + + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('permission_groups'); + } + }; diff --git a/Database/Migrations/2023_04_15_225909_update_permissions_table.php b/Database/Migrations/2023_04_15_225909_update_permissions_table.php new file mode 100644 index 0000000..88967cb --- /dev/null +++ b/Database/Migrations/2023_04_15_225909_update_permissions_table.php @@ -0,0 +1,27 @@ +foreignIdFor(PermissionGroup::class); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropForeignKey('permission_group_id'); + Schema::dropColumn('permission_group_id'); + } +}; diff --git a/Database/Seeders/.gitkeep b/Database/Seeders/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Database/Seeders/UserManagerDatabaseSeeder.php b/Database/Seeders/UserManagerDatabaseSeeder.php new file mode 100644 index 0000000..23e2e82 --- /dev/null +++ b/Database/Seeders/UserManagerDatabaseSeeder.php @@ -0,0 +1,23 @@ +call([ + UsersSeeder::class + ]); + } +} diff --git a/Database/Seeders/UsersSeeder.php b/Database/Seeders/UsersSeeder.php new file mode 100644 index 0000000..62c8124 --- /dev/null +++ b/Database/Seeders/UsersSeeder.php @@ -0,0 +1,33 @@ + $faker->name, + 'email' => 'demo@demo.com', + 'password' => Hash::make('demo'), + 'email_verified_at' => now(), + ]); + + $demoUser2 = User::create([ + 'name' => $faker->name, + 'email' => 'admin@demo.com', + 'password' => Hash::make('demo'), + 'email_verified_at' => now(), + ]); + } +} diff --git a/Database/factories/.gitkeep b/Database/factories/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Entities/.gitkeep b/Entities/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Entities/BaseModel.php b/Entities/BaseModel.php new file mode 100644 index 0000000..8b38625 --- /dev/null +++ b/Entities/BaseModel.php @@ -0,0 +1,34 @@ +connection = $module->database; + } + + public function getActivitylogOptions() + : LogOptions + { + return LogOptions::defaults()->logAll() + ->useLogName('Cetak Label : '); + } + + } diff --git a/Entities/Permission.php b/Entities/Permission.php new file mode 100644 index 0000000..5902493 --- /dev/null +++ b/Entities/Permission.php @@ -0,0 +1,23 @@ +logAll() + ->useLogName('master data'); + } + + public function group() + { + return $this->hasOne(PermissionGroup::class); + } +} diff --git a/Entities/PermissionGroup.php b/Entities/PermissionGroup.php new file mode 100644 index 0000000..c8f3d60 --- /dev/null +++ b/Entities/PermissionGroup.php @@ -0,0 +1,43 @@ +select('name', 'id')->where('permission_group_id', $id)->get(); + return $permissions; + } + + public function permission() + { + return $this->hasMany(Permission::class); + } + + public function roles($group) + { + $permission = Permission::where('permission_group_id', $group->id)->first(); + + $data = []; + + $roles = Role::all(); + + foreach ($roles as $role) { + if ($role->hasPermissionTo($permission->name)) { + array_push($data, $role); + } + } + + return $data; + } + + } diff --git a/Entities/User.php b/Entities/User.php new file mode 100644 index 0000000..3fda4a4 --- /dev/null +++ b/Entities/User.php @@ -0,0 +1,48 @@ + + */ + protected $fillable = [ + 'name', + 'email', + 'password', + 'directorat_id', + 'sub_directorat_id', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var array + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'email_verified_at' => 'datetime', + ]; + } diff --git a/Http/Controllers/.gitkeep b/Http/Controllers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Http/Controllers/Auth/AuthApiController.php b/Http/Controllers/Auth/AuthApiController.php new file mode 100644 index 0000000..96bf91a --- /dev/null +++ b/Http/Controllers/Auth/AuthApiController.php @@ -0,0 +1,58 @@ +all(), [ + 'name' => 'required', + 'email' => 'required|email', + 'password' => 'required', + 'password_confirmation' => 'required|same:password', + ]); + + if ($validator->fails()) { + return $this->sendError('Validation Error.', $validator->errors()); + } + + $input = $request->all(); + $input['password'] = bcrypt($input['password']); + $user = User::create($input); + $success['token'] = $user->createToken('MyApp')->plainTextToken; + $success['name'] = $user->name; + + return $this->sendResponse($success, 'User register successfully.'); + } + + /** + * Login api + * + * @return \Illuminate\Http\Response + */ + public function login(Request $request): JsonResponse + { + if (Auth::attempt(['email' => $request->email, 'password' => $request->password])) { + $user = Auth::user(); + $success['token'] = $user->createToken('MyApp')->plainTextToken; + $success['name'] = $user->name; + + return $this->sendResponse($success, 'User login successfully.'); + } else { + return $this->sendError('Unauthorised.', ['error' => 'Unauthorised']); + } + } + } diff --git a/Http/Controllers/Auth/AuthenticatedSessionController.php b/Http/Controllers/Auth/AuthenticatedSessionController.php new file mode 100644 index 0000000..c607ad0 --- /dev/null +++ b/Http/Controllers/Auth/AuthenticatedSessionController.php @@ -0,0 +1,58 @@ +authenticate(); + + $request->session()->regenerate(); + + return redirect()->intended(RouteServiceProvider::HOME); + } + + /** + * Destroy an authenticated session. + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(Request $request) + { + Auth::guard('web')->logout(); + + $request->session()->invalidate(); + + $request->session()->regenerateToken(); + + return redirect('/'); + } + } diff --git a/Http/Controllers/Auth/ConfirmablePasswordController.php b/Http/Controllers/Auth/ConfirmablePasswordController.php new file mode 100644 index 0000000..4dca1f3 --- /dev/null +++ b/Http/Controllers/Auth/ConfirmablePasswordController.php @@ -0,0 +1,45 @@ +validate([ + 'email' => $request->user()->email, + 'password' => $request->password, + ])) { + throw ValidationException::withMessages([ + 'password' => __('auth.password'), + ]); + } + + $request->session()->put('auth.password_confirmed_at', time()); + + return redirect()->intended(RouteServiceProvider::HOME); + } + } diff --git a/Http/Controllers/Auth/EmailVerificationNotificationController.php b/Http/Controllers/Auth/EmailVerificationNotificationController.php new file mode 100644 index 0000000..382ab76 --- /dev/null +++ b/Http/Controllers/Auth/EmailVerificationNotificationController.php @@ -0,0 +1,28 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(RouteServiceProvider::HOME); + } + + $request->user()->sendEmailVerificationNotification(); + + return back()->with('status', 'verification-link-sent'); + } + } diff --git a/Http/Controllers/Auth/EmailVerificationPromptController.php b/Http/Controllers/Auth/EmailVerificationPromptController.php new file mode 100644 index 0000000..cbf71cc --- /dev/null +++ b/Http/Controllers/Auth/EmailVerificationPromptController.php @@ -0,0 +1,22 @@ +user()->hasVerifiedEmail() ? redirect()->intended(RouteServiceProvider::HOME) : view('usermanager::auth.verify-email'); + } + } diff --git a/Http/Controllers/Auth/NewPasswordController.php b/Http/Controllers/Auth/NewPasswordController.php new file mode 100644 index 0000000..0bde770 --- /dev/null +++ b/Http/Controllers/Auth/NewPasswordController.php @@ -0,0 +1,61 @@ + $request]); + } + + /** + * Handle an incoming new password request. + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\RedirectResponse + * + * @throws \Illuminate\Validation\ValidationException + */ + public function store(Request $request) + { + $request->validate([ + 'token' => ['required'], + 'email' => ['required', 'email'], + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $status = Password::reset($request->only('email', 'password', 'password_confirmation', 'token'), function ($user) use ($request) { + $user->forceFill([ + 'password' => Hash::make($request->password), + 'remember_token' => Str::random(60), + ])->save(); + + event(new PasswordReset($user)); + }); + + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + return $status == Password::PASSWORD_RESET ? redirect()->route('login')->with('status', __($status)) : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]); + } + } diff --git a/Http/Controllers/Auth/PasswordResetLinkController.php b/Http/Controllers/Auth/PasswordResetLinkController.php new file mode 100644 index 0000000..7057425 --- /dev/null +++ b/Http/Controllers/Auth/PasswordResetLinkController.php @@ -0,0 +1,45 @@ +validate([ + 'email' => ['required', 'email'], + ]); + + // We will send the password reset link to this user. Once we have attempted + // to send the link, we will examine the response then see the message we + // need to show to the user. Finally, we'll send out a proper response. + $status = Password::sendResetLink($request->only('email')); + + return $status == Password::RESET_LINK_SENT ? back()->with('status', __($status)) : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]); + } + } diff --git a/Http/Controllers/Auth/RegisteredUserController.php b/Http/Controllers/Auth/RegisteredUserController.php new file mode 100644 index 0000000..a907f3a --- /dev/null +++ b/Http/Controllers/Auth/RegisteredUserController.php @@ -0,0 +1,57 @@ +validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + ]); + + event(new Registered($user)); + + Auth::login($user); + + return redirect(RouteServiceProvider::HOME); + } + + /** + * Display the registration view. + * + * @return \Illuminate\View\View + */ + public function create() + { + addJavascriptFile('assets/js/custom/authentication/sign-up/general.js'); + + return view('usermanager::auth.register'); + } + } diff --git a/Http/Controllers/Auth/VerifyEmailController.php b/Http/Controllers/Auth/VerifyEmailController.php new file mode 100644 index 0000000..8c75dfb --- /dev/null +++ b/Http/Controllers/Auth/VerifyEmailController.php @@ -0,0 +1,31 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(RouteServiceProvider::HOME . '?verified=1'); + } + + if ($request->user()->markEmailAsVerified()) { + event(new Verified($request->user())); + } + + return redirect()->intended(RouteServiceProvider::HOME . '?verified=1'); + } + } diff --git a/Http/Controllers/Users/PermissionsController.php b/Http/Controllers/Users/PermissionsController.php new file mode 100644 index 0000000..550e6c6 --- /dev/null +++ b/Http/Controllers/Users/PermissionsController.php @@ -0,0 +1,211 @@ +middleware(function ($request, $next) { + $this->user = Auth::guard('web')->user(); + return $next($request); + }); + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index(PermissionsDataTable $dataTable) + { + /* if (is_null($this->user) || !$this->user->can('permission.read')) { + abort(403, 'Sorry !! You are Unauthorized to view any permission !'); + }*/ + return $dataTable->render('usermanager::users.permissions.index'); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + /*if (is_null($this->user) || !$this->user->can('permission.create')) { + abort(403, 'Sorry !! You are Unauthorized to create any permission !'); + }*/ + + // Validation Data + $validate = $request->validate([ + 'name' => 'required|max:100|unique:permission_groups' + ], [ + 'name.requried' => 'Please give a permission name' + ]); + + if ($validate) { + try { + // Process Data + $group = PermissionGroup::create(['name' => $request->name]); + + $group_name = strtolower($request->name); + $data = [ + $group_name . '.create', + $group_name . '.read', + $group_name . '.update', + $group_name . '.delete', + $group_name . '.authorize', + $group_name . '.report' + ]; + + foreach ($data as $permission) { + + Permission::create([ + 'name' => $permission, + 'guard_name' => 'web', + 'permission_group_id' => $group->id + ]); + } + + echo json_encode(['status' => 'success', 'message' => 'Permission created successfully.']); + } catch (Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Permission created failed.']); + } + } + + return false; + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + + } + + /** + * Display the specified resource. + * + * @param int $id + * + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + /*if (is_null($this->user) || !$this->user->can('permission.update')) { + abort(403, 'Sorry !! You are Unauthorized to edit any permission !'); + }*/ + + $permission = PermissionGroup::find($id); + echo json_encode($permission); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + /* if (is_null($this->user) || !$this->user->can('permission.update')) { + abort(403, 'Sorry !! You are Unauthorized to edit any permission !'); + }*/ + + // Validation Data + $validated = $request->validate([ + 'name' => 'required|max:100|unique:permission_groups,name,' . $id + ], [ + 'name.requried' => 'Please give a permission name' + ]); + + if ($validated) { + try { + // Process Data + $group = PermissionGroup::find($id); + $group->name = $request->name; + + if ($group->save()) { + $group_name = strtolower($request->name); + $permissions = Permission::where('permission_group_id', $group->id)->get(); + + $data = [ + $group_name . '.create', + $group_name . '.read', + $group_name . '.update', + $group_name . '.delete', + $group_name . '.authorize', + $group_name . '.report' + ]; + + $i = 0; + foreach ($permissions as $permission) { + $permission->name = $data[$i]; + $permission->save(); + + $i++; + } + } + + echo json_encode(['status' => 'success', 'message' => 'Permission updated successfully.']); + } catch (Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Permission updated failed.']); + } + } + + return false; + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + /*if (is_null($this->user) || !$this->user->can('permission.delete')) { + abort(403, 'Sorry !! You are Unauthorized to delete any role !'); + }*/ + + + $permission = PermissionGroup::find($id); + if (!is_null($permission)) { + if ($permission->delete()) { + Permission::where('permission_group_id', $id)->delete(); + } + } + + echo json_encode(['status' => 'success', 'message' => 'Permission deleted successfully.']); + } + } diff --git a/Http/Controllers/Users/RolesController.php b/Http/Controllers/Users/RolesController.php new file mode 100644 index 0000000..572da3f --- /dev/null +++ b/Http/Controllers/Users/RolesController.php @@ -0,0 +1,188 @@ +middleware(function ($request, $next) { + $this->user = Auth::guard('web')->user(); + return $next($request); + }); + } + + /** + * Display a listing of the resource. + * + * @return Response + */ + public function index(RolesDataTable $dataTable) + { + /*if (is_null($this->user) || !$this->user->can('role.read')) { + abort(403, 'Sorry !! You are Unauthorized to view any role !'); + }*/ + $permissiongroups = PermissionGroup::all(); + + return $dataTable->render('usermanager::users.roles.index', compact('permissiongroups')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + /*if (is_null($this->user) || !$this->user->can('role.create')) { + abort(403, 'Sorry !! You are Unauthorized to create any role !'); + }*/ + + // Validation Data + $validated = $request->validate([ + 'name' => 'required|max:100|unique:roles' + ], [ + 'name.requried' => 'Please give a role name' + ]); + + + if ($validated) { + try { + // Process Data + $role = Role::create(['name' => $request->name, 'guard_name' => 'web']); + + $permissions = $request->input('permissions'); + + if (!empty($permissions)) { + $role = Role::find($role->id); + $role->syncPermissions($permissions); + } + + echo json_encode(['status' => 'success', 'message' => 'Role Created Successfully']); + } catch (Exception $e) { + echo json_encode(['status' => 'error', 'message' => 'Role Created Failed']); + } + } + + return false; + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + } + + /** + * Display the specified resource. + * + * @param int $id + * + * @return Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * + * @return Response + */ + public function edit($id) + { + /* if (is_null($this->user) || !$this->user->can('role.update')) { + abort(403, 'Sorry !! You are Unauthorized to edit any role !'); + }*/ + + $role = Role::findById($id, 'web'); + $permissions = Permission::all(); + $permissiongroups = PermissionGroup::all(); + + $_array = [ + 'role' => $role, + 'permissions' => $permissions, + 'permissiongroups' => $permissiongroups + ]; + + return view('usermanager::users.roles.edit', $_array); + } + + /** + * Update the specified resource in storage. + * + * @param Request $request + * @param int $id + * + * @return Response + */ + public function update(Request $request, $id) + { + /* if (is_null($this->user) || !$this->user->can('role.update')) { + abort(403, 'Sorry !! You are Unauthorized to edit any role !'); + }*/ + + // Validation Data + $request->validate([ + 'name' => 'required|max:100|unique:roles,name,' . $id + ], [ + 'name.requried' => 'Please give a role name' + ]); + + $role = Role::findById($id, 'web'); + $permissions = $request->input('permissions'); + + $role->name = $request->name; + $role->save(); + + if (!empty($permissions)) { + $role->syncPermissions($permissions); + } + + session()->flash('success', 'Role has been updated !!'); + return redirect()->route('user.roles.index'); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * + * @return Response + */ + public function destroy($id) + { + /*if (is_null($this->user) || !$this->user->can('role.delete')) { + abort(403, 'Sorry !! You are Unauthorized to delete any role !'); + }*/ + + + $role = Role::findById($id, 'web'); + if (!is_null($role)) { + $role->delete(); + } + + session()->flash('success', 'Role has been deleted !!'); + return redirect()->route('user.roles.index'); + } + } diff --git a/Http/Controllers/Users/UsersController.php b/Http/Controllers/Users/UsersController.php new file mode 100644 index 0000000..c27c270 --- /dev/null +++ b/Http/Controllers/Users/UsersController.php @@ -0,0 +1,237 @@ +middleware(function ($request, $next) { + $this->user = Auth::guard('web')->user(); + return $next($request); + }); + } + + /** + * Display a listing of the resource. + * + * @return Response + */ + + public function index(UsersDataTable $dataTable) + { + /*if (is_null($this->user) || !$this->user->can('user.read')) { + abort(403, 'Sorry !! You are Unauthorized to view any users !'); + }*/ + + addVendor('chained-select'); + + $directorat = Directorat::all(); + $roles = Role::all(); + return $dataTable->render('usermanager::users.users.index', compact('directorat', 'roles')); + } + + /** + * Show the form for creating a new resource. + * + * @return Response + */ + public function create() + { + /* if (is_null($this->user) || !$this->user->can('user.create')) { + abort(403, 'Sorry !! You are Unauthorized to create any users !'); + }*/ + + $roles = Role::all(); + return view('usermanager::users.create', compact('roles')); + } + + /** + * Store a newly created resource in storage. + * + * @param Request $request + * + * @return Response + */ + public function store(Request $request) + { + /* if (is_null($this->user) || !$this->user->can('user.create')) { + abort(403, 'Sorry !! You are Unauthorized to create any users !'); + }*/ + // Validation Data + $request->password = 'bagbag'; + + $validated = $request->validate([ + 'name' => 'required|max:50', + 'email' => 'required|max:100|email|unique:users' + ]); + + if ($validated) { + try { + // Create New User + $user = new User(); + $user->name = $request->name; + $user->email = $request->email; + $user->directorat_id = $request->directorat_id; + $user->sub_directorat_id = $request->sub_directorat_id; + $user->password = Hash::make($request->password); + + $user->save(); + + if ($request->roles) { + $user->assignRole($request->roles); + } + + echo json_encode([ + 'status' => 'success', + 'message' => 'User Created Successfully' + ]); + } catch (Exception $e) { + echo json_encode([ + 'status' => 'error', + 'message' => $e->getMessage() + ]); + } + } + + return false; + + } + + /** + * Display the specified resource. + * + * @param int $id + * + * @return Response + */ + public function show($id) + { + /*if (is_null($this->user) || !$this->user->can('user.read')) { + abort(403, 'Sorry !! You are Unauthorized to view any users !'); + }*/ + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * + * @return Response + */ + public function edit($id) + { + /*if (is_null($this->user) || !$this->user->can('user.update')) { + abort(403, 'Sorry !! You are Unauthorized to update any users !'); + }*/ + + $user = User::find($id); + $roles = $user->roles; + + echo json_encode([ + 'status' => 'success', + 'data' => $user, + 'roles' => $roles + ]); + } + + /** + * Update the specified resource in storage. + * + * @param Request $request + * @param int $id + * + * @return Response + */ + public function update(Request $request, $id) + { + /* if (is_null($this->user) || !$this->user->can('user.update')) { + abort(403, 'Sorry !! You are Unauthorized to update any users !'); + }*/ + + // Create New User + $user = User::find($id); + + // Validation Data + if ($request->password !== '') { + $validated = $request->validate([ + 'name' => 'required|max:50', + 'email' => 'required|max:100|email|unique:users,email,' . $id, + 'password' => 'nullable|min:6|confirmed' + ]); + } else { + $validated = $request->validate([ + 'name' => 'required|max:50', + 'email' => 'required|max:100|email|unique:users,email,' . $id + ]); + } + + if ($validated) { + try { + $user->name = $request->name; + $user->email = $request->email; + $user->directorat_id = $request->directorat_id; + $user->sub_directorat_id = $request->sub_directorat_id; + + if ($request->password) { + $user->password = Hash::make($request->password); + } + + $user->save(); + + $user->roles()->detach(); + if ($request->roles) { + $user->assignRole($request->roles); + } + + echo json_encode([ + 'status' => 'success', + 'message' => 'User Updated Successfully' + ]); + + } catch (Exception $e) { + echo json_encode([ + 'status' => 'error', + 'message' => $e->getMessage() + ]); + } + } + + return false; + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * + * @return Response + */ + public function destroy(User $user) + { + /*if (is_null($this->user) || !$this->user->can('user.delete')) { + abort(403, 'Sorry !! You are Unauthorized to delete any users !'); + }*/ + + $user->delete(); + + echo json_encode([ + 'status' => 'success', + 'message' => 'User Deleted Successfully' + ]); + } + } diff --git a/Http/Middleware/.gitkeep b/Http/Middleware/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Http/Requests/.gitkeep b/Http/Requests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Http/Requests/LoginRequest.php b/Http/Requests/LoginRequest.php new file mode 100644 index 0000000..3ef477c --- /dev/null +++ b/Http/Requests/LoginRequest.php @@ -0,0 +1,93 @@ + ['required', 'string', 'email'], + 'password' => ['required', 'string'], + ]; + } + + /** + * Attempt to authenticate the request's credentials. + * + * @return void + * + * @throws \Illuminate\Validation\ValidationException + */ + public function authenticate() + { + $this->ensureIsNotRateLimited(); + + if (!Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) { + RateLimiter::hit($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.failed'), + ]); + } + + RateLimiter::clear($this->throttleKey()); + } + + /** + * Ensure the login request is not rate limited. + * + * @return void + * + * @throws \Illuminate\Validation\ValidationException + */ + public function ensureIsNotRateLimited() + { + if (!RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { + return; + } + + event(new Lockout($this)); + + $seconds = RateLimiter::availableIn($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.throttle', [ + 'seconds' => $seconds, + 'minutes' => ceil($seconds / 60), + ]), + ]); + } + + /** + * Get the rate limiting throttle key for the request. + * + * @return string + */ + public function throttleKey() + { + return Str::transliterate(Str::lower($this->input('email')) . '|' . $this->ip()); + } + } diff --git a/Providers/.gitkeep b/Providers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Providers/AuthServiceProvider.php b/Providers/AuthServiceProvider.php new file mode 100644 index 0000000..1157c05 --- /dev/null +++ b/Providers/AuthServiceProvider.php @@ -0,0 +1,27 @@ + + */ + protected $policies = [// 'App\Models\Model' => 'App\Policies\ModelPolicy', + ]; + + /** + * Register any authentication / authorization services. + * + * @return void + */ + public function boot() + { + // + } + } diff --git a/Providers/RouteServiceProvider.php b/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..c0b6a7e --- /dev/null +++ b/Providers/RouteServiceProvider.php @@ -0,0 +1,68 @@ +mapApiRoutes(); + $this->mapWebRoutes(); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @return void + */ + protected function mapWebRoutes() + { + Route::middleware('web') + ->namespace($this->moduleNamespace) + ->group(module_path('UserManager', '/Routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApiRoutes() + { + Route::prefix('api') + ->middleware('api') + ->namespace($this->moduleNamespace) + ->group(module_path('UserManager', '/Routes/api.php')); + } +} diff --git a/Providers/UserManagerServiceProvider.php b/Providers/UserManagerServiceProvider.php new file mode 100644 index 0000000..59830b7 --- /dev/null +++ b/Providers/UserManagerServiceProvider.php @@ -0,0 +1,114 @@ +registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations')); + } + + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + $this->app->register(RouteServiceProvider::class); + } + + /** + * Register config. + * + * @return void + */ + protected function registerConfig() + { + $this->publishes([ + module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower . '.php'), + ], 'config'); + $this->mergeConfigFrom( + module_path($this->moduleName, 'Config/config.php'), $this->moduleNameLower + ); + } + + /** + * Register views. + * + * @return void + */ + public function registerViews() + { + $viewPath = resource_path('views/modules/' . $this->moduleNameLower); + + $sourcePath = module_path($this->moduleName, 'Resources/views'); + + $this->publishes([ + $sourcePath => $viewPath + ], ['views', $this->moduleNameLower . '-module-views']); + + $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); + } + + /** + * Register translations. + * + * @return void + */ + public function registerTranslations() + { + $langPath = resource_path('lang/modules/' . $this->moduleNameLower); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, $this->moduleNameLower); + $this->loadJsonTranslationsFrom($langPath); + } else { + $this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower); + $this->loadJsonTranslationsFrom(module_path($this->moduleName, 'Resources/lang')); + } + } + + /** + * Get the services provided by the provider. + * + * @return array + */ + public function provides() + { + return []; + } + + private function getPublishableViewPaths(): array + { + $paths = []; + foreach (\Config::get('view.paths') as $path) { + if (is_dir($path . '/modules/' . $this->moduleNameLower)) { + $paths[] = $path . '/modules/' . $this->moduleNameLower; + } + } + return $paths; + } +} diff --git a/Resources/lang/.gitkeep b/Resources/lang/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Resources/views/.gitkeep b/Resources/views/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Resources/views/auth/forgot-password.blade.php b/Resources/views/auth/forgot-password.blade.php new file mode 100644 index 0000000..be1adac --- /dev/null +++ b/Resources/views/auth/forgot-password.blade.php @@ -0,0 +1,41 @@ + + + +
+ @csrf + +
+ +

+ Forgot Password ? +

+ + + +
+ Enter your email to reset your password. +
+ +
+ + + +
+ + + +
+ + +
+ + + Cancel +
+ +
+ + +
diff --git a/Resources/views/auth/login.blade.php b/Resources/views/auth/login.blade.php new file mode 100644 index 0000000..9561408 --- /dev/null +++ b/Resources/views/auth/login.blade.php @@ -0,0 +1,102 @@ + + + +
+ @csrf + +
+ +

+ Sign In +

+ + + +
+ Your Social Campaigns +
+ +
+ + + + + + + +
+ Or with email +
+ + + +
+ + + +
+ + +
+ + + +
+ + + + + + + +
+ +
+ + + +
+ Not a Member yet? + + + Sign up + +
+ +
+ + +
diff --git a/Resources/views/auth/register.blade.php b/Resources/views/auth/register.blade.php new file mode 100644 index 0000000..96283be --- /dev/null +++ b/Resources/views/auth/register.blade.php @@ -0,0 +1,142 @@ + + + +
+ @csrf + +
+ +

+ Sign Up +

+ + + +
+ Your Social Campaigns +
+ +
+ + + + + + + +
+ Or with email +
+ + + +
+ + + +
+ + +
+ + + +
+ + +
+ +
+ +
+ + + + + + +
+ + + +
+
+
+
+
+
+ +
+ + + +
+ Use 8 or more characters with a mix of letters, numbers & symbols. +
+ +
+ + + +
+ + + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ Already have an Account? + + + Sign in + +
+ +
+ + +
diff --git a/Resources/views/auth/reset-password.blade.php b/Resources/views/auth/reset-password.blade.php new file mode 100644 index 0000000..6b0d9b1 --- /dev/null +++ b/Resources/views/auth/reset-password.blade.php @@ -0,0 +1,51 @@ + + + + + + + + +
+ @csrf + + + + + +
+ + + + + +
+ + +
+ + + + + +
+ + +
+ + + + + +
+ +
+ + {{ __('Reset Password') }} + +
+
+
+
diff --git a/Resources/views/users/permissions/_action.blade.php b/Resources/views/users/permissions/_action.blade.php new file mode 100644 index 0000000..3ea2ecb --- /dev/null +++ b/Resources/views/users/permissions/_action.blade.php @@ -0,0 +1,13 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp +
+ + {!! getIcon("pencil", "fs-1 text-info","duotune") !!} + + + {!! Form::open(['method' => 'DELETE','route' => [$route[0].'.'.$route[1].'.destroy', $model->id],'class'=>'']) !!} + {{ Form::button(getIcon("trash", "fs-1 text-danger","duotune"), ['type' => 'submit', 'class' => 'delete btn btn-icon btn-bg-light btn-active-light-danger btn-sm'] ) }} + {!! Form::close() !!} +
diff --git a/Resources/views/users/permissions/_checkbox.blade.php b/Resources/views/users/permissions/_checkbox.blade.php new file mode 100644 index 0000000..04631f2 --- /dev/null +++ b/Resources/views/users/permissions/_checkbox.blade.php @@ -0,0 +1,21 @@ + + @php + $color = [ + 'badge-white', + 'badge-light-primary',# + 'badge-light-dark',# + 'badge-secondary', + 'badge-light-success',# + 'badge-light-info',# + 'badge-light-warning',# + 'badge-light-danger'# + ]; + + $i = 1; + + @endphp + @foreach($role as $row) + {{ $row->name }} + @php $i++ @endphp + @endforeach + diff --git a/Resources/views/users/permissions/_form.blade.php b/Resources/views/users/permissions/_form.blade.php new file mode 100644 index 0000000..7e532ab --- /dev/null +++ b/Resources/views/users/permissions/_form.blade.php @@ -0,0 +1,58 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp + + + + diff --git a/Resources/views/users/permissions/_table.blade.php b/Resources/views/users/permissions/_table.blade.php new file mode 100644 index 0000000..1d8b2af --- /dev/null +++ b/Resources/views/users/permissions/_table.blade.php @@ -0,0 +1,116 @@ + +{{ $dataTable->table() }} + + +{{-- Inject Scripts --}} +@section('scripts') + {{ $dataTable->scripts() }} +@endsection + +@push('customscript') + @php + $route = explode('.', Route::currentRouteName()); + @endphp + + +@endpush + +@section('styles') + +@endsection diff --git a/Resources/views/users/permissions/index.blade.php b/Resources/views/users/permissions/index.blade.php new file mode 100644 index 0000000..8e370df --- /dev/null +++ b/Resources/views/users/permissions/index.blade.php @@ -0,0 +1,135 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp + + + +
+ +
+
+
+ + + + + + + + + +
+ + +
+ + +
+ +
+ + + + + + + +
+ + +
+
+
+ @include('usermanager::users.permissions._table') + @include('usermanager::users.permissions._form') +
+ +
+ + @push('customscript') + + @endpush +
diff --git a/Resources/views/users/roles/_action.blade.php b/Resources/views/users/roles/_action.blade.php new file mode 100644 index 0000000..7c24f5b --- /dev/null +++ b/Resources/views/users/roles/_action.blade.php @@ -0,0 +1,13 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp +
+ + {!! getIcon("pencil", "fs-1 text-info","duotune") !!} + + + {!! Form::open(['method' => 'DELETE','route' => [$route[0].'.'.$route[1].'.destroy', $model->id],'class'=>'']) !!} + {{ Form::button(getIcon("trash", "fs-1 text-danger","duotune"), ['type' => 'submit', 'class' => 'delete btn btn-icon btn-bg-light btn-active-light-danger btn-sm'] ) }} + {!! Form::close() !!} +
diff --git a/Resources/views/users/roles/_editform.blade.php b/Resources/views/users/roles/_editform.blade.php new file mode 100644 index 0000000..6c382a9 --- /dev/null +++ b/Resources/views/users/roles/_editform.blade.php @@ -0,0 +1,142 @@ +
+@method('PUT') +{{ csrf_field() }} + +
+ +
+ + + + +
+ +
+ @error('name') +
{{ $message }}
+ @enderror + +
+ +
+ + + + +
+ + + + + + + + + + + @foreach($permissiongroups as $group) + + + + + + + + + + + @endforeach + + +
Administrator/Superuser Access + + + + +
{{ $group->name }} + +
+ @foreach($group->getpermissionsByGroupId($group->id) as $permission) + + + + @endforeach +
+ +
+ +
+ +
+ +
+ + +
+ + Cancel + + +
+ +
+ +@push('customscript') + +@endpush + diff --git a/Resources/views/users/roles/_form.blade.php b/Resources/views/users/roles/_form.blade.php new file mode 100644 index 0000000..1271645 --- /dev/null +++ b/Resources/views/users/roles/_form.blade.php @@ -0,0 +1,160 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp + + + + + +@push('customscript') + +@endpush diff --git a/Resources/views/users/roles/_table.blade.php b/Resources/views/users/roles/_table.blade.php new file mode 100644 index 0000000..99766ac --- /dev/null +++ b/Resources/views/users/roles/_table.blade.php @@ -0,0 +1,99 @@ + +{{ $dataTable->table() }} + + +{{-- Inject Scripts --}} +@section('scripts') + {{ $dataTable->scripts() }} +@endsection + +@push('customscript') + @php + $route = explode('.', Route::currentRouteName()); + @endphp + + +@endpush + +@section('styles') + +@endsection diff --git a/Resources/views/users/roles/edit.blade.php b/Resources/views/users/roles/edit.blade.php new file mode 100644 index 0000000..1cedf19 --- /dev/null +++ b/Resources/views/users/roles/edit.blade.php @@ -0,0 +1,16 @@ + + +
+ +
+

+ Edit Role {{ $role->name }} +

+
+
+ @include('users.roles._editform') +
+ +
+ +
diff --git a/Resources/views/users/roles/index.blade.php b/Resources/views/users/roles/index.blade.php new file mode 100644 index 0000000..39ad0c5 --- /dev/null +++ b/Resources/views/users/roles/index.blade.php @@ -0,0 +1,135 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp + + + +
+ +
+
+
+ + + + + + + + + +
+ + +
+ + +
+ +
+ + + + + + + +
+ + +
+
+
+ @include('usermanager::users.roles._table') + @include('usermanager::users.roles._form') +
+ +
+ + @push('customscript') + + @endpush +
diff --git a/Resources/views/users/users/_action.blade.php b/Resources/views/users/users/_action.blade.php new file mode 100644 index 0000000..dc1a612 --- /dev/null +++ b/Resources/views/users/users/_action.blade.php @@ -0,0 +1,13 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp +
+ + {!! getIcon("pencil", "fs-1 text-info","duotune") !!} + + + {!! Form::open(['method' => 'DELETE','route' => [$route[0].'.'.$route[1].'.destroy', $model->id],'class'=>'']) !!} + {{ Form::button(getIcon("trash", "fs-1 text-danger","duotune"), ['type' => 'submit', 'class' => 'delete btn btn-icon btn-bg-light btn-active-light-danger btn-sm'] ) }} + {!! Form::close() !!} +
diff --git a/Resources/views/users/users/_form.blade.php b/Resources/views/users/users/_form.blade.php new file mode 100644 index 0000000..388e766 --- /dev/null +++ b/Resources/views/users/users/_form.blade.php @@ -0,0 +1,142 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp + + + + diff --git a/Resources/views/users/users/_table.blade.php b/Resources/views/users/users/_table.blade.php new file mode 100644 index 0000000..62ff3fb --- /dev/null +++ b/Resources/views/users/users/_table.blade.php @@ -0,0 +1,127 @@ + +{{ $dataTable->table() }} + + +{{-- Inject Scripts --}} +@section('scripts') + {{ $dataTable->scripts() }} +@endsection + +@push('customscript') + @php + $route = explode('.', Route::currentRouteName()); + @endphp + + +@endpush + +@section('styles') + +@endsection diff --git a/Resources/views/users/users/index.blade.php b/Resources/views/users/users/index.blade.php new file mode 100644 index 0000000..a2d7e8e --- /dev/null +++ b/Resources/views/users/users/index.blade.php @@ -0,0 +1,141 @@ +@php + $route = explode('.', Route::currentRouteName()); +@endphp + + + +
+ +
+
+
+ + + + + + + + + +
+ + +
+ + +
+ +
+ + + + + + + +
+ + +
+
+
+ @include('usermanager::users.users._table') + @include('usermanager::users.users._form') +
+ +
+ + @push('customscript') + + @endpush +
diff --git a/Routes/.gitkeep b/Routes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Routes/api.php b/Routes/api.php new file mode 100644 index 0000000..2ebed69 --- /dev/null +++ b/Routes/api.php @@ -0,0 +1,18 @@ +get('/usermanager', function (Request $request) { + return $request->user(); +}); \ No newline at end of file diff --git a/Routes/auth.php b/Routes/auth.php new file mode 100644 index 0000000..55d5126 --- /dev/null +++ b/Routes/auth.php @@ -0,0 +1,56 @@ +group(function () { + Route::get('register', [RegisteredUserController::class, 'create']) + ->name('register'); + + Route::post('register', [RegisteredUserController::class, 'store']); + + Route::get('login', [AuthenticatedSessionController::class, 'create']) + ->name('login'); + + Route::post('login', [AuthenticatedSessionController::class, 'store']); + + Route::get('forgot-password', [PasswordResetLinkController::class, 'create']) + ->name('password.request'); + + Route::post('forgot-password', [PasswordResetLinkController::class, 'store']) + ->name('password.email'); + + Route::get('reset-password/{token}', [NewPasswordController::class, 'create']) + ->name('password.reset'); + + Route::post('reset-password', [NewPasswordController::class, 'store']) + ->name('password.update'); +}); + +Route::middleware('auth')->group(function () { + Route::get('verify-email', [EmailVerificationPromptController::class, '__invoke']) + ->name('verification.notice'); + + Route::get('verify-email/{id}/{hash}', [VerifyEmailController::class, '__invoke']) + ->middleware(['signed', 'throttle:6,1']) + ->name('verification.verify'); + + Route::post('email/verification-notification', [EmailVerificationNotificationController::class, 'store']) + ->middleware('throttle:6,1') + ->name('verification.send'); + + Route::get('confirm-password', [ConfirmablePasswordController::class, 'show']) + ->name('password.confirm'); + + Route::post('confirm-password', [ConfirmablePasswordController::class, 'store']); + + Route::get('logout', [AuthenticatedSessionController::class, 'destroy']) + ->name('logout'); +}); diff --git a/Routes/web.php b/Routes/web.php new file mode 100644 index 0000000..8bc9456 --- /dev/null +++ b/Routes/web.php @@ -0,0 +1,27 @@ +group(function () { + // Users Management + Route::group(['middleware' => ['auth', 'verified']], function () { + Route::resource('roles', RolesController::class); + Route::resource('permissions', PermissionsController::class); + Route::resource('users', UsersController::class); + }); +}); + +require __DIR__ . '/auth.php'; diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..32bc509 --- /dev/null +++ b/composer.json @@ -0,0 +1,24 @@ +{ + "name": "putrakuningan/usermanager-module", + "type": "laravel-module", + "description": "", + "authors": [ + { + "name": "Daeng Deni Mardaeni", + "email": "ddeni05@gmail.com" + } + ], + "extra": { + "laravel": { + "providers": [], + "aliases": { + + } + } + }, + "autoload": { + "psr-4": { + "Modules\\UserManager\\": "" + } + } +} diff --git a/module.json b/module.json new file mode 100644 index 0000000..c35c07f --- /dev/null +++ b/module.json @@ -0,0 +1,11 @@ +{ + "name": "UserManager", + "alias": "usermanager", + "description": "", + "keywords": [], + "priority": 99, + "providers": [ + "Modules\\UserManager\\Providers\\UserManagerServiceProvider" + ], + "files": [] +}