@yuuvis/user-management-app 2.0.4 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,26 +1,38 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject,
|
|
3
|
-
import * as
|
|
2
|
+
import { inject, Injectable, signal, computed, Component, Pipe, Input, linkedSignal, input, output, effect, Inject, HostBinding, ViewChild } from '@angular/core';
|
|
3
|
+
import * as i5 from '@angular/router';
|
|
4
4
|
import { Router, ActivatedRoute, NavigationEnd, RouterModule } from '@angular/router';
|
|
5
|
-
import * as
|
|
5
|
+
import * as i3 from '@angular/material/button';
|
|
6
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
7
|
+
import * as i2$1 from '@angular/material/button-toggle';
|
|
6
8
|
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
7
|
-
import
|
|
9
|
+
import { MatDialogRef, MatDialog, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
10
|
+
import * as i1$1 from '@angular/material/icon';
|
|
11
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
12
|
+
import * as i4$1 from '@angular/material/tooltip';
|
|
8
13
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
9
14
|
import { filter } from 'rxjs/operators';
|
|
10
15
|
import { Title } from '@angular/platform-browser';
|
|
11
|
-
import {
|
|
12
|
-
import * as i6 from '@yuuvis/material/panes';
|
|
16
|
+
import { BackendService, TranslateService, ApiBase, TranslatePipe, NotificationService, Logger, LocalizationService, UserService } from '@yuuvis/client-core';
|
|
17
|
+
import * as i6$1 from '@yuuvis/material/panes';
|
|
13
18
|
import { YmtPanesModule } from '@yuuvis/material/panes';
|
|
14
|
-
import * as
|
|
19
|
+
import * as i6 from '@yuuvis/client-shell';
|
|
15
20
|
import { YuvClientShellModule } from '@yuuvis/client-shell';
|
|
16
21
|
import { ShellService } from '@yuuvis/client-shell-core';
|
|
17
|
-
import * as i1$
|
|
22
|
+
import * as i1$2 from '@angular/common';
|
|
18
23
|
import { CommonModule } from '@angular/common';
|
|
19
|
-
import * as
|
|
20
|
-
import {
|
|
21
|
-
import
|
|
22
|
-
import
|
|
23
|
-
import
|
|
24
|
+
import * as i1 from '@angular/forms';
|
|
25
|
+
import { ReactiveFormsModule, FormBuilder, FormControl, Validators } from '@angular/forms';
|
|
26
|
+
import * as i2 from '@angular/cdk/clipboard';
|
|
27
|
+
import { ClipboardModule } from '@angular/cdk/clipboard';
|
|
28
|
+
import * as i4 from '@angular/material/form-field';
|
|
29
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
30
|
+
import * as i3$1 from '@angular/material/input';
|
|
31
|
+
import { MatInputModule } from '@angular/material/input';
|
|
32
|
+
import { map, switchMap, of, forkJoin } from 'rxjs';
|
|
33
|
+
import { YmtButtonDirective, YmtIconButtonDirective } from '@yuuvis/material';
|
|
34
|
+
import { ConfirmService, BusyOverlayDirective, DialogComponent, ClickDoubleDirective } from '@yuuvis/client-components/common';
|
|
35
|
+
import { HttpParams } from '@angular/common/http';
|
|
24
36
|
import * as i2$2 from '@angular/material/paginator';
|
|
25
37
|
import { MatPaginatorModule } from '@angular/material/paginator';
|
|
26
38
|
import { MatSortModule } from '@angular/material/sort';
|
|
@@ -28,25 +40,15 @@ import * as i3$4 from '@angular/material/table';
|
|
|
28
40
|
import { MatTableModule } from '@angular/material/table';
|
|
29
41
|
import { MatTabsModule } from '@angular/material/tabs';
|
|
30
42
|
import { SelectionModel } from '@angular/cdk/collections';
|
|
31
|
-
import { ConfirmService, BusyOverlayDirective, DialogComponent, ClickDoubleDirective } from '@yuuvis/client-components/common';
|
|
32
43
|
import { SimpleSearchComponent } from '@yuuvis/client-framework/simple-search';
|
|
33
44
|
import * as i8 from '@yuuvis/client-components/overflow-menu';
|
|
34
45
|
import { YuvOverflowMenuModule } from '@yuuvis/client-components/overflow-menu';
|
|
35
|
-
import { YmtButtonDirective, YmtIconButtonDirective } from '@yuuvis/material';
|
|
36
46
|
import { YmtBadge } from '@yuuvis/material/badge';
|
|
37
|
-
import * as i5 from '@yuuvis/material/layout';
|
|
47
|
+
import * as i5$1 from '@yuuvis/material/layout';
|
|
38
48
|
import { YmtLayoutModule } from '@yuuvis/material/layout';
|
|
39
|
-
import { HttpParams } from '@angular/common/http';
|
|
40
|
-
import { map, switchMap, of, forkJoin } from 'rxjs';
|
|
41
49
|
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
42
|
-
import * as i3$
|
|
50
|
+
import * as i3$2 from '@angular/material/chips';
|
|
43
51
|
import { MatChipsModule } from '@angular/material/chips';
|
|
44
|
-
import * as i1$1 from '@angular/forms';
|
|
45
|
-
import { ReactiveFormsModule, FormBuilder, FormControl, Validators } from '@angular/forms';
|
|
46
|
-
import * as i2 from '@angular/material/form-field';
|
|
47
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
48
|
-
import * as i3$2 from '@angular/material/input';
|
|
49
|
-
import { MatInputModule } from '@angular/material/input';
|
|
50
52
|
import * as i7 from '@angular/material/slide-toggle';
|
|
51
53
|
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
52
54
|
import * as i3$3 from '@angular/material/list';
|
|
@@ -71,52 +73,9 @@ const APP_ICONS = {
|
|
|
71
73
|
actionDeactivateUser: 'person_off',
|
|
72
74
|
actionDeleteUser: 'delete',
|
|
73
75
|
actionEditGroup: 'edit',
|
|
76
|
+
actionSettings: 'settings',
|
|
74
77
|
};
|
|
75
78
|
|
|
76
|
-
class YuvUserManagementComponent {
|
|
77
|
-
#shell = inject(ShellService);
|
|
78
|
-
#titleService = inject(Title);
|
|
79
|
-
#translateService = inject(TranslateService);
|
|
80
|
-
#router = inject(Router);
|
|
81
|
-
#activatedRoute = inject(ActivatedRoute);
|
|
82
|
-
#app = this.#shell.getApp(APP_ID);
|
|
83
|
-
appName = this.#app?.title;
|
|
84
|
-
views = [
|
|
85
|
-
{ id: 'users', title: 'yuv.app.user-management.navigation.users.label', link: 'users', tooltip: 'yuv.app.user-management.navigation.users.tooltip' },
|
|
86
|
-
{ id: 'groups', title: 'yuv.app.user-management.navigation.groups.label', link: 'groups', tooltip: 'yuv.app.user-management.navigation.groups.tooltip' },
|
|
87
|
-
];
|
|
88
|
-
activeLink = this.views[0].link;
|
|
89
|
-
constructor() {
|
|
90
|
-
this.#router.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe((e) => {
|
|
91
|
-
const view = this.views.find(v => e.urlAfterRedirects.includes('/' + v.link));
|
|
92
|
-
if (view)
|
|
93
|
-
this.activeLink = view.link;
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
ngOnInit() {
|
|
97
|
-
const translatedTitle = this.appName.startsWith('yuv.')
|
|
98
|
-
? this.#translateService.instant(this.appName)
|
|
99
|
-
: this.appName;
|
|
100
|
-
this.#titleService.setTitle(translatedTitle);
|
|
101
|
-
}
|
|
102
|
-
navigate(link) {
|
|
103
|
-
this.#router.navigate([link], { relativeTo: this.#activatedRoute });
|
|
104
|
-
}
|
|
105
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: YuvUserManagementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
106
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: YuvUserManagementComponent, isStandalone: true, selector: "ymusrmgmt-root", ngImport: i0, template: "<ng-template yuvAppHeaderSlot=\"actions\">\n <mat-button-toggle-group [value]=\"activeLink\" (change)=\"navigate($event.value)\" hideSingleSelectionIndicator>\n @for (view of views; track view.id) {\n <mat-button-toggle [value]=\"view.link\" [matTooltip]=\"view.tooltip | translate\">{{ view.title | translate }}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n</ng-template>\n\n<main class=\"usrmgmt-main__content\" [attr.aria-label]=\"'yuv.app.user-management.content.aria.label' | translate\">\n <router-outlet></router-outlet>\n</main>\n\n<router-outlet name=\"modal\"></router-outlet>\n", styles: [":host{display:flex;flex-flow:column;height:100%}:host .usrmgmt-main__content{flex:1;overflow-y:hidden}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i3.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "ngmodule", type: YmtPanesModule }, { kind: "ngmodule", type: YuvClientShellModule }, { kind: "directive", type: i4$1.YuvAppHeaderSlotDirective, selector: "ng-template[yuvAppHeaderSlot]", inputs: ["yuvAppHeaderSlot"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
107
|
-
}
|
|
108
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: YuvUserManagementComponent, decorators: [{
|
|
109
|
-
type: Component,
|
|
110
|
-
args: [{ selector: 'ymusrmgmt-root', standalone: true, imports: [
|
|
111
|
-
MatButtonToggleModule,
|
|
112
|
-
MatTooltipModule,
|
|
113
|
-
RouterModule,
|
|
114
|
-
TranslatePipe,
|
|
115
|
-
YmtPanesModule,
|
|
116
|
-
YuvClientShellModule,
|
|
117
|
-
], template: "<ng-template yuvAppHeaderSlot=\"actions\">\n <mat-button-toggle-group [value]=\"activeLink\" (change)=\"navigate($event.value)\" hideSingleSelectionIndicator>\n @for (view of views; track view.id) {\n <mat-button-toggle [value]=\"view.link\" [matTooltip]=\"view.tooltip | translate\">{{ view.title | translate }}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n</ng-template>\n\n<main class=\"usrmgmt-main__content\" [attr.aria-label]=\"'yuv.app.user-management.content.aria.label' | translate\">\n <router-outlet></router-outlet>\n</main>\n\n<router-outlet name=\"modal\"></router-outlet>\n", styles: [":host{display:flex;flex-flow:column;height:100%}:host .usrmgmt-main__content{flex:1;overflow-y:hidden}\n"] }]
|
|
118
|
-
}], ctorParameters: () => [] });
|
|
119
|
-
|
|
120
79
|
class YuvUserManagementService {
|
|
121
80
|
static DEFAULT_PAGE_SIZE = 15;
|
|
122
81
|
#backendService = inject(BackendService);
|
|
@@ -220,6 +179,43 @@ class YuvUserManagementService {
|
|
|
220
179
|
})));
|
|
221
180
|
return combined$;
|
|
222
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Fetches the OIDC identity provider configuration (e.g. Microsoft Entra ID) of the current
|
|
184
|
+
* tenant. Emits a 404 error if no OIDC identity provider is configured.
|
|
185
|
+
*/
|
|
186
|
+
fetchOIDCProviderConfig() {
|
|
187
|
+
return this.#backendService
|
|
188
|
+
.get(`/tenant-management/api/admin/identity-provider/oidc`, ApiBase.none);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Creates (or updates) the OIDC identity provider configuration of the current tenant. The
|
|
192
|
+
* discovery URL must be passed as `config.metadataDescriptorUrl` — the backend resolves the
|
|
193
|
+
* OIDC endpoints (authorizationUrl, tokenUrl, jwksUrl, ...) from the discovery document.
|
|
194
|
+
*/
|
|
195
|
+
setOIDCProviderConfig(providerConfig) {
|
|
196
|
+
return this.#backendService
|
|
197
|
+
.post(`/tenant-management/api/admin/identity-provider/oidc`, providerConfig, ApiBase.none);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Deletes the OIDC identity provider configuration of the current tenant, after the user
|
|
201
|
+
* confirmed the action.
|
|
202
|
+
*/
|
|
203
|
+
deleteOIDCProviderConfig() {
|
|
204
|
+
return this.#confirmService
|
|
205
|
+
.confirm({
|
|
206
|
+
title: this.#translateService.instant('yuv.app.user-management.settings.oidc.action.delete.label'),
|
|
207
|
+
message: this.#translateService.instant('yuv.app.user-management.settings.oidc.action.delete.confirm.message'),
|
|
208
|
+
})
|
|
209
|
+
.pipe(switchMap((confirmed) => {
|
|
210
|
+
if (confirmed) {
|
|
211
|
+
return this.#backendService
|
|
212
|
+
.delete(`/tenant-management/api/admin/identity-provider/oidc`, ApiBase.none)
|
|
213
|
+
.pipe(map(() => true));
|
|
214
|
+
}
|
|
215
|
+
else
|
|
216
|
+
return of(false);
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
223
219
|
getGroupDetails(id) {
|
|
224
220
|
const queryParams = new HttpParams()
|
|
225
221
|
.set('briefRepresentation', false);
|
|
@@ -236,6 +232,235 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
236
232
|
}]
|
|
237
233
|
}] });
|
|
238
234
|
|
|
235
|
+
const components$4 = [BusyOverlayDirective, YmtButtonDirective, DialogComponent];
|
|
236
|
+
const modules$4 = [CommonModule, ReactiveFormsModule, TranslatePipe, ClipboardModule, MatButtonModule, MatFormFieldModule, MatIconModule, MatInputModule, MatTooltipModule];
|
|
237
|
+
/** Placeholder shown in the client secret field of an already configured provider; the backend never returns the real secret. */
|
|
238
|
+
const FAKE_CLIENT_SECRET = '••••••••••••••••';
|
|
239
|
+
class SettingsComponent {
|
|
240
|
+
#fb = inject(FormBuilder);
|
|
241
|
+
#userManagementService = inject(YuvUserManagementService);
|
|
242
|
+
#dialogRef = inject((MatDialogRef));
|
|
243
|
+
#translateService = inject(TranslateService);
|
|
244
|
+
#notificationService = inject(NotificationService);
|
|
245
|
+
#logger = inject(Logger);
|
|
246
|
+
busy = signal(true, ...(ngDevMode ? [{ debugName: "busy" }] : /* istanbul ignore next */ []));
|
|
247
|
+
error = signal(undefined, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
|
|
248
|
+
/** True if the tenant has no OIDC identity provider configured (backend responds with 404). */
|
|
249
|
+
notConfigured = signal(false, ...(ngDevMode ? [{ debugName: "notConfigured" }] : /* istanbul ignore next */ []));
|
|
250
|
+
provider = signal(undefined, ...(ngDevMode ? [{ debugName: "provider" }] : /* istanbul ignore next */ []));
|
|
251
|
+
/**
|
|
252
|
+
* SCIM tenant URL. Uses the backend-provided value if present; otherwise falls back to a
|
|
253
|
+
* client-side computation from the redirect URI: `{redirectUri up to and including /realms/{tenant}}/scim/v2`.
|
|
254
|
+
*/
|
|
255
|
+
tenantUrl = computed(() => {
|
|
256
|
+
const scimTenantUrl = this.provider()?.scimProvisioning?.tenantUrl;
|
|
257
|
+
if (scimTenantUrl)
|
|
258
|
+
return scimTenantUrl;
|
|
259
|
+
const redirectUri = this.provider()?.redirectUri;
|
|
260
|
+
const match = redirectUri?.match(/^(.*\/realms\/[^/]+)\//);
|
|
261
|
+
return match ? `${match[1]}/scim/v2` : undefined;
|
|
262
|
+
}, ...(ngDevMode ? [{ debugName: "tenantUrl" }] : /* istanbul ignore next */ []));
|
|
263
|
+
displayName = new FormControl('Microsoft Entra ID', [Validators.required]);
|
|
264
|
+
discoveryUrl = new FormControl('', [Validators.required]);
|
|
265
|
+
clientId = new FormControl('', [Validators.required]);
|
|
266
|
+
clientSecret = new FormControl('', [Validators.required]);
|
|
267
|
+
form = this.#fb.group({
|
|
268
|
+
displayName: this.displayName,
|
|
269
|
+
discoveryUrl: this.discoveryUrl,
|
|
270
|
+
clientId: this.clientId,
|
|
271
|
+
clientSecret: this.clientSecret,
|
|
272
|
+
});
|
|
273
|
+
/** Only used to update the client secret of an already configured OIDC identity provider, e.g. after it was rotated at the IdP. Pre-filled with a fake value; the update button unlocks once the user edits it. */
|
|
274
|
+
newClientSecret = new FormControl('');
|
|
275
|
+
constructor() {
|
|
276
|
+
this.#loadProviderConfig();
|
|
277
|
+
}
|
|
278
|
+
/** Resets the client secret field back to its fake placeholder value, pristine, so the update button locks again. */
|
|
279
|
+
#resetNewClientSecretField() {
|
|
280
|
+
this.newClientSecret.setValue(FAKE_CLIENT_SECRET);
|
|
281
|
+
this.newClientSecret.markAsPristine();
|
|
282
|
+
}
|
|
283
|
+
#loadProviderConfig() {
|
|
284
|
+
this.#userManagementService.fetchOIDCProviderConfig().subscribe({
|
|
285
|
+
next: (provider) => {
|
|
286
|
+
this.provider.set(provider);
|
|
287
|
+
this.notConfigured.set(false);
|
|
288
|
+
this.#resetNewClientSecretField();
|
|
289
|
+
this.busy.set(false);
|
|
290
|
+
},
|
|
291
|
+
error: (e) => {
|
|
292
|
+
if (e.status === 404) {
|
|
293
|
+
this.notConfigured.set(true);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
this.error.set(this.#translateService.instant('yuv.app.user-management.settings.oidc.error.unknown'));
|
|
297
|
+
this.#logger.error('Failed to fetch OIDC identity provider configuration', e);
|
|
298
|
+
}
|
|
299
|
+
this.busy.set(false);
|
|
300
|
+
},
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
configure() {
|
|
304
|
+
this.busy.set(true);
|
|
305
|
+
this.error.set(undefined);
|
|
306
|
+
const providerConfig = {
|
|
307
|
+
displayName: this.displayName.value?.trim() ?? '',
|
|
308
|
+
config: {
|
|
309
|
+
// The discovery URL must be sent as `metadataDescriptorUrl` — the backend resolves the
|
|
310
|
+
// OIDC endpoints (authorizationUrl, tokenUrl, jwksUrl, ...) from the discovery document.
|
|
311
|
+
metadataDescriptorUrl: this.discoveryUrl.value?.trim() ?? '',
|
|
312
|
+
clientId: this.clientId.value?.trim() ?? '',
|
|
313
|
+
clientSecret: this.clientSecret.value ?? '',
|
|
314
|
+
defaultScope: 'openid profile',
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
this.#userManagementService
|
|
318
|
+
.setOIDCProviderConfig(providerConfig)
|
|
319
|
+
.pipe(
|
|
320
|
+
// Re-fetch so the overlay shows exactly what a fresh GET delivers (secrets stripped etc.).
|
|
321
|
+
switchMap(() => this.#userManagementService.fetchOIDCProviderConfig()))
|
|
322
|
+
.subscribe({
|
|
323
|
+
next: (provider) => {
|
|
324
|
+
this.provider.set(provider);
|
|
325
|
+
this.notConfigured.set(false);
|
|
326
|
+
this.#resetNewClientSecretField();
|
|
327
|
+
this.busy.set(false);
|
|
328
|
+
},
|
|
329
|
+
error: (e) => {
|
|
330
|
+
// 422: the backend could not resolve the OIDC endpoints from the discovery URL
|
|
331
|
+
this.error.set(this.#translateService.instant(e.status === 422
|
|
332
|
+
? 'yuv.app.user-management.settings.oidc.configure.error.discovery'
|
|
333
|
+
: 'yuv.app.user-management.settings.oidc.configure.error.unknown'));
|
|
334
|
+
this.#logger.error('Failed to configure OIDC identity provider', e);
|
|
335
|
+
this.busy.set(false);
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
/** Updates the client secret of the already configured OIDC identity provider, keeping all other config values unchanged. */
|
|
340
|
+
update() {
|
|
341
|
+
const oidcProvider = this.provider();
|
|
342
|
+
const newClientSecret = this.newClientSecret.value?.trim();
|
|
343
|
+
if (!oidcProvider || !this.newClientSecret.dirty || !newClientSecret)
|
|
344
|
+
return;
|
|
345
|
+
this.busy.set(true);
|
|
346
|
+
this.error.set(undefined);
|
|
347
|
+
const providerConfig = {
|
|
348
|
+
displayName: oidcProvider.displayName,
|
|
349
|
+
config: {
|
|
350
|
+
metadataDescriptorUrl: oidcProvider.config?.['metadataDescriptorUrl'] ?? '',
|
|
351
|
+
clientId: oidcProvider.config?.['clientId'] ?? '',
|
|
352
|
+
clientSecret: newClientSecret,
|
|
353
|
+
defaultScope: oidcProvider.config?.['defaultScope'] ?? '',
|
|
354
|
+
},
|
|
355
|
+
};
|
|
356
|
+
this.#userManagementService
|
|
357
|
+
.setOIDCProviderConfig(providerConfig)
|
|
358
|
+
.pipe(
|
|
359
|
+
// Re-fetch so the overlay shows exactly what a fresh GET delivers (secrets stripped etc.).
|
|
360
|
+
switchMap(() => this.#userManagementService.fetchOIDCProviderConfig()))
|
|
361
|
+
.subscribe({
|
|
362
|
+
next: (provider) => {
|
|
363
|
+
this.provider.set(provider);
|
|
364
|
+
this.#resetNewClientSecretField();
|
|
365
|
+
this.busy.set(false);
|
|
366
|
+
this.#notificationService.success(this.#translateService.instant('yuv.app.user-management.settings.oidc.action.update.success'));
|
|
367
|
+
},
|
|
368
|
+
error: (e) => {
|
|
369
|
+
this.error.set(this.#translateService.instant('yuv.app.user-management.settings.oidc.action.update.error'));
|
|
370
|
+
this.#logger.error('Failed to update the OIDC identity provider client secret', e);
|
|
371
|
+
this.busy.set(false);
|
|
372
|
+
},
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
/** Asks the user to confirm, then deletes the OIDC identity provider configuration. */
|
|
376
|
+
delete() {
|
|
377
|
+
this.#userManagementService.deleteOIDCProviderConfig().subscribe({
|
|
378
|
+
next: (deleted) => {
|
|
379
|
+
if (deleted) {
|
|
380
|
+
this.#notificationService.success(this.#translateService.instant('yuv.app.user-management.settings.oidc.action.delete.success'));
|
|
381
|
+
this.#dialogRef.close();
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
error: (e) => {
|
|
385
|
+
this.#notificationService.error(this.#translateService.instant('yuv.app.user-management.settings.oidc.action.delete.error'));
|
|
386
|
+
this.#logger.error('Failed to delete OIDC identity provider configuration', e);
|
|
387
|
+
},
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
/** Handles the `cdkCopyToClipboardCopied` output, which reports whether the copy succeeded. */
|
|
391
|
+
onCopied(success) {
|
|
392
|
+
if (success) {
|
|
393
|
+
this.#notificationService.success(this.#translateService.instant('yuv.app.user-management.settings.oidc.action.copy.success'));
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
this.#notificationService.error(this.#translateService.instant('yuv.app.user-management.settings.oidc.action.copy.error'));
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
close() {
|
|
400
|
+
this.#dialogRef.close();
|
|
401
|
+
}
|
|
402
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
403
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: SettingsComponent, isStandalone: true, selector: "ymusrmgmt-settings", ngImport: i0, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.settings.dialog.title' | translate\">\n <main class=\"yuv-dialog-content\">\n @if (notConfigured()) {\n <p class=\"hint\">{{ 'yuv.app.user-management.settings.oidc.notConfigured' | translate }}</p>\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.displayName' | translate }}</mat-label>\n <input matInput [formControl]=\"displayName\" type=\"text\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.discoveryUrl' | translate }}</mat-label>\n <input matInput [formControl]=\"discoveryUrl\" type=\"text\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.clientId' | translate }}</mat-label>\n <input matInput [formControl]=\"clientId\" type=\"text\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.clientSecret' | translate }}</mat-label>\n <input matInput [formControl]=\"clientSecret\" type=\"password\" autocomplete=\"new-password\" />\n </mat-form-field>\n </form>\n } @else if (provider(); as oidcProvider) {\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.displayName' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"oidcProvider.displayName || '\u2014'\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.discoveryUrl' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"oidcProvider.config?.['metadataDescriptorUrl'] || '\u2014'\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.clientId' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"oidcProvider.config?.['clientId'] || '\u2014'\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.clientSecret' | translate }}</mat-label>\n <input matInput [formControl]=\"newClientSecret\" type=\"password\" autocomplete=\"new-password\" />\n </mat-form-field>\n @if (oidcProvider.redirectUri; as redirectUri) {\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.redirectUri' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"redirectUri\" />\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"redirectUri\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n }\n\n @if (oidcProvider.scimProvisioning; as scimProvisioning) {\n <h4>{{ 'yuv.app.user-management.settings.oidc.section.provisioning' | translate }}</h4>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.tenantUrl' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"tenantUrl() || '\u2014'\" />\n @if (tenantUrl(); as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.tokenUrl' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"scimProvisioning.tokenEndpoint || '\u2014'\" />\n @if (scimProvisioning.tokenEndpoint; as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.clientName' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"scimProvisioning.clientId || '\u2014'\" />\n @if (scimProvisioning.clientId; as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.clientSecret' | translate }}</mat-label>\n <input matInput type=\"password\" readonly [attr.tabindex]=\"-1\" [value]=\"scimProvisioning.clientSecret || '\u2014'\" />\n @if (scimProvisioning.clientSecret; as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n }\n }\n\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </main>\n <footer>\n @if (provider()) {\n <button ymtButton=\"danger\" class=\"delete-button\" [disabled]=\"busy()\" (click)=\"delete()\">\n {{ 'yuv.app.user-management.settings.oidc.action.delete.label' | translate }}\n </button>\n }\n <button [ymtButton]=\"notConfigured() ? 'secondary' : 'primary'\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ 'yuv.app.user-management.settings.action.button.close' | translate }}\n </button>\n @if (notConfigured()) {\n <button ymtButton=\"primary\" [disabled]=\"busy() || form.invalid\" (click)=\"configure()\">\n {{ 'yuv.app.user-management.settings.action.button.configure' | translate }}\n </button>\n } @else if (provider()) {\n <button ymtButton=\"secondary\" [disabled]=\"busy() || !newClientSecret.dirty || !newClientSecret.value?.trim()\" (click)=\"update()\">\n {{ 'yuv.app.user-management.settings.oidc.action.update.label' | translate }}\n </button>\n }\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main{padding:var(--ymt-spacing-m);min-height:120px}:host main .hint{color:var(--ymt-on-info-container, inherit);background-color:var(--ymt-info-container, var(--ymt-surface-container));padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs);margin:0 0 var(--ymt-spacing-m)}:host main .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs);margin:0}:host main h4{margin:var(--ymt-spacing-m) 0 var(--ymt-spacing-s)}:host footer .delete-button{margin-inline-end:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ClipboardModule }, { kind: "directive", type: i2.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitle", "headertitel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
404
|
+
}
|
|
405
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: SettingsComponent, decorators: [{
|
|
406
|
+
type: Component,
|
|
407
|
+
args: [{ selector: 'ymusrmgmt-settings', standalone: true, imports: [...modules$4, ...components$4], template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.settings.dialog.title' | translate\">\n <main class=\"yuv-dialog-content\">\n @if (notConfigured()) {\n <p class=\"hint\">{{ 'yuv.app.user-management.settings.oidc.notConfigured' | translate }}</p>\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.displayName' | translate }}</mat-label>\n <input matInput [formControl]=\"displayName\" type=\"text\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.discoveryUrl' | translate }}</mat-label>\n <input matInput [formControl]=\"discoveryUrl\" type=\"text\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.clientId' | translate }}</mat-label>\n <input matInput [formControl]=\"clientId\" type=\"text\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.clientSecret' | translate }}</mat-label>\n <input matInput [formControl]=\"clientSecret\" type=\"password\" autocomplete=\"new-password\" />\n </mat-form-field>\n </form>\n } @else if (provider(); as oidcProvider) {\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.displayName' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"oidcProvider.displayName || '\u2014'\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.discoveryUrl' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"oidcProvider.config?.['metadataDescriptorUrl'] || '\u2014'\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.clientId' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"oidcProvider.config?.['clientId'] || '\u2014'\" />\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.configure.property.clientSecret' | translate }}</mat-label>\n <input matInput [formControl]=\"newClientSecret\" type=\"password\" autocomplete=\"new-password\" />\n </mat-form-field>\n @if (oidcProvider.redirectUri; as redirectUri) {\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.property.redirectUri' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"redirectUri\" />\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"redirectUri\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n }\n\n @if (oidcProvider.scimProvisioning; as scimProvisioning) {\n <h4>{{ 'yuv.app.user-management.settings.oidc.section.provisioning' | translate }}</h4>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.tenantUrl' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"tenantUrl() || '\u2014'\" />\n @if (tenantUrl(); as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.tokenUrl' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"scimProvisioning.tokenEndpoint || '\u2014'\" />\n @if (scimProvisioning.tokenEndpoint; as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.clientName' | translate }}</mat-label>\n <input matInput type=\"text\" readonly [attr.tabindex]=\"-1\" [value]=\"scimProvisioning.clientId || '\u2014'\" />\n @if (scimProvisioning.clientId; as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{ 'yuv.app.user-management.settings.oidc.provisioning.property.clientSecret' | translate }}</mat-label>\n <input matInput type=\"password\" readonly [attr.tabindex]=\"-1\" [value]=\"scimProvisioning.clientSecret || '\u2014'\" />\n @if (scimProvisioning.clientSecret; as value) {\n <button\n matSuffix\n mat-icon-button\n class=\"copy-button\"\n type=\"button\"\n [matTooltip]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.settings.oidc.action.copy.label' | translate\"\n [cdkCopyToClipboard]=\"value\"\n (cdkCopyToClipboardCopied)=\"onCopied($event)\">\n <mat-icon>content_copy</mat-icon>\n </button>\n }\n </mat-form-field>\n }\n }\n\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </main>\n <footer>\n @if (provider()) {\n <button ymtButton=\"danger\" class=\"delete-button\" [disabled]=\"busy()\" (click)=\"delete()\">\n {{ 'yuv.app.user-management.settings.oidc.action.delete.label' | translate }}\n </button>\n }\n <button [ymtButton]=\"notConfigured() ? 'secondary' : 'primary'\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ 'yuv.app.user-management.settings.action.button.close' | translate }}\n </button>\n @if (notConfigured()) {\n <button ymtButton=\"primary\" [disabled]=\"busy() || form.invalid\" (click)=\"configure()\">\n {{ 'yuv.app.user-management.settings.action.button.configure' | translate }}\n </button>\n } @else if (provider()) {\n <button ymtButton=\"secondary\" [disabled]=\"busy() || !newClientSecret.dirty || !newClientSecret.value?.trim()\" (click)=\"update()\">\n {{ 'yuv.app.user-management.settings.oidc.action.update.label' | translate }}\n </button>\n }\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main{padding:var(--ymt-spacing-m);min-height:120px}:host main .hint{color:var(--ymt-on-info-container, inherit);background-color:var(--ymt-info-container, var(--ymt-surface-container));padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs);margin:0 0 var(--ymt-spacing-m)}:host main .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs);margin:0}:host main h4{margin:var(--ymt-spacing-m) 0 var(--ymt-spacing-s)}:host footer .delete-button{margin-inline-end:auto}\n"] }]
|
|
408
|
+
}], ctorParameters: () => [] });
|
|
409
|
+
|
|
410
|
+
class YuvUserManagementComponent {
|
|
411
|
+
#shell = inject(ShellService);
|
|
412
|
+
#titleService = inject(Title);
|
|
413
|
+
#translateService = inject(TranslateService);
|
|
414
|
+
#router = inject(Router);
|
|
415
|
+
#activatedRoute = inject(ActivatedRoute);
|
|
416
|
+
#dialog = inject(MatDialog);
|
|
417
|
+
#app = this.#shell.getApp(APP_ID);
|
|
418
|
+
appName = this.#app?.title;
|
|
419
|
+
icons = APP_ICONS;
|
|
420
|
+
views = [
|
|
421
|
+
{ id: 'users', title: 'yuv.app.user-management.navigation.users.label', link: 'users', tooltip: 'yuv.app.user-management.navigation.users.tooltip' },
|
|
422
|
+
{ id: 'groups', title: 'yuv.app.user-management.navigation.groups.label', link: 'groups', tooltip: 'yuv.app.user-management.navigation.groups.tooltip' },
|
|
423
|
+
];
|
|
424
|
+
activeLink = this.views[0].link;
|
|
425
|
+
constructor() {
|
|
426
|
+
this.#router.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe((e) => {
|
|
427
|
+
const view = this.views.find(v => e.urlAfterRedirects.includes('/' + v.link));
|
|
428
|
+
if (view)
|
|
429
|
+
this.activeLink = view.link;
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
ngOnInit() {
|
|
433
|
+
const translatedTitle = this.appName.startsWith('yuv.')
|
|
434
|
+
? this.#translateService.instant(this.appName)
|
|
435
|
+
: this.appName;
|
|
436
|
+
this.#titleService.setTitle(translatedTitle);
|
|
437
|
+
}
|
|
438
|
+
navigate(link) {
|
|
439
|
+
this.#router.navigate([link], { relativeTo: this.#activatedRoute });
|
|
440
|
+
}
|
|
441
|
+
openSettings() {
|
|
442
|
+
this.#dialog.open(SettingsComponent, {
|
|
443
|
+
width: '600px',
|
|
444
|
+
maxWidth: '90vw',
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: YuvUserManagementComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
448
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: YuvUserManagementComponent, isStandalone: true, selector: "ymusrmgmt-root", ngImport: i0, template: "<ng-template yuvAppHeaderSlot=\"actions\">\n <div class=\"usrmgmt-header-actions\">\n <mat-button-toggle-group [value]=\"activeLink\" (change)=\"navigate($event.value)\" hideSingleSelectionIndicator>\n @for (view of views; track view.id) {\n <mat-button-toggle [value]=\"view.link\" [matTooltip]=\"view.tooltip | translate\">{{ view.title | translate }}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n <button\n mat-icon-button\n class=\"usrmgmt-settings-button\"\n [matTooltip]=\"'yuv.app.user-management.navigation.settings.tooltip' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.navigation.settings.label' | translate\"\n (click)=\"openSettings()\">\n <mat-icon>{{ icons.actionSettings }}</mat-icon>\n </button>\n </div>\n</ng-template>\n\n<main class=\"usrmgmt-main__content\" [attr.aria-label]=\"'yuv.app.user-management.content.aria.label' | translate\">\n <router-outlet></router-outlet>\n</main>\n\n<router-outlet name=\"modal\"></router-outlet>\n", styles: [":host{display:flex;flex-flow:column;height:100%}:host .usrmgmt-main__content{flex:1;overflow-y:hidden}.usrmgmt-header-actions{display:flex;align-items:center;width:100%}.usrmgmt-header-actions .usrmgmt-settings-button{margin-inline-start:auto}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i2$1.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i2$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i5.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "ngmodule", type: YmtPanesModule }, { kind: "ngmodule", type: YuvClientShellModule }, { kind: "directive", type: i6.YuvAppHeaderSlotDirective, selector: "ng-template[yuvAppHeaderSlot]", inputs: ["yuvAppHeaderSlot"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
449
|
+
}
|
|
450
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: YuvUserManagementComponent, decorators: [{
|
|
451
|
+
type: Component,
|
|
452
|
+
args: [{ selector: 'ymusrmgmt-root', standalone: true, imports: [
|
|
453
|
+
MatButtonModule,
|
|
454
|
+
MatButtonToggleModule,
|
|
455
|
+
MatIconModule,
|
|
456
|
+
MatTooltipModule,
|
|
457
|
+
RouterModule,
|
|
458
|
+
TranslatePipe,
|
|
459
|
+
YmtPanesModule,
|
|
460
|
+
YuvClientShellModule,
|
|
461
|
+
], template: "<ng-template yuvAppHeaderSlot=\"actions\">\n <div class=\"usrmgmt-header-actions\">\n <mat-button-toggle-group [value]=\"activeLink\" (change)=\"navigate($event.value)\" hideSingleSelectionIndicator>\n @for (view of views; track view.id) {\n <mat-button-toggle [value]=\"view.link\" [matTooltip]=\"view.tooltip | translate\">{{ view.title | translate }}</mat-button-toggle>\n }\n </mat-button-toggle-group>\n <button\n mat-icon-button\n class=\"usrmgmt-settings-button\"\n [matTooltip]=\"'yuv.app.user-management.navigation.settings.tooltip' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.navigation.settings.label' | translate\"\n (click)=\"openSettings()\">\n <mat-icon>{{ icons.actionSettings }}</mat-icon>\n </button>\n </div>\n</ng-template>\n\n<main class=\"usrmgmt-main__content\" [attr.aria-label]=\"'yuv.app.user-management.content.aria.label' | translate\">\n <router-outlet></router-outlet>\n</main>\n\n<router-outlet name=\"modal\"></router-outlet>\n", styles: [":host{display:flex;flex-flow:column;height:100%}:host .usrmgmt-main__content{flex:1;overflow-y:hidden}.usrmgmt-header-actions{display:flex;align-items:center;width:100%}.usrmgmt-header-actions .usrmgmt-settings-button{margin-inline-start:auto}\n"] }]
|
|
462
|
+
}], ctorParameters: () => [] });
|
|
463
|
+
|
|
239
464
|
const ROLE_KEY_PREFIX = 'role:';
|
|
240
465
|
/** Localized role name, falling back to the technical name when no `_label` entry exists. */
|
|
241
466
|
function resolveRoleLabel(localization, role) {
|
|
@@ -339,8 +564,8 @@ class UserDetailsComponent {
|
|
|
339
564
|
enabled: [{ value: false, disabled: true }]
|
|
340
565
|
});
|
|
341
566
|
}
|
|
342
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: UserDetailsComponent, deps: [{ token: YuvUserManagementService }, { token: i1
|
|
343
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: UserDetailsComponent, isStandalone: true, selector: "ymusrmgmt-user-details", inputs: { userId: "userId" }, ngImport: i0, template: "@let currentUserDetails = userDetails();\n@if (currentUserDetails) {\n <form [formGroup]=\"userDetailsForm\" class=\"user-details-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{('yuv.app.user-management.users.object.property.id' | translate)}}</mat-label>\n <input matInput formControlName=\"id\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.username' | translate)}}</mat-label>\n <input matInput formControlName=\"username\" readonly>\n <mat-icon matPrefix>account_box</mat-icon>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.email' | translate)}}</mat-label>\n <input matInput formControlName=\"email\" readonly>\n <mat-icon matPrefix>email</mat-icon>\n </mat-form-field> \n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.firstname' | translate)}}</mat-label>\n <input matInput formControlName=\"firstName\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.lastname' | translate)}}</mat-label>\n <input matInput formControlName=\"lastName\" readonly>\n </mat-form-field>\n <mat-form-field class=\"groups-field\">\n <mat-label>{{('yuv.app.user-management.users.object.property.groups' | translate)}}</mat-label>\n <mat-chip-grid #groupChipGrid>\n @if (currentUserDetails.groups) {\n @for (group of currentUserDetails.groups.sort(); track group) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{group}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"groupChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n <mat-form-field class=\"roles-field\">\n <mat-label>{{('yuv.app.user-management.users.object.property.roles' | translate)}}</mat-label>\n <mat-chip-grid #roleChipGrid>\n @if (currentUserDetails.effectiveRoles) {\n @for (role of currentUserDetails.effectiveRoles | sortRolesByLabel; track role) {\n <mat-chip-row [editable]=\"false\" [disabled]=\"currentUserDetails.roles.indexOf(role) === -1\" [matTooltip]=\"role | roleTooltip\"><div class=\"chip\">{{role | roleLabel}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"roleChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n <mat-slide-toggle formControlName=\"enabled\">\n {{ userDetailsForm.get('enabled')?.value ? ('yuv.app.user-management.users.object.property.enabled' | translate) :\n ('yuv.app.user-management.users.object.property.disabled' | translate) }}\n </mat-slide-toggle> \n </form>\n}", styles: [":host{height:100%;overflow:hidden;display:flex;flex-flow:column}:host .user-details-form{flex:1;overflow-y:auto;display:grid;align-items:start;align-content:start;gap:var(--ymt-spacing-m);padding:1rem}:host .user-details-form mat-chip-row{overflow:hidden}:host .user-details-form .groups-field mat-chip-grid,:host .user-details-form .roles-field mat-chip-grid{max-height:300px;overflow-y:auto;display:block}\n"], dependencies: [{ kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i3$
|
|
567
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: UserDetailsComponent, deps: [{ token: YuvUserManagementService }, { token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
568
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: UserDetailsComponent, isStandalone: true, selector: "ymusrmgmt-user-details", inputs: { userId: "userId" }, ngImport: i0, template: "@let currentUserDetails = userDetails();\n@if (currentUserDetails) {\n <form [formGroup]=\"userDetailsForm\" class=\"user-details-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{('yuv.app.user-management.users.object.property.id' | translate)}}</mat-label>\n <input matInput formControlName=\"id\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.username' | translate)}}</mat-label>\n <input matInput formControlName=\"username\" readonly>\n <mat-icon matPrefix>account_box</mat-icon>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.email' | translate)}}</mat-label>\n <input matInput formControlName=\"email\" readonly>\n <mat-icon matPrefix>email</mat-icon>\n </mat-form-field> \n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.firstname' | translate)}}</mat-label>\n <input matInput formControlName=\"firstName\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.lastname' | translate)}}</mat-label>\n <input matInput formControlName=\"lastName\" readonly>\n </mat-form-field>\n <mat-form-field class=\"groups-field\">\n <mat-label>{{('yuv.app.user-management.users.object.property.groups' | translate)}}</mat-label>\n <mat-chip-grid #groupChipGrid>\n @if (currentUserDetails.groups) {\n @for (group of currentUserDetails.groups.sort(); track group) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{group}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"groupChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n <mat-form-field class=\"roles-field\">\n <mat-label>{{('yuv.app.user-management.users.object.property.roles' | translate)}}</mat-label>\n <mat-chip-grid #roleChipGrid>\n @if (currentUserDetails.effectiveRoles) {\n @for (role of currentUserDetails.effectiveRoles | sortRolesByLabel; track role) {\n <mat-chip-row [editable]=\"false\" [disabled]=\"currentUserDetails.roles.indexOf(role) === -1\" [matTooltip]=\"role | roleTooltip\"><div class=\"chip\">{{role | roleLabel}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"roleChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n <mat-slide-toggle formControlName=\"enabled\">\n {{ userDetailsForm.get('enabled')?.value ? ('yuv.app.user-management.users.object.property.enabled' | translate) :\n ('yuv.app.user-management.users.object.property.disabled' | translate) }}\n </mat-slide-toggle> \n </form>\n}", styles: [":host{height:100%;overflow:hidden;display:flex;flex-flow:column}:host .user-details-form{flex:1;overflow-y:auto;display:grid;align-items:start;align-content:start;gap:var(--ymt-spacing-m);padding:1rem}:host .user-details-form mat-chip-row{overflow:hidden}:host .user-details-form .groups-field mat-chip-grid,:host .user-details-form .roles-field mat-chip-grid{max-height:300px;overflow-y:auto;display:block}\n"], dependencies: [{ kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i3$2.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i3$2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled", "readonly", "matChipInputDisabledInteractive"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "component", type: i3$2.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: RoleLabelPipe, name: "roleLabel" }, { kind: "pipe", type: RoleTooltipPipe, name: "roleTooltip" }, { kind: "pipe", type: SortRolesByLabelPipe, name: "sortRolesByLabel" }] });
|
|
344
569
|
}
|
|
345
570
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: UserDetailsComponent, decorators: [{
|
|
346
571
|
type: Component,
|
|
@@ -358,7 +583,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
358
583
|
RoleTooltipPipe,
|
|
359
584
|
SortRolesByLabelPipe
|
|
360
585
|
], template: "@let currentUserDetails = userDetails();\n@if (currentUserDetails) {\n <form [formGroup]=\"userDetailsForm\" class=\"user-details-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{('yuv.app.user-management.users.object.property.id' | translate)}}</mat-label>\n <input matInput formControlName=\"id\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.username' | translate)}}</mat-label>\n <input matInput formControlName=\"username\" readonly>\n <mat-icon matPrefix>account_box</mat-icon>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.email' | translate)}}</mat-label>\n <input matInput formControlName=\"email\" readonly>\n <mat-icon matPrefix>email</mat-icon>\n </mat-form-field> \n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.firstname' | translate)}}</mat-label>\n <input matInput formControlName=\"firstName\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.users.object.property.lastname' | translate)}}</mat-label>\n <input matInput formControlName=\"lastName\" readonly>\n </mat-form-field>\n <mat-form-field class=\"groups-field\">\n <mat-label>{{('yuv.app.user-management.users.object.property.groups' | translate)}}</mat-label>\n <mat-chip-grid #groupChipGrid>\n @if (currentUserDetails.groups) {\n @for (group of currentUserDetails.groups.sort(); track group) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{group}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"groupChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n <mat-form-field class=\"roles-field\">\n <mat-label>{{('yuv.app.user-management.users.object.property.roles' | translate)}}</mat-label>\n <mat-chip-grid #roleChipGrid>\n @if (currentUserDetails.effectiveRoles) {\n @for (role of currentUserDetails.effectiveRoles | sortRolesByLabel; track role) {\n <mat-chip-row [editable]=\"false\" [disabled]=\"currentUserDetails.roles.indexOf(role) === -1\" [matTooltip]=\"role | roleTooltip\"><div class=\"chip\">{{role | roleLabel}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"roleChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n <mat-slide-toggle formControlName=\"enabled\">\n {{ userDetailsForm.get('enabled')?.value ? ('yuv.app.user-management.users.object.property.enabled' | translate) :\n ('yuv.app.user-management.users.object.property.disabled' | translate) }}\n </mat-slide-toggle> \n </form>\n}", styles: [":host{height:100%;overflow:hidden;display:flex;flex-flow:column}:host .user-details-form{flex:1;overflow-y:auto;display:grid;align-items:start;align-content:start;gap:var(--ymt-spacing-m);padding:1rem}:host .user-details-form mat-chip-row{overflow:hidden}:host .user-details-form .groups-field mat-chip-grid,:host .user-details-form .roles-field mat-chip-grid{max-height:300px;overflow-y:auto;display:block}\n"] }]
|
|
361
|
-
}], ctorParameters: () => [{ type: YuvUserManagementService }, { type: i1
|
|
586
|
+
}], ctorParameters: () => [{ type: YuvUserManagementService }, { type: i1.FormBuilder }], propDecorators: { userId: [{
|
|
362
587
|
type: Input
|
|
363
588
|
}] } });
|
|
364
589
|
|
|
@@ -451,13 +676,13 @@ class CreateUserComponent {
|
|
|
451
676
|
});
|
|
452
677
|
}
|
|
453
678
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CreateUserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
454
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: CreateUserComponent, isStandalone: true, selector: "ymusrmgmt-create-user", host: { properties: { "class.busy": "!busy()" } }, ngImport: i0, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstname\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastname\" type=\"text\"/>\n </mat-form-field>\n <div class=\"yuv-form-field\" id=\"enabledPropDiv\">\n <mat-slide-toggle formControlName=\"enabled\">\n {{ form.get('enabled')?.value ? ('yuv.app.user-management.users.object.property.enabled' | translate) : ('yuv.app.user-management.users.object.property.disabled' | translate) }}\n </mat-slide-toggle>\n </div>\n @if (error()) {\n <p class=\"error\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createUser()\">\n {{ 'yuv.app.user-management.users.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form #enabledPropDiv{display:flex;justify-content:center;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1
|
|
679
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: CreateUserComponent, isStandalone: true, selector: "ymusrmgmt-create-user", host: { properties: { "class.busy": "!busy()" } }, ngImport: i0, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstname\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastname\" type=\"text\"/>\n </mat-form-field>\n <div class=\"yuv-form-field\" id=\"enabledPropDiv\">\n <mat-slide-toggle formControlName=\"enabled\">\n {{ form.get('enabled')?.value ? ('yuv.app.user-management.users.object.property.enabled' | translate) : ('yuv.app.user-management.users.object.property.disabled' | translate) }}\n </mat-slide-toggle>\n </div>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createUser()\">\n {{ 'yuv.app.user-management.users.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form #enabledPropDiv{display:flex;justify-content:center;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitle", "headertitel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
455
680
|
}
|
|
456
681
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CreateUserComponent, decorators: [{
|
|
457
682
|
type: Component,
|
|
458
683
|
args: [{ selector: 'ymusrmgmt-create-user', standalone: true, imports: [...modules$3, ...components$3], host: {
|
|
459
684
|
'[class.busy]': '!busy()',
|
|
460
|
-
}, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstname\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastname\" type=\"text\"/>\n </mat-form-field>\n <div class=\"yuv-form-field\" id=\"enabledPropDiv\">\n <mat-slide-toggle formControlName=\"enabled\">\n {{ form.get('enabled')?.value ? ('yuv.app.user-management.users.object.property.enabled' | translate) : ('yuv.app.user-management.users.object.property.disabled' | translate) }}\n </mat-slide-toggle>\n </div>\n @if (error()) {\n <p class=\"error\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createUser()\">\n {{ 'yuv.app.user-management.users.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form #enabledPropDiv{display:flex;justify-content:center;align-items:center}\n"] }]
|
|
685
|
+
}, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstname\" type=\"text\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastname\" type=\"text\"/>\n </mat-form-field>\n <div class=\"yuv-form-field\" id=\"enabledPropDiv\">\n <mat-slide-toggle formControlName=\"enabled\">\n {{ form.get('enabled')?.value ? ('yuv.app.user-management.users.object.property.enabled' | translate) : ('yuv.app.user-management.users.object.property.disabled' | translate) }}\n </mat-slide-toggle>\n </div>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createUser()\">\n {{ 'yuv.app.user-management.users.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form #enabledPropDiv{display:flex;justify-content:center;align-items:center}\n"] }]
|
|
461
686
|
}] });
|
|
462
687
|
|
|
463
688
|
class RolesSelectionComponent {
|
|
@@ -483,23 +708,12 @@ class RolesSelectionComponent {
|
|
|
483
708
|
this.selectedAssigned.set([]);
|
|
484
709
|
});
|
|
485
710
|
}
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
this.selectedAvailable.set(current.filter((r) => r !== role));
|
|
490
|
-
}
|
|
491
|
-
else {
|
|
492
|
-
this.selectedAvailable.set([...current, role]);
|
|
493
|
-
}
|
|
711
|
+
/** Bound to `mat-list-option`'s `(selectedChange)`, which fires uniformly for mouse and keyboard interaction — unlike `(click)`, which Material's keyboard handling never dispatches. */
|
|
712
|
+
onAvailableSelectedChange(role, selected) {
|
|
713
|
+
this.selectedAvailable.update((current) => selected ? [...current, role] : current.filter((r) => r !== role));
|
|
494
714
|
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
if (current.includes(role)) {
|
|
498
|
-
this.selectedAssigned.set(current.filter((r) => r !== role));
|
|
499
|
-
}
|
|
500
|
-
else {
|
|
501
|
-
this.selectedAssigned.set([...current, role]);
|
|
502
|
-
}
|
|
715
|
+
onAssignedSelectedChange(role, selected) {
|
|
716
|
+
this.selectedAssigned.update((current) => selected ? [...current, role] : current.filter((r) => r !== role));
|
|
503
717
|
}
|
|
504
718
|
assignRoles() {
|
|
505
719
|
const toAssign = this.selectedAvailable();
|
|
@@ -544,7 +758,7 @@ class RolesSelectionComponent {
|
|
|
544
758
|
return this.selectedAssigned().includes(role);
|
|
545
759
|
}
|
|
546
760
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RolesSelectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
547
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: RolesSelectionComponent, isStandalone: true, selector: "ymusrmgmt-role-selection", inputs: { allRoles: { classPropertyName: "allRoles", publicName: "allRoles", isSignal: true, isRequired: true, transformFunction: null }, initialRoles: { classPropertyName: "initialRoles", publicName: "initialRoles", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { rolesChange: "rolesChange" }, ngImport: i0, template: "<div class=\"role-selector\">\n <!-- Available Roles (Left) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.users.roles.available' | translate }}\n </div>\n <mat-selection-list
|
|
761
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: RolesSelectionComponent, isStandalone: true, selector: "ymusrmgmt-role-selection", inputs: { allRoles: { classPropertyName: "allRoles", publicName: "allRoles", isSignal: true, isRequired: true, transformFunction: null }, initialRoles: { classPropertyName: "initialRoles", publicName: "initialRoles", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { rolesChange: "rolesChange" }, ngImport: i0, template: "<div class=\"role-selector\">\n <!-- Available Roles (Left) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.users.roles.available' | translate }}\n </div>\n <mat-selection-list\n class=\"role-list\"\n #availableList\n hideSingleSelectionIndicator=\"true\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.available' | translate\">\n @for (role of availableRoles(); track role) {\n <mat-list-option\n [value]=\"role\"\n [matTooltip]=\"role | roleTooltip\"\n [selected]=\"isAvailableSelected(role)\"\n (selectedChange)=\"onAvailableSelectedChange(role, $event)\">\n {{ role | roleLabel }}\n </mat-list-option>\n }\n @empty {\n <div class=\"empty-message\">\n {{ 'yuv.app.user-management.users.roles.noAvailable' | translate }}\n </div>\n }\n </mat-selection-list>\n </div>\n\n <!-- Control Buttons (Center) -->\n <div class=\"control-buttons\">\n <button\n mat-icon-button\n [disabled]=\"availableRoles().length === 0\"\n (click)=\"assignAllRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.assignAll' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.assignAll' | translate\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"!canAssign()\"\n (click)=\"assignRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.assign' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.assign' | translate\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"!canRemove()\"\n (click)=\"removeRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.remove' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.remove' | translate\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"assignedRoles().length === 0\"\n (click)=\"removeAllRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.removeAll' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.removeAll' | translate\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n </div>\n\n <!-- Assigned Roles (Right) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.users.roles.assigned' | translate }}\n </div>\n <mat-selection-list\n class=\"role-list\"\n #assignedList\n hideSingleSelectionIndicator=\"true\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.assigned' | translate\">\n @for (role of assignedRoles(); track role) {\n <mat-list-option\n [value]=\"role\"\n [matTooltip]=\"role | roleTooltip\"\n [selected]=\"isAssignedSelected(role)\"\n (selectedChange)=\"onAssignedSelectedChange(role, $event)\">\n {{ role | roleLabel }}\n </mat-list-option>\n }\n @empty {\n <div class=\"empty-message\">\n {{ 'yuv.app.user-management.users.roles.noAssigned' | translate }}\n </div>\n }\n </mat-selection-list>\n </div>\n</div>\n", styles: [".role-selector{display:flex;gap:var(--ymt-spacing-m);align-items:stretch;min-height:300px;padding:var(--ymt-spacing-xs) 0}.role-list-container{flex:1;display:flex;flex-direction:column;border:var(--ymt-outline-width) solid var(--ymt-outline-variant);border-radius:var(--ymt-corner-xs);overflow:hidden;background-color:var(--ymt-surface-container-lowest);max-height:300px}.role-list-header{padding:var(--ymt-spacing-s) var(--ymt-spacing-m);background-color:var(--ymt-surface-container-high);color:var(--ymt-on-surface);font:var(--ymt-font-title-smallest);border-bottom:var(--ymt-outline-width) solid var(--ymt-outline-variant)}.role-list{flex:1;overflow-y:auto;min-height:0}.role-list ::ng-deep .mat-mdc-list-option{font:var(--ymt-font-body-subtle);height:var(--ymt-sizing-l)}.role-list ::ng-deep .mdc-list-item__primary-text{font:var(--ymt-font-body-subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.role-list ::ng-deep .mdc-checkbox{display:none}.role-list ::ng-deep .mat-mdc-list-option[aria-selected=true]{background-color:var(--ymt-selection-background)!important}.role-list ::ng-deep .mat-mdc-list-option[aria-selected=true] .mdc-list-item__primary-text{color:var(--ymt-on-selection-background);font-weight:500}.role-list ::ng-deep .mat-mdc-list-option:hover:not([aria-selected=true]){background-color:var(--ymt-hover-background)}.control-buttons{display:flex;flex-direction:column;justify-content:center;gap:var(--ymt-spacing-xs)}.empty-message{padding:var(--ymt-spacing-m);text-align:center;color:var(--ymt-text-color-subtle);font:var(--ymt-font-body-subtle)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i3$3.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i3$3.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: RoleLabelPipe, name: "roleLabel" }, { kind: "pipe", type: RoleTooltipPipe, name: "roleTooltip" }] });
|
|
548
762
|
}
|
|
549
763
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: RolesSelectionComponent, decorators: [{
|
|
550
764
|
type: Component,
|
|
@@ -557,7 +771,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
557
771
|
TranslatePipe,
|
|
558
772
|
RoleLabelPipe,
|
|
559
773
|
RoleTooltipPipe,
|
|
560
|
-
], standalone: true, template: "<div class=\"role-selector\">\n <!-- Available Roles (Left) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.users.roles.available' | translate }}\n </div>\n <mat-selection-list
|
|
774
|
+
], standalone: true, template: "<div class=\"role-selector\">\n <!-- Available Roles (Left) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.users.roles.available' | translate }}\n </div>\n <mat-selection-list\n class=\"role-list\"\n #availableList\n hideSingleSelectionIndicator=\"true\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.available' | translate\">\n @for (role of availableRoles(); track role) {\n <mat-list-option\n [value]=\"role\"\n [matTooltip]=\"role | roleTooltip\"\n [selected]=\"isAvailableSelected(role)\"\n (selectedChange)=\"onAvailableSelectedChange(role, $event)\">\n {{ role | roleLabel }}\n </mat-list-option>\n }\n @empty {\n <div class=\"empty-message\">\n {{ 'yuv.app.user-management.users.roles.noAvailable' | translate }}\n </div>\n }\n </mat-selection-list>\n </div>\n\n <!-- Control Buttons (Center) -->\n <div class=\"control-buttons\">\n <button\n mat-icon-button\n [disabled]=\"availableRoles().length === 0\"\n (click)=\"assignAllRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.assignAll' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.assignAll' | translate\">\n <mat-icon>keyboard_double_arrow_right</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"!canAssign()\"\n (click)=\"assignRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.assign' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.assign' | translate\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"!canRemove()\"\n (click)=\"removeRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.remove' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.remove' | translate\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n <button\n mat-icon-button\n [disabled]=\"assignedRoles().length === 0\"\n (click)=\"removeAllRoles()\"\n [matTooltip]=\"'yuv.app.user-management.users.roles.removeAll' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.removeAll' | translate\">\n <mat-icon>keyboard_double_arrow_left</mat-icon>\n </button>\n </div>\n\n <!-- Assigned Roles (Right) -->\n <div class=\"role-list-container\">\n <div class=\"role-list-header\">\n {{ 'yuv.app.user-management.users.roles.assigned' | translate }}\n </div>\n <mat-selection-list\n class=\"role-list\"\n #assignedList\n hideSingleSelectionIndicator=\"true\"\n [attr.aria-label]=\"'yuv.app.user-management.users.roles.assigned' | translate\">\n @for (role of assignedRoles(); track role) {\n <mat-list-option\n [value]=\"role\"\n [matTooltip]=\"role | roleTooltip\"\n [selected]=\"isAssignedSelected(role)\"\n (selectedChange)=\"onAssignedSelectedChange(role, $event)\">\n {{ role | roleLabel }}\n </mat-list-option>\n }\n @empty {\n <div class=\"empty-message\">\n {{ 'yuv.app.user-management.users.roles.noAssigned' | translate }}\n </div>\n }\n </mat-selection-list>\n </div>\n</div>\n", styles: [".role-selector{display:flex;gap:var(--ymt-spacing-m);align-items:stretch;min-height:300px;padding:var(--ymt-spacing-xs) 0}.role-list-container{flex:1;display:flex;flex-direction:column;border:var(--ymt-outline-width) solid var(--ymt-outline-variant);border-radius:var(--ymt-corner-xs);overflow:hidden;background-color:var(--ymt-surface-container-lowest);max-height:300px}.role-list-header{padding:var(--ymt-spacing-s) var(--ymt-spacing-m);background-color:var(--ymt-surface-container-high);color:var(--ymt-on-surface);font:var(--ymt-font-title-smallest);border-bottom:var(--ymt-outline-width) solid var(--ymt-outline-variant)}.role-list{flex:1;overflow-y:auto;min-height:0}.role-list ::ng-deep .mat-mdc-list-option{font:var(--ymt-font-body-subtle);height:var(--ymt-sizing-l)}.role-list ::ng-deep .mdc-list-item__primary-text{font:var(--ymt-font-body-subtle);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.role-list ::ng-deep .mdc-checkbox{display:none}.role-list ::ng-deep .mat-mdc-list-option[aria-selected=true]{background-color:var(--ymt-selection-background)!important}.role-list ::ng-deep .mat-mdc-list-option[aria-selected=true] .mdc-list-item__primary-text{color:var(--ymt-on-selection-background);font-weight:500}.role-list ::ng-deep .mat-mdc-list-option:hover:not([aria-selected=true]){background-color:var(--ymt-hover-background)}.control-buttons{display:flex;flex-direction:column;justify-content:center;gap:var(--ymt-spacing-xs)}.empty-message{padding:var(--ymt-spacing-m);text-align:center;color:var(--ymt-text-color-subtle);font:var(--ymt-font-body-subtle)}\n"] }]
|
|
561
775
|
}], ctorParameters: () => [], propDecorators: { allRoles: [{ type: i0.Input, args: [{ isSignal: true, alias: "allRoles", required: true }] }], initialRoles: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialRoles", required: true }] }], rolesChange: [{ type: i0.Output, args: ["rolesChange"] }] } });
|
|
562
776
|
|
|
563
777
|
const components$2 = [BusyOverlayDirective, YmtButtonDirective, DialogComponent, RolesSelectionComponent];
|
|
@@ -681,13 +895,13 @@ class EditUserComponent {
|
|
|
681
895
|
this.#dialogRef.close();
|
|
682
896
|
}
|
|
683
897
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EditUserComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
684
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: EditUserComponent, isStandalone: true, selector: "ymusrmgmt-edit-user", host: { properties: { "class.busy": "!busy()" } }, ngImport: i0, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n @if (externallyManaged()) {\n <p class=\"externally-managed-hint\">{{ \"yuv.app.user-management.users.action.edit.identitySource.external.hint\" | translate }}</p>\n }\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\" #emailField [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n \n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"userRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n \n @if (error()) {\n <p class=\"error\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateUser()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .readonly-field{opacity:.5;pointer-events:none}:host main form .readonly-label{pointer-events:none}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form .externally-managed-hint{color:var(--ymt-on-info-container, inherit);background-color:var(--ymt-info-container, var(--ymt-surface-container));padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs);margin:0 0 var(--ymt-spacing-m)}:host main form .roles-section{margin:var(--ymt-spacing-m) 0}:host main form .roles-section .roles-label{display:block;font-size:12px;font-weight:400;color:#0009;margin-bottom:var(--ymt-spacing-xs)}:host main form .roles-section.has-error .roles-label{color:var(--ymt-danger)}:host main form .roles-section.has-error ymusrmgmt-role-selection{border:2px solid var(--ymt-danger);border-radius:var(--ymt-corner-xs);display:block}:host main form .roles-section .roles-error{color:var(--ymt-danger);font-size:12px;margin-top:var(--ymt-spacing-xs);padding-left:var(--ymt-spacing-m)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1
|
|
898
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: EditUserComponent, isStandalone: true, selector: "ymusrmgmt-edit-user", host: { properties: { "class.busy": "!busy()" } }, ngImport: i0, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n @if (externallyManaged()) {\n <p class=\"externally-managed-hint\">{{ \"yuv.app.user-management.users.action.edit.identitySource.external.hint\" | translate }}</p>\n }\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\" #emailField [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n \n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"userRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n \n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateUser()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .readonly-field{opacity:.5;pointer-events:none}:host main form .readonly-label{pointer-events:none}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form .externally-managed-hint{color:var(--ymt-on-info-container, inherit);background-color:var(--ymt-info-container, var(--ymt-surface-container));padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs);margin:0 0 var(--ymt-spacing-m)}:host main form .roles-section{margin:var(--ymt-spacing-m) 0}:host main form .roles-section .roles-label{display:block;font-size:12px;font-weight:400;color:#0009;margin-bottom:var(--ymt-spacing-xs)}:host main form .roles-section.has-error .roles-label{color:var(--ymt-danger)}:host main form .roles-section.has-error ymusrmgmt-role-selection{border:2px solid var(--ymt-danger);border-radius:var(--ymt-corner-xs);display:block}:host main form .roles-section .roles-error{color:var(--ymt-danger);font-size:12px;margin-top:var(--ymt-spacing-xs);padding-left:var(--ymt-spacing-m)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitle", "headertitel"] }, { kind: "component", type: RolesSelectionComponent, selector: "ymusrmgmt-role-selection", inputs: ["allRoles", "initialRoles"], outputs: ["rolesChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
685
899
|
}
|
|
686
900
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EditUserComponent, decorators: [{
|
|
687
901
|
type: Component,
|
|
688
902
|
args: [{ selector: 'ymusrmgmt-edit-user', standalone: true, imports: [...modules$2, ...components$2], host: {
|
|
689
903
|
'[class.busy]': '!busy()',
|
|
690
|
-
}, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n @if (externallyManaged()) {\n <p class=\"externally-managed-hint\">{{ \"yuv.app.user-management.users.action.edit.identitySource.external.hint\" | translate }}</p>\n }\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\" #emailField [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n \n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"userRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n \n @if (error()) {\n <p class=\"error\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateUser()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .readonly-field{opacity:.5;pointer-events:none}:host main form .readonly-label{pointer-events:none}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form .externally-managed-hint{color:var(--ymt-on-info-container, inherit);background-color:var(--ymt-info-container, var(--ymt-surface-container));padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs);margin:0 0 var(--ymt-spacing-m)}:host main form .roles-section{margin:var(--ymt-spacing-m) 0}:host main form .roles-section .roles-label{display:block;font-size:12px;font-weight:400;color:#0009;margin-bottom:var(--ymt-spacing-xs)}:host main form .roles-section.has-error .roles-label{color:var(--ymt-danger)}:host main form .roles-section.has-error ymusrmgmt-role-selection{border:2px solid var(--ymt-danger);border-radius:var(--ymt-corner-xs);display:block}:host main form .roles-section .roles-error{color:var(--ymt-danger);font-size:12px;margin-top:var(--ymt-spacing-xs);padding-left:var(--ymt-spacing-m)}\n"] }]
|
|
904
|
+
}, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.users.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n @if (externallyManaged()) {\n <p class=\"externally-managed-hint\">{{ \"yuv.app.user-management.users.action.edit.identitySource.external.hint\" | translate }}</p>\n }\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.users.object.property.username\" | translate }}</mat-label>\n <input matInput [formControl]=\"username\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.email\" | translate}}</mat-label>\n <input matInput [formControl]=\"email\" type=\"text\" #emailField [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.firstname\" | translate}}</mat-label>\n <input matInput [formControl]=\"firstName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n <mat-form-field class=\"yuv-form-field\" [class.readonly-field]=\"externallyManaged()\">\n <mat-label [class.readonly-label]=\"externallyManaged()\">{{\"yuv.app.user-management.users.object.property.lastname\" | translate}}</mat-label>\n <input matInput [formControl]=\"lastName\" type=\"text\" [readonly]=\"externallyManaged()\" [attr.tabindex]=\"externallyManaged() ? -1 : null\"/>\n </mat-form-field>\n \n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"userRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n \n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateUser()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .readonly-field{opacity:.5;pointer-events:none}:host main form .readonly-label{pointer-events:none}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form .externally-managed-hint{color:var(--ymt-on-info-container, inherit);background-color:var(--ymt-info-container, var(--ymt-surface-container));padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs);margin:0 0 var(--ymt-spacing-m)}:host main form .roles-section{margin:var(--ymt-spacing-m) 0}:host main form .roles-section .roles-label{display:block;font-size:12px;font-weight:400;color:#0009;margin-bottom:var(--ymt-spacing-xs)}:host main form .roles-section.has-error .roles-label{color:var(--ymt-danger)}:host main form .roles-section.has-error ymusrmgmt-role-selection{border:2px solid var(--ymt-danger);border-radius:var(--ymt-corner-xs);display:block}:host main form .roles-section .roles-error{color:var(--ymt-danger);font-size:12px;margin-top:var(--ymt-spacing-xs);padding-left:var(--ymt-spacing-m)}\n"] }]
|
|
691
905
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
692
906
|
type: Inject,
|
|
693
907
|
args: [MAT_DIALOG_DATA]
|
|
@@ -929,7 +1143,7 @@ class YuvUsersPageComponent {
|
|
|
929
1143
|
});
|
|
930
1144
|
}
|
|
931
1145
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: YuvUsersPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
932
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: YuvUsersPageComponent, isStandalone: true, selector: "ymusrmgmt-users", host: { properties: { "class.busy": "!busy()", "class.pagination": "this.pagination" } }, viewQueries: [{ propertyName: "userDetailsComponent", first: true, predicate: UserDetailsComponent, descendants: true }], ngImport: i0, template: "<ng-template yuvAppHeaderSlot=\"search\">\n <yuv-simple-search (queryChange)=\"onQueryChange($event)\"></yuv-simple-search>\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\" [(detailsActive)]=\"detailsActive\" [options]=\"layoutOptions\" [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\" title=\"sss\">\n <ymt-pane-body>\n <mat-table [dataSource]=\"dataSource()\" class=\"user-table mat-elevation-z8\" row>\n <ng-container matColumnDef=\"state\">\n <mat-header-cell *matHeaderCellDef />\n <mat-cell *matCellDef=\"let element\">\n <mat-icon>{{ element.enabled ? icons.stateActive : icons.stateInactive }}</mat-icon>\n @if (element.externallyManaged) {\n <mat-icon class=\"external-source\"\n [matTooltip]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\">{{\n icons.sourceExternal }}</mat-icon>\n }\n </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.username' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.username}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"firstName\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.firstname' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.firstName}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"lastName\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.lastname' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.lastName}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"email\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.email' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.email}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.id' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.id}} </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row \n *matRowDef=\"let row; columns: displayedColumns;\" \n (click.single)=\"select(row)\" \n [class.selected-row]=\"this.isSelected(row)\" class=\"user-row\">\n </mat-row>\n </mat-table>\n </ymt-pane-body>\n </ng-template>\n <ng-template ymtLayoutPane role=\"details\">\n @let selectedUser = selection().selected.at(0);\n <ymt-pane-header [icon]=\"'person'\" [title]=\"'yuv.app.user-management.users.details.title' | translate\" [subtitle]=\"selectedUser?.id || ('yuv.app.user-management.users.details.empty' | translate)\" [actions]=\"listActions\" [badges]=\"selectedUser?.externallyManaged ? sourceBadge : undefined\"></ymt-pane-header>\n <ymt-pane-body>\n <ymusrmgmt-user-details [userId]=\"selectedUser?.id\" />\n </ymt-pane-body>\n </ng-template>\n</ymt-master-details-layout>\n\n<ng-template #masterPaneActions>\n <!--h2>{{('yuv.app.user-management.users.title' | translate)}}</h2-->\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageIndex]=\"pagination.page\" [pageSize]=\"getPageSize()\" aria-label=\"Select page\" (page)=\"onChangePage($event)\" hidePageSize></mat-paginator>\n <button ymt-icon-button (click)=\"refresh(true)\" [matTooltip]=\"'yuv.app.user-management.users.navigation.refresh.tooltip' | translate\"><mat-icon>{{icons.refresh}}</mat-icon></button>\n <button ymtButton=\"primary\" (click)=\"createNewUser()\" [matTooltip]=\"'yuv.app.user-management.users.action.create.description' | translate\">\n <mat-icon>person_add</mat-icon>{{'yuv.app.user-management.users.action.create.label' | translate }}\n </button>\n</ng-template>\n\n<ng-template #listActions>\n <yuv-overflow-menu [menuItems]=\"actions\"></yuv-overflow-menu>\n</ng-template>\n\n<ng-template #sourceBadge>\n <ymt-badge severity=\"primary\" [aura]=\"true\" class=\"source-badge\"\n [matTooltip]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\">\n <mat-icon>{{ icons.sourceExternal }}</mat-icon>\n <span>{{ 'yuv.app.user-management.users.object.property.identitySource.external' | translate }}</span>\n </ymt-badge>\n</ng-template>", styles: [":host{--mat-table-row-item-outline-color: var(--ymt-outline-variant);height:100%;overflow:hidden;display:flex;flex-flow:column}:host ymt-master-details-layout{height:100%;padding:1rem}:host .paginator{flex:1;background:transparent}:host .user-table{overflow:auto;height:100%}:host .user-row:hover{background-color:var(--ymt-hover-background)}:host mat-cell mat-icon.external-source{color:var(--ymt-primary);margin-left:.25rem}:host .source-badge{display:inline-flex;align-items:center;gap:.25rem}:host .source-badge mat-icon{font-size:1rem;width:1rem;height:1rem}:host .selected-row{background-color:var(--ymt-selection-background)!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i2$2.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3$4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3$4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3$4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3$4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i3$4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3$4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3$4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3$4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3$4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: SimpleSearchComponent, selector: "yuv-simple-search", inputs: ["query"], outputs: ["querySubmit", "clearInput", "targetSelectionChanged", "queryChange", "typeAggregation"] }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "directive", type: ClickDoubleDirective, selector: "[click.single],[click.double]", inputs: ["debounceTime"], outputs: ["click.double", "click.single"] }, { kind: "component", type: UserDetailsComponent, selector: "ymusrmgmt-user-details", inputs: ["userId"] }, { kind: "component", type: YmtBadge, selector: "ymt-badge", inputs: ["severity", "outline", "aura"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }, { kind: "ngmodule", type: YmtLayoutModule }, { kind: "component", type: i5.MasterDetailsLayoutComponent, selector: "ymt-master-details-layout", inputs: ["layoutSettingsID", "options", "direction", "gutterSize", "detailsActive"], outputs: ["detailsActiveChange"] }, { kind: "directive", type: i5.YmtLayoutPaneDirective, selector: "[ymtLayoutPane]", inputs: ["role", "topBarActions"] }, { kind: "ngmodule", type: YmtPanesModule }, { kind: "component", type: i6.YmtPaneHeaderComponent, selector: "ymt-pane-header", inputs: ["title", "icon", "subtitle", "actions", "badges"] }, { kind: "component", type: i6.YmtPaneBodyComponent, selector: "ymt-pane-body" }, { kind: "ngmodule", type: YuvClientShellModule }, { kind: "directive", type: i4$1.YuvAppHeaderSlotDirective, selector: "ng-template[yuvAppHeaderSlot]", inputs: ["yuvAppHeaderSlot"] }, { kind: "ngmodule", type: YuvOverflowMenuModule }, { kind: "component", type: i8.OverflowMenuComponent, selector: "yuv-overflow-menu", inputs: ["overflowIcon", "groupLabels", "menuItems", "vertical"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1146
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: YuvUsersPageComponent, isStandalone: true, selector: "ymusrmgmt-users", host: { properties: { "class.busy": "!busy()", "class.pagination": "this.pagination" } }, viewQueries: [{ propertyName: "userDetailsComponent", first: true, predicate: UserDetailsComponent, descendants: true }], ngImport: i0, template: "<ng-template yuvAppHeaderSlot=\"search\">\n <yuv-simple-search (queryChange)=\"onQueryChange($event)\"></yuv-simple-search>\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\" [(detailsActive)]=\"detailsActive\" [options]=\"layoutOptions\" [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\" title=\"sss\">\n <ymt-pane-body>\n <mat-table [dataSource]=\"dataSource()\" class=\"user-table mat-elevation-z8\" row>\n <ng-container matColumnDef=\"state\">\n <mat-header-cell *matHeaderCellDef [attr.aria-label]=\"'yuv.app.user-management.users.object.property.state' | translate\" />\n <mat-cell *matCellDef=\"let element\">\n <mat-icon\n aria-hidden=\"false\"\n [attr.aria-label]=\"(element.enabled ? 'yuv.app.user-management.users.object.property.enabled' : 'yuv.app.user-management.users.object.property.disabled') | translate\">{{\n element.enabled ? icons.stateActive : icons.stateInactive }}</mat-icon>\n @if (element.externallyManaged) {\n <mat-icon class=\"external-source\"\n aria-hidden=\"false\"\n [matTooltip]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\">{{\n icons.sourceExternal }}</mat-icon>\n }\n </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.username' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.username}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"firstName\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.firstname' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.firstName}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"lastName\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.lastname' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.lastName}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"email\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.email' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.email}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.id' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.id}} </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row\n *matRowDef=\"let row; columns: displayedColumns;\"\n (click.single)=\"select(row)\"\n [attr.tabindex]=\"0\"\n (keydown.enter)=\"select(row)\"\n (keydown.space)=\"$event.preventDefault(); select(row)\"\n [class.selected-row]=\"this.isSelected(row)\" class=\"user-row\">\n </mat-row>\n </mat-table>\n </ymt-pane-body>\n </ng-template>\n <ng-template ymtLayoutPane role=\"details\">\n @let selectedUser = selection().selected.at(0);\n <ymt-pane-header [icon]=\"'person'\" [title]=\"'yuv.app.user-management.users.details.title' | translate\" [subtitle]=\"selectedUser?.id || ('yuv.app.user-management.users.details.empty' | translate)\" [actions]=\"listActions\" [badges]=\"selectedUser?.externallyManaged ? sourceBadge : undefined\"></ymt-pane-header>\n <ymt-pane-body>\n <ymusrmgmt-user-details [userId]=\"selectedUser?.id\" />\n </ymt-pane-body>\n </ng-template>\n</ymt-master-details-layout>\n\n<ng-template #masterPaneActions>\n <!--h2>{{('yuv.app.user-management.users.title' | translate)}}</h2-->\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageIndex]=\"pagination.page\" [pageSize]=\"getPageSize()\" [attr.aria-label]=\"'yuv.app.user-management.users.navigation.pagination.aria' | translate\" (page)=\"onChangePage($event)\" hidePageSize></mat-paginator>\n <button ymt-icon-button (click)=\"refresh(true)\" [matTooltip]=\"'yuv.app.user-management.users.navigation.refresh.tooltip' | translate\" [attr.aria-label]=\"'yuv.app.user-management.users.navigation.refresh.tooltip' | translate\"><mat-icon>{{icons.refresh}}</mat-icon></button>\n <button ymtButton=\"primary\" (click)=\"createNewUser()\" [matTooltip]=\"'yuv.app.user-management.users.action.create.description' | translate\">\n <mat-icon>person_add</mat-icon>{{'yuv.app.user-management.users.action.create.label' | translate }}\n </button>\n</ng-template>\n\n<ng-template #listActions>\n <yuv-overflow-menu [menuItems]=\"actions\"></yuv-overflow-menu>\n</ng-template>\n\n<ng-template #sourceBadge>\n <ymt-badge severity=\"primary\" [aura]=\"true\" class=\"source-badge\"\n [matTooltip]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\">\n <mat-icon>{{ icons.sourceExternal }}</mat-icon>\n <span>{{ 'yuv.app.user-management.users.object.property.identitySource.external' | translate }}</span>\n </ymt-badge>\n</ng-template>", styles: [":host{--mat-table-row-item-outline-color: var(--ymt-outline-variant);height:100%;overflow:hidden;display:flex;flex-flow:column}:host ymt-master-details-layout{height:100%;padding:1rem}:host .paginator{flex:1;background:transparent}:host .user-table{overflow:auto;height:100%}:host .user-row:hover{background-color:var(--ymt-hover-background)}:host mat-cell mat-icon.external-source{color:var(--ymt-primary);margin-left:.25rem}:host .source-badge{display:inline-flex;align-items:center;gap:.25rem}:host .source-badge mat-icon{font-size:1rem;width:1rem;height:1rem}:host .selected-row{background-color:var(--ymt-selection-background)!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i2$2.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3$4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3$4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3$4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3$4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i3$4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3$4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3$4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3$4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3$4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: SimpleSearchComponent, selector: "yuv-simple-search", inputs: ["query"], outputs: ["querySubmit", "clearInput", "targetSelectionChanged", "queryChange", "typeAggregation"] }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "directive", type: ClickDoubleDirective, selector: "[click.single],[click.double]", inputs: ["debounceTime"], outputs: ["click.double", "click.single"] }, { kind: "component", type: UserDetailsComponent, selector: "ymusrmgmt-user-details", inputs: ["userId"] }, { kind: "component", type: YmtBadge, selector: "ymt-badge", inputs: ["severity", "outline", "aura"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }, { kind: "ngmodule", type: YmtLayoutModule }, { kind: "component", type: i5$1.MasterDetailsLayoutComponent, selector: "ymt-master-details-layout", inputs: ["layoutSettingsID", "options", "direction", "gutterSize", "detailsActive"], outputs: ["detailsActiveChange"] }, { kind: "directive", type: i5$1.YmtLayoutPaneDirective, selector: "[ymtLayoutPane]", inputs: ["role", "topBarActions"] }, { kind: "ngmodule", type: YmtPanesModule }, { kind: "component", type: i6$1.YmtPaneHeaderComponent, selector: "ymt-pane-header", inputs: ["title", "icon", "subtitle", "actions", "badges"] }, { kind: "component", type: i6$1.YmtPaneBodyComponent, selector: "ymt-pane-body" }, { kind: "ngmodule", type: YuvClientShellModule }, { kind: "directive", type: i6.YuvAppHeaderSlotDirective, selector: "ng-template[yuvAppHeaderSlot]", inputs: ["yuvAppHeaderSlot"] }, { kind: "ngmodule", type: YuvOverflowMenuModule }, { kind: "component", type: i8.OverflowMenuComponent, selector: "yuv-overflow-menu", inputs: ["overflowIcon", "groupLabels", "menuItems", "vertical"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
933
1147
|
}
|
|
934
1148
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: YuvUsersPageComponent, decorators: [{
|
|
935
1149
|
type: Component,
|
|
@@ -957,7 +1171,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
957
1171
|
YuvOverflowMenuModule,
|
|
958
1172
|
], host: {
|
|
959
1173
|
'[class.busy]': '!busy()',
|
|
960
|
-
}, template: "<ng-template yuvAppHeaderSlot=\"search\">\n <yuv-simple-search (queryChange)=\"onQueryChange($event)\"></yuv-simple-search>\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\" [(detailsActive)]=\"detailsActive\" [options]=\"layoutOptions\" [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\" title=\"sss\">\n <ymt-pane-body>\n <mat-table [dataSource]=\"dataSource()\" class=\"user-table mat-elevation-z8\" row>\n <ng-container matColumnDef=\"state\">\n <mat-header-cell *matHeaderCellDef />\n <mat-cell *matCellDef=\"let element\">\n <mat-icon>{{
|
|
1174
|
+
}, template: "<ng-template yuvAppHeaderSlot=\"search\">\n <yuv-simple-search (queryChange)=\"onQueryChange($event)\"></yuv-simple-search>\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\" [(detailsActive)]=\"detailsActive\" [options]=\"layoutOptions\" [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\" title=\"sss\">\n <ymt-pane-body>\n <mat-table [dataSource]=\"dataSource()\" class=\"user-table mat-elevation-z8\" row>\n <ng-container matColumnDef=\"state\">\n <mat-header-cell *matHeaderCellDef [attr.aria-label]=\"'yuv.app.user-management.users.object.property.state' | translate\" />\n <mat-cell *matCellDef=\"let element\">\n <mat-icon\n aria-hidden=\"false\"\n [attr.aria-label]=\"(element.enabled ? 'yuv.app.user-management.users.object.property.enabled' : 'yuv.app.user-management.users.object.property.disabled') | translate\">{{\n element.enabled ? icons.stateActive : icons.stateInactive }}</mat-icon>\n @if (element.externallyManaged) {\n <mat-icon class=\"external-source\"\n aria-hidden=\"false\"\n [matTooltip]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\"\n [attr.aria-label]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\">{{\n icons.sourceExternal }}</mat-icon>\n }\n </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.username' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.username}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"firstName\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.firstname' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.firstName}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"lastName\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.lastname' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.lastName}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"email\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.email' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.email}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.users.object.property.id' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.id}} </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row\n *matRowDef=\"let row; columns: displayedColumns;\"\n (click.single)=\"select(row)\"\n [attr.tabindex]=\"0\"\n (keydown.enter)=\"select(row)\"\n (keydown.space)=\"$event.preventDefault(); select(row)\"\n [class.selected-row]=\"this.isSelected(row)\" class=\"user-row\">\n </mat-row>\n </mat-table>\n </ymt-pane-body>\n </ng-template>\n <ng-template ymtLayoutPane role=\"details\">\n @let selectedUser = selection().selected.at(0);\n <ymt-pane-header [icon]=\"'person'\" [title]=\"'yuv.app.user-management.users.details.title' | translate\" [subtitle]=\"selectedUser?.id || ('yuv.app.user-management.users.details.empty' | translate)\" [actions]=\"listActions\" [badges]=\"selectedUser?.externallyManaged ? sourceBadge : undefined\"></ymt-pane-header>\n <ymt-pane-body>\n <ymusrmgmt-user-details [userId]=\"selectedUser?.id\" />\n </ymt-pane-body>\n </ng-template>\n</ymt-master-details-layout>\n\n<ng-template #masterPaneActions>\n <!--h2>{{('yuv.app.user-management.users.title' | translate)}}</h2-->\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageIndex]=\"pagination.page\" [pageSize]=\"getPageSize()\" [attr.aria-label]=\"'yuv.app.user-management.users.navigation.pagination.aria' | translate\" (page)=\"onChangePage($event)\" hidePageSize></mat-paginator>\n <button ymt-icon-button (click)=\"refresh(true)\" [matTooltip]=\"'yuv.app.user-management.users.navigation.refresh.tooltip' | translate\" [attr.aria-label]=\"'yuv.app.user-management.users.navigation.refresh.tooltip' | translate\"><mat-icon>{{icons.refresh}}</mat-icon></button>\n <button ymtButton=\"primary\" (click)=\"createNewUser()\" [matTooltip]=\"'yuv.app.user-management.users.action.create.description' | translate\">\n <mat-icon>person_add</mat-icon>{{'yuv.app.user-management.users.action.create.label' | translate }}\n </button>\n</ng-template>\n\n<ng-template #listActions>\n <yuv-overflow-menu [menuItems]=\"actions\"></yuv-overflow-menu>\n</ng-template>\n\n<ng-template #sourceBadge>\n <ymt-badge severity=\"primary\" [aura]=\"true\" class=\"source-badge\"\n [matTooltip]=\"'yuv.app.user-management.users.identitySource.external.tooltip' | translate\">\n <mat-icon>{{ icons.sourceExternal }}</mat-icon>\n <span>{{ 'yuv.app.user-management.users.object.property.identitySource.external' | translate }}</span>\n </ymt-badge>\n</ng-template>", styles: [":host{--mat-table-row-item-outline-color: var(--ymt-outline-variant);height:100%;overflow:hidden;display:flex;flex-flow:column}:host ymt-master-details-layout{height:100%;padding:1rem}:host .paginator{flex:1;background:transparent}:host .user-table{overflow:auto;height:100%}:host .user-row:hover{background-color:var(--ymt-hover-background)}:host mat-cell mat-icon.external-source{color:var(--ymt-primary);margin-left:.25rem}:host .source-badge{display:inline-flex;align-items:center;gap:.25rem}:host .source-badge mat-icon{font-size:1rem;width:1rem;height:1rem}:host .selected-row{background-color:var(--ymt-selection-background)!important}\n"] }]
|
|
961
1175
|
}], propDecorators: { userDetailsComponent: [{
|
|
962
1176
|
type: ViewChild,
|
|
963
1177
|
args: [UserDetailsComponent]
|
|
@@ -1062,13 +1276,13 @@ class CreateGroupComponent {
|
|
|
1062
1276
|
this.roles.markAsTouched(); // Mark as touched to trigger validation display
|
|
1063
1277
|
}
|
|
1064
1278
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CreateGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1065
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: CreateGroupComponent, isStandalone: true, selector: "ymusrmgmt-create-group", host: { properties: { "class.busy": "!busy()" } }, ngImport: i0, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\"/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n @if (error()) {\n <p class=\"error\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.groups.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createGroup()\">\n {{ 'yuv.app.user-management.groups.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form #enabledPropDiv{display:flex;justify-content:center;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1
|
|
1279
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: CreateGroupComponent, isStandalone: true, selector: "ymusrmgmt-create-group", host: { properties: { "class.busy": "!busy()" } }, ngImport: i0, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\"/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.groups.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createGroup()\">\n {{ 'yuv.app.user-management.groups.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form #enabledPropDiv{display:flex;justify-content:center;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitle", "headertitel"] }, { kind: "component", type: RolesSelectionComponent, selector: "ymusrmgmt-role-selection", inputs: ["allRoles", "initialRoles"], outputs: ["rolesChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1066
1280
|
}
|
|
1067
1281
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: CreateGroupComponent, decorators: [{
|
|
1068
1282
|
type: Component,
|
|
1069
1283
|
args: [{ selector: 'ymusrmgmt-create-group', standalone: true, imports: [...modules$1, ...components$1], host: {
|
|
1070
1284
|
'[class.busy]': '!busy()',
|
|
1071
|
-
}, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\"/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n @if (error()) {\n <p class=\"error\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.groups.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createGroup()\">\n {{ 'yuv.app.user-management.groups.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form #enabledPropDiv{display:flex;justify-content:center;align-items:center}\n"] }]
|
|
1285
|
+
}, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.create.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\"/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.groups.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"createGroup()\">\n {{ 'yuv.app.user-management.groups.action.button.create' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form #enabledPropDiv{display:flex;justify-content:center;align-items:center}\n"] }]
|
|
1072
1286
|
}], ctorParameters: () => [] });
|
|
1073
1287
|
|
|
1074
1288
|
class GroupDetailsComponent {
|
|
@@ -1109,8 +1323,8 @@ class GroupDetailsComponent {
|
|
|
1109
1323
|
name: [{ value: '' }]
|
|
1110
1324
|
});
|
|
1111
1325
|
}
|
|
1112
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: GroupDetailsComponent, deps: [{ token: YuvUserManagementService }, { token: i1
|
|
1113
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: GroupDetailsComponent, isStandalone: true, selector: "ymusrmgmt-group-details", inputs: { groupId: "groupId" }, ngImport: i0, template: " \n@let currentGroupDetails = groupDetails();\n@if (currentGroupDetails) {\n <form [formGroup]=\"groupDetailsForm\" class=\"group-details-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{('yuv.app.user-management.groups.object.property.id' | translate)}}</mat-label>\n <input matInput formControlName=\"id\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.name' | translate)}}</mat-label>\n <input matInput formControlName=\"name\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.roles' | translate)}}</mat-label>\n <mat-chip-grid #roleChipGrid>\n @if (currentGroupDetails.roles) {\n @for (role of currentGroupDetails.roles | sortRolesByLabel; track role) {\n <mat-chip-row [editable]=\"false\" [disabled]=\"currentGroupDetails.roles.indexOf(role) === -1\" [matTooltip]=\"role | roleTooltip\"><div class=\"chip\">{{role | roleLabel}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"roleChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field> \n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.members' | translate)}}</mat-label>\n <mat-chip-grid #memberChipGrid>\n @if (currentGroupDetails.members) {\n @for (member of currentGroupDetails.members.sort(); track member) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{member}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"memberChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field> \n </form>\n} @else {\n <p>{{('yuv.app.user-management.groups.details.empty' | translate)}}</p>\n}\n", styles: [":host{height:100%;overflow:hidden;display:flex;flex-flow:column}:host .group-details-form{flex:1;overflow-y:auto;display:grid;align-items:start;align-content:start;gap:var(--ymt-spacing-m);padding:1rem}:host .group-details-form mat-chip-row{overflow:hidden}:host .group-details-form .roles-field mat-chip-grid{max-height:300px;overflow-y:auto;display:block}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i3$
|
|
1326
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: GroupDetailsComponent, deps: [{ token: YuvUserManagementService }, { token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
1327
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: GroupDetailsComponent, isStandalone: true, selector: "ymusrmgmt-group-details", inputs: { groupId: "groupId" }, ngImport: i0, template: " \n@let currentGroupDetails = groupDetails();\n@if (currentGroupDetails) {\n <form [formGroup]=\"groupDetailsForm\" class=\"group-details-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{('yuv.app.user-management.groups.object.property.id' | translate)}}</mat-label>\n <input matInput formControlName=\"id\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.name' | translate)}}</mat-label>\n <input matInput formControlName=\"name\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.roles' | translate)}}</mat-label>\n <mat-chip-grid #roleChipGrid>\n @if (currentGroupDetails.roles) {\n @for (role of currentGroupDetails.roles | sortRolesByLabel; track role) {\n <mat-chip-row [editable]=\"false\" [disabled]=\"currentGroupDetails.roles.indexOf(role) === -1\" [matTooltip]=\"role | roleTooltip\"><div class=\"chip\">{{role | roleLabel}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"roleChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field> \n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.members' | translate)}}</mat-label>\n <mat-chip-grid #memberChipGrid>\n @if (currentGroupDetails.members) {\n @for (member of currentGroupDetails.members.sort(); track member) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{member}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"memberChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field> \n </form>\n} @else {\n <p>{{('yuv.app.user-management.groups.details.empty' | translate)}}</p>\n}\n", styles: [":host{height:100%;overflow:hidden;display:flex;flex-flow:column}:host .group-details-form{flex:1;overflow-y:auto;display:grid;align-items:start;align-content:start;gap:var(--ymt-spacing-m);padding:1rem}:host .group-details-form mat-chip-row{overflow:hidden}:host .group-details-form .roles-field mat-chip-grid{max-height:300px;overflow-y:auto;display:block}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i3$2.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i3$2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled", "readonly", "matChipInputDisabledInteractive"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "component", type: i3$2.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: RoleLabelPipe, name: "roleLabel" }, { kind: "pipe", type: RoleTooltipPipe, name: "roleTooltip" }, { kind: "pipe", type: SortRolesByLabelPipe, name: "sortRolesByLabel" }] });
|
|
1114
1328
|
}
|
|
1115
1329
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: GroupDetailsComponent, decorators: [{
|
|
1116
1330
|
type: Component,
|
|
@@ -1130,7 +1344,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1130
1344
|
RoleTooltipPipe,
|
|
1131
1345
|
SortRolesByLabelPipe
|
|
1132
1346
|
], template: " \n@let currentGroupDetails = groupDetails();\n@if (currentGroupDetails) {\n <form [formGroup]=\"groupDetailsForm\" class=\"group-details-form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{('yuv.app.user-management.groups.object.property.id' | translate)}}</mat-label>\n <input matInput formControlName=\"id\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.name' | translate)}}</mat-label>\n <input matInput formControlName=\"name\" readonly>\n </mat-form-field>\n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.roles' | translate)}}</mat-label>\n <mat-chip-grid #roleChipGrid>\n @if (currentGroupDetails.roles) {\n @for (role of currentGroupDetails.roles | sortRolesByLabel; track role) {\n <mat-chip-row [editable]=\"false\" [disabled]=\"currentGroupDetails.roles.indexOf(role) === -1\" [matTooltip]=\"role | roleTooltip\"><div class=\"chip\">{{role | roleLabel}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"roleChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field> \n <mat-form-field>\n <mat-label>{{('yuv.app.user-management.groups.object.property.members' | translate)}}</mat-label>\n <mat-chip-grid #memberChipGrid>\n @if (currentGroupDetails.members) {\n @for (member of currentGroupDetails.members.sort(); track member) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{member}}</div></mat-chip-row>\n }\n }\n <input [matChipInputFor]=\"memberChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field> \n </form>\n} @else {\n <p>{{('yuv.app.user-management.groups.details.empty' | translate)}}</p>\n}\n", styles: [":host{height:100%;overflow:hidden;display:flex;flex-flow:column}:host .group-details-form{flex:1;overflow-y:auto;display:grid;align-items:start;align-content:start;gap:var(--ymt-spacing-m);padding:1rem}:host .group-details-form mat-chip-row{overflow:hidden}:host .group-details-form .roles-field mat-chip-grid{max-height:300px;overflow-y:auto;display:block}\n"] }]
|
|
1133
|
-
}], ctorParameters: () => [{ type: YuvUserManagementService }, { type: i1
|
|
1347
|
+
}], ctorParameters: () => [{ type: YuvUserManagementService }, { type: i1.FormBuilder }], propDecorators: { groupId: [{
|
|
1134
1348
|
type: Input
|
|
1135
1349
|
}] } });
|
|
1136
1350
|
|
|
@@ -1245,13 +1459,13 @@ class EditGroupComponent {
|
|
|
1245
1459
|
this.#dialogRef.close();
|
|
1246
1460
|
}
|
|
1247
1461
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EditGroupComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
1248
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: EditGroupComponent, isStandalone: true, selector: "ymusrmgmt-edit-group", host: { properties: { "class.busy": "!busy()" } }, ngImport: i0, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{'yuv.app.user-management.groups.object.property.members' | translate}}</mat-label>\n <mat-chip-grid #memberChipGrid>\n @for (member of groupMembers(); track member) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{member}}</div></mat-chip-row>\n }\n <input [matChipInputFor]=\"memberChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n @if (error()) {\n <p class=\"error\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateGroup()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .readonly-field{opacity:.5;pointer-events:none}:host main form .readonly-label{pointer-events:none}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form .roles-section{margin:var(--ymt-spacing-m) 0}:host main form .roles-section .roles-label{display:block;font-size:12px;font-weight:400;color:#0009;margin-bottom:var(--ymt-spacing-xs)}:host main form .roles-section.has-error .roles-label{color:var(--ymt-danger)}:host main form .roles-section.has-error ymusrmgmt-role-selection{border:2px solid var(--ymt-danger);border-radius:var(--ymt-corner-xs);display:block}:host main form .roles-section .roles-error{color:var(--ymt-danger);font-size:12px;margin-top:var(--ymt-spacing-xs);padding-left:var(--ymt-spacing-m)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1
|
|
1462
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: EditGroupComponent, isStandalone: true, selector: "ymusrmgmt-edit-group", host: { properties: { "class.busy": "!busy()" } }, ngImport: i0, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{'yuv.app.user-management.groups.object.property.members' | translate}}</mat-label>\n <mat-chip-grid #memberChipGrid>\n @for (member of groupMembers(); track member) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{member}}</div></mat-chip-row>\n }\n <input [matChipInputFor]=\"memberChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateGroup()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .readonly-field{opacity:.5;pointer-events:none}:host main form .readonly-label{pointer-events:none}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form .roles-section{margin:var(--ymt-spacing-m) 0}:host main form .roles-section .roles-label{display:block;font-size:12px;font-weight:400;color:#0009;margin-bottom:var(--ymt-spacing-xs)}:host main form .roles-section.has-error .roles-label{color:var(--ymt-danger)}:host main form .roles-section.has-error ymusrmgmt-role-selection{border:2px solid var(--ymt-danger);border-radius:var(--ymt-corner-xs);display:block}:host main form .roles-section .roles-error{color:var(--ymt-danger);font-size:12px;margin-top:var(--ymt-spacing-xs);padding-left:var(--ymt-spacing-m)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i3$2.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i3$2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled", "readonly", "matChipInputDisabledInteractive"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "component", type: i3$2.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitle", "headertitel"] }, { kind: "component", type: RolesSelectionComponent, selector: "ymusrmgmt-role-selection", inputs: ["allRoles", "initialRoles"], outputs: ["rolesChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1249
1463
|
}
|
|
1250
1464
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EditGroupComponent, decorators: [{
|
|
1251
1465
|
type: Component,
|
|
1252
1466
|
args: [{ selector: 'ymusrmgmt-edit-group', standalone: true, imports: [...modules, ...components], host: {
|
|
1253
1467
|
'[class.busy]': '!busy()',
|
|
1254
|
-
}, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{'yuv.app.user-management.groups.object.property.members' | translate}}</mat-label>\n <mat-chip-grid #memberChipGrid>\n @for (member of groupMembers(); track member) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{member}}</div></mat-chip-row>\n }\n <input [matChipInputFor]=\"memberChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n @if (error()) {\n <p class=\"error\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateGroup()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .readonly-field{opacity:.5;pointer-events:none}:host main form .readonly-label{pointer-events:none}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form .roles-section{margin:var(--ymt-spacing-m) 0}:host main form .roles-section .roles-label{display:block;font-size:12px;font-weight:400;color:#0009;margin-bottom:var(--ymt-spacing-xs)}:host main form .roles-section.has-error .roles-label{color:var(--ymt-danger)}:host main form .roles-section.has-error ymusrmgmt-role-selection{border:2px solid var(--ymt-danger);border-radius:var(--ymt-corner-xs);display:block}:host main form .roles-section .roles-error{color:var(--ymt-danger);font-size:12px;margin-top:var(--ymt-spacing-xs);padding-left:var(--ymt-spacing-m)}\n"] }]
|
|
1468
|
+
}, template: "<yuv-dialog [yuvBusyOverlay]=\"busy()\" [headertitel]=\"'yuv.app.user-management.groups.action.edit.label' | translate\">\n <main class=\"yuv-dialog-content\">\n <form [formGroup]=\"form\">\n <mat-form-field class=\"yuv-form-field readonly-field\">\n <mat-label class=\"readonly-label\">{{\"yuv.app.user-management.groups.object.property.name\" | translate }}</mat-label>\n <input matInput [formControl]=\"name\" type=\"text\" [attr.tabindex]=\"-1\" readonly/>\n </mat-form-field>\n <div class=\"roles-section\" [class.has-error]=\"roles.invalid && roles.touched\">\n <ymusrmgmt-role-selection\n [allRoles]=\"allAvailableRoles()\"\n [initialRoles]=\"groupRoles()\"\n (rolesChange)=\"onRolesChange($event)\">\n </ymusrmgmt-role-selection>\n </div>\n <mat-form-field class=\"yuv-form-field\">\n <mat-label>{{'yuv.app.user-management.groups.object.property.members' | translate}}</mat-label>\n <mat-chip-grid #memberChipGrid>\n @for (member of groupMembers(); track member) {\n <mat-chip-row [editable]=\"false\"><div class=\"chip\">{{member}}</div></mat-chip-row>\n }\n <input [matChipInputFor]=\"memberChipGrid\" readonly/>\n </mat-chip-grid>\n </mat-form-field>\n @if (error()) {\n <p class=\"error\" role=\"alert\">{{ error() }}</p>\n }\n </form>\n </main>\n <footer>\n <button ymtButton=\"secondary\" [disabled]=\"busy()\" (click)=\"close()\">\n {{ \"yuv.app.user-management.users.action.button.cancel\" | translate }}\n </button>\n <button ymtButton=\"primary\" [disabled]=\"disabledSubmit()\" (click)=\"updateGroup()\">\n {{ 'yuv.app.user-management.users.action.button.save' | translate }}\n </button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:block;position:relative}:host main form{padding:var(--ymt-spacing-m)}:host main form .yuv-form-field{width:100%;margin:var(--ymt-spacing-xs) 0}:host main form .readonly-field{opacity:.5;pointer-events:none}:host main form .readonly-label{pointer-events:none}:host main form .error{color:var(--ymt-on-danger-container);background-color:var(--ymt-danger-container);padding:var(--ymt-spacing-m);border-radius:var(--ymt-corner-xs)}:host main form .roles-section{margin:var(--ymt-spacing-m) 0}:host main form .roles-section .roles-label{display:block;font-size:12px;font-weight:400;color:#0009;margin-bottom:var(--ymt-spacing-xs)}:host main form .roles-section.has-error .roles-label{color:var(--ymt-danger)}:host main form .roles-section.has-error ymusrmgmt-role-selection{border:2px solid var(--ymt-danger);border-radius:var(--ymt-corner-xs);display:block}:host main form .roles-section .roles-error{color:var(--ymt-danger);font-size:12px;margin-top:var(--ymt-spacing-xs);padding-left:var(--ymt-spacing-m)}\n"] }]
|
|
1255
1469
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
1256
1470
|
type: Inject,
|
|
1257
1471
|
args: [MAT_DIALOG_DATA]
|
|
@@ -1418,7 +1632,7 @@ class YuvGroupsPageComponent {
|
|
|
1418
1632
|
});
|
|
1419
1633
|
}
|
|
1420
1634
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: YuvGroupsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1421
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.14", type: YuvGroupsPageComponent, isStandalone: true, selector: "ymusrmgmt-groups", host: { properties: { "class.busy": "!busy()", "class.pagination": "this.pagination" } }, viewQueries: [{ propertyName: "groupDetailsComponent", first: true, predicate: GroupDetailsComponent, descendants: true }], ngImport: i0, template: "<ng-template yuvAppHeaderSlot=\"search\">\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\"\n [gutterSize]=\"16\"\n [options]=\"layoutOptions\"\n [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\">\n <ng-container *ngTemplateOutlet=\"masterPaneContent\"></ng-container>\n </ng-template>\n <ng-template ymtLayoutPane role=\"details\">\n <ng-container *ngTemplateOutlet=\"detailsPaneContent\"></ng-container>\n </ng-template>\n</ymt-master-details-layout>\n\n<ng-template #masterPaneActions>\n <!--h2>{{('yuv.app.user-management.groups.title' | translate)}}</h2-->\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageIndex]=\"pagination.page\" [pageSize]=\"getPageSize()\" aria-label=\"
|
|
1635
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.14", type: YuvGroupsPageComponent, isStandalone: true, selector: "ymusrmgmt-groups", host: { properties: { "class.busy": "!busy()", "class.pagination": "this.pagination" } }, viewQueries: [{ propertyName: "groupDetailsComponent", first: true, predicate: GroupDetailsComponent, descendants: true }], ngImport: i0, template: "<ng-template yuvAppHeaderSlot=\"search\">\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\"\n [gutterSize]=\"16\"\n [options]=\"layoutOptions\"\n [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\">\n <ng-container *ngTemplateOutlet=\"masterPaneContent\"></ng-container>\n </ng-template>\n <ng-template ymtLayoutPane role=\"details\">\n <ng-container *ngTemplateOutlet=\"detailsPaneContent\"></ng-container>\n </ng-template>\n</ymt-master-details-layout>\n\n<ng-template #masterPaneActions>\n <!--h2>{{('yuv.app.user-management.groups.title' | translate)}}</h2-->\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageIndex]=\"pagination.page\" [pageSize]=\"getPageSize()\" [attr.aria-label]=\"'yuv.app.user-management.groups.navigation.pagination.aria' | translate\" (page)=\"onChangePage($event)\" hidePageSize></mat-paginator>\n <button ymt-icon-button (click)=\"refresh()\" [matTooltip]=\"'yuv.app.user-management.groups.navigation.refresh.tooltip' | translate\" [attr.aria-label]=\"'yuv.app.user-management.groups.navigation.refresh.tooltip' | translate\"><mat-icon>{{icons.refresh}}</mat-icon></button>\n</ng-template>\n\n<ng-template #listActions>\n <yuv-overflow-menu [menuItems]=\"actions\"></yuv-overflow-menu>\n</ng-template>\n\n<ng-template #masterPaneContent>\n <ymt-pane-body>\n <mat-table [dataSource]=\"dataSource()\" class=\"group-table mat-elevation-z8\" row>\n <ng-container matColumnDef=\"state\">\n <mat-header-cell *matHeaderCellDef />\n <mat-cell *matCellDef=\"let element\"><mat-icon>{{ element.enabled ? icons.stateActive : icons.stateInactive\n }}</mat-icon></mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.groups.object.property.name' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.name}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"description\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.groups.object.property.description' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.description}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.groups.object.property.id' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.id}} </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row\n *matRowDef=\"let row; columns: displayedColumns;\"\n (click.single)=\"select(row)\"\n [attr.tabindex]=\"0\"\n (keydown.enter)=\"select(row)\"\n (keydown.space)=\"$event.preventDefault(); select(row)\"\n [class.selected-row]=\"this.isSelected(row)\" class=\"group-row\">\n </mat-row>\n </mat-table>\n </ymt-pane-body>\n</ng-template>\n\n<ng-template #detailsPaneContent>\n <ymt-pane-header [icon]=\"'group'\" [title]=\"'yuv.app.user-management.groups.details.title' | translate\" [subtitle]=\"selection().selected.at(0)?.id || ('yuv.app.user-management.groups.details.empty' | translate)\" [actions]=\"listActions\"></ymt-pane-header>\n <ymt-pane-body>\n <ymusrmgmt-group-details #groupDetails [groupId]=\"selection().selected.at(0)?.id\" />\n </ymt-pane-body>\n</ng-template>", styles: [":host{--mat-table-row-item-outline-color: var(--ymt-outline-variant);height:100%;overflow:hidden;display:flex;flex-flow:column}:host ymt-master-details-layout{height:100%;padding:1rem}:host .paginator{flex:1;background:transparent}:host .group-table{overflow:auto;height:100%}:host .group-row:hover{background-color:var(--ymt-hover-background)}:host .selected-row{background-color:var(--ymt-selection-background)!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3$4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3$4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3$4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3$4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i3$4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3$4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3$4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3$4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3$4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3$4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i2$2.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: BusyOverlayDirective, selector: "[yuvBusyOverlay]", inputs: ["yuvBusyOverlay", "yuvBusyOverlayConfig", "yuvBusyError"], outputs: ["yuvBusyErrorDismiss"] }, { kind: "directive", type: ClickDoubleDirective, selector: "[click.single],[click.double]", inputs: ["debounceTime"], outputs: ["click.double", "click.single"] }, { kind: "component", type: GroupDetailsComponent, selector: "ymusrmgmt-group-details", inputs: ["groupId"] }, { kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }, { kind: "ngmodule", type: YmtLayoutModule }, { kind: "component", type: i5$1.MasterDetailsLayoutComponent, selector: "ymt-master-details-layout", inputs: ["layoutSettingsID", "options", "direction", "gutterSize", "detailsActive"], outputs: ["detailsActiveChange"] }, { kind: "directive", type: i5$1.YmtLayoutPaneDirective, selector: "[ymtLayoutPane]", inputs: ["role", "topBarActions"] }, { kind: "ngmodule", type: YmtPanesModule }, { kind: "component", type: i6$1.YmtPaneHeaderComponent, selector: "ymt-pane-header", inputs: ["title", "icon", "subtitle", "actions", "badges"] }, { kind: "component", type: i6$1.YmtPaneBodyComponent, selector: "ymt-pane-body" }, { kind: "ngmodule", type: YuvClientShellModule }, { kind: "directive", type: i6.YuvAppHeaderSlotDirective, selector: "ng-template[yuvAppHeaderSlot]", inputs: ["yuvAppHeaderSlot"] }, { kind: "ngmodule", type: YuvOverflowMenuModule }, { kind: "component", type: i8.OverflowMenuComponent, selector: "yuv-overflow-menu", inputs: ["overflowIcon", "groupLabels", "menuItems", "vertical"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1422
1636
|
}
|
|
1423
1637
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: YuvGroupsPageComponent, decorators: [{
|
|
1424
1638
|
type: Component,
|
|
@@ -1442,7 +1656,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
1442
1656
|
YuvOverflowMenuModule,
|
|
1443
1657
|
], host: {
|
|
1444
1658
|
'[class.busy]': '!busy()',
|
|
1445
|
-
}, template: "<ng-template yuvAppHeaderSlot=\"search\">\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\"\n [gutterSize]=\"16\"\n [options]=\"layoutOptions\"\n [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\">\n <ng-container *ngTemplateOutlet=\"masterPaneContent\"></ng-container>\n </ng-template>\n <ng-template ymtLayoutPane role=\"details\">\n <ng-container *ngTemplateOutlet=\"detailsPaneContent\"></ng-container>\n </ng-template>\n</ymt-master-details-layout>\n\n<ng-template #masterPaneActions>\n <!--h2>{{('yuv.app.user-management.groups.title' | translate)}}</h2-->\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageIndex]=\"pagination.page\" [pageSize]=\"getPageSize()\" aria-label=\"
|
|
1659
|
+
}, template: "<ng-template yuvAppHeaderSlot=\"search\">\n</ng-template>\n\n<ymt-master-details-layout [yuvBusyOverlay]=\"busy()\"\n [gutterSize]=\"16\"\n [options]=\"layoutOptions\"\n [layoutSettingsID]=\"layoutSettingsID\">\n <ng-template ymtLayoutPane role=\"master\" [topBarActions]=\"masterPaneActions\">\n <ng-container *ngTemplateOutlet=\"masterPaneContent\"></ng-container>\n </ng-template>\n <ng-template ymtLayoutPane role=\"details\">\n <ng-container *ngTemplateOutlet=\"detailsPaneContent\"></ng-container>\n </ng-template>\n</ymt-master-details-layout>\n\n<ng-template #masterPaneActions>\n <!--h2>{{('yuv.app.user-management.groups.title' | translate)}}</h2-->\n <mat-paginator class=\"paginator\" [length]=\"pagination.total\" [pageIndex]=\"pagination.page\" [pageSize]=\"getPageSize()\" [attr.aria-label]=\"'yuv.app.user-management.groups.navigation.pagination.aria' | translate\" (page)=\"onChangePage($event)\" hidePageSize></mat-paginator>\n <button ymt-icon-button (click)=\"refresh()\" [matTooltip]=\"'yuv.app.user-management.groups.navigation.refresh.tooltip' | translate\" [attr.aria-label]=\"'yuv.app.user-management.groups.navigation.refresh.tooltip' | translate\"><mat-icon>{{icons.refresh}}</mat-icon></button>\n</ng-template>\n\n<ng-template #listActions>\n <yuv-overflow-menu [menuItems]=\"actions\"></yuv-overflow-menu>\n</ng-template>\n\n<ng-template #masterPaneContent>\n <ymt-pane-body>\n <mat-table [dataSource]=\"dataSource()\" class=\"group-table mat-elevation-z8\" row>\n <ng-container matColumnDef=\"state\">\n <mat-header-cell *matHeaderCellDef />\n <mat-cell *matCellDef=\"let element\"><mat-icon>{{ element.enabled ? icons.stateActive : icons.stateInactive\n }}</mat-icon></mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"name\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.groups.object.property.name' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.name}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"description\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.groups.object.property.description' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.description}} </mat-cell>\n </ng-container>\n <ng-container matColumnDef=\"id\">\n <mat-header-cell *matHeaderCellDef>{{'yuv.app.user-management.groups.object.property.id' | translate\n }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\"> {{element.id}} </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"displayedColumns\"></mat-header-row>\n <mat-row\n *matRowDef=\"let row; columns: displayedColumns;\"\n (click.single)=\"select(row)\"\n [attr.tabindex]=\"0\"\n (keydown.enter)=\"select(row)\"\n (keydown.space)=\"$event.preventDefault(); select(row)\"\n [class.selected-row]=\"this.isSelected(row)\" class=\"group-row\">\n </mat-row>\n </mat-table>\n </ymt-pane-body>\n</ng-template>\n\n<ng-template #detailsPaneContent>\n <ymt-pane-header [icon]=\"'group'\" [title]=\"'yuv.app.user-management.groups.details.title' | translate\" [subtitle]=\"selection().selected.at(0)?.id || ('yuv.app.user-management.groups.details.empty' | translate)\" [actions]=\"listActions\"></ymt-pane-header>\n <ymt-pane-body>\n <ymusrmgmt-group-details #groupDetails [groupId]=\"selection().selected.at(0)?.id\" />\n </ymt-pane-body>\n</ng-template>", styles: [":host{--mat-table-row-item-outline-color: var(--ymt-outline-variant);height:100%;overflow:hidden;display:flex;flex-flow:column}:host ymt-master-details-layout{height:100%;padding:1rem}:host .paginator{flex:1;background:transparent}:host .group-table{overflow:auto;height:100%}:host .group-row:hover{background-color:var(--ymt-hover-background)}:host .selected-row{background-color:var(--ymt-selection-background)!important}\n"] }]
|
|
1446
1660
|
}], propDecorators: { groupDetailsComponent: [{
|
|
1447
1661
|
type: ViewChild,
|
|
1448
1662
|
args: [GroupDetailsComponent]
|