diff --git a/frontend/src/app/components/footer/footer.component.scss b/frontend/src/app/components/footer/footer.component.scss
index db08325..2416d2b 100644
--- a/frontend/src/app/components/footer/footer.component.scss
+++ b/frontend/src/app/components/footer/footer.component.scss
@@ -14,5 +14,5 @@ span.line {
.heart {
font-size: 22px;
- translate: 0 25%;
+ transform: translate(0, 25%);
}
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 c3eecb7..42a708d 100644
--- a/frontend/src/app/routes/settings/roles/settings-roles.component.html
+++ b/frontend/src/app/routes/settings/roles/settings-roles.component.html
@@ -1,2 +1,84 @@
Roles
+
+
+ Name
+ {{ role.name }}
+
+
+
+ Permissions
+
+
+
+ System
+
+
+ {{ uiFriendlyPermission(permission) }}
+
+ permissionsTruncate"
+ >
+ +{{ role.permissions.length - permissionsTruncate }}
+
+
+
+
+
+
+ Actions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/app/routes/settings/roles/settings-roles.component.scss b/frontend/src/app/routes/settings/roles/settings-roles.component.scss
new file mode 100644
index 0000000..67c6177
--- /dev/null
+++ b/frontend/src/app/routes/settings/roles/settings-roles.component.scss
@@ -0,0 +1,21 @@
+mat-table {
+ width: 100%;
+
+}
+
+.mat-column-actions {
+ justify-content: end;
+}
+
+.mat-column-permissions {
+ flex-grow: 3;
+}
+
+.icon-red {
+ color: #f44336;
+}
+
+mat-chip-list {
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
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 1bae3af..8ea98ff 100644
--- a/frontend/src/app/routes/settings/roles/settings-roles.component.ts
+++ b/frontend/src/app/routes/settings/roles/settings-roles.component.ts
@@ -1,12 +1,68 @@
-import { Component, OnInit } from '@angular/core';
+import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';
+import { MatPaginator } from '@angular/material/paginator';
+import { MatTableDataSource } from '@angular/material/table';
+import {
+ Permission,
+ UIFriendlyPermissions
+} from 'picsur-shared/dist/dto/permissions';
+import { ERole } from 'picsur-shared/dist/entities/role.entity';
+import { HasFailed } from 'picsur-shared/dist/types';
+import { SnackBarType } from 'src/app/models/snack-bar-type';
+import { RolesService } from 'src/app/services/api/roles.service';
+import { UtilService } from 'src/app/util/util.service';
@Component({
templateUrl: './settings-roles.component.html',
+ styleUrls: ['./settings-roles.component.scss'],
})
-export class SettingsRolesComponent implements OnInit {
- constructor() {}
+export class SettingsRolesComponent implements OnInit, AfterViewInit {
+ public readonly displayedColumns: string[] = [
+ 'name',
+ 'permissions',
+ 'actions',
+ ];
+ public readonly pageSizeOptions: number[] = [5, 10, 25, 100];
+ public readonly startingPageSize = this.pageSizeOptions[2];
+ public readonly permissionsTruncate = 5;
+
+ public dataSource = new MatTableDataSource([]);
+
+ @ViewChild(MatPaginator) paginator: MatPaginator;
+
+ constructor(
+ private rolesService: RolesService,
+ private utilService: UtilService
+ ) {}
ngOnInit(): void {
+ this.initRoles().catch(console.error);
}
+ ngAfterViewInit() {
+ this.dataSource.paginator = this.paginator;
+ }
+
+ async initRoles() {
+ const roles = await this.rolesService.getRoles();
+ if (HasFailed(roles)) {
+ this.utilService.showSnackBar('Failed to load roles', SnackBarType.Error);
+ return;
+ }
+
+ this.dataSource.data = roles;
+ }
+
+ addRole() {}
+
+ editRole(role: ERole) {}
+
+ deleteRole(role: ERole) {}
+
+ uiFriendlyPermission(permission: Permission) {
+ return UIFriendlyPermissions[permission];
+ }
+
+ isSystem(role: ERole) {
+ return false;
+ }
}
diff --git a/frontend/src/app/routes/settings/roles/settings-roles.module.ts b/frontend/src/app/routes/settings/roles/settings-roles.module.ts
index 6140e66..bd53855 100644
--- a/frontend/src/app/routes/settings/roles/settings-roles.module.ts
+++ b/frontend/src/app/routes/settings/roles/settings-roles.module.ts
@@ -1,5 +1,10 @@
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
+import { MatButtonModule } from '@angular/material/button';
+import { MatChipsModule } from '@angular/material/chips';
+import { MatIconModule } from '@angular/material/icon';
+import { MatPaginatorModule } from '@angular/material/paginator';
+import { MatTableModule } from '@angular/material/table';
import { SettingsRolesComponent } from './settings-roles.component';
import { SettingsRolesRoutingModule } from './settings-roles.routing.module';
@@ -8,6 +13,11 @@ import { SettingsRolesRoutingModule } from './settings-roles.routing.module';
imports: [
CommonModule,
SettingsRolesRoutingModule,
+ MatIconModule,
+ MatButtonModule,
+ MatTableModule,
+ MatChipsModule,
+ MatPaginatorModule,
],
})
export class SettingsRolesRouteModule {}
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 8c48d1a..b22d974 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
@@ -9,6 +9,8 @@
matInput
[value]="pref.value"
(change)="stringUpdateWrapper($event)"
+ autocorrect="off"
+ autocapitalize="none"
/>
diff --git a/frontend/src/app/routes/settings/users/settings-users-edit/settings-users-edit.component.html b/frontend/src/app/routes/settings/users/settings-users-edit/settings-users-edit.component.html
index 0f5ee46..152ee8c 100644
--- a/frontend/src/app/routes/settings/users/settings-users-edit/settings-users-edit.component.html
+++ b/frontend/src/app/routes/settings/users/settings-users-edit/settings-users-edit.component.html
@@ -22,6 +22,8 @@
type="text"
[formControl]="model.username"
name="username"
+ autocorrect="off"
+ autocapitalize="none"
required
/>
@@ -74,6 +76,8 @@
[matChipInputFor]="chipList"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes"
(matChipInputTokenEnd)="addRole($event)"
+ autocorrect="off"
+ autocapitalize="none"
/>
-