From c63a9789cc89f2a62a76378ebac44e5c39d7e72c Mon Sep 17 00:00:00 2001 From: Matteo Gheza Date: Thu, 4 Jan 2024 00:41:41 +0100 Subject: [PATCH] Add user info modal --- .../app/Http/Controllers/UserController.php | 6 +- backend/app/Models/User.php | 7 ++ ...01_03_233238_add_more_user_data_fields.php | 40 ++++++ backend/routes/api.php | 2 + .../modal-user-info.component.html | 117 ++++++++++++++++++ .../modal-user-info.component.scss | 3 + .../modal-user-info.component.ts | 46 +++++++ .../_components/table/table.component.html | 10 +- .../app/_components/table/table.component.ts | 5 + .../src/app/_routes/list/list.component.html | 2 +- .../src/app/_routes/list/list.component.ts | 9 ++ frontend/src/app/app.module.ts | 2 + frontend/src/assets/i18n/en.json | 6 +- frontend/src/assets/i18n/it.json | 6 +- 14 files changed, 252 insertions(+), 9 deletions(-) create mode 100644 backend/database/migrations/2024_01_03_233238_add_more_user_data_fields.php create mode 100644 frontend/src/app/_components/modal-user-info/modal-user-info.component.html create mode 100644 frontend/src/app/_components/modal-user-info/modal-user-info.component.scss create mode 100644 frontend/src/app/_components/modal-user-info/modal-user-info.component.ts diff --git a/backend/app/Http/Controllers/UserController.php b/backend/app/Http/Controllers/UserController.php index d2f2658..022f8f5 100644 --- a/backend/app/Http/Controllers/UserController.php +++ b/backend/app/Http/Controllers/UserController.php @@ -51,9 +51,11 @@ class UserController extends Controller /** * Display the specified resource. */ - public function show(User $user) + public function show(Request $request, $id) { - // + User::where('id', $request->user()->id)->update(['last_access' => now()]); + + return response()->json(User::findOrFail($id)); } /** diff --git a/backend/app/Models/User.php b/backend/app/Models/User.php index 3abae2a..81403e9 100644 --- a/backend/app/Models/User.php +++ b/backend/app/Models/User.php @@ -24,6 +24,7 @@ class User extends Authenticatable implements LaratrustUser */ protected $fillable = [ 'name', + 'surname', 'username', 'email', 'phone_number', @@ -37,6 +38,10 @@ class User extends Authenticatable implements LaratrustUser 'banned', 'hidden', 'password', + 'birthplace', + 'birthplace_province', + 'ssn', + 'address' ]; /** @@ -58,6 +63,8 @@ class User extends Authenticatable implements LaratrustUser 'email_verified_at' => 'datetime', 'last_access' => 'datetime', 'last_availability_change' => 'datetime', + 'birthday' => 'datetime', + 'course_date' => 'datetime' ]; /** diff --git a/backend/database/migrations/2024_01_03_233238_add_more_user_data_fields.php b/backend/database/migrations/2024_01_03_233238_add_more_user_data_fields.php new file mode 100644 index 0000000..e289e44 --- /dev/null +++ b/backend/database/migrations/2024_01_03_233238_add_more_user_data_fields.php @@ -0,0 +1,40 @@ +string('surname')->nullable()->after('name'); + $table->string('birthplace')->nullable()->after('surname'); + $table->string('birthplace_province')->nullable()->after('birthplace'); + $table->string('ssn')->nullable()->after('birthplace_province'); + $table->string('address')->nullable()->after('ssn'); + $table->timestamp('birthday')->nullable()->after('last_availability_change'); + $table->timestamp('course_date')->nullable()->after('birthday'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('surname'); + $table->dropColumn('birthplace'); + $table->dropColumn('birthplace_province'); + $table->dropColumn('ssn'); + $table->dropColumn('address'); + $table->dropColumn('birthday'); + $table->dropColumn('course_date'); + }); + } +}; diff --git a/backend/routes/api.php b/backend/routes/api.php index 92908e4..ade50d5 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -45,6 +45,8 @@ Route::middleware('auth:sanctum')->group( function () { Route::get('/list', [UserController::class, 'index'])->middleware(ETag::class); + Route::get('/users/{id}', [UserController::class, 'show']); + Route::get('/schedules', [ScheduleSlotsController::class, 'index']); Route::post('/schedules', [ScheduleSlotsController::class, 'store']); diff --git a/frontend/src/app/_components/modal-user-info/modal-user-info.component.html b/frontend/src/app/_components/modal-user-info/modal-user-info.component.html new file mode 100644 index 0000000..895438c --- /dev/null +++ b/frontend/src/app/_components/modal-user-info/modal-user-info.component.html @@ -0,0 +1,117 @@ + + + + diff --git a/frontend/src/app/_components/modal-user-info/modal-user-info.component.scss b/frontend/src/app/_components/modal-user-info/modal-user-info.component.scss new file mode 100644 index 0000000..2bd39ff --- /dev/null +++ b/frontend/src/app/_components/modal-user-info/modal-user-info.component.scss @@ -0,0 +1,3 @@ +td { + border-bottom: 1px solid #ddd; +} \ No newline at end of file diff --git a/frontend/src/app/_components/modal-user-info/modal-user-info.component.ts b/frontend/src/app/_components/modal-user-info/modal-user-info.component.ts new file mode 100644 index 0000000..67fc90f --- /dev/null +++ b/frontend/src/app/_components/modal-user-info/modal-user-info.component.ts @@ -0,0 +1,46 @@ +import { Component, OnInit } from '@angular/core'; +import { BsModalRef } from 'ngx-bootstrap/modal'; +import { ApiClientService } from 'src/app/_services/api-client.service'; +import { AuthService } from 'src/app/_services/auth.service'; +import { ToastrService } from 'ngx-toastr'; +import { TranslateService } from '@ngx-translate/core'; +import Swal from 'sweetalert2'; + +@Component({ + selector: 'modal-user-info', + templateUrl: './modal-user-info.component.html', + styleUrls: ['./modal-user-info.component.scss'] +}) +export class ModalUserInfoComponent implements OnInit { + id = 0; + loaded = false; + + canGoToEditPage = false; + + user: any = {}; + + constructor( + public bsModalRef: BsModalRef, + private api: ApiClientService, + public auth: AuthService, + private toastr: ToastrService, + private translate: TranslateService + ) { } + + ngOnInit() { + this.api.get(`users/${this.id}`).then((response) => { + this.user = response; + this.loaded = true; + console.log(response); + }).catch((err) => { + console.log(err); + }); + this.canGoToEditPage = this.auth.profile.id === this.id || this.auth.profile.can('users-read'); + } + + goToEditPage() { + if(!this.canGoToEditPage) return; + this.bsModalRef.hide(); + + } +} diff --git a/frontend/src/app/_components/table/table.component.html b/frontend/src/app/_components/table/table.component.html index a52b727..f1906c3 100644 --- a/frontend/src/app/_components/table/table.component.html +++ b/frontend/src/app/_components/table/table.component.html @@ -27,10 +27,12 @@ - red helmet - red helmet - {{ row.name }} - {{ row.name }} +
+ red helmet + black helmet + {{ row.name }} + {{ row.name }} +
diff --git a/frontend/src/app/_components/table/table.component.ts b/frontend/src/app/_components/table/table.component.ts index 5bac9ed..50792c6 100644 --- a/frontend/src/app/_components/table/table.component.ts +++ b/frontend/src/app/_components/table/table.component.ts @@ -63,6 +63,7 @@ export class TableComponent implements OnInit, OnDestroy { @Output() changeAvailability: EventEmitter<{user: number, newState: 0|1}> = new EventEmitter<{user: number, newState: 0|1}>(); @Output() userImpersonate: EventEmitter = new EventEmitter(); + @Output() moreDetails: EventEmitter<{rowId: number}> = new EventEmitter<{rowId: number}>(); public data: any = []; public displayedData: any = []; @@ -199,6 +200,10 @@ export class TableComponent implements OnInit, OnDestroy { } } + onMoreDetails(rowId: number) { + this.moreDetails.emit({rowId}); + } + openPlaceDetails(id: number) { this.router.navigate(['/place-details', id]); } diff --git a/frontend/src/app/_routes/list/list.component.html b/frontend/src/app/_routes/list/list.component.html index f8983fe..ac98b31 100644 --- a/frontend/src/app/_routes/list/list.component.html +++ b/frontend/src/app/_routes/list/list.component.html @@ -28,7 +28,7 @@ - +