diff --git a/src/app/admin/organisation/organisation.service.ts b/src/app/admin/organisation/organisation.service.ts index 756907b2..856a84c9 100644 --- a/src/app/admin/organisation/organisation.service.ts +++ b/src/app/admin/organisation/organisation.service.ts @@ -63,6 +63,20 @@ export class OrganisationService { }); } + getMultipleWithApplicationAdmin( + limit: number = 1000, + offset: number = 0, + orderByColumn?: string, + orderByDirection?: string + ): Observable { + return this.restService.get(`${this.URL}/applicationAdmin`, { + limit, + offset, + orderOn: orderByColumn, + sort: orderByDirection, + }); + } + delete(id: number) { return this.restService.delete(this.URL, id); } diff --git a/src/app/applications/application-change-organization-dialog/application-change-organization-dialog.component.html b/src/app/applications/application-change-organization-dialog/application-change-organization-dialog.component.html new file mode 100644 index 00000000..8e25a205 --- /dev/null +++ b/src/app/applications/application-change-organization-dialog/application-change-organization-dialog.component.html @@ -0,0 +1,46 @@ +
+

{{ "APPLICATION.CHANGE-ORGANIZATION.TITLE" | translate }}

+
+ + + + {{ organization.name }} + + + +
+ + + {{ permission.name }} + + + {{ "APPLICATION.CHANGE-ORGANIZATION.USER-GROUP-AUTO-SELECT" | translate }} +
+
+
+ + +
+
diff --git a/src/app/applications/application-change-organization-dialog/application-change-organization-dialog.component.scss b/src/app/applications/application-change-organization-dialog/application-change-organization-dialog.component.scss new file mode 100644 index 00000000..5731c5e9 --- /dev/null +++ b/src/app/applications/application-change-organization-dialog/application-change-organization-dialog.component.scss @@ -0,0 +1,3 @@ +.application-change-organization-dialog { + width: 50vw; +} diff --git a/src/app/applications/application-change-organization-dialog/application-change-organization-dialog.component.ts b/src/app/applications/application-change-organization-dialog/application-change-organization-dialog.component.ts new file mode 100644 index 00000000..05eaebb6 --- /dev/null +++ b/src/app/applications/application-change-organization-dialog/application-change-organization-dialog.component.ts @@ -0,0 +1,110 @@ +import { Component, Inject, OnInit } from "@angular/core"; +import { UntypedFormControl } from "@angular/forms"; +import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; +import { MatSnackBar } from "@angular/material/snack-bar"; +import { Organisation } from "@app/admin/organisation/organisation.model"; +import { OrganisationService } from "@app/admin/organisation/organisation.service"; +import { PermissionResponse } from "@app/admin/permission/permission.model"; +import { PermissionService } from "@app/admin/permission/permission.service"; +import { Application, UpdateApplicationOrganization } from "@applications/application.model"; +import { ApplicationService } from "@applications/application.service"; +import { TranslateService } from "@ngx-translate/core"; +import { ApplicationDialogModel } from "@shared/models/dialog.model"; +import { SharedVariableService } from "@shared/shared-variable/shared-variable.service"; +import { ReplaySubject, Subscription } from "rxjs"; + +@Component({ + selector: "app-change-organization-dialog", + templateUrl: "./application-change-organization-dialog.component.html", + styleUrls: ["./application-change-organization-dialog.component.scss"], +}) +export class ApplicationChangeOrganizationDialogComponent implements OnInit { + public applicationsSubscription: Subscription; + public permissionsSubscription: Subscription; + public organizationsSubscription: Subscription; + public application: UpdateApplicationOrganization; + public permissions: PermissionResponse[]; + public organizations: Organisation[]; + public filteredPermissionsMulti: ReplaySubject = new ReplaySubject(1); + public filteredOrganizations: ReplaySubject = new ReplaySubject(1); + + constructor( + private applicationService: ApplicationService, + public translate: TranslateService, + private permissionService: PermissionService, + private organizationService: OrganisationService, + private sharedVariableService: SharedVariableService, + private snackBar: MatSnackBar, + private dialog: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public dialogModel: ApplicationDialogModel + ) { + this.application = { + organizationId: this.dialogModel.organizationId ?? this.sharedVariableService.getSelectedOrganisationId(), + permissionIds: [], + }; + } + + ngOnInit(): void { + this.translate.use("da"); + if (this.dialogModel.applicationId) { + this.getApplication(this.dialogModel.applicationId); + } + this.getOrganizations(); + this.getPermissions(); + } + + getApplication(id: number): void { + this.applicationsSubscription = this.applicationService.getApplication(id).subscribe((application: Application) => { + this.application.permissionIds = application.permissionIds; + }); + } + + getOrganizations() { + this.organizationsSubscription = this.organizationService.getMultipleWithApplicationAdmin().subscribe(res => { + this.organizations = res.data; + this.filteredOrganizations.next(this.organizations.slice()); + }); + } + + getPermissions() { + this.permissionsSubscription = this.permissionService.getPermissions(1000, 0).subscribe(res => { + this.permissions = res.data.sort((a, b) => a.name.localeCompare(b.name, "da-DK", { numeric: true })); + this.filteredPermissionsMulti.next( + this.permissions.filter(p => p?.organization?.id === this?.application?.organizationId) + ); + }); + } + + public compare(o1: any, o2: any): boolean { + return o1 === o2; + } + + onOrganizationChange() { + this.filteredPermissionsMulti.next( + this.permissions.filter(p => p?.organization?.id === this?.application?.organizationId) + ); + this.filteredPermissionsMulti.subscribe(res => { + this.application.permissionIds = res + .filter(permission => permission.automaticallyAddNewApplications) + .map(permission => permission.id); + }); + } + + onSubmit() { + this.applicationsSubscription = this.applicationService + .updateApplicationOrganization(this.application, this.dialogModel.applicationId) + .subscribe(savedApplication => { + this.snackBar.open( + this.translate.instant("APPLICATION.CHANGE-ORGANIZATION.SNACKBAR-SAVED", { + applicationName: savedApplication.name, + organizationName: savedApplication.belongsTo.name, + }), + "", + { + duration: 10000, + } + ); + this.dialog.close(true); + }); + } +} diff --git a/src/app/applications/application-detail/application-detail.component.html b/src/app/applications/application-detail/application-detail.component.html index 9a6262ef..53a57b1c 100644 --- a/src/app/applications/application-detail/application-detail.component.html +++ b/src/app/applications/application-detail/application-detail.component.html @@ -66,7 +66,7 @@

{{ "APPLICATION.DETAILS" | translate }}

-