From 63e70cd10926beefe5e57d4385ef2843fc5aefb4 Mon Sep 17 00:00:00 2001 From: William Date: Sat, 14 May 2022 21:19:19 -0400 Subject: [PATCH] #30 Working group token dialog --- src/app/app-routing.module.ts | 3 + src/app/modules/accounts/accounts.module.ts | 11 +-- src/app/modules/accounts/group-token-add.html | 8 --- src/app/modules/accounts/group-tokens.ts | 18 ----- .../accounts/services/group-token.service.ts | 4 +- src/app/modules/groupTokens/add.html | 10 +++ .../group-tokens-routing.module.ts | 18 +++++ .../groupTokens/group-tokens.module.ts | 24 +++++++ src/app/modules/groupTokens/group-tokens.ts | 69 +++++++++++++++++++ src/app/modules/groupTokens/list.html | 1 + src/app/modules/groups/group.module.ts | 18 ++--- .../groups/pages/list/list.component.html | 11 ++- .../groups/pages/list/list.component.ts | 41 ++++------- .../shared/components/dialogs/dialogs.ts | 1 + .../shared/components/dialogs/prompt.html | 2 +- src/app/modules/shared/model/account.model.ts | 2 +- .../modules/users/services/user.service.ts | 12 ++-- .../administration.component.ts | 1 + 18 files changed, 174 insertions(+), 80 deletions(-) delete mode 100644 src/app/modules/accounts/group-token-add.html delete mode 100644 src/app/modules/accounts/group-tokens.ts create mode 100644 src/app/modules/groupTokens/add.html create mode 100644 src/app/modules/groupTokens/group-tokens-routing.module.ts create mode 100644 src/app/modules/groupTokens/group-tokens.module.ts create mode 100644 src/app/modules/groupTokens/group-tokens.ts create mode 100644 src/app/modules/groupTokens/list.html diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 3d9f34f..c17efab 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -38,6 +38,9 @@ const routes: Routes = [{ }, { path: 'group', loadChildren: () => import('./modules/groups/group.module').then(m => m.GroupModule) + }, { + path: 'group-token', + loadChildren: () => import('./modules/groupTokens/group-tokens.module').then(m => m.GroupTokensModule) }, { path: 'config', loadChildren: () => import('./modules/configuration/config.module').then(m => m.ConfigModule), diff --git a/src/app/modules/accounts/accounts.module.ts b/src/app/modules/accounts/accounts.module.ts index fbae01b..236563a 100644 --- a/src/app/modules/accounts/accounts.module.ts +++ b/src/app/modules/accounts/accounts.module.ts @@ -3,19 +3,14 @@ import {NgModule} from '@angular/core' import {AccountsRoutingModule} from './accounts-routing.module' import {SharedModule} from '../shared/shared.module' import {Login, Logout} from './accounts' -import {CreInputsModule} from '../shared/components/inputs/inputs.module' -import {CreButtonsModule} from '../shared/components/buttons/buttons.module' -import {GroupTokenAdd} from "./group-tokens"; +import {CreInputsModule} from "../shared/components/inputs/inputs.module"; +import {CreButtonsModule} from "../shared/components/buttons/buttons.module"; @NgModule({ declarations: [ Login, - Logout, - GroupTokenAdd - ], - exports: [ - GroupTokenAdd + Logout ], imports: [ SharedModule, diff --git a/src/app/modules/accounts/group-token-add.html b/src/app/modules/accounts/group-token-add.html deleted file mode 100644 index 0dbc965..0000000 --- a/src/app/modules/accounts/group-token-add.html +++ /dev/null @@ -1,8 +0,0 @@ - - -
- -
-
-
diff --git a/src/app/modules/accounts/group-tokens.ts b/src/app/modules/accounts/group-tokens.ts deleted file mode 100644 index e4fa932..0000000 --- a/src/app/modules/accounts/group-tokens.ts +++ /dev/null @@ -1,18 +0,0 @@ -import {Component, ViewChild} from "@angular/core"; -import {CrePromptDialog} from "../shared/components/dialogs/dialogs"; -import {Group} from "../shared/model/account.model"; -import {FormControl, Validators} from "@angular/forms"; - -@Component({ - selector: 'cre-group-token-add', - templateUrl: 'group-token-add.html' -}) -export class GroupTokenAdd { - @ViewChild(CrePromptDialog) dialog: CrePromptDialog - - controls = {name: new FormControl(null, Validators.required)} - - show(group: Group) { - this.dialog.show() - } -} diff --git a/src/app/modules/accounts/services/group-token.service.ts b/src/app/modules/accounts/services/group-token.service.ts index b6cc2ee..a7409d8 100644 --- a/src/app/modules/accounts/services/group-token.service.ts +++ b/src/app/modules/accounts/services/group-token.service.ts @@ -20,7 +20,7 @@ export class GroupTokenService { return this.api.get('/account/group/token/current') } - save(name: string): Observable { - return this.api.post('/account/group/token') + save(name: string, groupId: number): Observable { + return this.api.post('/account/group/token', {name, groupId}) } } diff --git a/src/app/modules/groupTokens/add.html b/src/app/modules/groupTokens/add.html new file mode 100644 index 0000000..391cf0b --- /dev/null +++ b/src/app/modules/groupTokens/add.html @@ -0,0 +1,10 @@ + + +
+ +
+
+
diff --git a/src/app/modules/groupTokens/group-tokens-routing.module.ts b/src/app/modules/groupTokens/group-tokens-routing.module.ts new file mode 100644 index 0000000..0409085 --- /dev/null +++ b/src/app/modules/groupTokens/group-tokens-routing.module.ts @@ -0,0 +1,18 @@ +import {RouterModule, Routes} from "@angular/router"; +import {GroupTokenList} from "./group-tokens"; +import {NgModule} from "@angular/core"; + +const routes: Routes = [{ + path: 'list', + component: GroupTokenList +}, { + path: '', + redirectTo: 'list' +}] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule] +}) +export class GroupTokensRoutingModule { +} diff --git a/src/app/modules/groupTokens/group-tokens.module.ts b/src/app/modules/groupTokens/group-tokens.module.ts new file mode 100644 index 0000000..f7f0191 --- /dev/null +++ b/src/app/modules/groupTokens/group-tokens.module.ts @@ -0,0 +1,24 @@ +import {NgModule} from '@angular/core' + +import {SharedModule} from '../shared/shared.module' +import {CreInputsModule} from '../shared/components/inputs/inputs.module' +import {CreButtonsModule} from '../shared/components/buttons/buttons.module' +import {GroupTokenAdd, GroupTokenList} from "../groupTokens/group-tokens"; + + +@NgModule({ + declarations: [ + GroupTokenAdd, + GroupTokenList + ], + exports: [ + GroupTokenAdd + ], + imports: [ + SharedModule, + CreInputsModule, + CreButtonsModule + ] +}) +export class GroupTokensModule { +} diff --git a/src/app/modules/groupTokens/group-tokens.ts b/src/app/modules/groupTokens/group-tokens.ts new file mode 100644 index 0000000..959feaf --- /dev/null +++ b/src/app/modules/groupTokens/group-tokens.ts @@ -0,0 +1,69 @@ +import {Component, EventEmitter, Output, ViewChild} from "@angular/core"; +import {CrePromptDialog} from "../shared/components/dialogs/dialogs"; +import {Group, GroupToken} from "../shared/model/account.model"; +import {FormControl, FormGroup, Validators} from "@angular/forms"; +import {GroupTokenService} from "../accounts/services/group-token.service"; +import {SubscribingComponent} from "../shared/components/subscribing.component"; +import {ErrorService} from "../shared/service/error.service"; +import {ActivatedRoute, Router} from "@angular/router"; + +@Component({ + selector: 'cre-group-token-list', + templateUrl: 'list.html' +}) +export class GroupTokenList extends SubscribingComponent { + tokens$ = this.groupTokenService.all + + columns = ['id', 'name', 'groupName', 'deleteButton'] + + constructor( + private groupTokenService: GroupTokenService, + errorService: ErrorService, + router: Router, + activatedRoute: ActivatedRoute + ) { + super(errorService, activatedRoute, router) + } +} + +@Component({ + selector: 'cre-group-token-add', + templateUrl: 'add.html' +}) +export class GroupTokenAdd extends SubscribingComponent { + @ViewChild(CrePromptDialog) dialog: CrePromptDialog + + @Output() defaultGroupUpdate = new EventEmitter() + + controls = {name: new FormControl(null, Validators.required)} + form = new FormGroup(this.controls) + + private group: Group | null + + constructor( + private groupTokenService: GroupTokenService, + errorService: ErrorService, + router: Router, + activatedRoute: ActivatedRoute + ) { + super(errorService, activatedRoute, router) + } + + show(group: Group) { + this.group = group + this.dialog.show() + } + + submit() { + if (!this.group) { + console.error("Group token group id was not defined") + return + } + + const name = this.controls.name.value + this.subscribe( + this.groupTokenService.save(name, this.group.id), + groupToken => this.defaultGroupUpdate.emit(groupToken.group) + ) + } +} diff --git a/src/app/modules/groupTokens/list.html b/src/app/modules/groupTokens/list.html new file mode 100644 index 0000000..79a243c --- /dev/null +++ b/src/app/modules/groupTokens/list.html @@ -0,0 +1 @@ +
A list
diff --git a/src/app/modules/groups/group.module.ts b/src/app/modules/groups/group.module.ts index e9fa649..baa7335 100644 --- a/src/app/modules/groups/group.module.ts +++ b/src/app/modules/groups/group.module.ts @@ -9,17 +9,19 @@ import {AccountsModule} from "../accounts/accounts.module"; import {CreActionBarModule} from "../shared/components/action-bar/action-bar.module"; import {CreButtonsModule} from "../shared/components/buttons/buttons.module"; import {CreTablesModule} from "../shared/components/tables/tables.module"; +import {GroupTokensModule} from "../groupTokens/group-tokens.module"; @NgModule({ declarations: [ListComponent, AddComponent, EditComponent], - imports: [ - GroupRoutingModule, - SharedModule, - AccountsModule, - CreActionBarModule, - CreButtonsModule, - CreTablesModule - ] + imports: [ + GroupRoutingModule, + SharedModule, + AccountsModule, + CreActionBarModule, + CreButtonsModule, + CreTablesModule, + GroupTokensModule + ] }) export class GroupModule { } diff --git a/src/app/modules/groups/pages/list/list.component.html b/src/app/modules/groups/pages/list/list.component.html index 506cd17..1287618 100644 --- a/src/app/modules/groups/pages/list/list.component.html +++ b/src/app/modules/groups/pages/list/list.component.html @@ -20,10 +20,17 @@ {{group.permissions.length}} + + + + Groupe par défaut + + + - + Définir par défaut @@ -39,4 +46,4 @@ - + diff --git a/src/app/modules/groups/pages/list/list.component.ts b/src/app/modules/groups/pages/list/list.component.ts index b0a3d81..f5450a4 100644 --- a/src/app/modules/groups/pages/list/list.component.ts +++ b/src/app/modules/groups/pages/list/list.component.ts @@ -1,6 +1,6 @@ import {Component, ViewChild} from '@angular/core' import {GroupService} from '../../services/group.service' -import {Group, Permission} from '../../../shared/model/account.model' +import {Group, GroupToken, Permission} from '../../../shared/model/account.model' import {AccountService} from '../../../accounts/services/account.service' import {ErrorHandlingComponent} from '../../../shared/components/subscribing.component' import {ActivatedRoute, Router} from '@angular/router' @@ -8,7 +8,7 @@ import {ErrorHandler, ErrorService} from '../../../shared/service/error.service' import {AlertService} from '../../../shared/service/alert.service' import {AppState} from '../../../shared/app-state' import {GroupTokenService} from "../../../accounts/services/group-token.service"; -import {GroupTokenAdd} from "../../../accounts/group-tokens"; +import {GroupTokenAdd} from "../../../groupTokens/group-tokens"; @Component({ selector: 'cre-groups', @@ -17,28 +17,18 @@ import {GroupTokenAdd} from "../../../accounts/group-tokens"; }) export class ListComponent extends ErrorHandlingComponent { groups$ = this.groupService.all - defaultGroup: Group = null - // columns = [ - // {def: 'name', title: 'Nom', valueFn: g => g.name}, - // {def: 'permissionCount', title: 'Nombre de permissions', valueFn: g => g.permissions.length} - // ] - // buttons = [{ - // text: 'Définir par défaut', - // clickFn: group => this.setDefaultGroup(group), - // disabledFn: group => this.isDefaultGroup(group) - // }, { - // text: 'Modifier', - // linkFn: group => `/admin/group/edit/${group.id}`, - // permission: Permission.EDIT_USERS - // }] - groupsEmpty = false + currentGroupToken: GroupToken | null - columns = ['name', 'permissionCount', 'setAsDefaultButton', 'editButton'] + noDefaultGroupColumns = ['name', 'permissionCount', 'setAsDefaultButton', 'editButton'] + defaultGroupColumns = ['name', 'permissionCount', 'currentDefaultGroup', 'editButton'] errorHandlers: ErrorHandler[] = [{ filter: error => error.type === 'nodefaultgroup', consumer: () => this.alertService.pushWarning('Aucun groupe par défaut n\'a été défini sur cet ordinateur') + }, { + filter: error => error.type === 'exists-grouptoken-name', + messageProducer: error => `Un ordinateur avec le nom '${error.name}' existe déjà` }] @ViewChild(GroupTokenAdd) groupTokenDialog: GroupTokenAdd @@ -58,14 +48,9 @@ export class ListComponent extends ErrorHandlingComponent { } ngOnInit(): void { - // this.subscribe( - // this.groupService.defaultGroup, - // group => this.defaultGroup = group, - // true - // ) this.subscribe( this.groupTokenService.current, - token => console.info(token) + token => this.currentGroupToken = token ) } @@ -73,8 +58,12 @@ export class ListComponent extends ErrorHandlingComponent { this.groupTokenDialog.show(group) } - isDefaultGroup(group: Group): boolean { - return this.defaultGroup && this.defaultGroup.id == group.id + isCurrentGroup(group: Group): boolean { + return this.currentGroupToken && this.currentGroupToken.group.id == group.id + } + + get columns(): string[] { + return this.currentGroupToken ? this.defaultGroupColumns : this.noDefaultGroupColumns } get hasEditPermission(): boolean { diff --git a/src/app/modules/shared/components/dialogs/dialogs.ts b/src/app/modules/shared/components/dialogs/dialogs.ts index a06f602..b8bbc48 100644 --- a/src/app/modules/shared/components/dialogs/dialogs.ts +++ b/src/app/modules/shared/components/dialogs/dialogs.ts @@ -58,6 +58,7 @@ abstract class CreDialog { }) export class CrePromptDialog extends CreDialog { @Input() title: string + @Input() continueButtonDisabled = false protected get data(): CrePromptDialogData { return { diff --git a/src/app/modules/shared/components/dialogs/prompt.html b/src/app/modules/shared/components/dialogs/prompt.html index 0d14939..f8c8a10 100644 --- a/src/app/modules/shared/components/dialogs/prompt.html +++ b/src/app/modules/shared/components/dialogs/prompt.html @@ -5,6 +5,6 @@
Annuler - Continuer + Continuer
diff --git a/src/app/modules/shared/model/account.model.ts b/src/app/modules/shared/model/account.model.ts index 60aa354..26e5e4f 100644 --- a/src/app/modules/shared/model/account.model.ts +++ b/src/app/modules/shared/model/account.model.ts @@ -32,7 +32,7 @@ export interface GroupToken { id: string, name: string, enabled: boolean, - groupId: Group + group: Group } export enum Permission { diff --git a/src/app/modules/users/services/user.service.ts b/src/app/modules/users/services/user.service.ts index 3f52444..8b7ad1a 100644 --- a/src/app/modules/users/services/user.service.ts +++ b/src/app/modules/users/services/user.service.ts @@ -13,28 +13,28 @@ export class UserService { } get all(): Observable { - return this.api.get('/user') + return this.api.get('/account/user') } getById(id: number): Observable { - return this.api.get(`/user/${id}`) + return this.api.get(`/account/user/${id}`) } save(id: number, firstName: string, lastName: string, password: string, group: number, permissions: Permission[]): Observable { const user = {id, firstName, lastName, password, groupId: group >= 0 ? group : null, permissions} - return this.api.post('/user', user) + return this.api.post('/account/user', user) } update(id: number, firstName: string, lastName: string, group: number, permissions: Permission[]): Observable { const user = {id, firstName, lastName, groupId: group >= 0 ? group : null, permissions} - return this.api.put('/user', user) + return this.api.put('/account/user', user) } updatePassword(id: number, password: string): Observable { - return this.api.put(`/user/${id}/password`, password, true, {contentType: 'text/plain'}) + return this.api.put(`/account/user/${id}/password`, password, true, {contentType: 'text/plain'}) } delete(id: number): Observable { - return this.api.delete(`/user/${id}`) + return this.api.delete(`/account/user/${id}`) } } diff --git a/src/app/pages/administration/administration.component.ts b/src/app/pages/administration/administration.component.ts index bbeee5e..4801036 100644 --- a/src/app/pages/administration/administration.component.ts +++ b/src/app/pages/administration/administration.component.ts @@ -12,6 +12,7 @@ export class AdministrationComponent extends SubMenuComponent { links: NavLink[] = [ {route: '/admin/user', title: 'Utilisateurs', permission: Permission.VIEW_USERS}, {route: '/admin/group', title: 'Groupes', permission: Permission.VIEW_USERS}, + {route: '/admin/group-token', title: 'Ordinateurs', permission: Permission.ADMIN}, {route: '/admin/config', title: 'Configuration', permission: Permission.ADMIN} ] }