From 981460980cfaacc42f36442af8ec17e26bf976c1 Mon Sep 17 00:00:00 2001 From: Nikolaj Gustafsson Date: Sun, 6 Nov 2022 13:46:07 +0100 Subject: [PATCH 1/8] Implementation works for user admins when an organization is selected --- src/app/admin/admin-routing.module.ts | 1 + .../users/user-list/user-list.component.html | 2 +- .../users/user-list/user-list.component.ts | 56 +++--- .../user-table/user-table.component.ts | 190 ++++++++++-------- src/app/admin/users/user.service.ts | 19 +- 5 files changed, 157 insertions(+), 111 deletions(-) diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index e3d9e8f59..bbdfaeac0 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -30,6 +30,7 @@ const adminRoutes: Routes = [ { path: 'users', component: UsersComponent, children: [ { path: '', component: UserListComponent }, + { path: 'organization/:organization-id', component: UserListComponent }, { path: 'new-user', component: UserEditComponent }, { path: ':user-id', component: UserDetailComponent }, { path: ':user-id/edit-user', component: UserEditComponent }, diff --git a/src/app/admin/users/user-list/user-list.component.html b/src/app/admin/users/user-list/user-list.component.html index 4f2052a26..b7e2f5f9e 100644 --- a/src/app/admin/users/user-list/user-list.component.html +++ b/src/app/admin/users/user-list/user-list.component.html @@ -14,7 +14,7 @@ [component]="true" [title]="'USERS.EXISTING-USERS' | translate" > - + diff --git a/src/app/admin/users/user-list/user-list.component.ts b/src/app/admin/users/user-list/user-list.component.ts index 17fc8848a..a6c3c7dbd 100644 --- a/src/app/admin/users/user-list/user-list.component.ts +++ b/src/app/admin/users/user-list/user-list.component.ts @@ -1,23 +1,33 @@ -import { Component, OnInit } from '@angular/core'; -import { Title } from '@angular/platform-browser'; -import { TranslateService } from '@ngx-translate/core'; -import { OrganizationAccessScope } from '@shared/enums/access-scopes'; -import { MeService } from '@shared/services/me.service'; - -@Component({ - selector: 'app-user-list', - templateUrl: './user-list.component.html', - styleUrls: ['./user-list.component.scss'], -}) -export class UserListComponent implements OnInit { - canEdit: boolean; - constructor(private titleService: Title, private translate: TranslateService, private meService: MeService) {} - - ngOnInit(): void { - this.translate.get(['TITLE.USER']) - .subscribe(translations => { - this.titleService.setTitle(translations['TITLE.USER']); - }); - this.canEdit = this.meService.hasAccessToTargetOrganization(OrganizationAccessScope.UserAdministrationWrite); - } -} +import { Component, OnInit } from '@angular/core'; +import { Title } from '@angular/platform-browser'; +import { TranslateService } from '@ngx-translate/core'; +import { OrganizationAccessScope } from '@shared/enums/access-scopes'; +import { MeService } from '@shared/services/me.service'; +import { SharedVariableService } from '@shared/shared-variable/shared-variable.service'; + +@Component({ + selector: 'app-user-list', + templateUrl: './user-list.component.html', + styleUrls: ['./user-list.component.scss'], +}) +export class UserListComponent implements OnInit { + canEdit: boolean; + organizationId: number; + + constructor( + private titleService: Title, + private translate: TranslateService, + private meService: MeService, + private globalService: SharedVariableService + ) { + this.organizationId = this.globalService.getSelectedOrganisationId(); + } + + ngOnInit(): void { + this.translate.get(['TITLE.USER']) + .subscribe(translations => { + this.titleService.setTitle(translations['TITLE.USER']); + }); + this.canEdit = this.meService.hasAccessToTargetOrganization(OrganizationAccessScope.UserAdministrationWrite); + } +} diff --git a/src/app/admin/users/user-list/user-table/user-table.component.ts b/src/app/admin/users/user-list/user-table/user-table.component.ts index a5a44d90e..3d5989a56 100644 --- a/src/app/admin/users/user-list/user-table/user-table.component.ts +++ b/src/app/admin/users/user-list/user-table/user-table.component.ts @@ -1,86 +1,104 @@ -import { - AfterViewInit, - Component, - Input, - ViewChild, -} from '@angular/core'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { TranslateService } from '@ngx-translate/core'; -import { startWith, switchMap, map, catchError } from 'rxjs/operators'; -import { UserGetManyResponse, UserResponse } from '../../user.model'; -import { UserService } from '../../user.service'; -import { merge, Observable, of as observableOf } from 'rxjs'; -import { environment } from '@environments/environment'; -import { DefaultPageSizeOptions } from '@shared/constants/page.constants'; - -@Component({ - selector: 'app-user-table', - templateUrl: './user-table.component.html', - styleUrls: ['./user-table.component.scss'], -}) -export class UserTableComponent implements AfterViewInit { - displayedColumns: string[] = [ - 'name', - 'email', - 'global', - 'status', - 'lastLogin', - 'menu', - ]; - data: UserResponse[]; - - public pageSize = environment.tablePageSize; - pageSizeOptions = DefaultPageSizeOptions; - resultsLength = 0; - isLoadingResults = true; - @ViewChild(MatPaginator) paginator: MatPaginator; - @ViewChild(MatSort) sort: MatSort; - - @Input() permissionId?: number; - @Input() canSort = true; - - constructor( - public translate: TranslateService, - private userService: UserService - ) {} - - getUsers( - orderByColumn: string, - orderByDirection: string - ): Observable { - return this.userService.getMultiple( - this.paginator.pageSize, - this.paginator.pageIndex * this.paginator.pageSize, - orderByColumn, - orderByDirection, - this.permissionId - ); - } - - ngAfterViewInit() { - // If the user changes the sort order, reset back to the first page. - this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0)); - - merge(this.sort.sortChange, this.paginator.page) - .pipe( - startWith({}), - switchMap(() => { - this.isLoadingResults = true; - return this.getUsers(this.sort.active, this.sort.direction); - }), - map((data) => { - // Flip flag to show that loading has finished. - this.isLoadingResults = false; - this.resultsLength = data.count; - - return data.data; - }), - catchError(() => { - this.isLoadingResults = false; - return observableOf([]); - }) - ) - .subscribe((data) => (this.data = data)); - } -} +import { + AfterViewInit, + Component, + Input, + ViewChild, +} from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { TranslateService } from '@ngx-translate/core'; +import { startWith, switchMap, map, catchError } from 'rxjs/operators'; +import { UserGetManyResponse, UserResponse } from '../../user.model'; +import { UserService } from '../../user.service'; +import { merge, Observable, of as observableOf } from 'rxjs'; +import { environment } from '@environments/environment'; +import { DefaultPageSizeOptions } from '@shared/constants/page.constants'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'app-user-table', + templateUrl: './user-table.component.html', + styleUrls: ['./user-table.component.scss'], +}) +export class UserTableComponent implements AfterViewInit { + displayedColumns: string[] = [ + 'name', + 'email', + 'global', + 'status', + 'lastLogin', + 'menu', + ]; + data: UserResponse[]; + + public pageSize = environment.tablePageSize; + pageSizeOptions = DefaultPageSizeOptions; + resultsLength = 0; + isLoadingResults = true; + @ViewChild(MatPaginator) paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + + // If supplied, users will only be retrieved for the specified organization + // If supplied, permissionId will ignored, even if supplied + @Input() organizationId?: number; + + // If supplied, users will be retrieved on the permissionId (userGroup/brugerGruppe) + @Input() permissionId?: number; + + @Input() canSort = true; + + constructor( + public translate: TranslateService, + private userService: UserService + ) { + } + + getUsers( + orderByColumn: string, + orderByDirection: string + ): Observable { + if (this.organizationId !== null && this.organizationId !== undefined) { + return this.userService.getMultipleByOrganization( + this.paginator.pageSize, + this.paginator.pageIndex * this.paginator.pageSize, + orderByColumn, + orderByDirection, + this.organizationId + ); + } else { + return this.userService.getMultiple( + this.paginator.pageSize, + this.paginator.pageIndex * this.paginator.pageSize, + orderByColumn, + orderByDirection, + this.permissionId + ); + } + } + + ngAfterViewInit() { + // If the user changes the sort order, reset back to the first page. + this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0)); + + merge(this.sort.sortChange, this.paginator.page) + .pipe( + startWith({}), + switchMap(() => { + this.isLoadingResults = true; + return this.getUsers(this.sort.active, this.sort.direction); + }), + map((data) => { + // Flip flag to show that loading has finished. + this.isLoadingResults = false; + this.resultsLength = data.count; + + return data.data; + }), + catchError(() => { + this.isLoadingResults = false; + return observableOf([]); + }) + ) + .subscribe((data) => (this.data = data)); + } +} diff --git a/src/app/admin/users/user.service.ts b/src/app/admin/users/user.service.ts index 9bb278aa1..90cb9a58f 100644 --- a/src/app/admin/users/user.service.ts +++ b/src/app/admin/users/user.service.ts @@ -51,13 +51,15 @@ export class UserService { ); } + + getMultiple( limit: number = 1000, offset: number = 0, orderByColumn?: string, orderByDirection?: string, permissionId?: number - ): Observable { + ): Observable { if (permissionId != null) { return this.restService.get(`permission/${permissionId}/users`, { limit, @@ -73,6 +75,21 @@ export class UserService { } } + getMultipleByOrganization( + limit: number = 1000, + offset: number = 0, + orderByColumn?: string, + orderByDirection?: string, + organizationId?: number + ): Observable { + return this.restService.get(this.URL + `/organizationUsers/${organizationId}`, { + limit, + offset, + orderOn: orderByColumn, + sort: orderByDirection, + }); + } + hideWelcome(id: number): Observable { return this.restService.put(`${this.URL}/${id}/hide-welcome`, null, null); } From 4e9cba4ea91335d5cbb14f05a5b89f2492b85bcd Mon Sep 17 00:00:00 2001 From: Nikolaj Gustafsson Date: Sun, 6 Nov 2022 14:53:35 +0100 Subject: [PATCH 2/8] User list works for global admins again --- .../user-table/user-table.component.ts | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/app/admin/users/user-list/user-table/user-table.component.ts b/src/app/admin/users/user-list/user-table/user-table.component.ts index 3d5989a56..baac24d7e 100644 --- a/src/app/admin/users/user-list/user-table/user-table.component.ts +++ b/src/app/admin/users/user-list/user-table/user-table.component.ts @@ -14,6 +14,7 @@ import { merge, Observable, of as observableOf } from 'rxjs'; import { environment } from '@environments/environment'; import { DefaultPageSizeOptions } from '@shared/constants/page.constants'; import { ActivatedRoute } from '@angular/router'; +import { MeService } from '@shared/services/me.service'; @Component({ selector: 'app-user-table', @@ -46,11 +47,14 @@ export class UserTableComponent implements AfterViewInit { @Input() permissionId?: number; @Input() canSort = true; + isGlobalAdmin: boolean; constructor( public translate: TranslateService, - private userService: UserService + private userService: UserService, + private meService: MeService ) { + this.isGlobalAdmin = this.meService.hasGlobalAdmin(); } getUsers( @@ -58,13 +62,22 @@ export class UserTableComponent implements AfterViewInit { orderByDirection: string ): Observable { if (this.organizationId !== null && this.organizationId !== undefined) { - return this.userService.getMultipleByOrganization( - this.paginator.pageSize, - this.paginator.pageIndex * this.paginator.pageSize, - orderByColumn, - orderByDirection, - this.organizationId - ); + if (this.isGlobalAdmin) { + return this.userService.getMultiple( + this.paginator.pageSize, + this.paginator.pageIndex * this.paginator.pageSize, + orderByColumn, + orderByDirection + ); + } else { + return this.userService.getMultipleByOrganization( + this.paginator.pageSize, + this.paginator.pageIndex * this.paginator.pageSize, + orderByColumn, + orderByDirection, + this.organizationId + ); + } } else { return this.userService.getMultiple( this.paginator.pageSize, From 7cfd0e5e245d455a01c89cd67a6a7d2159beacd3 Mon Sep 17 00:00:00 2001 From: Nikolaj Gustafsson Date: Sun, 6 Nov 2022 16:26:03 +0100 Subject: [PATCH 3/8] Awaiting users also filtered by organizations --- .../awaiting-users-table.component.ts | 283 +++++++++--------- src/app/admin/users/user.service.ts | 21 +- 2 files changed, 168 insertions(+), 136 deletions(-) diff --git a/src/app/admin/users/user-list/awaiting-users-table/awaiting-users-table.component.ts b/src/app/admin/users/user-list/awaiting-users-table/awaiting-users-table.component.ts index bf6dd4a81..a7665b976 100644 --- a/src/app/admin/users/user-list/awaiting-users-table/awaiting-users-table.component.ts +++ b/src/app/admin/users/user-list/awaiting-users-table/awaiting-users-table.component.ts @@ -1,134 +1,149 @@ -import { AfterViewInit, Component, Input, ViewChild } from '@angular/core'; -import { - RejectUserDto, - UserGetManyResponse, - UserResponse, - UserResponsePerRequestedOrganization, -} from '../../user.model'; -import { UserService } from '../../user.service'; -import { SharedVariableService } from '@shared/shared-variable/shared-variable.service'; -import { environment } from '@environments/environment'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatSort } from '@angular/material/sort'; -import { TranslateService } from '@ngx-translate/core'; -import { merge, Observable, of as observableOf } from 'rxjs'; -import { catchError, map, startWith, switchMap } from 'rxjs/operators'; -import { DeleteDialogService } from '@shared/components/delete-dialog/delete-dialog.service'; -import { DefaultPageSizeOptions } from '@shared/constants/page.constants'; - -@Component({ - selector: 'app-awaiting-users-table', - templateUrl: './awaiting-users-table.component.html', - styleUrls: ['./awaiting-users-table.component.scss'], -}) -export class AwaitingUsersTableComponent implements AfterViewInit { - displayedColumns: string[] = ['name', 'email', 'menu']; - users: UserResponsePerRequestedOrganization[]; - - public pageSize = environment.tablePageSize; - pageSizeOptions = DefaultPageSizeOptions; - - resultsLength = 0; - public errorMessage: string; - isLoadingResults = true; - message: string; - infoTitle: string; - @ViewChild(MatPaginator) paginator: MatPaginator; - @ViewChild(MatSort) sort: MatSort; - - @Input() permissionId?: number; - @Input() canSort = true; - - constructor( - public translate: TranslateService, - private userService: UserService, - private sharedService: SharedVariableService, - private deleteDialogService: DeleteDialogService - ) {} - - ngAfterViewInit() { - // If the user changes the sort order, reset back to the first page. - this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0)); - - merge(this.sort.sortChange, this.paginator.page) - .pipe( - startWith({}), - switchMap(() => { - this.isLoadingResults = true; - return this.getUsers(this.sort.active, this.sort.direction); - }), - map((data) => { - // Flip flag to show that loading has finished. - this.isLoadingResults = false; - this.resultsLength = data.count; - - return data.data; - }), - catchError(() => { - this.isLoadingResults = false; - return observableOf([] as UserResponse[]); - }) - ) - .subscribe((userResponses) => { - this.users = []; - - // Flatten users so each table row is exactly one request - for (const response of userResponses) { - const { requestedOrganizations, ...user} = response; - - for (const organizationId of response.requestedOrganizations) { - this.users.push({ - ...user, - requestedOrganization: organizationId, - }); - } - } - }); - - this.translate - .get(['USERS.DIALOG.QUESTION-REJECT', 'USERS.DIALOG.HEAD-REJECT']) - .subscribe((translations) => { - this.message = translations['USERS.DIALOG.QUESTION-REJECT']; - this.infoTitle = translations['USERS.DIALOG.HEAD-REJECT']; - }); - } - - getUsers( - orderByColumn: string, - orderByDirection: string - ): Observable { - return this.userService.getAwaitingUsers( - this.paginator.pageSize, - this.paginator.pageIndex * this.paginator.pageSize, - orderByColumn, - orderByDirection - ); - } - - rejectUser(userId: number, organizationId: number) { - this.deleteDialogService - .showSimpleDialog(this.message, false, true, false, this.infoTitle, true) - .subscribe((response) => { - if (response) { - const rejectUserOrgDto: RejectUserDto = { - orgId: organizationId, - userIdToReject: userId, - }; - - this.userService - .rejectUser(rejectUserOrgDto) - .subscribe((response) => { - if (response) { - this.paginator.page.emit({ - pageIndex: this.paginator.pageIndex, - pageSize: this.paginator.pageSize, - length: this.resultsLength, - }); - } else { - this.errorMessage = response?.name; - } - }); - } - }); - } -} +import { AfterViewInit, Component, Input, ViewChild } from '@angular/core'; +import { + RejectUserDto, + UserGetManyResponse, + UserResponse, + UserResponsePerRequestedOrganization, +} from '../../user.model'; +import { UserService } from '../../user.service'; +import { SharedVariableService } from '@shared/shared-variable/shared-variable.service'; +import { environment } from '@environments/environment'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { TranslateService } from '@ngx-translate/core'; +import { merge, Observable, of as observableOf } from 'rxjs'; +import { catchError, map, startWith, switchMap } from 'rxjs/operators'; +import { DeleteDialogService } from '@shared/components/delete-dialog/delete-dialog.service'; +import { DefaultPageSizeOptions } from '@shared/constants/page.constants'; +import { MeService } from '@shared/services/me.service'; + +@Component({ + selector: 'app-awaiting-users-table', + templateUrl: './awaiting-users-table.component.html', + styleUrls: ['./awaiting-users-table.component.scss'], +}) +export class AwaitingUsersTableComponent implements AfterViewInit { + displayedColumns: string[] = ['name', 'email', 'menu']; + users: UserResponsePerRequestedOrganization[]; + + public pageSize = environment.tablePageSize; + pageSizeOptions = DefaultPageSizeOptions; + + resultsLength = 0; + public errorMessage: string; + isLoadingResults = true; + message: string; + infoTitle: string; + @ViewChild(MatPaginator) paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + + @Input() permissionId?: number; + @Input() canSort = true; + organizationId: number; + + constructor( + public translate: TranslateService, + private userService: UserService, + private sharedService: SharedVariableService, + private deleteDialogService: DeleteDialogService, + private meService: MeService + ) { + this.organizationId = this.sharedService.getSelectedOrganisationId(); + } + + ngAfterViewInit() { + // If the user changes the sort order, reset back to the first page. + this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0)); + + merge(this.sort.sortChange, this.paginator.page) + .pipe( + startWith({}), + switchMap(() => { + this.isLoadingResults = true; + return this.getUsers(this.sort.active, this.sort.direction); + }), + map((data) => { + // Flip flag to show that loading has finished. + this.isLoadingResults = false; + this.resultsLength = data.count; + + return data.data; + }), + catchError(() => { + this.isLoadingResults = false; + return observableOf([] as UserResponse[]); + }) + ) + .subscribe((userResponses) => { + this.users = []; + + // Flatten users so each table row is exactly one request + for (const response of userResponses) { + const { requestedOrganizations, ...user} = response; + + for (const organizationId of response.requestedOrganizations) { + this.users.push({ + ...user, + requestedOrganization: organizationId, + }); + } + } + }); + + this.translate + .get(['USERS.DIALOG.QUESTION-REJECT', 'USERS.DIALOG.HEAD-REJECT']) + .subscribe((translations) => { + this.message = translations['USERS.DIALOG.QUESTION-REJECT']; + this.infoTitle = translations['USERS.DIALOG.HEAD-REJECT']; + }); + } + + getUsers( + orderByColumn: string, + orderByDirection: string + ): Observable { + if(this.meService.hasGlobalAdmin()) { + return this.userService.getAwaitingUsers( + this.paginator.pageSize, + this.paginator.pageIndex * this.paginator.pageSize, + orderByColumn, + orderByDirection + ); + } else { + return this.userService.getAwaitingUsersForOrganization( + this.paginator.pageSize, + this.paginator.pageIndex * this.paginator.pageSize, + this.organizationId, + orderByColumn, + orderByDirection + ); + } + } + + rejectUser(userId: number, organizationId: number) { + this.deleteDialogService + .showSimpleDialog(this.message, false, true, false, this.infoTitle, true) + .subscribe((response) => { + if (response) { + const rejectUserOrgDto: RejectUserDto = { + orgId: organizationId, + userIdToReject: userId, + }; + + this.userService + .rejectUser(rejectUserOrgDto) + .subscribe((response) => { + if (response) { + this.paginator.page.emit({ + pageIndex: this.paginator.pageIndex, + pageSize: this.paginator.pageSize, + length: this.resultsLength, + }); + } else { + this.errorMessage = response?.name; + } + }); + } + }); + } +} diff --git a/src/app/admin/users/user.service.ts b/src/app/admin/users/user.service.ts index 90cb9a58f..45c75b71c 100644 --- a/src/app/admin/users/user.service.ts +++ b/src/app/admin/users/user.service.ts @@ -51,8 +51,6 @@ export class UserService { ); } - - getMultiple( limit: number = 1000, offset: number = 0, @@ -111,6 +109,24 @@ export class UserService { ); } + getAwaitingUsersForOrganization( + limit: number = 1000, + offset: number = 0, + organizationId: number, + orderByColumn?: string, + orderByDirection?: string + ): Observable { + return this.restService.get( + `${this.URL}/awaitingUsers/${organizationId}`, + { + limit, + offset, + orderOn: orderByColumn, + sort: orderByDirection, + }, + ); + } + getOneSimple(id: number): Observable { return this.restService.get(this.URL_NEW_KOMBIT, {}, id).pipe( map((response: UserResponse) => { @@ -118,6 +134,7 @@ export class UserService { }) ); } + updateNewKombit(body: CreateNewKombitUserDto): Observable { return this.restService.put( this.URL_NEW_KOMBIT + '/createNewKombitUser', From 6cf41c582288aee6e93a81eafe79fb0b4bc4ad54 Mon Sep 17 00:00:00 2001 From: Nikolaj Gustafsson Date: Mon, 7 Nov 2022 11:18:12 +0100 Subject: [PATCH 4/8] Added translations for new error messages --- src/assets/i18n/da.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index 5f492ba1a..4566426e7 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -847,7 +847,9 @@ "DUPLICATE-METADATA-KEY": "Metadata må ikke indeholde den samme nøgle flere gange", "INVALID-KEY-IN-KEY-VALUE-PAIR": "En eller flere nøgler er ugyldige. Det skal være en gyldig tekstværdi", "INVALID-VALUE-IN-KEY-VALUE-PAIR": "En eller flere værdier er ugyldige. Det skal være en gyldig tekstværdi", - "INVALID-DATE": "Datoen er ugyldig" + "INVALID-DATE": "Datoen er ugyldig", + "USER-ALREADY-HAVE-MAIL": "Brugeren har allerede sat en email", + "EMAIL-ALREADY-IN-USE": "Den valgte email er allerede i brug. Kontakt din lokale administrator for hjælp." }, "PROFILES": { "NAME": "LoRaWAN profiler", From b5b032a2f6c84ba89df76967fd1b9acdee17dc31 Mon Sep 17 00:00:00 2001 From: Nikolaj Gustafsson Date: Tue, 8 Nov 2022 16:14:56 +0100 Subject: [PATCH 5/8] Email can now be modified for KOMBIT users --- src/app/admin/users/user-edit/user-edit.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/admin/users/user-edit/user-edit.component.html b/src/app/admin/users/user-edit/user-edit.component.html index eed313831..a7add0d85 100644 --- a/src/app/admin/users/user-edit/user-edit.component.html +++ b/src/app/admin/users/user-edit/user-edit.component.html @@ -23,7 +23,7 @@
* - From 8c49402e8c43a534b0615308de330664ad4225ae Mon Sep 17 00:00:00 2001 From: Nikolaj Gustafsson Date: Wed, 9 Nov 2022 14:40:14 +0100 Subject: [PATCH 6/8] Fixed dependency issues --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index c2b268746..0a27fb4fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3263,9 +3263,9 @@ }, "dependencies": { "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", + "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", "dev": true, "requires": { "big.js": "^5.2.2", @@ -3579,9 +3579,9 @@ }, "dependencies": { "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", + "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", "dev": true, "requires": { "big.js": "^5.2.2", @@ -7718,9 +7718,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -9812,9 +9812,9 @@ }, "dependencies": { "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz", + "integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==", "dev": true, "requires": { "big.js": "^5.2.2", From c594566881d8781941fcf937c3cadf3216c7cff6 Mon Sep 17 00:00:00 2001 From: Nikolaj Gustafsson Date: Wed, 9 Nov 2022 15:46:27 +0100 Subject: [PATCH 7/8] Fixed angular schematic vulnerability --- package-lock.json | 110 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0a27fb4fb..a4cd4e001 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,12 +20,12 @@ } }, "@angular-devkit/architect": { - "version": "0.1402.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.3.tgz", - "integrity": "sha512-vU5j0WhSYxux5RzhuZ3VY3B4XbRJuEtVqSoW5j9ew3Oc78tkR6RNXgT97PPr0GfRA1fOEhVoReR7NbsKU3uIkQ==", + "version": "0.1402.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.4.tgz", + "integrity": "sha512-lOgyKJ+KjBYWzgcxJ3vAy3RFkqRmSw3RY4thNsWOHLvzT8o33u3USDuOr6cDAQW12NjX9K7JDuvNlPbadjQbSQ==", "dev": true, "requires": { - "@angular-devkit/core": "14.2.3", + "@angular-devkit/core": "14.2.4", "rxjs": "6.6.7" } }, @@ -564,9 +564,9 @@ } }, "@angular-devkit/core": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.3.tgz", - "integrity": "sha512-E8bnC6F0xNni4IIKAnIDBDkbi6cOePm4Q/Y9IrTk3wquGTfsiMlQpdnRA0nr+FTN/LT3N08O5dEw2Gd4ff4tGA==", + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.4.tgz", + "integrity": "sha512-NsvN1U42goBcibVR75vDp2NOFeSU+Wcekwf1r3Jbyz6a2l9Unf0v9BOWLXdigFY8xztbrOHJPSIbC+2rkvOUnw==", "dev": true, "requires": { "ajv": "8.11.0", @@ -603,12 +603,12 @@ } }, "@angular-devkit/schematics": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.3.tgz", - "integrity": "sha512-98ldx+To7xW1BH/DqIToQwHVscPZhXnZP01SeoiUnFlJE5FnXx8Lv7qHAQtE96M+cfE5NR1NKBgfCH3S3rnmFA==", + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.4.tgz", + "integrity": "sha512-Pm2C7HBNslQavsqXh6/rcyAavmgzTxU3x7NoWwSBH+fIplLJjEFzHdnW9JJp59A2ONfqO0wND3yWKtjIoDAUqw==", "dev": true, "requires": { - "@angular-devkit/core": "14.2.3", + "@angular-devkit/core": "14.2.4", "jsonc-parser": "3.1.0", "magic-string": "0.26.2", "ora": "5.4.1", @@ -641,15 +641,15 @@ } }, "@angular/cli": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.3.tgz", - "integrity": "sha512-pFo/h3ImjebjKzdw6yWcaERSIzWsSu4eqH9qQ/dWD1ChkSph+krBw3+5Q+Kda5l3dLgl7mQXX6mC5u8IHTdvDg==", + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.4.tgz", + "integrity": "sha512-3YqwjPYlLzqQB0y6A7c3l9X1e0z418NjSQQD2e12N8y68V8nkTK4UcsDVpqb/7ce+xnQ7xGz2wb6DJddU4Wogw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1402.3", - "@angular-devkit/core": "14.2.3", - "@angular-devkit/schematics": "14.2.3", - "@schematics/angular": "14.2.3", + "@angular-devkit/architect": "0.1402.4", + "@angular-devkit/core": "14.2.4", + "@angular-devkit/schematics": "14.2.4", + "@schematics/angular": "14.2.4", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "debug": "4.3.4", @@ -2691,9 +2691,9 @@ }, "dependencies": { "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true }, "mkdirp": { @@ -2786,13 +2786,13 @@ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, "@schematics/angular": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.3.tgz", - "integrity": "sha512-lHWeeWrhpyMwJRTK4RpFVptWZo5kTdI+bOOd+lZBTjOAs+PM8r9VXHzB6qhE6P2e3HsceXM59PonvekTUdOJtQ==", + "version": "14.2.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.4.tgz", + "integrity": "sha512-9n7HyxZvoSR+Ynyvr8oEQ3zy5trSjCQMTF+fZSTCzCBEVHKGxqMyisI6KO4qcGeIQYGXWeBYrMsy9jMQFgK8dQ==", "dev": true, "requires": { - "@angular-devkit/core": "14.2.3", - "@angular-devkit/schematics": "14.2.3", + "@angular-devkit/core": "14.2.4", + "@angular-devkit/schematics": "14.2.4", "jsonc-parser": "3.1.0" } }, @@ -3941,9 +3941,9 @@ } }, "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true }, "minimatch": { @@ -6202,18 +6202,18 @@ "dev": true }, "hosted-git-info": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.1.0.tgz", - "integrity": "sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { "lru-cache": "^7.5.1" }, "dependencies": { "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true } } @@ -6567,9 +6567,9 @@ "dev": true }, "rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "dev": true, "requires": { "tslib": "^2.1.0" @@ -6623,9 +6623,9 @@ } }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -7578,9 +7578,9 @@ } }, "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", "dev": true } } @@ -7972,16 +7972,16 @@ "dev": true }, "node-gyp": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", - "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", + "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", "dev": true, "requires": { "env-paths": "^2.2.0", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", + "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", @@ -8019,12 +8019,12 @@ "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "requires": { - "abbrev": "1" + "abbrev": "^1.0.0" } }, "normalize-package-data": { @@ -10363,9 +10363,9 @@ } }, "socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "requires": { "ip": "^2.0.0", diff --git a/package.json b/package.json index 0672a19c6..9eb943b18 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^14.2.3", - "@angular/cli": "~14.2.3", + "@angular/cli": "^14.2.4", "@angular/compiler-cli": "~14.2.3", "@ngrx/store-devtools": "^10.0.0", "@types/jasmine": "~3.6.0", From 128438ed48423be72986508a1a1159c7e67955df Mon Sep 17 00:00:00 2001 From: Nikolaj Gustafsson Date: Wed, 9 Nov 2022 16:00:24 +0100 Subject: [PATCH 8/8] Updated Angular CLI --- package-lock.json | 46 +++++++++++++++++++++++----------------------- package.json | 4 ++-- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index a4cd4e001..8a65c4fe0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,12 +20,12 @@ } }, "@angular-devkit/architect": { - "version": "0.1402.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.4.tgz", - "integrity": "sha512-lOgyKJ+KjBYWzgcxJ3vAy3RFkqRmSw3RY4thNsWOHLvzT8o33u3USDuOr6cDAQW12NjX9K7JDuvNlPbadjQbSQ==", + "version": "0.1402.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.9.tgz", + "integrity": "sha512-I0KTpmtukxq447CkdzKonFpIytRnvC77WuwnX4Sef32EM9KqmeNvfy/gZwm08Lqi4mOAC/iTCajXH1TN/4xllA==", "dev": true, "requires": { - "@angular-devkit/core": "14.2.4", + "@angular-devkit/core": "14.2.9", "rxjs": "6.6.7" } }, @@ -564,9 +564,9 @@ } }, "@angular-devkit/core": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.4.tgz", - "integrity": "sha512-NsvN1U42goBcibVR75vDp2NOFeSU+Wcekwf1r3Jbyz6a2l9Unf0v9BOWLXdigFY8xztbrOHJPSIbC+2rkvOUnw==", + "version": "14.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.9.tgz", + "integrity": "sha512-+e2OmzH/0gjNNH96xJDgshbuIM/NPSwE0NQlgU/KRb8TZt+7ooTmZJ1vk25HKV2YS99BEYzUSqvVAaJtxX/6Qw==", "dev": true, "requires": { "ajv": "8.11.0", @@ -603,12 +603,12 @@ } }, "@angular-devkit/schematics": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.4.tgz", - "integrity": "sha512-Pm2C7HBNslQavsqXh6/rcyAavmgzTxU3x7NoWwSBH+fIplLJjEFzHdnW9JJp59A2ONfqO0wND3yWKtjIoDAUqw==", + "version": "14.2.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.9.tgz", + "integrity": "sha512-E7muTIbDqysjQld5r9AGXiW8vKHadkHaGe+0QONpmr8TMAtTMqBFxBXRG9vajiUzt/GcFL9dbGGEwM/1dc7VPQ==", "dev": true, "requires": { - "@angular-devkit/core": "14.2.4", + "@angular-devkit/core": "14.2.9", "jsonc-parser": "3.1.0", "magic-string": "0.26.2", "ora": "5.4.1", @@ -641,15 +641,15 @@ } }, "@angular/cli": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.4.tgz", - "integrity": "sha512-3YqwjPYlLzqQB0y6A7c3l9X1e0z418NjSQQD2e12N8y68V8nkTK4UcsDVpqb/7ce+xnQ7xGz2wb6DJddU4Wogw==", + "version": "14.2.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.9.tgz", + "integrity": "sha512-1cQE7mRrPyzk1sg2UwpbQ/sXQyPukPKdN69o4Bn59Scfl/4wUh53WRPAAHXNudgPYT2ZT3s9Jj2E1cdhi+gxyQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1402.4", - "@angular-devkit/core": "14.2.4", - "@angular-devkit/schematics": "14.2.4", - "@schematics/angular": "14.2.4", + "@angular-devkit/architect": "0.1402.9", + "@angular-devkit/core": "14.2.9", + "@angular-devkit/schematics": "14.2.9", + "@schematics/angular": "14.2.9", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "debug": "4.3.4", @@ -2786,13 +2786,13 @@ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, "@schematics/angular": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.4.tgz", - "integrity": "sha512-9n7HyxZvoSR+Ynyvr8oEQ3zy5trSjCQMTF+fZSTCzCBEVHKGxqMyisI6KO4qcGeIQYGXWeBYrMsy9jMQFgK8dQ==", + "version": "14.2.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.9.tgz", + "integrity": "sha512-pt/eN+D9a6JeOjgqEdWP8lU6VQIoo3F8RcoVEVXHhjXzF2mIe1a3ZJTwY3ssdemKV4mZgseTJBG99/jxrHK0XQ==", "dev": true, "requires": { - "@angular-devkit/core": "14.2.4", - "@angular-devkit/schematics": "14.2.4", + "@angular-devkit/core": "14.2.9", + "@angular-devkit/schematics": "14.2.9", "jsonc-parser": "3.1.0" } }, diff --git a/package.json b/package.json index 9eb943b18..393081aa0 100644 --- a/package.json +++ b/package.json @@ -54,14 +54,14 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^14.2.3", - "@angular/cli": "^14.2.4", + "@angular/cli": "^14.2.9", "@angular/compiler-cli": "~14.2.3", "@ngrx/store-devtools": "^10.0.0", "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/jwt-decode": "^3.1.0", "@types/node": "^12.11.1", - "codelyzer": "^6.0.0", + "codelyzer": "^6.0.2", "eslint": "^7.3.1", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0",