diff --git a/frontend/src/app/components/values-picker/values-picker.component.html b/frontend/src/app/components/values-picker/values-picker.component.html index 4d50d63..d6f466a 100644 --- a/frontend/src/app/components/values-picker/values-picker.component.html +++ b/frontend/src/app/components/values-picker/values-picker.component.html @@ -14,7 +14,6 @@
-

Processing a

+

Processing

diff --git a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.html b/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.html index 775d444..c42ec99 100644 --- a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.html +++ b/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.html @@ -5,7 +5,7 @@

Add new role

-
+
@@ -54,5 +54,3 @@
- -
diff --git a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.scss b/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.scss deleted file mode 100644 index 0779a03..0000000 --- a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.scss +++ /dev/null @@ -1,3 +0,0 @@ -values-picker { - width: 100%; -} diff --git a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.ts b/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.ts index be8c73d..7b9c4b3 100644 --- a/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.ts +++ b/frontend/src/app/routes/settings/roles/settings-roles-edit/settings-roles-edit.component.ts @@ -11,11 +11,9 @@ enum EditMode { edit = 'edit', add = 'add', } - @Component({ selector: 'app-settings-roles-edit', templateUrl: './settings-roles-edit.component.html', - styleUrls: ['./settings-roles-edit.component.scss'], }) export class SettingsRolesEditComponent implements OnInit { private mode: EditMode = EditMode.edit; @@ -78,11 +76,7 @@ export class SettingsRolesEditComponent implements OnInit { this.allPermissions = allPermissions; } - cancel() { - this.router.navigate(['/settings/roles']); - } - - async updateUser() { + async updateRole() { const data = this.model.getData(); if (this.adding) { @@ -111,4 +105,8 @@ export class SettingsRolesEditComponent implements OnInit { this.router.navigate(['/settings/roles']); } + + cancel() { + this.router.navigate(['/settings/roles']); + } } diff --git a/frontend/src/app/routes/settings/roles/settings-roles.component.html b/frontend/src/app/routes/settings/roles/settings-roles.component.html index e0a0cb8..47ebf89 100644 --- a/frontend/src/app/routes/settings/roles/settings-roles.component.html +++ b/frontend/src/app/routes/settings/roles/settings-roles.component.html @@ -7,9 +7,9 @@ - Permissions + + Permissions + - add + + add + diff --git a/frontend/src/app/routes/settings/roles/settings-roles.component.scss b/frontend/src/app/routes/settings/roles/settings-roles.component.scss index 67c6177..5493936 100644 --- a/frontend/src/app/routes/settings/roles/settings-roles.component.scss +++ b/frontend/src/app/routes/settings/roles/settings-roles.component.scss @@ -1,6 +1,5 @@ mat-table { width: 100%; - } .mat-column-actions { diff --git a/frontend/src/app/routes/settings/roles/settings-roles.component.ts b/frontend/src/app/routes/settings/roles/settings-roles.component.ts index 6bca049..d83666c 100644 --- a/frontend/src/app/routes/settings/roles/settings-roles.component.ts +++ b/frontend/src/app/routes/settings/roles/settings-roles.component.ts @@ -6,7 +6,7 @@ import { Permission } from 'picsur-shared/dist/dto/permissions.dto'; import { ERole } from 'picsur-shared/dist/entities/role.entity'; import { HasFailed } from 'picsur-shared/dist/types'; import { UIFriendlyPermissions } from 'src/app/i18n/permissions.i18n'; -import { SnackBarType } from "src/app/models/dto/snack-bar-type.dto"; +import { SnackBarType } from 'src/app/models/dto/snack-bar-type.dto'; import { RolesService } from 'src/app/services/api/roles.service'; import { UtilService } from 'src/app/util/util.service'; @@ -38,7 +38,7 @@ export class SettingsRolesComponent implements OnInit, AfterViewInit { ) {} ngOnInit(): void { - this.fetchRoles().catch(console.error); + this.loadRoles().catch(console.error); } ngAfterViewInit() { @@ -83,7 +83,7 @@ export class SettingsRolesComponent implements OnInit, AfterViewInit { } } - await this.fetchRoles(); + await this.loadRoles(); } uiFriendlyPermission(permission: string) { @@ -98,16 +98,18 @@ export class SettingsRolesComponent implements OnInit, AfterViewInit { return this.ImmutableRolesList.includes(role.name); } - private async fetchRoles() { - const roles = await this.rolesService.getRoles(); + private async loadRoles() { + const [roles, specialRoles] = await Promise.all([ + this.rolesService.getRoles(), + this.rolesService.getSpecialRoles(), + ]); + if (HasFailed(roles)) { this.utilService.showSnackBar('Failed to load roles', SnackBarType.Error); return; } - this.dataSource.data = roles; - const specialRoles = await this.rolesService.getSpecialRoles(); if (HasFailed(specialRoles)) { this.utilService.showSnackBar( 'Failed to load special roles', @@ -115,7 +117,6 @@ export class SettingsRolesComponent implements OnInit, AfterViewInit { ); return; } - this.UndeletableRolesList = specialRoles.UndeletableRoles; this.ImmutableRolesList = specialRoles.ImmutableRoles; } diff --git a/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.html b/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.html index 74d7991..5d721e6 100644 --- a/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.html +++ b/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.html @@ -6,9 +6,10 @@ mat-list-item [routerLink]="'/settings/' + route.path" routerLinkActive="active" - [routerLinkActiveOptions]="{ exact: true }" > - {{ route.data?.page?.icon }} + + {{ route.data?.page?.icon }} + {{ route.data?.page?.title }} @@ -24,7 +25,9 @@ [routerLink]="'/settings/' + route.path" routerLinkActive="active" > - {{ route.data?.page?.icon }} + + {{ route.data?.page?.icon }} + {{ route.data?.page?.title }} diff --git a/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.ts b/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.ts index ea5dedf..2a24d78 100644 --- a/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.ts +++ b/frontend/src/app/routes/settings/sidebar/settings-sidebar.component.ts @@ -24,29 +24,36 @@ export class SettingsSidebarComponent implements OnInit { this.subscribePermissions(); } + private handlePermissions(permissions: string[]) { + // Filter all routes to the routes the current user can access + this.accessibleRoutes = this.settingsRoutes + .filter((route) => route.path !== '') + .filter((route) => + route.data?.permissions !== undefined + ? route.data?.permissions?.every((permission) => + permissions.includes(permission) + ) + : true + ); + + // Split them according to their groups + this.personalRoutes = this.accessibleRoutes.filter( + (route) => route.data?.page?.category === 'personal' + ); + this.systemRoutes = this.accessibleRoutes.filter( + (route) => route.data?.page?.category === 'system' + ); + + // Get out of here if we have no routes + if (this.systemRoutes.length === 0 && this.personalRoutes.length === 0) { + this.router.navigate(['/']); + } + } + @AutoUnsubscribe() private subscribePermissions() { - return this.permissionService.live.subscribe((permissions) => { - this.accessibleRoutes = this.settingsRoutes - .filter((route) => route.path !== '') - .filter((route) => - route.data?.permissions !== undefined - ? route.data?.permissions?.every((permission) => - permissions.includes(permission) - ) - : true - ); - - this.personalRoutes = this.accessibleRoutes.filter( - (route) => route.data?.page?.category === 'personal' - ); - this.systemRoutes = this.accessibleRoutes.filter( - (route) => route.data?.page?.category === 'system' - ); - - if (this.systemRoutes.length === 0 && this.personalRoutes.length === 0) { - this.router.navigate(['/']); - } - }); + return this.permissionService.live.subscribe( + this.handlePermissions.bind(this) + ); } } diff --git a/frontend/src/app/routes/settings/syspref/syspref-option/settings-syspref-option.component.html b/frontend/src/app/routes/settings/syspref/syspref-option/settings-syspref-option.component.html index b22d974..4d13079 100644 --- a/frontend/src/app/routes/settings/syspref/syspref-option/settings-syspref-option.component.html +++ b/frontend/src/app/routes/settings/syspref/syspref-option/settings-syspref-option.component.html @@ -16,6 +16,7 @@ +
@@ -33,6 +34,7 @@
+
diff --git a/frontend/src/app/routes/settings/syspref/syspref-option/settings-syspref-option.component.ts b/frontend/src/app/routes/settings/syspref/syspref-option/settings-syspref-option.component.ts index 83e412f..dad5c8a 100644 --- a/frontend/src/app/routes/settings/syspref/syspref-option/settings-syspref-option.component.ts +++ b/frontend/src/app/routes/settings/syspref/syspref-option/settings-syspref-option.component.ts @@ -1,11 +1,14 @@ import { Component, Input, OnInit } from '@angular/core'; import { AutoUnsubscribe } from 'ngx-auto-unsubscribe-decorator'; import { SysPreferenceBaseResponse } from 'picsur-shared/dist/dto/api/pref.dto'; -import { SysPreference, SysPrefValueType } from 'picsur-shared/dist/dto/syspreferences.dto'; +import { + SysPreference, + SysPrefValueType +} from 'picsur-shared/dist/dto/syspreferences.dto'; import { HasFailed } from 'picsur-shared/dist/types'; import { Subject, throttleTime } from 'rxjs'; import { SysPreferenceFriendlyNames } from 'src/app/i18n/syspref.i18n'; -import { SnackBarType } from "src/app/models/dto/snack-bar-type.dto"; +import { SnackBarType } from 'src/app/models/dto/snack-bar-type.dto'; import { SysprefService } from 'src/app/services/api/syspref.service'; import { UtilService } from 'src/app/util/util.service'; @@ -29,7 +32,10 @@ export class SettingsSysprefOptionComponent implements OnInit { } get name(): string { - return SysPreferenceFriendlyNames[this.pref.key as SysPreference] ?? this.pref.key; + return ( + SysPreferenceFriendlyNames[this.pref.key as SysPreference] ?? + this.pref.key + ); } get valString(): string { @@ -65,26 +71,28 @@ export class SettingsSysprefOptionComponent implements OnInit { this.update((e.target as HTMLInputElement).valueAsNumber); } + private async updatePreference(value: SysPrefValueType) { + const result = await this.sysprefService.setPreference( + this.pref.key, + value + ); + if (!HasFailed(result)) { + this.utilService.showSnackBar( + `Updated ${this.name}`, + SnackBarType.Success + ); + } else { + this.utilService.showSnackBar( + `Failed to update ${this.name}`, + SnackBarType.Error + ); + } + } + @AutoUnsubscribe() subscribeUpdate() { return this.updateSubject .pipe(throttleTime(300, undefined, { leading: true, trailing: true })) - .subscribe(async (value) => { - const result = await this.sysprefService.setPreference( - this.pref.key, - value - ); - if (!HasFailed(result)) { - this.utilService.showSnackBar( - `Updated ${this.name}`, - SnackBarType.Success - ); - } else { - this.utilService.showSnackBar( - `Failed to update ${this.name}`, - SnackBarType.Error - ); - } - }); + .subscribe(this.updatePreference.bind(this)); } }