@memberjunction/ng-explorer-settings 6.2.0-edge.0 → 6.2.0-edge.1
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.
- package/dist/lib/account-info/account-info.component.d.ts +1 -1
- package/dist/lib/account-info/account-info.component.js +2 -2
- package/dist/lib/account-info/account-info.component.js.map +1 -1
- package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts +92 -10
- package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -1
- package/dist/lib/application-management/application-dialog/application-dialog.component.js +222 -76
- package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
- package/dist/lib/application-management/application-management.component.d.ts +92 -10
- package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
- package/dist/lib/application-management/application-management.component.js +229 -65
- package/dist/lib/application-management/application-management.component.js.map +1 -1
- package/dist/lib/application-settings/application-settings.component.d.ts +4 -4
- package/dist/lib/application-settings/application-settings.component.js +10 -10
- package/dist/lib/application-settings/application-settings.component.js.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.d.ts +88 -10
- package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
- package/dist/lib/entity-permissions/entity-permissions.component.js +219 -63
- package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts +44 -6
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -1
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +117 -43
- package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
- package/dist/lib/notification-preferences/notification-preferences.component.d.ts +25 -3
- package/dist/lib/notification-preferences/notification-preferences.component.d.ts.map +1 -1
- package/dist/lib/notification-preferences/notification-preferences.component.js +62 -18
- package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
- package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts +32 -4
- package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts.map +1 -1
- package/dist/lib/role-management/role-dialog/role-dialog.component.js +84 -30
- package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -1
- package/dist/lib/role-management/role-management-agent-context.d.ts +12 -4
- package/dist/lib/role-management/role-management-agent-context.d.ts.map +1 -1
- package/dist/lib/role-management/role-management-agent-context.js +26 -10
- package/dist/lib/role-management/role-management-agent-context.js.map +1 -1
- package/dist/lib/role-management/role-management.component.d.ts +95 -11
- package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
- package/dist/lib/role-management/role-management.component.js +259 -91
- package/dist/lib/role-management/role-management.component.js.map +1 -1
- package/dist/lib/settings/settings.component.d.ts +87 -11
- package/dist/lib/settings/settings.component.d.ts.map +1 -1
- package/dist/lib/settings/settings.component.js +211 -65
- package/dist/lib/settings/settings.component.js.map +1 -1
- package/dist/lib/shared/settings-card.component.d.ts +24 -4
- package/dist/lib/shared/settings-card.component.d.ts.map +1 -1
- package/dist/lib/shared/settings-card.component.js +46 -6
- package/dist/lib/shared/settings-card.component.js.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.d.ts +172 -18
- package/dist/lib/sql-logging/sql-logging.component.d.ts.map +1 -1
- package/dist/lib/sql-logging/sql-logging.component.js +320 -108
- package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
- package/dist/lib/user-app-config/user-app-config-content.component.js +3 -3
- package/dist/lib/user-app-config/user-app-config-content.component.js.map +1 -1
- package/dist/lib/user-app-config/user-app-config-reorder.d.ts +4 -0
- package/dist/lib/user-app-config/user-app-config-reorder.d.ts.map +1 -1
- package/dist/lib/user-app-config/user-app-config-reorder.js +11 -3
- package/dist/lib/user-app-config/user-app-config-reorder.js.map +1 -1
- package/dist/lib/user-management/transaction-group-refusals.d.ts +4 -2
- package/dist/lib/user-management/transaction-group-refusals.d.ts.map +1 -1
- package/dist/lib/user-management/transaction-group-refusals.js +7 -3
- package/dist/lib/user-management/transaction-group-refusals.js.map +1 -1
- package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts +44 -6
- package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts.map +1 -1
- package/dist/lib/user-management/user-dialog/user-dialog.component.js +121 -47
- package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -1
- package/dist/lib/user-management/user-management-agent-context.d.ts +10 -0
- package/dist/lib/user-management/user-management-agent-context.d.ts.map +1 -1
- package/dist/lib/user-management/user-management-agent-context.js +26 -6
- package/dist/lib/user-management/user-management-agent-context.js.map +1 -1
- package/dist/lib/user-management/user-management.component.d.ts +174 -16
- package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
- package/dist/lib/user-management/user-management.component.js +480 -171
- package/dist/lib/user-management/user-management.component.js.map +1 -1
- package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts +97 -15
- package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts.map +1 -1
- package/dist/lib/user-profile-settings/user-profile-settings.component.js +280 -116
- package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
- package/package.json +20 -20
|
@@ -295,36 +295,84 @@ function PermissionDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1)
|
|
|
295
295
|
i0.ɵɵconditional(ctx_r1.isLoading ? 96 : 97);
|
|
296
296
|
} }
|
|
297
297
|
export class PermissionDialogComponent extends BaseAngularComponent {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
298
|
+
Data = null;
|
|
299
|
+
/** @deprecated Use {@link Data}. */
|
|
300
|
+
set data(value) {
|
|
301
|
+
this.Data = value;
|
|
302
|
+
}
|
|
303
|
+
/** @deprecated Use {@link Data}. */
|
|
304
|
+
get data() {
|
|
305
|
+
return this.Data;
|
|
306
|
+
}
|
|
307
|
+
Visible = false;
|
|
308
|
+
/** @deprecated Use {@link Visible}. */
|
|
309
|
+
set visible(value) {
|
|
310
|
+
this.Visible = value;
|
|
311
|
+
}
|
|
312
|
+
/** @deprecated Use {@link Visible}. */
|
|
313
|
+
get visible() {
|
|
314
|
+
return this.Visible;
|
|
315
|
+
}
|
|
316
|
+
Result = new EventEmitter();
|
|
317
|
+
/**
|
|
318
|
+
* @deprecated Use {@link Result}.
|
|
319
|
+
*
|
|
320
|
+
* The same emitter under the old binding name, so a template still binding
|
|
321
|
+
* (result) keeps working. Must stay AFTER Result: class fields
|
|
322
|
+
* initialise in order, and the other way round this captures undefined.
|
|
323
|
+
*/
|
|
324
|
+
result = this.Result;
|
|
301
325
|
fb = inject(FormBuilder);
|
|
302
326
|
cdr = inject(ChangeDetectorRef);
|
|
303
327
|
ngZone = inject(NgZone);
|
|
304
328
|
get metadata() { return this.ProviderToUse; }
|
|
305
|
-
|
|
329
|
+
PermissionForm;
|
|
330
|
+
/** @deprecated Use {@link PermissionForm}. */
|
|
331
|
+
get permissionForm() {
|
|
332
|
+
return this.PermissionForm;
|
|
333
|
+
}
|
|
334
|
+
/** @deprecated Use {@link PermissionForm}. */
|
|
335
|
+
set permissionForm(value) {
|
|
336
|
+
this.PermissionForm = value;
|
|
337
|
+
}
|
|
306
338
|
isLoading = false;
|
|
307
339
|
error = null;
|
|
308
|
-
|
|
309
|
-
|
|
340
|
+
RolePermissions = [];
|
|
341
|
+
/** @deprecated Use {@link RolePermissions}. */
|
|
342
|
+
get rolePermissions() {
|
|
343
|
+
return this.RolePermissions;
|
|
344
|
+
}
|
|
345
|
+
/** @deprecated Use {@link RolePermissions}. */
|
|
346
|
+
set rolePermissions(value) {
|
|
347
|
+
this.RolePermissions = value;
|
|
348
|
+
}
|
|
349
|
+
AvailableRoles = [];
|
|
350
|
+
/** @deprecated Use {@link AvailableRoles}. */
|
|
351
|
+
get availableRoles() {
|
|
352
|
+
return this.AvailableRoles;
|
|
353
|
+
}
|
|
354
|
+
/** @deprecated Use {@link AvailableRoles}. */
|
|
355
|
+
set availableRoles(value) {
|
|
356
|
+
this.AvailableRoles = value;
|
|
357
|
+
}
|
|
310
358
|
constructor() {
|
|
311
359
|
super();
|
|
312
|
-
this.
|
|
360
|
+
this.PermissionForm = this.fb.group({});
|
|
313
361
|
}
|
|
314
362
|
ngOnInit() {
|
|
315
363
|
// Initial setup
|
|
316
364
|
}
|
|
317
365
|
ngOnChanges(changes) {
|
|
318
366
|
console.log('Permission dialog ngOnChanges called:', changes);
|
|
319
|
-
if (changes['visible'] && this.
|
|
367
|
+
if (changes['visible'] && this.Visible) {
|
|
320
368
|
this.resetDialog();
|
|
321
369
|
// Load data when dialog becomes visible and we have data
|
|
322
|
-
if (this.
|
|
370
|
+
if (this.Data) {
|
|
323
371
|
console.log('Dialog became visible, loading permission data');
|
|
324
372
|
this.loadPermissionData();
|
|
325
373
|
}
|
|
326
374
|
}
|
|
327
|
-
if (changes['data'] && this.
|
|
375
|
+
if (changes['data'] && this.Data && this.Visible) {
|
|
328
376
|
console.log('Data changed while dialog is visible, reloading permission data');
|
|
329
377
|
this.loadPermissionData();
|
|
330
378
|
}
|
|
@@ -337,28 +385,36 @@ export class PermissionDialogComponent extends BaseAngularComponent {
|
|
|
337
385
|
this.isLoading = false;
|
|
338
386
|
}
|
|
339
387
|
onEscapeKey(event) {
|
|
340
|
-
if (this.
|
|
388
|
+
if (this.Visible) {
|
|
341
389
|
this.onCancel();
|
|
342
390
|
}
|
|
343
391
|
}
|
|
392
|
+
get HasChanges() {
|
|
393
|
+
return this.RolePermissions.some(rp => rp.isNew || rp.entityPermission.Dirty);
|
|
394
|
+
}
|
|
395
|
+
/** @deprecated Use {@link HasChanges}. */
|
|
344
396
|
get hasChanges() {
|
|
345
|
-
return this.
|
|
397
|
+
return this.HasChanges;
|
|
346
398
|
}
|
|
347
|
-
|
|
399
|
+
HasEntityChanges(rolePermission) {
|
|
348
400
|
return rolePermission.isNew || rolePermission.entityPermission.Dirty;
|
|
349
401
|
}
|
|
402
|
+
/** @deprecated Use {@link HasEntityChanges}. */
|
|
403
|
+
hasEntityChanges(rolePermission) {
|
|
404
|
+
return this.HasEntityChanges(rolePermission);
|
|
405
|
+
}
|
|
350
406
|
loadPermissionData() {
|
|
351
|
-
if (!this.
|
|
407
|
+
if (!this.Data)
|
|
352
408
|
return;
|
|
353
|
-
console.log('Loading permission data for entity:', this.
|
|
354
|
-
console.log('Existing permissions:', this.
|
|
355
|
-
console.log('Available roles:', this.
|
|
409
|
+
console.log('Loading permission data for entity:', this.Data.entity.Name);
|
|
410
|
+
console.log('Existing permissions:', this.Data.existingPermissions);
|
|
411
|
+
console.log('Available roles:', this.Data.roles);
|
|
356
412
|
// Initialize role permissions from existing data
|
|
357
|
-
this.
|
|
413
|
+
this.RolePermissions = [];
|
|
358
414
|
const existingRoleIds = new Set();
|
|
359
415
|
// Process existing permissions
|
|
360
|
-
for (const permission of this.
|
|
361
|
-
const role = this.
|
|
416
|
+
for (const permission of this.Data.existingPermissions) {
|
|
417
|
+
const role = this.Data.roles.find(r => UUIDsEqual(r.ID, permission.RoleID));
|
|
362
418
|
if (role) {
|
|
363
419
|
console.log(`Processing permission for role ${role.Name}:`, {
|
|
364
420
|
canCreate: permission.CanCreate,
|
|
@@ -366,7 +422,7 @@ export class PermissionDialogComponent extends BaseAngularComponent {
|
|
|
366
422
|
canUpdate: permission.CanUpdate,
|
|
367
423
|
canDelete: permission.CanDelete
|
|
368
424
|
});
|
|
369
|
-
this.
|
|
425
|
+
this.RolePermissions.push({
|
|
370
426
|
roleId: role.ID,
|
|
371
427
|
roleName: role.Name || '',
|
|
372
428
|
entityPermission: permission,
|
|
@@ -375,68 +431,76 @@ export class PermissionDialogComponent extends BaseAngularComponent {
|
|
|
375
431
|
existingRoleIds.add(role.ID);
|
|
376
432
|
}
|
|
377
433
|
}
|
|
378
|
-
console.log('Loaded role permissions:', this.
|
|
434
|
+
console.log('Loaded role permissions:', this.RolePermissions);
|
|
379
435
|
// Set available roles (those not already configured)
|
|
380
|
-
this.
|
|
381
|
-
console.log('Available roles for adding:', this.
|
|
436
|
+
this.AvailableRoles = this.Data.roles.filter(role => !existingRoleIds.has(role.ID));
|
|
437
|
+
console.log('Available roles for adding:', this.AvailableRoles.map(r => r.Name));
|
|
382
438
|
// Trigger change detection to update the UI
|
|
383
439
|
this.cdr.detectChanges();
|
|
384
440
|
}
|
|
385
|
-
async
|
|
441
|
+
async AddRolePermission(role) {
|
|
386
442
|
// Create new EntityPermission entity
|
|
387
443
|
const entityPermission = await this.metadata.GetEntityObject('MJ: Entity Permissions');
|
|
388
444
|
entityPermission.NewRecord();
|
|
389
|
-
entityPermission.EntityID = this.
|
|
445
|
+
entityPermission.EntityID = this.Data.entity.ID;
|
|
390
446
|
entityPermission.RoleID = role.ID;
|
|
391
447
|
entityPermission.CanCreate = false;
|
|
392
448
|
entityPermission.CanRead = true; // Default to read access
|
|
393
449
|
entityPermission.CanUpdate = false;
|
|
394
450
|
entityPermission.CanDelete = false;
|
|
395
451
|
// Add new role permission
|
|
396
|
-
this.
|
|
452
|
+
this.RolePermissions.push({
|
|
397
453
|
roleId: role.ID,
|
|
398
454
|
roleName: role.Name || '',
|
|
399
455
|
entityPermission: entityPermission,
|
|
400
456
|
isNew: true
|
|
401
457
|
});
|
|
402
458
|
// Remove from available roles
|
|
403
|
-
this.
|
|
459
|
+
this.AvailableRoles = this.AvailableRoles.filter(r => !UUIDsEqual(r.ID, role.ID));
|
|
404
460
|
this.cdr.detectChanges();
|
|
405
461
|
}
|
|
406
|
-
|
|
462
|
+
/** @deprecated Use {@link AddRolePermission}. */
|
|
463
|
+
async addRolePermission(role) {
|
|
464
|
+
return this.AddRolePermission(role);
|
|
465
|
+
}
|
|
466
|
+
RemoveRolePermission(rolePermission) {
|
|
407
467
|
// Add back to available roles if not new
|
|
408
468
|
if (!rolePermission.isNew) {
|
|
409
|
-
const role = this.
|
|
469
|
+
const role = this.Data?.roles.find(r => UUIDsEqual(r.ID, rolePermission.roleId));
|
|
410
470
|
if (role) {
|
|
411
|
-
this.
|
|
412
|
-
this.
|
|
471
|
+
this.AvailableRoles.push(role);
|
|
472
|
+
this.AvailableRoles.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));
|
|
413
473
|
}
|
|
414
474
|
}
|
|
415
475
|
else {
|
|
416
476
|
// Add back to available roles
|
|
417
|
-
const role = this.
|
|
477
|
+
const role = this.Data?.roles.find(r => UUIDsEqual(r.ID, rolePermission.roleId));
|
|
418
478
|
if (role) {
|
|
419
|
-
this.
|
|
420
|
-
this.
|
|
479
|
+
this.AvailableRoles.push(role);
|
|
480
|
+
this.AvailableRoles.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));
|
|
421
481
|
}
|
|
422
482
|
}
|
|
423
483
|
// Remove from role permissions
|
|
424
|
-
this.
|
|
484
|
+
this.RolePermissions = this.RolePermissions.filter(rp => rp.roleId !== rolePermission.roleId);
|
|
425
485
|
this.cdr.detectChanges();
|
|
426
486
|
}
|
|
427
|
-
|
|
428
|
-
|
|
487
|
+
/** @deprecated Use {@link RemoveRolePermission}. */
|
|
488
|
+
removeRolePermission(rolePermission) {
|
|
489
|
+
return this.RemoveRolePermission(rolePermission);
|
|
490
|
+
}
|
|
491
|
+
async OnSubmit() {
|
|
492
|
+
if (!this.Data || !this.HasChanges)
|
|
429
493
|
return;
|
|
430
494
|
this.isLoading = true;
|
|
431
495
|
this.error = null;
|
|
432
496
|
try {
|
|
433
497
|
// Process each role permission
|
|
434
|
-
for (const rolePermission of this.
|
|
498
|
+
for (const rolePermission of this.RolePermissions) {
|
|
435
499
|
if (rolePermission.isNew || rolePermission.entityPermission.Dirty) {
|
|
436
500
|
await this.saveRolePermission(rolePermission);
|
|
437
501
|
}
|
|
438
502
|
}
|
|
439
|
-
this.
|
|
503
|
+
this.Result.emit({ action: 'save', entity: this.Data.entity });
|
|
440
504
|
}
|
|
441
505
|
catch (error) {
|
|
442
506
|
console.error('Error saving permissions:', error);
|
|
@@ -452,6 +516,10 @@ export class PermissionDialogComponent extends BaseAngularComponent {
|
|
|
452
516
|
});
|
|
453
517
|
}
|
|
454
518
|
}
|
|
519
|
+
/** @deprecated Use {@link OnSubmit}. */
|
|
520
|
+
async onSubmit() {
|
|
521
|
+
return this.OnSubmit();
|
|
522
|
+
}
|
|
455
523
|
async saveRolePermission(rolePermission) {
|
|
456
524
|
// Save the entity directly - it already has all the values bound
|
|
457
525
|
const saveResult = await rolePermission.entityPermission.Save();
|
|
@@ -460,12 +528,12 @@ export class PermissionDialogComponent extends BaseAngularComponent {
|
|
|
460
528
|
}
|
|
461
529
|
}
|
|
462
530
|
onCancel() {
|
|
463
|
-
this.
|
|
531
|
+
this.Result.emit({ action: 'cancel' });
|
|
464
532
|
}
|
|
465
533
|
static ɵfac = function PermissionDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PermissionDialogComponent)(); };
|
|
466
534
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PermissionDialogComponent, selectors: [["mj-permission-dialog"]], hostBindings: function PermissionDialogComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
467
535
|
i0.ɵɵlistener("keydown.escape", function PermissionDialogComponent_keydown_escape_HostBindingHandler($event) { return ctx.onEscapeKey($event); }, i0.ɵɵresolveDocument);
|
|
468
|
-
} }, inputs: { data: "data", visible: "visible" }, outputs: { result: "result" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "modal-backdrop"], [1, "modal-backdrop", 3, "click"], [1, "modal-dialog", 3, "click"], [1, "modal-header"], [1, "dialog-header"], [1, "dialog-title"], [1, "fa-solid", "fa-key"], [1, "dialog-subtitle"], ["type", "button", "aria-label", "Close dialog", 1, "modal-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "modal-body"], [3, "ngSubmit", "formGroup"], [1, "content-section"], [1, "form-section"], [1, "section-header"], [1, "section-title"], [1, "fa-solid", "fa-database"], [1, "section-description"], [1, "entity-info-card"], [1, "entity-meta"], [1, "meta-item"], [1, "fa-solid", "fa-table"], [1, "meta-label"], [1, "meta-value"], [1, "fa-solid", "fa-shield-halved"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-users-cog"], [1, "permissions-table-container"], [1, "permissions-table"], [1, "role-column"], [1, "permission-column"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-eye"], [1, "fa-solid", "fa-edit"], [1, "fa-solid", "fa-trash"], [1, "actions-column"], [1, "permission-row", 3, "has-changes", "is-new"], [1, "empty-permissions"], [1, "add-role-section"], [1, "add-role-header"], [1, "available-roles"], ["type", "button", 1, "role-chip", 3, "title"], [1, "no-available-roles"], [1, "modal-footer"], [1, "footer-info"], [1, "changes-indicator"], [1, "footer-actions"], ["type", "submit", 1, "btn", "btn-primary", 3, "disabled"], ["type", "button", 1, "btn", "btn-secondary", 3, "click"], ["Variant", "error", 3, "Message"], [1, "permission-row"], [1, "role-name"], [1, "role-info"], [1, "new-badge"], [1, "changed-badge"], [1, "permission-cell"], [1, "permission-toggle"], ["type", "checkbox", 1, "permission-checkbox", 3, "ngModelChange", "id", "ngModel", "ngModelOptions"], [1, "permission-label", 3, "for"], [1, "checkbox-indicator"], [1, "actions-cell"], ["type", "button", "title", "Remove permissions for this role", 1, "btn-icon", "btn-danger", 3, "click"], [1, "empty-subtext"], ["type", "button", 1, "role-chip", 3, "click", "title"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-save"]], template: function PermissionDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
536
|
+
} }, inputs: { Data: "Data", data: "data", Visible: "Visible", visible: "visible" }, outputs: { Result: "Result", result: "result" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "modal-backdrop"], [1, "modal-backdrop", 3, "click"], [1, "modal-dialog", 3, "click"], [1, "modal-header"], [1, "dialog-header"], [1, "dialog-title"], [1, "fa-solid", "fa-key"], [1, "dialog-subtitle"], ["type", "button", "aria-label", "Close dialog", 1, "modal-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "modal-body"], [3, "ngSubmit", "formGroup"], [1, "content-section"], [1, "form-section"], [1, "section-header"], [1, "section-title"], [1, "fa-solid", "fa-database"], [1, "section-description"], [1, "entity-info-card"], [1, "entity-meta"], [1, "meta-item"], [1, "fa-solid", "fa-table"], [1, "meta-label"], [1, "meta-value"], [1, "fa-solid", "fa-shield-halved"], [1, "fa-solid", "fa-clock"], [1, "fa-solid", "fa-users-cog"], [1, "permissions-table-container"], [1, "permissions-table"], [1, "role-column"], [1, "permission-column"], [1, "fa-solid", "fa-plus"], [1, "fa-solid", "fa-eye"], [1, "fa-solid", "fa-edit"], [1, "fa-solid", "fa-trash"], [1, "actions-column"], [1, "permission-row", 3, "has-changes", "is-new"], [1, "empty-permissions"], [1, "add-role-section"], [1, "add-role-header"], [1, "available-roles"], ["type", "button", 1, "role-chip", 3, "title"], [1, "no-available-roles"], [1, "modal-footer"], [1, "footer-info"], [1, "changes-indicator"], [1, "footer-actions"], ["type", "submit", 1, "btn", "btn-primary", 3, "disabled"], ["type", "button", 1, "btn", "btn-secondary", 3, "click"], ["Variant", "error", 3, "Message"], [1, "permission-row"], [1, "role-name"], [1, "role-info"], [1, "new-badge"], [1, "changed-badge"], [1, "permission-cell"], [1, "permission-toggle"], ["type", "checkbox", 1, "permission-checkbox", 3, "ngModelChange", "id", "ngModel", "ngModelOptions"], [1, "permission-label", 3, "for"], [1, "checkbox-indicator"], [1, "actions-cell"], ["type", "button", "title", "Remove permissions for this role", 1, "btn-icon", "btn-danger", 3, "click"], [1, "empty-subtext"], ["type", "button", 1, "role-chip", 3, "click", "title"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-save"]], template: function PermissionDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
469
537
|
i0.ɵɵconditionalCreate(0, PermissionDialogComponent_Conditional_0_Template, 101, 16, "div", 0);
|
|
470
538
|
} if (rf & 2) {
|
|
471
539
|
i0.ɵɵconditional(ctx.visible ? 0 : -1);
|
|
@@ -474,10 +542,16 @@ export class PermissionDialogComponent extends BaseAngularComponent {
|
|
|
474
542
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PermissionDialogComponent, [{
|
|
475
543
|
type: Component,
|
|
476
544
|
args: [{ standalone: false, selector: 'mj-permission-dialog', encapsulation: ViewEncapsulation.None, template: "<!-- MD3 Modal Dialog -->\n@if (visible) {\n <div class=\"modal-backdrop\" (click)=\"onCancel()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <!-- Modal Header -->\n <div class=\"modal-header\">\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">\n <i class=\"fa-solid fa-key\"></i>\n Edit Entity Permissions\n </h2>\n <p class=\"dialog-subtitle\">\n Configure role-based permissions for {{ data?.entity?.Name }}\n </p>\n </div>\n <button type=\"button\" class=\"modal-close\" (click)=\"onCancel()\" aria-label=\"Close dialog\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Modal Body -->\n <div class=\"modal-body\">\n <form [formGroup]=\"permissionForm\" (ngSubmit)=\"onSubmit()\">\n @if (error) {\n <div class=\"content-section\">\n <mj-alert Variant=\"error\" [Message]=\"error\" />\n </div>\n }\n <!-- Entity Information Section -->\n <div class=\"content-section\">\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Information\n </h3>\n <p class=\"section-description\">{{ data?.entity?.Description || 'Entity permissions configuration' }}</p>\n </div>\n <div class=\"entity-info-card\">\n <div class=\"entity-meta\">\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"meta-label\">Entity:</span>\n <span class=\"meta-value\">{{ data?.entity?.Name }}</span>\n </div>\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span class=\"meta-label\">Schema Name:</span>\n <span class=\"meta-value\">{{ data?.entity?.SchemaName || 'N/A' }}</span>\n </div>\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-key\"></i>\n <span class=\"meta-label\">Total Permissions:</span>\n <span class=\"meta-value\">{{ rolePermissions.length }}</span>\n </div>\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span class=\"meta-label\">Last Updated:</span>\n <span class=\"meta-value\">{{ data?.entity?.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Permissions Configuration Section -->\n <div class=\"content-section\">\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-users-cog\"></i>\n Role Permissions\n </h3>\n <p class=\"section-description\">Configure CRUD permissions for each role</p>\n </div>\n <div class=\"permissions-table-container\">\n <table class=\"permissions-table\">\n <thead>\n <tr>\n <th class=\"role-column\">Role</th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-plus\"></i>\n Create\n </th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-eye\"></i>\n Read\n </th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-edit\"></i>\n Update\n </th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </th>\n <th class=\"actions-column\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (rolePermission of rolePermissions; track rolePermission.roleId) {\n <tr class=\"permission-row\" [class.has-changes]=\"hasEntityChanges(rolePermission)\" [class.is-new]=\"rolePermission.isNew\">\n <td class=\"role-name\">\n <div class=\"role-info\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>{{ rolePermission.roleName }}</span>\n @if (rolePermission.isNew) {\n <span class=\"new-badge\">New</span>\n }\n @if (hasEntityChanges(rolePermission) && !rolePermission.isNew) {\n <span class=\"changed-badge\">Modified</span>\n }\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'create-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanCreate\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'create-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'read-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanRead\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'read-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'update-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanUpdate\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'update-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'delete-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanDelete\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'delete-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"actions-cell\">\n <button\n type=\"button\"\n class=\"btn-icon btn-danger\"\n (click)=\"removeRolePermission(rolePermission)\"\n title=\"Remove permissions for this role\"\n attr.aria-label=\"Remove permissions for {{ rolePermission.roleName }}\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (rolePermissions.length === 0) {\n <div class=\"empty-permissions\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <p>No role permissions configured</p>\n <p class=\"empty-subtext\">Add permissions for specific roles to control access to this entity</p>\n </div>\n }\n </div>\n <!-- Add Role Permissions -->\n <div class=\"add-role-section\">\n <div class=\"add-role-header\">\n <h4>Add Role Permissions</h4>\n <p>Select roles to configure permissions for this entity</p>\n </div>\n <div class=\"available-roles\">\n @for (role of availableRoles; track role.ID) {\n <button\n type=\"button\"\n class=\"role-chip\"\n (click)=\"addRolePermission(role)\"\n title=\"Add permissions for {{ role.Name }}\"\n attr.aria-label=\"Add permissions for {{ role.Name }}\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n {{ role.Name }}\n </button>\n }\n @if (availableRoles.length === 0) {\n <p class=\"no-available-roles\">All roles have been configured</p>\n }\n </div>\n </div>\n </div>\n </div>\n <!-- Modal Footer -->\n <div class=\"modal-footer\">\n <div class=\"footer-info\">\n @if (hasChanges) {\n <span class=\"changes-indicator\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n You have unsaved changes\n </span>\n }\n </div>\n <div class=\"footer-actions\">\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"!hasChanges || isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n Save Permissions\n }\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i>\n Cancel\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n}\n", styles: ["/* ==============================================\n Permission Dialog - MJ Design System\n Using MJ design tokens from _tokens.scss\n Pure Modal (No Kendo UI)\n ============================================== */\n\n/* Modal Backdrop */\n.modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n padding: 1rem;\n animation: fadeIn 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Modal Dialog Container */\n.modal-dialog {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-2xl);\n box-shadow: var(--mj-shadow-2xl);\n width: 900px;\n max-width: calc(100vw - 2rem);\n max-height: calc(100vh - 2rem);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: slideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(20px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* Modal Header - MJ Blue Background */\n.modal-header {\n background: var(--mj-brand-primary);\n padding: 24px 32px;\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.dialog-header {\n flex: 1;\n color: var(--mj-brand-on-primary);\n}\n\n.dialog-header .dialog-title {\n font-size: 20px;\n font-weight: 600;\n display: flex;\n align-items: center;\n gap: 12px;\n margin: 0 0 4px 0;\n color: var(--mj-brand-on-primary);\n}\n\n.dialog-header .dialog-title i {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.15);\n border-radius: var(--mj-radius-md);\n font-size: 16px;\n}\n\n.dialog-header .dialog-subtitle {\n margin: 0;\n font-size: 13px;\n opacity: 0.9;\n font-weight: 400;\n color: var(--mj-brand-on-primary);\n}\n\n/* Modal Close Button */\n.modal-close {\n background: rgba(255, 255, 255, 0.1);\n border: 1px solid rgba(255, 255, 255, 0.2);\n color: var(--mj-brand-on-primary);\n border-radius: var(--mj-radius-md);\n width: 44px;\n height: 44px;\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n flex-shrink: 0;\n}\n\n.modal-close:hover {\n background: rgba(255, 255, 255, 0.2);\n border-color: rgba(255, 255, 255, 0.3);\n}\n\n.modal-close i {\n font-size: 16px;\n}\n\n/* Modal Body - Scrollable Content */\n.modal-body {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-surface);\n}\n\n/* Content Sections */\n.content-section {\n padding: 32px;\n}\n\n.content-section:not(:last-child) {\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n/* Form Sections */\n.form-section .section-header {\n margin-bottom: 24px;\n}\n\n.form-section .section-header .section-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 4px 0;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.form-section .section-header .section-title i {\n color: var(--mj-brand-primary);\n font-size: 18px;\n}\n\n.form-section .section-header .section-description {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n/* Entity Info Card - Static Display (Non-interactive) */\n.entity-info-card {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n padding: 24px;\n cursor: default;\n}\n\n.entity-info-card .entity-meta {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n}\n\n@media (max-width: 640px) {\n .entity-info-card .entity-meta {\n grid-template-columns: 1fr;\n }\n}\n\n.entity-info-card .entity-meta .meta-item {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.entity-info-card .entity-meta .meta-item i {\n color: var(--mj-brand-primary);\n width: 16px;\n font-size: 14px;\n flex-shrink: 0;\n}\n\n.entity-info-card .entity-meta .meta-item .meta-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n white-space: nowrap;\n}\n\n.entity-info-card .entity-meta .meta-item .meta-value {\n font-size: 12px;\n color: var(--mj-text-primary);\n font-weight: 600;\n}\n\n/* Permissions Table */\n.permissions-table-container {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n overflow: hidden;\n background: var(--mj-bg-surface);\n}\n\n.permissions-table-container .permissions-table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.permissions-table-container .permissions-table thead {\n background: var(--mj-bg-surface-card);\n}\n\n.permissions-table-container .permissions-table thead th {\n padding: 16px 24px;\n text-align: left;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-primary);\n border-bottom: 1px solid var(--mj-border-default);\n white-space: nowrap;\n}\n\n.permissions-table-container .permissions-table thead th.role-column {\n width: 25%;\n min-width: 200px;\n}\n\n.permissions-table-container .permissions-table thead th.permission-column {\n width: 15%;\n text-align: center;\n}\n\n.permissions-table-container .permissions-table thead th.permission-column i {\n color: var(--mj-brand-primary);\n margin-right: 4px;\n}\n\n.permissions-table-container .permissions-table thead th.actions-column {\n width: 10%;\n text-align: center;\n}\n\n.permissions-table-container .permissions-table tbody tr {\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.permissions-table-container .permissions-table tbody tr:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, transparent);\n}\n\n.permissions-table-container .permissions-table tbody tr.has-changes {\n background: var(--mj-color-accent-300);\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n.permissions-table-container .permissions-table tbody tr.is-new {\n background: var(--mj-color-success-100);\n border-left: 3px solid var(--mj-color-success-500);\n}\n\n.permissions-table-container .permissions-table tbody tr td {\n padding: 16px 24px;\n border-bottom: 1px solid var(--mj-bg-surface-card);\n}\n\n.permissions-table-container .permissions-table tbody tr td.role-name .role-info {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-text-primary);\n}\n\n.permissions-table-container .permissions-table tbody tr td.role-name .role-info i {\n color: var(--mj-brand-primary);\n width: 16px;\n flex-shrink: 0;\n}\n\n.permissions-table-container .permissions-table tbody tr td.role-name .role-info .new-badge,\n.permissions-table-container .permissions-table tbody tr td.role-name .role-info .changed-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.375rem 0.875rem;\n border-radius: var(--mj-radius-full);\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.03em;\n margin-left: 8px;\n}\n\n.permissions-table-container .permissions-table tbody tr td.role-name .role-info .new-badge {\n background: var(--mj-color-success-100);\n color: var(--mj-color-success-800);\n border: 1px solid var(--mj-color-success-500);\n}\n\n.permissions-table-container .permissions-table tbody tr td.role-name .role-info .changed-badge {\n background: var(--mj-color-warning-100);\n color: var(--mj-color-warning-800);\n border: 1px solid var(--mj-color-warning-500);\n}\n\n.permissions-table-container .permissions-table tbody tr td.permission-cell,\n.permissions-table-container .permissions-table tbody tr td.actions-cell {\n text-align: center;\n}\n\n/* Permission Toggle - Checkbox */\n.permission-toggle {\n display: flex;\n justify-content: center;\n}\n\n.permission-toggle .permission-checkbox {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n}\n\n.permission-toggle .permission-checkbox:checked + .permission-label .checkbox-indicator {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.permission-toggle .permission-checkbox:checked + .permission-label .checkbox-indicator::after {\n opacity: 1;\n transform: rotate(45deg) scale(1);\n}\n\n.permission-toggle .permission-checkbox:focus + .permission-label .checkbox-indicator {\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 20%, transparent);\n}\n\n.permission-toggle .permission-label {\n display: flex;\n align-items: center;\n cursor: pointer;\n margin: 0;\n min-width: 44px;\n min-height: 44px;\n justify-content: center;\n}\n\n.permission-toggle .checkbox-indicator {\n width: 20px;\n height: 20px;\n border: 2px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n position: relative;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.permission-toggle .checkbox-indicator::after {\n content: '';\n position: absolute;\n left: 6px;\n top: 2px;\n width: 4px;\n height: 8px;\n border: solid var(--mj-brand-on-primary);\n border-width: 0 2px 2px 0;\n opacity: 0;\n transform: rotate(45deg) scale(0.8);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* Action Buttons - Danger Icon Button */\n.btn-icon {\n width: 44px;\n height: 44px;\n min-width: 44px;\n min-height: 44px;\n border: none;\n border-radius: var(--mj-radius-md);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n}\n\n.btn-icon.btn-danger {\n background: var(--mj-color-error-100);\n color: var(--mj-status-error);\n}\n\n.btn-icon.btn-danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 20%, transparent);\n transform: scale(1.05);\n}\n\n/* Empty Permissions */\n.empty-permissions {\n text-align: center;\n padding: 32px;\n color: var(--mj-text-secondary);\n}\n\n.empty-permissions i {\n font-size: 2rem;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-permissions p {\n margin: 0 0 4px 0;\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.empty-permissions .empty-subtext {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n/* Add Role Section */\n.add-role-section {\n margin-top: 32px;\n padding-top: 24px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.add-role-section .add-role-header {\n margin-bottom: 24px;\n}\n\n.add-role-section .add-role-header h4 {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin: 0 0 4px 0;\n}\n\n.add-role-section .add-role-header p {\n font-size: 12px;\n color: var(--mj-text-secondary);\n margin: 0;\n}\n\n.add-role-section .available-roles {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.add-role-section .available-roles .role-chip {\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n gap: 4px;\n min-height: 44px;\n}\n\n.add-role-section .available-roles .role-chip i {\n font-size: 12px;\n color: var(--mj-brand-primary);\n}\n\n.add-role-section .available-roles .role-chip:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.add-role-section .available-roles .no-available-roles {\n color: var(--mj-text-secondary);\n font-style: italic;\n margin: 0;\n}\n\n/* Modal Footer */\n.modal-footer {\n padding: 24px 32px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n flex-shrink: 0;\n}\n\n.modal-footer .footer-info {\n flex: 1;\n}\n\n.modal-footer .footer-info .changes-indicator {\n color: var(--mj-color-warning-500);\n font-size: 12px;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.modal-footer .footer-info .changes-indicator i {\n font-size: 14px;\n}\n\n.modal-footer .footer-actions {\n display: flex;\n gap: 16px;\n}\n\n/* Button Styles */\n.modal-footer .btn {\n padding: 0.75rem 1.5rem;\n border-radius: var(--mj-radius-full);\n font-size: 14px;\n font-weight: 600;\n border: 1px solid transparent;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: inline-flex;\n align-items: center;\n gap: 8px;\n min-height: 44px;\n}\n\n.modal-footer .btn:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.modal-footer .btn:disabled i.fa-spinner {\n animation: spin 1s linear infinite;\n}\n\n/* Secondary Button - Light, fills with primary on hover */\n.modal-footer .btn.btn-secondary {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n border-color: var(--mj-border-strong);\n}\n\n.modal-footer .btn.btn-secondary:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n border-color: var(--mj-brand-primary);\n}\n\n.modal-footer .btn.btn-secondary:active:not(:disabled) {\n background: var(--mj-color-brand-700);\n border-color: var(--mj-color-brand-700);\n}\n\n/* Primary Button - Dark, lightens on hover */\n.modal-footer .btn.btn-primary {\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.modal-footer .btn.btn-primary:hover:not(:disabled) {\n background: var(--mj-color-brand-350);\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-1px);\n}\n\n.modal-footer .btn.btn-primary:active:not(:disabled) {\n background: var(--mj-color-brand-300);\n transform: scale(0.98);\n}\n\n@keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* Accessibility - Focus Indicators */\nbutton:focus-visible,\ninput:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n/* Reduced Motion */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n .modal-backdrop {\n padding: 0;\n align-items: flex-start;\n }\n\n .modal-dialog {\n width: 100vw;\n max-width: 100vw;\n max-height: 100vh;\n border-radius: 0;\n margin: 0;\n }\n\n .modal-header {\n padding: 16px 20px;\n }\n\n .dialog-header .dialog-title {\n font-size: 18px;\n }\n\n .content-section {\n padding: 24px 20px;\n }\n\n .modal-footer {\n padding: 16px 20px;\n flex-direction: column;\n align-items: stretch;\n }\n\n .modal-footer .footer-info,\n .modal-footer .footer-actions {\n width: 100%;\n }\n\n .modal-footer .footer-actions {\n display: flex;\n gap: 12px;\n }\n\n .modal-footer .footer-actions .btn {\n flex: 1;\n justify-content: center;\n }\n\n .permissions-table-container {\n overflow-x: auto;\n }\n\n .permissions-table-container .permissions-table {\n min-width: 600px;\n }\n\n .available-roles .role-chip {\n flex: 1;\n min-width: 120px;\n justify-content: center;\n }\n}\n\n@media (max-width: 640px) {\n .entity-info-card .entity-meta {\n grid-template-columns: 1fr;\n }\n}\n"] }]
|
|
477
|
-
}], () => [], {
|
|
545
|
+
}], () => [], { Data: [{
|
|
546
|
+
type: Input
|
|
547
|
+
}], data: [{
|
|
548
|
+
type: Input
|
|
549
|
+
}], Visible: [{
|
|
478
550
|
type: Input
|
|
479
551
|
}], visible: [{
|
|
480
552
|
type: Input
|
|
553
|
+
}], Result: [{
|
|
554
|
+
type: Output
|
|
481
555
|
}], result: [{
|
|
482
556
|
type: Output
|
|
483
557
|
}], onEscapeKey: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/entity-permissions/permission-dialog/permission-dialog.component.ts","../../../../src/lib/entity-permissions/permission-dialog/permission-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges, inject, HostListener, ChangeDetectorRef, NgZone, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJEntityPermissionEntity, MJEntityEntity, MJRoleEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface PermissionDialogData {\n entity: MJEntityEntity;\n roles: MJRoleEntity[];\n existingPermissions: MJEntityPermissionEntity[];\n}\n\nexport interface PermissionDialogResult {\n action: 'save' | 'cancel';\n entity?: MJEntityEntity;\n}\n\ninterface RolePermissions {\n roleId: string;\n roleName: string;\n entityPermission: MJEntityPermissionEntity;\n isNew: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-permission-dialog',\n encapsulation: ViewEncapsulation.None,\n templateUrl: './permission-dialog.component.html',\n styleUrls: ['./permission-dialog.component.css']\n})\nexport class PermissionDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy, OnChanges {\n @Input() data: PermissionDialogData | null = null;\n @Input() visible = false;\n @Output() result = new EventEmitter<PermissionDialogResult>();\n\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private get metadata() { return this.ProviderToUse; }\n public permissionForm: FormGroup;\n public isLoading = false;\n public error: string | null = null;\n public rolePermissions: RolePermissions[] = [];\n public availableRoles: MJRoleEntity[] = [];\n\n constructor() {\n super();\n this.permissionForm = this.fb.group({});\n }\n\n ngOnInit(): void {\n // Initial setup\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n console.log('Permission dialog ngOnChanges called:', changes);\n \n if (changes['visible'] && this.visible) {\n this.resetDialog();\n // Load data when dialog becomes visible and we have data\n if (this.data) {\n console.log('Dialog became visible, loading permission data');\n this.loadPermissionData();\n }\n }\n \n if (changes['data'] && this.data && this.visible) {\n console.log('Data changed while dialog is visible, reloading permission data');\n this.loadPermissionData();\n }\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n private resetDialog(): void {\n this.error = null;\n this.isLoading = false;\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n onEscapeKey(event: Event): void {\n if (this.visible) {\n this.onCancel();\n }\n }\n\n public get hasChanges(): boolean {\n return this.rolePermissions.some(rp => rp.isNew || rp.entityPermission.Dirty);\n }\n\n public hasEntityChanges(rolePermission: RolePermissions): boolean {\n return rolePermission.isNew || rolePermission.entityPermission.Dirty;\n }\n\n private loadPermissionData(): void {\n if (!this.data) return;\n\n console.log('Loading permission data for entity:', this.data.entity.Name);\n console.log('Existing permissions:', this.data.existingPermissions);\n console.log('Available roles:', this.data.roles);\n\n // Initialize role permissions from existing data\n this.rolePermissions = [];\n const existingRoleIds = new Set<string>();\n\n // Process existing permissions\n for (const permission of this.data.existingPermissions) {\n const role = this.data.roles.find(r => UUIDsEqual(r.ID, permission.RoleID));\n if (role) {\n console.log(`Processing permission for role ${role.Name}:`, {\n canCreate: permission.CanCreate,\n canRead: permission.CanRead,\n canUpdate: permission.CanUpdate,\n canDelete: permission.CanDelete\n });\n \n this.rolePermissions.push({\n roleId: role.ID,\n roleName: role.Name || '',\n entityPermission: permission,\n isNew: false\n });\n existingRoleIds.add(role.ID);\n }\n }\n\n console.log('Loaded role permissions:', this.rolePermissions);\n\n // Set available roles (those not already configured)\n this.availableRoles = this.data.roles.filter(role => !existingRoleIds.has(role.ID));\n \n console.log('Available roles for adding:', this.availableRoles.map(r => r.Name));\n \n // Trigger change detection to update the UI\n this.cdr.detectChanges();\n }\n\n public async addRolePermission(role: MJRoleEntity): Promise<void> {\n // Create new EntityPermission entity\n const entityPermission = await this.metadata.GetEntityObject<MJEntityPermissionEntity>('MJ: Entity Permissions');\n entityPermission.NewRecord();\n entityPermission.EntityID = this.data!.entity.ID;\n entityPermission.RoleID = role.ID;\n entityPermission.CanCreate = false;\n entityPermission.CanRead = true; // Default to read access\n entityPermission.CanUpdate = false;\n entityPermission.CanDelete = false;\n\n // Add new role permission\n this.rolePermissions.push({\n roleId: role.ID,\n roleName: role.Name || '',\n entityPermission: entityPermission,\n isNew: true\n });\n\n // Remove from available roles\n this.availableRoles = this.availableRoles.filter(r => !UUIDsEqual(r.ID, role.ID));\n this.cdr.detectChanges();\n }\n\n public removeRolePermission(rolePermission: RolePermissions): void {\n // Add back to available roles if not new\n if (!rolePermission.isNew) {\n const role = this.data?.roles.find(r => UUIDsEqual(r.ID, rolePermission.roleId));\n if (role) {\n this.availableRoles.push(role);\n this.availableRoles.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));\n }\n } else {\n // Add back to available roles\n const role = this.data?.roles.find(r => UUIDsEqual(r.ID, rolePermission.roleId));\n if (role) {\n this.availableRoles.push(role);\n this.availableRoles.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));\n }\n }\n\n // Remove from role permissions\n this.rolePermissions = this.rolePermissions.filter(rp => rp.roleId !== rolePermission.roleId);\n this.cdr.detectChanges();\n }\n\n public async onSubmit(): Promise<void> {\n if (!this.data || !this.hasChanges) return;\n\n this.isLoading = true;\n this.error = null;\n\n try {\n // Process each role permission\n for (const rolePermission of this.rolePermissions) {\n if (rolePermission.isNew || rolePermission.entityPermission.Dirty) {\n await this.saveRolePermission(rolePermission);\n }\n }\n\n this.result.emit({ action: 'save', entity: this.data.entity });\n\n } catch (error: unknown) {\n console.error('Error saving permissions:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'An unexpected error occurred while saving permissions';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n private async saveRolePermission(rolePermission: RolePermissions): Promise<void> {\n // Save the entity directly - it already has all the values bound\n const saveResult = await rolePermission.entityPermission.Save();\n if (!saveResult) {\n throw new Error(rolePermission.entityPermission.LatestResult?.Message || `Failed to save permissions for role ${rolePermission.roleName}`);\n }\n }\n\n public onCancel(): void {\n this.result.emit({ action: 'cancel' });\n }\n}","<!-- MD3 Modal Dialog -->\n@if (visible) {\n <div class=\"modal-backdrop\" (click)=\"onCancel()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <!-- Modal Header -->\n <div class=\"modal-header\">\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">\n <i class=\"fa-solid fa-key\"></i>\n Edit Entity Permissions\n </h2>\n <p class=\"dialog-subtitle\">\n Configure role-based permissions for {{ data?.entity?.Name }}\n </p>\n </div>\n <button type=\"button\" class=\"modal-close\" (click)=\"onCancel()\" aria-label=\"Close dialog\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Modal Body -->\n <div class=\"modal-body\">\n <form [formGroup]=\"permissionForm\" (ngSubmit)=\"onSubmit()\">\n @if (error) {\n <div class=\"content-section\">\n <mj-alert Variant=\"error\" [Message]=\"error\" />\n </div>\n }\n <!-- Entity Information Section -->\n <div class=\"content-section\">\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Information\n </h3>\n <p class=\"section-description\">{{ data?.entity?.Description || 'Entity permissions configuration' }}</p>\n </div>\n <div class=\"entity-info-card\">\n <div class=\"entity-meta\">\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"meta-label\">Entity:</span>\n <span class=\"meta-value\">{{ data?.entity?.Name }}</span>\n </div>\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span class=\"meta-label\">Schema Name:</span>\n <span class=\"meta-value\">{{ data?.entity?.SchemaName || 'N/A' }}</span>\n </div>\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-key\"></i>\n <span class=\"meta-label\">Total Permissions:</span>\n <span class=\"meta-value\">{{ rolePermissions.length }}</span>\n </div>\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span class=\"meta-label\">Last Updated:</span>\n <span class=\"meta-value\">{{ data?.entity?.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Permissions Configuration Section -->\n <div class=\"content-section\">\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-users-cog\"></i>\n Role Permissions\n </h3>\n <p class=\"section-description\">Configure CRUD permissions for each role</p>\n </div>\n <div class=\"permissions-table-container\">\n <table class=\"permissions-table\">\n <thead>\n <tr>\n <th class=\"role-column\">Role</th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-plus\"></i>\n Create\n </th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-eye\"></i>\n Read\n </th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-edit\"></i>\n Update\n </th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </th>\n <th class=\"actions-column\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (rolePermission of rolePermissions; track rolePermission.roleId) {\n <tr class=\"permission-row\" [class.has-changes]=\"hasEntityChanges(rolePermission)\" [class.is-new]=\"rolePermission.isNew\">\n <td class=\"role-name\">\n <div class=\"role-info\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>{{ rolePermission.roleName }}</span>\n @if (rolePermission.isNew) {\n <span class=\"new-badge\">New</span>\n }\n @if (hasEntityChanges(rolePermission) && !rolePermission.isNew) {\n <span class=\"changed-badge\">Modified</span>\n }\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'create-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanCreate\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'create-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'read-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanRead\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'read-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'update-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanUpdate\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'update-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'delete-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanDelete\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'delete-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"actions-cell\">\n <button\n type=\"button\"\n class=\"btn-icon btn-danger\"\n (click)=\"removeRolePermission(rolePermission)\"\n title=\"Remove permissions for this role\"\n attr.aria-label=\"Remove permissions for {{ rolePermission.roleName }}\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (rolePermissions.length === 0) {\n <div class=\"empty-permissions\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <p>No role permissions configured</p>\n <p class=\"empty-subtext\">Add permissions for specific roles to control access to this entity</p>\n </div>\n }\n </div>\n <!-- Add Role Permissions -->\n <div class=\"add-role-section\">\n <div class=\"add-role-header\">\n <h4>Add Role Permissions</h4>\n <p>Select roles to configure permissions for this entity</p>\n </div>\n <div class=\"available-roles\">\n @for (role of availableRoles; track role.ID) {\n <button\n type=\"button\"\n class=\"role-chip\"\n (click)=\"addRolePermission(role)\"\n title=\"Add permissions for {{ role.Name }}\"\n attr.aria-label=\"Add permissions for {{ role.Name }}\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n {{ role.Name }}\n </button>\n }\n @if (availableRoles.length === 0) {\n <p class=\"no-available-roles\">All roles have been configured</p>\n }\n </div>\n </div>\n </div>\n </div>\n <!-- Modal Footer -->\n <div class=\"modal-footer\">\n <div class=\"footer-info\">\n @if (hasChanges) {\n <span class=\"changes-indicator\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n You have unsaved changes\n </span>\n }\n </div>\n <div class=\"footer-actions\">\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"!hasChanges || isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n Save Permissions\n }\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i>\n Cancel\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"permission-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/entity-permissions/permission-dialog/permission-dialog.component.ts","../../../../src/lib/entity-permissions/permission-dialog/permission-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, OnChanges, SimpleChanges, inject, HostListener, ChangeDetectorRef, NgZone, ViewEncapsulation } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule, FormBuilder, FormGroup } from '@angular/forms';\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJEntityPermissionEntity, MJEntityEntity, MJRoleEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport interface PermissionDialogData {\n entity: MJEntityEntity;\n roles: MJRoleEntity[];\n existingPermissions: MJEntityPermissionEntity[];\n}\n\nexport interface PermissionDialogResult {\n action: 'save' | 'cancel';\n entity?: MJEntityEntity;\n}\n\ninterface RolePermissions {\n roleId: string;\n roleName: string;\n entityPermission: MJEntityPermissionEntity;\n isNew: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-permission-dialog',\n encapsulation: ViewEncapsulation.None,\n templateUrl: './permission-dialog.component.html',\n styleUrls: ['./permission-dialog.component.css']\n})\nexport class PermissionDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy, OnChanges {\n @Input() Data: PermissionDialogData | null = null;\n\n /** @deprecated Use {@link Data}. */\n @Input() set data(value: PermissionDialogData | null) {\n this.Data = value;\n }\n /** @deprecated Use {@link Data}. */\n get data(): PermissionDialogData | null {\n return this.Data;\n }\n @Input() Visible = false;\n\n /** @deprecated Use {@link Visible}. */\n @Input() set visible(value: PermissionDialogComponent['Visible']) {\n this.Visible = value;\n }\n /** @deprecated Use {@link Visible}. */\n get visible(): PermissionDialogComponent['Visible'] {\n return this.Visible;\n }\n @Output() Result = new EventEmitter<PermissionDialogResult>();\n\n /**\n * @deprecated Use {@link Result}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (result) keeps working. Must stay AFTER Result: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() result = this.Result;\n\n private fb = inject(FormBuilder);\n private cdr = inject(ChangeDetectorRef);\n private ngZone = inject(NgZone);\n private get metadata() { return this.ProviderToUse; }\n public PermissionForm: FormGroup;\n\n /** @deprecated Use {@link PermissionForm}. */\n public get permissionForm(): FormGroup {\n return this.PermissionForm;\n }\n /** @deprecated Use {@link PermissionForm}. */\n public set permissionForm(value: FormGroup) {\n this.PermissionForm = value;\n }\n public isLoading = false;\n public error: string | null = null;\n public RolePermissions: RolePermissions[] = [];\n\n /** @deprecated Use {@link RolePermissions}. */\n public get rolePermissions(): RolePermissions[] {\n return this.RolePermissions;\n }\n /** @deprecated Use {@link RolePermissions}. */\n public set rolePermissions(value: RolePermissions[]) {\n this.RolePermissions = value;\n }\n public AvailableRoles: MJRoleEntity[] = [];\n\n /** @deprecated Use {@link AvailableRoles}. */\n public get availableRoles(): MJRoleEntity[] {\n return this.AvailableRoles;\n }\n /** @deprecated Use {@link AvailableRoles}. */\n public set availableRoles(value: MJRoleEntity[]) {\n this.AvailableRoles = value;\n }\n\n constructor() {\n super();\n this.PermissionForm = this.fb.group({});\n }\n\n ngOnInit(): void {\n // Initial setup\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n console.log('Permission dialog ngOnChanges called:', changes);\n \n if (changes['visible'] && this.Visible) {\n this.resetDialog();\n // Load data when dialog becomes visible and we have data\n if (this.Data) {\n console.log('Dialog became visible, loading permission data');\n this.loadPermissionData();\n }\n }\n \n if (changes['data'] && this.Data && this.Visible) {\n console.log('Data changed while dialog is visible, reloading permission data');\n this.loadPermissionData();\n }\n }\n\n ngOnDestroy(): void {\n // Cleanup if needed\n }\n\n private resetDialog(): void {\n this.error = null;\n this.isLoading = false;\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n onEscapeKey(event: Event): void {\n if (this.Visible) {\n this.onCancel();\n }\n }\n\n public get HasChanges(): boolean {\n return this.RolePermissions.some(rp => rp.isNew || rp.entityPermission.Dirty);\n }\n\n /** @deprecated Use {@link HasChanges}. */\n public get hasChanges(): boolean {\n return this.HasChanges;\n }\n\n public HasEntityChanges(rolePermission: RolePermissions): boolean {\n return rolePermission.isNew || rolePermission.entityPermission.Dirty;\n }\n\n /** @deprecated Use {@link HasEntityChanges}. */\n public hasEntityChanges(rolePermission: RolePermissions): boolean {\n return this.HasEntityChanges(rolePermission);\n }\n\n private loadPermissionData(): void {\n if (!this.Data) return;\n\n console.log('Loading permission data for entity:', this.Data.entity.Name);\n console.log('Existing permissions:', this.Data.existingPermissions);\n console.log('Available roles:', this.Data.roles);\n\n // Initialize role permissions from existing data\n this.RolePermissions = [];\n const existingRoleIds = new Set<string>();\n\n // Process existing permissions\n for (const permission of this.Data.existingPermissions) {\n const role = this.Data.roles.find(r => UUIDsEqual(r.ID, permission.RoleID));\n if (role) {\n console.log(`Processing permission for role ${role.Name}:`, {\n canCreate: permission.CanCreate,\n canRead: permission.CanRead,\n canUpdate: permission.CanUpdate,\n canDelete: permission.CanDelete\n });\n \n this.RolePermissions.push({\n roleId: role.ID,\n roleName: role.Name || '',\n entityPermission: permission,\n isNew: false\n });\n existingRoleIds.add(role.ID);\n }\n }\n\n console.log('Loaded role permissions:', this.RolePermissions);\n\n // Set available roles (those not already configured)\n this.AvailableRoles = this.Data.roles.filter(role => !existingRoleIds.has(role.ID));\n \n console.log('Available roles for adding:', this.AvailableRoles.map(r => r.Name));\n \n // Trigger change detection to update the UI\n this.cdr.detectChanges();\n }\n\n public async AddRolePermission(role: MJRoleEntity): Promise<void> {\n // Create new EntityPermission entity\n const entityPermission = await this.metadata.GetEntityObject<MJEntityPermissionEntity>('MJ: Entity Permissions');\n entityPermission.NewRecord();\n entityPermission.EntityID = this.Data!.entity.ID;\n entityPermission.RoleID = role.ID;\n entityPermission.CanCreate = false;\n entityPermission.CanRead = true; // Default to read access\n entityPermission.CanUpdate = false;\n entityPermission.CanDelete = false;\n\n // Add new role permission\n this.RolePermissions.push({\n roleId: role.ID,\n roleName: role.Name || '',\n entityPermission: entityPermission,\n isNew: true\n });\n\n // Remove from available roles\n this.AvailableRoles = this.AvailableRoles.filter(r => !UUIDsEqual(r.ID, role.ID));\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link AddRolePermission}. */\n public async addRolePermission(role: MJRoleEntity): Promise<void> {\n return this.AddRolePermission(role);\n }\n\n public RemoveRolePermission(rolePermission: RolePermissions): void {\n // Add back to available roles if not new\n if (!rolePermission.isNew) {\n const role = this.Data?.roles.find(r => UUIDsEqual(r.ID, rolePermission.roleId));\n if (role) {\n this.AvailableRoles.push(role);\n this.AvailableRoles.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));\n }\n } else {\n // Add back to available roles\n const role = this.Data?.roles.find(r => UUIDsEqual(r.ID, rolePermission.roleId));\n if (role) {\n this.AvailableRoles.push(role);\n this.AvailableRoles.sort((a, b) => (a.Name || '').localeCompare(b.Name || ''));\n }\n }\n\n // Remove from role permissions\n this.RolePermissions = this.RolePermissions.filter(rp => rp.roleId !== rolePermission.roleId);\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link RemoveRolePermission}. */\n public removeRolePermission(rolePermission: RolePermissions): void {\n return this.RemoveRolePermission(rolePermission);\n }\n\n public async OnSubmit(): Promise<void> {\n if (!this.Data || !this.HasChanges) return;\n\n this.isLoading = true;\n this.error = null;\n\n try {\n // Process each role permission\n for (const rolePermission of this.RolePermissions) {\n if (rolePermission.isNew || rolePermission.entityPermission.Dirty) {\n await this.saveRolePermission(rolePermission);\n }\n }\n\n this.Result.emit({ action: 'save', entity: this.Data.entity });\n\n } catch (error: unknown) {\n console.error('Error saving permissions:', error);\n this.ngZone.run(() => {\n this.error = error instanceof Error ? error.message : 'An unexpected error occurred while saving permissions';\n this.cdr.markForCheck();\n });\n } finally {\n this.ngZone.run(() => {\n this.isLoading = false;\n this.cdr.markForCheck();\n });\n }\n }\n\n /** @deprecated Use {@link OnSubmit}. */\n public async onSubmit(): Promise<void> {\n return this.OnSubmit();\n }\n\n private async saveRolePermission(rolePermission: RolePermissions): Promise<void> {\n // Save the entity directly - it already has all the values bound\n const saveResult = await rolePermission.entityPermission.Save();\n if (!saveResult) {\n throw new Error(rolePermission.entityPermission.LatestResult?.Message || `Failed to save permissions for role ${rolePermission.roleName}`);\n }\n }\n\n public onCancel(): void {\n this.Result.emit({ action: 'cancel' });\n }\n}","<!-- MD3 Modal Dialog -->\n@if (visible) {\n <div class=\"modal-backdrop\" (click)=\"onCancel()\">\n <div class=\"modal-dialog\" (click)=\"$event.stopPropagation()\">\n <!-- Modal Header -->\n <div class=\"modal-header\">\n <div class=\"dialog-header\">\n <h2 class=\"dialog-title\">\n <i class=\"fa-solid fa-key\"></i>\n Edit Entity Permissions\n </h2>\n <p class=\"dialog-subtitle\">\n Configure role-based permissions for {{ data?.entity?.Name }}\n </p>\n </div>\n <button type=\"button\" class=\"modal-close\" (click)=\"onCancel()\" aria-label=\"Close dialog\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <!-- Modal Body -->\n <div class=\"modal-body\">\n <form [formGroup]=\"permissionForm\" (ngSubmit)=\"onSubmit()\">\n @if (error) {\n <div class=\"content-section\">\n <mj-alert Variant=\"error\" [Message]=\"error\" />\n </div>\n }\n <!-- Entity Information Section -->\n <div class=\"content-section\">\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-database\"></i>\n Entity Information\n </h3>\n <p class=\"section-description\">{{ data?.entity?.Description || 'Entity permissions configuration' }}</p>\n </div>\n <div class=\"entity-info-card\">\n <div class=\"entity-meta\">\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-table\"></i>\n <span class=\"meta-label\">Entity:</span>\n <span class=\"meta-value\">{{ data?.entity?.Name }}</span>\n </div>\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span class=\"meta-label\">Schema Name:</span>\n <span class=\"meta-value\">{{ data?.entity?.SchemaName || 'N/A' }}</span>\n </div>\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-key\"></i>\n <span class=\"meta-label\">Total Permissions:</span>\n <span class=\"meta-value\">{{ rolePermissions.length }}</span>\n </div>\n <div class=\"meta-item\">\n <i class=\"fa-solid fa-clock\"></i>\n <span class=\"meta-label\">Last Updated:</span>\n <span class=\"meta-value\">{{ data?.entity?.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Permissions Configuration Section -->\n <div class=\"content-section\">\n <div class=\"form-section\">\n <div class=\"section-header\">\n <h3 class=\"section-title\">\n <i class=\"fa-solid fa-users-cog\"></i>\n Role Permissions\n </h3>\n <p class=\"section-description\">Configure CRUD permissions for each role</p>\n </div>\n <div class=\"permissions-table-container\">\n <table class=\"permissions-table\">\n <thead>\n <tr>\n <th class=\"role-column\">Role</th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-plus\"></i>\n Create\n </th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-eye\"></i>\n Read\n </th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-edit\"></i>\n Update\n </th>\n <th class=\"permission-column\">\n <i class=\"fa-solid fa-trash\"></i>\n Delete\n </th>\n <th class=\"actions-column\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (rolePermission of rolePermissions; track rolePermission.roleId) {\n <tr class=\"permission-row\" [class.has-changes]=\"hasEntityChanges(rolePermission)\" [class.is-new]=\"rolePermission.isNew\">\n <td class=\"role-name\">\n <div class=\"role-info\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>{{ rolePermission.roleName }}</span>\n @if (rolePermission.isNew) {\n <span class=\"new-badge\">New</span>\n }\n @if (hasEntityChanges(rolePermission) && !rolePermission.isNew) {\n <span class=\"changed-badge\">Modified</span>\n }\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'create-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanCreate\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'create-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'read-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanRead\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'read-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'update-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanUpdate\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'update-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"permission-cell\">\n <div class=\"permission-toggle\">\n <input\n type=\"checkbox\"\n [id]=\"'delete-' + rolePermission.roleId\"\n [(ngModel)]=\"rolePermission.entityPermission.CanDelete\"\n [ngModelOptions]=\"{standalone: true}\"\n class=\"permission-checkbox\"\n />\n <label [for]=\"'delete-' + rolePermission.roleId\" class=\"permission-label\">\n <div class=\"checkbox-indicator\"></div>\n </label>\n </div>\n </td>\n <td class=\"actions-cell\">\n <button\n type=\"button\"\n class=\"btn-icon btn-danger\"\n (click)=\"removeRolePermission(rolePermission)\"\n title=\"Remove permissions for this role\"\n attr.aria-label=\"Remove permissions for {{ rolePermission.roleName }}\"\n >\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </td>\n </tr>\n }\n </tbody>\n </table>\n @if (rolePermissions.length === 0) {\n <div class=\"empty-permissions\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <p>No role permissions configured</p>\n <p class=\"empty-subtext\">Add permissions for specific roles to control access to this entity</p>\n </div>\n }\n </div>\n <!-- Add Role Permissions -->\n <div class=\"add-role-section\">\n <div class=\"add-role-header\">\n <h4>Add Role Permissions</h4>\n <p>Select roles to configure permissions for this entity</p>\n </div>\n <div class=\"available-roles\">\n @for (role of availableRoles; track role.ID) {\n <button\n type=\"button\"\n class=\"role-chip\"\n (click)=\"addRolePermission(role)\"\n title=\"Add permissions for {{ role.Name }}\"\n attr.aria-label=\"Add permissions for {{ role.Name }}\"\n >\n <i class=\"fa-solid fa-plus\"></i>\n {{ role.Name }}\n </button>\n }\n @if (availableRoles.length === 0) {\n <p class=\"no-available-roles\">All roles have been configured</p>\n }\n </div>\n </div>\n </div>\n </div>\n <!-- Modal Footer -->\n <div class=\"modal-footer\">\n <div class=\"footer-info\">\n @if (hasChanges) {\n <span class=\"changes-indicator\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n You have unsaved changes\n </span>\n }\n </div>\n <div class=\"footer-actions\">\n <button\n type=\"submit\"\n class=\"btn btn-primary\"\n [disabled]=\"!hasChanges || isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\"></i>\n Save Permissions\n }\n </button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"onCancel()\">\n <i class=\"fa-solid fa-times\"></i>\n Cancel\n </button>\n </div>\n </div>\n </form>\n </div>\n </div>\n </div>\n}\n"]}
|
|
@@ -43,10 +43,22 @@ interface NotificationPreferenceViewModel {
|
|
|
43
43
|
*/
|
|
44
44
|
export declare class NotificationPreferencesComponent extends BaseAngularComponent implements OnInit {
|
|
45
45
|
private sharedService;
|
|
46
|
-
|
|
46
|
+
Loading: boolean;
|
|
47
|
+
/** @deprecated Use {@link Loading}. */
|
|
48
|
+
get loading(): boolean;
|
|
49
|
+
/** @deprecated Use {@link Loading}. */
|
|
50
|
+
set loading(value: boolean);
|
|
47
51
|
saving: boolean;
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
ViewModels: NotificationPreferenceViewModel[];
|
|
53
|
+
/** @deprecated Use {@link ViewModels}. */
|
|
54
|
+
get viewModels(): NotificationPreferenceViewModel[];
|
|
55
|
+
/** @deprecated Use {@link ViewModels}. */
|
|
56
|
+
set viewModels(value: NotificationPreferenceViewModel[]);
|
|
57
|
+
HasChanges: boolean;
|
|
58
|
+
/** @deprecated Use {@link HasChanges}. */
|
|
59
|
+
get hasChanges(): boolean;
|
|
60
|
+
/** @deprecated Use {@link HasChanges}. */
|
|
61
|
+
set hasChanges(value: boolean);
|
|
50
62
|
constructor(sharedService: SharedService);
|
|
51
63
|
/**
|
|
52
64
|
* Angular lifecycle hook - initializes the component by loading notification preferences.
|
|
@@ -65,6 +77,8 @@ export declare class NotificationPreferencesComponent extends BaseAngularCompone
|
|
|
65
77
|
* Sets the global hasChanges flag to show/hide the save/cancel buttons.
|
|
66
78
|
* @param vm The view model for the notification type being modified
|
|
67
79
|
*/
|
|
80
|
+
OnChannelChange(vm: NotificationPreferenceViewModel): void;
|
|
81
|
+
/** @deprecated Use {@link OnChannelChange}. */
|
|
68
82
|
onChannelChange(vm: NotificationPreferenceViewModel): void;
|
|
69
83
|
/**
|
|
70
84
|
* Saves all changed notification preferences using a transaction group for batch updates.
|
|
@@ -85,6 +99,8 @@ export declare class NotificationPreferencesComponent extends BaseAngularCompone
|
|
|
85
99
|
* @param type The notification type entity
|
|
86
100
|
* @returns Font Awesome icon class (e.g., 'fa-bell'), defaults to 'fa-bell' if not specified
|
|
87
101
|
*/
|
|
102
|
+
GetTypeIcon(type: MJUserNotificationTypeEntity): string;
|
|
103
|
+
/** @deprecated Use {@link GetTypeIcon}. */
|
|
88
104
|
getTypeIcon(type: MJUserNotificationTypeEntity): string;
|
|
89
105
|
/**
|
|
90
106
|
* Gets the color hex code for a notification type.
|
|
@@ -92,6 +108,8 @@ export declare class NotificationPreferencesComponent extends BaseAngularCompone
|
|
|
92
108
|
* @param type The notification type entity
|
|
93
109
|
* @returns Hex color code (e.g., '#0076B6'), defaults to '#999' if not specified
|
|
94
110
|
*/
|
|
111
|
+
GetTypeColor(type: MJUserNotificationTypeEntity): string;
|
|
112
|
+
/** @deprecated Use {@link GetTypeColor}. */
|
|
95
113
|
getTypeColor(type: MJUserNotificationTypeEntity): string;
|
|
96
114
|
/**
|
|
97
115
|
* Gets the auto-expire duration in days for a notification type.
|
|
@@ -99,6 +117,8 @@ export declare class NotificationPreferencesComponent extends BaseAngularCompone
|
|
|
99
117
|
* @param type The notification type entity
|
|
100
118
|
* @returns Number of days until auto-expire, or null if not configured
|
|
101
119
|
*/
|
|
120
|
+
GetTypeAutoExpireDays(type: MJUserNotificationTypeEntity): number | null;
|
|
121
|
+
/** @deprecated Use {@link GetTypeAutoExpireDays}. */
|
|
102
122
|
getTypeAutoExpireDays(type: MJUserNotificationTypeEntity): number | null;
|
|
103
123
|
/**
|
|
104
124
|
* Checks if users are allowed to customize preferences for this notification type.
|
|
@@ -106,6 +126,8 @@ export declare class NotificationPreferencesComponent extends BaseAngularCompone
|
|
|
106
126
|
* @param type The notification type entity
|
|
107
127
|
* @returns True if user customization is allowed (default), false otherwise
|
|
108
128
|
*/
|
|
129
|
+
GetAllowUserPreference(type: MJUserNotificationTypeEntity): boolean;
|
|
130
|
+
/** @deprecated Use {@link GetAllowUserPreference}. */
|
|
109
131
|
getAllowUserPreference(type: MJUserNotificationTypeEntity): boolean;
|
|
110
132
|
static ɵfac: i0.ɵɵFactoryDeclaration<NotificationPreferencesComponent, never>;
|
|
111
133
|
static ɵcmp: i0.ɵɵComponentDeclaration<NotificationPreferencesComponent, "mj-notification-preferences", never, {}, {}, never, never, false, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-preferences.component.d.ts","sourceRoot":"","sources":["../../../src/lib/notification-preferences/notification-preferences.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,4BAA4B,EAAE,kCAAkC,EAAkB,MAAM,+BAA+B,CAAC;AACjI,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE;;;GAGG;AACH,UAAU,+BAA+B;IACvC,mDAAmD;IACnD,IAAI,EAAE,4BAA4B,CAAC;IACnC,gEAAgE;IAChE,UAAU,EAAE,kCAAkC,GAAG,IAAI,CAAC;IACtD,kDAAkD;IAClD,YAAY,EAAE,OAAO,CAAC;IACtB,iDAAiD;IACjD,YAAY,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uDAAuD;IACvD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,qDAAqD;IACrD,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;GAaG;AACH,qBAMa,gCAAiC,SAAQ,oBAAqB,YAAW,MAAM;
|
|
1
|
+
{"version":3,"file":"notification-preferences.component.d.ts","sourceRoot":"","sources":["../../../src/lib/notification-preferences/notification-preferences.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,4BAA4B,EAAE,kCAAkC,EAAkB,MAAM,+BAA+B,CAAC;AACjI,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE;;;GAGG;AACH,UAAU,+BAA+B;IACvC,mDAAmD;IACnD,IAAI,EAAE,4BAA4B,CAAC;IACnC,gEAAgE;IAChE,UAAU,EAAE,kCAAkC,GAAG,IAAI,CAAC;IACtD,kDAAkD;IAClD,YAAY,EAAE,OAAO,CAAC;IACtB,iDAAiD;IACjD,YAAY,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,UAAU,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uDAAuD;IACvD,oBAAoB,EAAE,OAAO,CAAC;IAC9B,qDAAqD;IACrD,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;GAaG;AACH,qBAMa,gCAAiC,SAAQ,oBAAqB,YAAW,MAAM;IAiC9E,OAAO,CAAC,aAAa;IAhCjC,OAAO,UAAQ;IAEf,uCAAuC;IACvC,IAAI,OAAO,YAEV;IACD,uCAAuC;IACvC,IAAI,OAAO,CAAC,KAAK,SAAA,EAEhB;IACD,MAAM,UAAS;IACf,UAAU,EAAE,+BAA+B,EAAE,CAAM;IAEnD,0CAA0C;IAC1C,IAAI,UAAU,IAAI,+BAA+B,EAAE,CAElD;IACD,0CAA0C;IAC1C,IAAI,UAAU,CAAC,KAAK,EAAE,+BAA+B,EAAE,EAEtD;IACD,UAAU,UAAS;IAEnB,0CAA0C;IAC1C,IAAI,UAAU,YAEb;IACD,0CAA0C;IAC1C,IAAI,UAAU,CAAC,KAAK,SAAA,EAEnB;gBAEmB,aAAa,EAAE,aAAa;IAGhD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;;;;OAKG;YACW,QAAQ;IAmDtB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,EAAE,+BAA+B,GAAG,IAAI;IAK1D,+CAA+C;IAC/C,eAAe,CAAC,EAAE,EAAE,+BAA+B,GAAG,IAAI;IAI1D;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4D3B;;;OAGG;IACH,MAAM,IAAI,IAAI;IAWd;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,4BAA4B,GAAG,MAAM;IAIvD,2CAA2C;IAC3C,WAAW,CAAC,IAAI,EAAE,4BAA4B,GAAG,MAAM;IAIvD;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,4BAA4B,GAAG,MAAM;IAIxD,4CAA4C;IAC5C,YAAY,CAAC,IAAI,EAAE,4BAA4B,GAAG,MAAM;IAIxD;;;;;OAKG;IACH,qBAAqB,CAAC,IAAI,EAAE,4BAA4B,GAAG,MAAM,GAAG,IAAI;IAIxE,qDAAqD;IACrD,qBAAqB,CAAC,IAAI,EAAE,4BAA4B,GAAG,MAAM,GAAG,IAAI;IAIxE;;;;;OAKG;IACH,sBAAsB,CAAC,IAAI,EAAE,4BAA4B,GAAG,OAAO;IAInE,sDAAsD;IACtD,sBAAsB,CAAC,IAAI,EAAE,4BAA4B,GAAG,OAAO;yCA9PxD,gCAAgC;2CAAhC,gCAAgC;CAiQ5C"}
|