From 88f0cf307e89b84b795cd10a1bb59abb9a97fd12 Mon Sep 17 00:00:00 2001 From: liosha84 <138026690+liosha84@users.noreply.github.com> Date: Sat, 19 Jul 2025 17:23:11 +0300 Subject: [PATCH] Implement admin and user sidebars with routing and styling updates --- .../admin-module/admin-module.service.spec.ts | 16 ++ .../app/admin-module/admin-module.service.ts | 19 ++ .../admin.component/admin.component.html | 29 +-- .../admin.component/admin.component.scss | 30 ++- .../admin.component/admin.component.ts | 2 + .../src/app/admin-module/admin.routing.ts | 9 +- .../side-bar-admin.component.html | 35 ++++ .../side-bar-admin.component.scss | 14 ++ .../side-bar-admin.component.spec.ts | 23 +++ .../side-bar-admin.component.ts | 20 ++ .../users.component/users.component.html | 56 ++++++ .../users.component/users.component.scss | 3 + .../users.component/users.component.spec.ts | 23 +++ .../users.component/users.component.ts | 185 ++++++++++++++++++ .../board-admin/board-admin.component.ts | 3 +- .../main.component/main.component.html | 2 +- .../main.component/main.component.ts | 4 +- .../side-bar-user.component.html | 19 ++ .../side-bar-user.component.scss | 14 ++ .../side-bar-user.component.spec.ts | 23 +++ .../side-bar-user.component.ts | 20 ++ .../tutorials-list.component.ts | 2 +- .../user.component/user.component.html | 29 +-- .../user.component/user.component.scss | 45 +---- .../user.component/user.component.ts | 4 +- .../controllers/UsersController.java | 31 ++- 26 files changed, 540 insertions(+), 120 deletions(-) create mode 100644 jambotron-ui/src/app/admin-module/admin-module.service.spec.ts create mode 100644 jambotron-ui/src/app/admin-module/admin-module.service.ts create mode 100644 jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.html create mode 100644 jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.scss create mode 100644 jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.spec.ts create mode 100644 jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.ts create mode 100644 jambotron-ui/src/app/admin-module/users.component/users.component.html create mode 100644 jambotron-ui/src/app/admin-module/users.component/users.component.scss create mode 100644 jambotron-ui/src/app/admin-module/users.component/users.component.spec.ts create mode 100644 jambotron-ui/src/app/admin-module/users.component/users.component.ts create mode 100644 jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.html create mode 100644 jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.scss create mode 100644 jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.spec.ts create mode 100644 jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.ts diff --git a/jambotron-ui/src/app/admin-module/admin-module.service.spec.ts b/jambotron-ui/src/app/admin-module/admin-module.service.spec.ts new file mode 100644 index 0000000..1dfcd33 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin-module.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { AdminModuleService } from './admin-module.service'; + +describe('AdminModuleService', () => { + let service: AdminModuleService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(AdminModuleService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/admin-module/admin-module.service.ts b/jambotron-ui/src/app/admin-module/admin-module.service.ts new file mode 100644 index 0000000..04787b7 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/admin-module.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import {Observable} from 'rxjs'; +import {HttpClient} from '@angular/common/http'; +import {User} from '../models/user.model'; + +@Injectable({ + providedIn: 'root' +}) +export class AdminModuleService { + baseUrl = 'http://localhost:8080/api'; + + constructor(private http: HttpClient) { + +} + + updateUserRoles(id: any,data: User): Observable { + return this.http.put(`${this.baseUrl}/users/${id}`, data); + } +} diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.html b/jambotron-ui/src/app/admin-module/admin.component/admin.component.html index 3876019..a2adc38 100644 --- a/jambotron-ui/src/app/admin-module/admin.component/admin.component.html +++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.html @@ -1,28 +1,13 @@ - - - - + +
-
-
-
+ -
-
+ -
-
-
-
-
-
+
diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss b/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss index 3cde704..9a8a04f 100644 --- a/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss +++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.scss @@ -1,22 +1,16 @@ -.example-container { - width: 500px; - height: 300px; - border: 1px solid rgba(0, 0, 0, 0.5); -} - -.example-sidenav-content { - display: flex; - height: 100%; - align-items: center; - justify-content: center; -} - -.example-sidenav { - padding: 20px; -} - +//--------------- .pc-sidebar{ - top: 120px; + top: 65px; + overflow-y: auto; + background-color: rgba(153, 153, 153, 0.16); + + backdrop-filter: blur(8px); +} +.pc-container{ + top: 0px; + padding-left: 5px; + padding-right: 5px; } + diff --git a/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts b/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts index c7496dc..7b2330a 100644 --- a/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts +++ b/jambotron-ui/src/app/admin-module/admin.component/admin.component.ts @@ -9,6 +9,7 @@ import {MatButton} from '@angular/material/button'; import { ScrollPanelModule } from 'primeng/scrollpanel'; import {MenuItem} from 'primeng/api'; import {PanelMenu} from 'primeng/panelmenu'; +import {SideBarAdminComponent} from '../side-bar-admin.component/side-bar-admin.component'; @Component({ selector: 'app-admin.component', imports: [ @@ -24,6 +25,7 @@ import {PanelMenu} from 'primeng/panelmenu'; RouterLink, PanelMenu, NgStyle, + SideBarAdminComponent, ], schemas:[CUSTOM_ELEMENTS_SCHEMA], diff --git a/jambotron-ui/src/app/admin-module/admin.routing.ts b/jambotron-ui/src/app/admin-module/admin.routing.ts index 246ca73..eb1ff4f 100644 --- a/jambotron-ui/src/app/admin-module/admin.routing.ts +++ b/jambotron-ui/src/app/admin-module/admin.routing.ts @@ -8,7 +8,7 @@ const ADMIN_ROUTES: Routes = [ children: [ { - path: 'welcome', + path: 'admin-welcome', loadComponent: () => import('../admin-module/admin-welcome.component/admin-welcome.component').then((c) => c.AdminWelcomeComponent), }, { @@ -17,9 +17,12 @@ const ADMIN_ROUTES: Routes = [ }, { path: 'system', - loadComponent: () => import('../admin-module/system.component/system.component').then((c) => c.SystemComponent) - } + }, + { + path: 'users', + loadComponent: () => import('../admin-module/users.component/users.component').then((c) => c.UsersComponent) + } ] } ]; diff --git a/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.html b/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.html new file mode 100644 index 0000000..3d40615 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.html @@ -0,0 +1,35 @@ + + + + house + @if (!isCollapsed) { + Dashboard + } + + + + + newspaper + @if (!isCollapsed) { + Users + } + + + + + newspaper + @if (!isCollapsed) { + Settings + } + + + + + newspaper + @if (!isCollapsed) { + System + } + + + + diff --git a/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.scss b/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.scss new file mode 100644 index 0000000..62a5b67 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.scss @@ -0,0 +1,14 @@ +.entry{ + display: flex; + align-items: center; + gap: 1rem; + padding:0.75rem; + color: rgba(24, 255, 255, 0.96); + +} + +a.mdc-list-item +{ + + background-color: rgba(24,255,255,0.04); +} diff --git a/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.spec.ts b/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.spec.ts new file mode 100644 index 0000000..b6f9f21 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SideBarAdminComponent } from './side-bar-admin.component'; + +describe('SideBarAdminComponent', () => { + let component: SideBarAdminComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SideBarAdminComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SideBarAdminComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.ts b/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.ts new file mode 100644 index 0000000..0940b6f --- /dev/null +++ b/jambotron-ui/src/app/admin-module/side-bar-admin.component/side-bar-admin.component.ts @@ -0,0 +1,20 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {MatListItem, MatNavList} from '@angular/material/list'; +import {RouterLink} from '@angular/router'; +import {MatIcon} from '@angular/material/icon'; + +@Component({ + selector: 'app-side-bar-admin', + imports: [ + MatIcon, + MatListItem, + MatNavList, + RouterLink + ], + templateUrl: './side-bar-admin.component.html', + styleUrl: './side-bar-admin.component.scss', + schemas:[CUSTOM_ELEMENTS_SCHEMA] +}) +export class SideBarAdminComponent { + isCollapsed = false; +} diff --git a/jambotron-ui/src/app/admin-module/users.component/users.component.html b/jambotron-ui/src/app/admin-module/users.component/users.component.html new file mode 100644 index 0000000..4634e66 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/users.component/users.component.html @@ -0,0 +1,56 @@ + + @for (column of columnsSchema; track column){ + + + + + } + + +
+ {{column.label}} + + @switch (column.type) { + @case ('list') { + + + @for (role of element.roles; track $index) { + + {{role.name}} + + + cancel + + + + } + + + + @for (role of filteredRoles(element.roles); track role) { + {{role.name}} + } + + + } + @default { + {{ element[column.key] }} + } + } +
diff --git a/jambotron-ui/src/app/admin-module/users.component/users.component.scss b/jambotron-ui/src/app/admin-module/users.component/users.component.scss new file mode 100644 index 0000000..fecda9c --- /dev/null +++ b/jambotron-ui/src/app/admin-module/users.component/users.component.scss @@ -0,0 +1,3 @@ +.example-chip-list { + width: 100%; +} diff --git a/jambotron-ui/src/app/admin-module/users.component/users.component.spec.ts b/jambotron-ui/src/app/admin-module/users.component/users.component.spec.ts new file mode 100644 index 0000000..241dbac --- /dev/null +++ b/jambotron-ui/src/app/admin-module/users.component/users.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UsersComponent } from './users.component'; + +describe('UsersComponent', () => { + let component: UsersComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [UsersComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(UsersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/admin-module/users.component/users.component.ts b/jambotron-ui/src/app/admin-module/users.component/users.component.ts new file mode 100644 index 0000000..5c45ed2 --- /dev/null +++ b/jambotron-ui/src/app/admin-module/users.component/users.component.ts @@ -0,0 +1,185 @@ +import {ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, model} from '@angular/core'; +import {UserService} from '../../services/user.service'; +import {RolesService} from '../../services/roles.service'; +import {Role} from '../../models/role'; +import {User} from '../../models/user.model'; +import { + MatCell, + MatCellDef, MatColumnDef, + MatHeaderCell, MatHeaderCellDef, + MatHeaderRow, + MatHeaderRowDef, + MatRow, + MatRowDef, MatTable +} from '@angular/material/table'; +import {FormControl, FormsModule, ReactiveFormsModule} from '@angular/forms'; +import { + MatAutocomplete, + MatAutocompleteSelectedEvent, + MatAutocompleteTrigger, + MatOption +} from '@angular/material/autocomplete'; +import { + MatChip, + MatChipGrid, + MatChipInput, + MatChipInputEvent, + MatChipRow, + MatChipsModule +} from '@angular/material/chips'; +import {MatIcon} from '@angular/material/icon'; +import {COMMA, ENTER} from '@angular/cdk/keycodes'; +import {MatFormField} from '@angular/material/input'; +import {MatSelect, MatSelectTrigger} from '@angular/material/select'; +import {AdminModuleService} from '../admin-module.service'; + +@Component({ + selector: 'app-users.component', + imports: [ + MatCell, + MatCellDef, + MatHeaderCell, + MatHeaderRow, + MatHeaderRowDef, + MatRow, + MatRowDef, + MatTable, + MatColumnDef, + MatHeaderCellDef, + FormsModule, + ReactiveFormsModule, + MatChipGrid, + MatChipRow, + MatIcon, + MatAutocompleteTrigger, + MatChipInput, + MatAutocomplete, + MatOption, + MatFormField, + MatSelect, + MatSelectTrigger, + MatChip, + MatChipsModule + ], + templateUrl: './users.component.html', + styleUrl: './users.component.scss', + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class UsersComponent { + + readonly separatorKeysCodes: number[] = [ENTER, COMMA]; + allRoles:Role[] = []; + users: User[] = []; + + displayedColumns: string[] = UserColumns.map((col) => col.key) + columnsSchema: any = UserColumns + + readonly currentRole = model(''); + + rolesControl = new FormControl([]); + protected ac = new FormControl(''); + + constructor(private userService: UserService, + private roleService: RolesService, + private adminService:AdminModuleService) { + this.getAllRoles(); + this.getUsers(); + } + + getAllRoles():any{ + this.roleService.getAllRoles().subscribe( + (data : any) => { + this.allRoles = data; + console.log(data); + }, + (err : any)=> { + this.allRoles = JSON.parse(err.error).message; + } + ); + } + + getUsers(){ + this.userService.getAdminBoard().subscribe( + (data : any) => { + this.users = data; + console.log(data); + }, + (err : any)=> { + console.log(JSON.parse(err.error).message); + } + ); + } + + filteredRoles(roles : Role[]):any { + return this.allRoles.filter( + (r:Role) => !roles.some((item) => item.id === r.id), + ); + } + + change($event: Event, roles: Role[]) { + roles.filter( + (r:Role) => !roles.some((item) => item.name?.toLowerCase() === r.name?.toLowerCase()), + ) + } + + selected(user: User, $event: MatAutocompleteSelectedEvent) { + user.roles.push($event.option.value); + this.saveUserRoles(user); + this.currentRole.set(''); + $event.option.deselect(); + } + + add($event: MatChipInputEvent, user:User) { + /*const value = ($event.value || '').trim(); + + const role = this.allRoles.find(value1 => value1.name === value); + if(role){ + user.roles.push(value); + this.saveUserRoles(user); + }*/ + // Clear the input value + this.currentRole.set(''); + } + + remove(role: any, user: User) { + const updatedRoles: Role[] = user.roles.filter( + (r: Role) => r.id !== role.id // Simple comparison with the role to remove + ); + + if (updatedRoles && updatedRoles.length >= 1) { + user.roles = updatedRoles; + this.saveUserRoles(user); + } + } + + saveUserRoles(user:User){ + this.adminService.updateUserRoles(user.id, user).subscribe( + (data:any) => { + console.log(data); + }, + (err:any) => { + console.log(err); + } + ) + } +} + +export const UserColumns = [ + { + key: 'username', + type: 'text', + label: 'Name', + required: true, + }, + { + key: 'email', + type: 'text', + label: 'Email', + }, + { + key: 'roles', + type: 'list', + label: 'Roles', + required: true, + } +]; diff --git a/jambotron-ui/src/app/components/board-admin/board-admin.component.ts b/jambotron-ui/src/app/components/board-admin/board-admin.component.ts index 1fc3f98..b2471d6 100644 --- a/jambotron-ui/src/app/components/board-admin/board-admin.component.ts +++ b/jambotron-ui/src/app/components/board-admin/board-admin.component.ts @@ -80,7 +80,6 @@ export class BoardAdminComponent implements OnInit { return this.allRoles.filter( (r:Role) => !roles.some((item) => item.id === r.id), ); - } // private _filter(value: string): string[] { @@ -111,7 +110,7 @@ export class BoardAdminComponent implements OnInit { // this.announcer.announce(`Removed ${fruit}`); // return [...fruits]; - } + } diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.html b/jambotron-ui/src/app/main-module/main.component/main.component.html index b0e338e..e115b74 100644 --- a/jambotron-ui/src/app/main-module/main.component/main.component.html +++ b/jambotron-ui/src/app/main-module/main.component/main.component.html @@ -27,7 +27,7 @@ @if (showAdminBoard) { - diff --git a/jambotron-ui/src/app/main-module/main.component/main.component.ts b/jambotron-ui/src/app/main-module/main.component/main.component.ts index f2f88a6..4fffd99 100644 --- a/jambotron-ui/src/app/main-module/main.component/main.component.ts +++ b/jambotron-ui/src/app/main-module/main.component/main.component.ts @@ -186,7 +186,9 @@ export class MainComponent implements OnInit{ this.refreshToolbar(); dialogLoginRef.close() - this.router.navigate(['main/user/user-welcome']); + + + this.router.navigate(['main/tutorials']); }, err => { dialogLoginRef.componentInstance.openLoginFailedSnackBar(err.error.message); diff --git a/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.html b/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.html new file mode 100644 index 0000000..c086fd8 --- /dev/null +++ b/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.html @@ -0,0 +1,19 @@ + + + + house + @if (!isCollapsed) { + Dashboard + } + + + + + newspaper + @if (!isCollapsed) { + Tutorials + } + + + + diff --git a/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.scss b/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.scss new file mode 100644 index 0000000..62a5b67 --- /dev/null +++ b/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.scss @@ -0,0 +1,14 @@ +.entry{ + display: flex; + align-items: center; + gap: 1rem; + padding:0.75rem; + color: rgba(24, 255, 255, 0.96); + +} + +a.mdc-list-item +{ + + background-color: rgba(24,255,255,0.04); +} diff --git a/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.spec.ts b/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.spec.ts new file mode 100644 index 0000000..86d79b6 --- /dev/null +++ b/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SideBarUserComponent } from './side-bar-user.component'; + +describe('SideBarUserComponent', () => { + let component: SideBarUserComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SideBarUserComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SideBarUserComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.ts b/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.ts new file mode 100644 index 0000000..7d71af6 --- /dev/null +++ b/jambotron-ui/src/app/user-module/side-bar-user.component/side-bar-user.component.ts @@ -0,0 +1,20 @@ +import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {MatListItem, MatNavList} from '@angular/material/list'; +import {RouterLink} from '@angular/router'; +import {MatIcon} from '@angular/material/icon'; + +@Component({ + selector: 'app-side-bar-user', + imports: [ + MatIcon, + MatListItem, + MatNavList, + RouterLink + ], + templateUrl: './side-bar-user.component.html', + styleUrl: './side-bar-user.component.scss', + schemas:[CUSTOM_ELEMENTS_SCHEMA] +}) +export class SideBarUserComponent { + isCollapsed = false; +} diff --git a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts index ec25a19..a30172c 100644 --- a/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts +++ b/jambotron-ui/src/app/user-module/tutorials-list.component/tutorials-list.component.ts @@ -200,7 +200,7 @@ export const TutorialColumns = [ required: true }, { - key: 'toBePublished', + key: 'tobepublished', type: 'boolean', label: 'To be published', required: true diff --git a/jambotron-ui/src/app/user-module/user.component/user.component.html b/jambotron-ui/src/app/user-module/user.component/user.component.html index 9467823..1668b71 100644 --- a/jambotron-ui/src/app/user-module/user.component/user.component.html +++ b/jambotron-ui/src/app/user-module/user.component/user.component.html @@ -1,34 +1,9 @@ - - - +
- - - - - - - - - - - - - - - - - - - - - - - - diff --git a/jambotron-ui/src/app/user-module/user.component/user.component.scss b/jambotron-ui/src/app/user-module/user.component/user.component.scss index 0a94558..016384e 100644 --- a/jambotron-ui/src/app/user-module/user.component/user.component.scss +++ b/jambotron-ui/src/app/user-module/user.component/user.component.scss @@ -1,49 +1,10 @@ - -mat-toolbar{ - position:fixed; - top:0; - z-index: 2; -} - -mat-sidenav-container { - height:100%; -} - -// Move the content down so that it won't be hidden by the toolbar -mat-sidenav { - padding-top: 3.5rem; - transition: width 0.3s ease; - @media screen and (min-width: 600px) { - padding-top: 4rem; - } - - .entry{ - display: flex; - align-items: center; - gap: 1rem; - padding:0.75rem; - } - -} - -// Move the content down so that it won't be hidden by the toolbar -mat-sidenav-content{ - padding-top: 3.5rem; - @media screen and (min-width: 600px) { - padding-top: 4rem; - } -} - - - -.expanded { - width: 250px; -} - //--------------- .pc-sidebar{ top: 65px; overflow-y: auto; + background-color: rgba(153, 153, 153, 0.16); + + backdrop-filter: blur(8px); } .pc-container{ top: 0px; diff --git a/jambotron-ui/src/app/user-module/user.component/user.component.ts b/jambotron-ui/src/app/user-module/user.component/user.component.ts index b76b805..0a52d2f 100644 --- a/jambotron-ui/src/app/user-module/user.component/user.component.ts +++ b/jambotron-ui/src/app/user-module/user.component/user.component.ts @@ -8,6 +8,7 @@ import {MatIcon} from '@angular/material/icon'; import {BreakpointObserver} from '@angular/cdk/layout'; import {MatToolbar} from '@angular/material/toolbar'; import {MatIconButton} from '@angular/material/button'; +import {SideBarUserComponent} from '../side-bar-user.component/side-bar-user.component'; @Component({ selector: 'app-user.component', @@ -21,7 +22,8 @@ import {MatIconButton} from '@angular/material/button'; MatListItem, MatIcon, MatToolbar, - MatIconButton + MatIconButton, + SideBarUserComponent ], templateUrl: './user.component.html', styleUrl: './user.component.scss', diff --git a/src/main/java/com/jambotronGroup/jambotron/controllers/UsersController.java b/src/main/java/com/jambotronGroup/jambotron/controllers/UsersController.java index 50882c7..39b5e03 100644 --- a/src/main/java/com/jambotronGroup/jambotron/controllers/UsersController.java +++ b/src/main/java/com/jambotronGroup/jambotron/controllers/UsersController.java @@ -1,6 +1,7 @@ package com.jambotronGroup.jambotron.controllers; +import com.jambotronGroup.jambotron.model.Tutorial; import com.jambotronGroup.jambotron.model.User; import com.jambotronGroup.jambotron.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; @@ -8,8 +9,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @CrossOrigin(origins = "${app.origin}", maxAge = 3600, allowCredentials="true") @RestController @@ -35,4 +35,31 @@ public class UsersController { return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); } } + + @PutMapping("users/{id}") + public ResponseEntity updateUserRoles(@PathVariable("id") long id, @RequestBody User user) { + Optional userData = userRepository.findById(id); + Map map = new LinkedHashMap(); + if (userData.isPresent()) { + User servUser = userData.get(); + if(user.getRoles().size() > 0) + servUser.setRoles(user.getRoles()); + else { + map.put("status", 0); + map.put("message", "User must have at least one role"); + return new ResponseEntity<>(map, HttpStatus.BAD_REQUEST); + } + try { + servUser = userRepository.save(servUser); + } catch (Exception e) { + + map.put("status", 0); + map.put("message", e.getMessage()); + return new ResponseEntity<>(map,HttpStatus.INTERNAL_SERVER_ERROR); + } + return new ResponseEntity<>(servUser, HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } }