@masterteam/delegations 0.0.16 → 0.0.17
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.
|
@@ -1166,6 +1166,8 @@ class DelegationForm {
|
|
|
1166
1166
|
formValue = toSignal(this.delegationFormControl.valueChanges);
|
|
1167
1167
|
detail = this.facade.detail;
|
|
1168
1168
|
isDetailLoading = this.facade.isLoadingDetail;
|
|
1169
|
+
scopePreview = this.facade.scopePreview;
|
|
1170
|
+
isPreviewingScope = this.facade.isPreviewingScope;
|
|
1169
1171
|
isSaving = this.facade.isSaving;
|
|
1170
1172
|
context = new HttpContext().set(REQUEST_CONTEXT, { useBaseUrl: false });
|
|
1171
1173
|
scope = signal(EMPTY_SCOPE, ...(ngDevMode ? [{ debugName: "scope" }] : /* istanbul ignore next */ []));
|
|
@@ -1340,11 +1342,15 @@ class DelegationForm {
|
|
|
1340
1342
|
this.facade.getDetail(editing.delegationId);
|
|
1341
1343
|
}
|
|
1342
1344
|
}
|
|
1343
|
-
canSubmit = computed(() => !this.readonly() &&
|
|
1345
|
+
canSubmit = computed(() => !this.readonly() &&
|
|
1346
|
+
this.scope().grants.length > 0 &&
|
|
1347
|
+
!!this.scopePreview() &&
|
|
1348
|
+
this.scopePreview().isValid &&
|
|
1349
|
+
!this.isPreviewingScope(), ...(ngDevMode ? [{ debugName: "canSubmit" }] : /* istanbul ignore next */ []));
|
|
1344
1350
|
onSubmit() {
|
|
1345
1351
|
if (this.readonly() || !this.delegationFormControl.valid)
|
|
1346
1352
|
return;
|
|
1347
|
-
if (this.
|
|
1353
|
+
if (!this.canSubmit())
|
|
1348
1354
|
return;
|
|
1349
1355
|
const v = this.delegationFormControl.value;
|
|
1350
1356
|
const base = {
|
|
@@ -1489,6 +1495,7 @@ class DelegationsList {
|
|
|
1489
1495
|
isLoading = computed(() => this.activeTab() === 'my'
|
|
1490
1496
|
? this.facade.isLoadingMy()
|
|
1491
1497
|
: this.facade.isLoadingAssigned(), ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
|
|
1498
|
+
scopeOptions = this.facade.scopeOptions;
|
|
1492
1499
|
rows = computed(() => this.activeTab() === 'my'
|
|
1493
1500
|
? this.facade.myItems()
|
|
1494
1501
|
: this.facade.assignedItems(), ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
|
|
@@ -1496,14 +1503,21 @@ class DelegationsList {
|
|
|
1496
1503
|
userCol = viewChild.required('userCol');
|
|
1497
1504
|
scopeCol = viewChild.required('scopeCol');
|
|
1498
1505
|
daysCol = viewChild.required('daysCol');
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1506
|
+
canCreate = computed(() => {
|
|
1507
|
+
if (this.adminMode())
|
|
1508
|
+
return true;
|
|
1509
|
+
return (this.scopeOptions()?.grants?.length ?? 0) > 0;
|
|
1510
|
+
}, ...(ngDevMode ? [{ debugName: "canCreate" }] : /* istanbul ignore next */ []));
|
|
1511
|
+
tableActions = computed(() => this.canCreate()
|
|
1512
|
+
? [
|
|
1513
|
+
{
|
|
1514
|
+
icon: 'general.plus',
|
|
1515
|
+
label: this.transloco.translate('delegations.action.create'),
|
|
1516
|
+
color: 'primary',
|
|
1517
|
+
action: () => this.openForm(null),
|
|
1518
|
+
},
|
|
1519
|
+
]
|
|
1520
|
+
: [], ...(ngDevMode ? [{ debugName: "tableActions" }] : /* istanbul ignore next */ []));
|
|
1507
1521
|
rowActions = signal([
|
|
1508
1522
|
{
|
|
1509
1523
|
icon: 'general.eye',
|
|
@@ -1562,6 +1576,7 @@ class DelegationsList {
|
|
|
1562
1576
|
label: this.transloco.translate('delegations.column.status'),
|
|
1563
1577
|
type: 'custom',
|
|
1564
1578
|
customCellTpl: this.statusCol(),
|
|
1579
|
+
width: '10rem',
|
|
1565
1580
|
},
|
|
1566
1581
|
{
|
|
1567
1582
|
key: this.activeTab() === 'my' ? 'delegatedUser' : 'delegator',
|
|
@@ -1570,33 +1585,39 @@ class DelegationsList {
|
|
|
1570
1585
|
: 'delegations.column.delegatorName'),
|
|
1571
1586
|
type: 'custom',
|
|
1572
1587
|
customCellTpl: this.userCol(),
|
|
1588
|
+
width: '16rem',
|
|
1573
1589
|
},
|
|
1574
1590
|
{
|
|
1575
1591
|
key: 'scopeSummary',
|
|
1576
1592
|
label: this.transloco.translate('delegations.column.scopeSummary'),
|
|
1577
1593
|
type: 'custom',
|
|
1578
1594
|
customCellTpl: this.scopeCol(),
|
|
1595
|
+
width: '16rem',
|
|
1579
1596
|
},
|
|
1580
1597
|
{
|
|
1581
1598
|
key: 'startsAtUtc',
|
|
1582
1599
|
label: this.transloco.translate('delegations.column.startDate'),
|
|
1583
1600
|
type: 'dateTime',
|
|
1601
|
+
width: '11rem',
|
|
1584
1602
|
},
|
|
1585
1603
|
{
|
|
1586
1604
|
key: 'endsAtUtc',
|
|
1587
1605
|
label: this.transloco.translate('delegations.column.endDate'),
|
|
1588
1606
|
type: 'dateTime',
|
|
1607
|
+
width: '11rem',
|
|
1589
1608
|
},
|
|
1590
1609
|
{
|
|
1591
1610
|
key: 'createdAtUtc',
|
|
1592
1611
|
label: this.transloco.translate('delegations.column.createdDate'),
|
|
1593
1612
|
type: 'dateTime',
|
|
1613
|
+
width: '11rem',
|
|
1594
1614
|
},
|
|
1595
1615
|
{
|
|
1596
1616
|
key: 'dayRuleMode',
|
|
1597
1617
|
label: this.transloco.translate('delegations.column.days'),
|
|
1598
1618
|
type: 'custom',
|
|
1599
1619
|
customCellTpl: this.daysCol(),
|
|
1620
|
+
width: '12rem',
|
|
1600
1621
|
},
|
|
1601
1622
|
], ...(ngDevMode ? [{ debugName: "tableColumns" }] : /* istanbul ignore next */ []));
|
|
1602
1623
|
busyIds = signal([], ...(ngDevMode ? [{ debugName: "busyIds" }] : /* istanbul ignore next */ []));
|
|
@@ -1610,6 +1631,9 @@ class DelegationsList {
|
|
|
1610
1631
|
'saturday',
|
|
1611
1632
|
];
|
|
1612
1633
|
ngOnInit() {
|
|
1634
|
+
if (!this.adminMode()) {
|
|
1635
|
+
this.facade.loadScopeOptions();
|
|
1636
|
+
}
|
|
1613
1637
|
this.loadCurrentTab();
|
|
1614
1638
|
}
|
|
1615
1639
|
switchTab(tab) {
|
|
@@ -1699,19 +1723,23 @@ class DelegationsList {
|
|
|
1699
1723
|
.subscribe({ next: () => this.reloadCurrentTab() });
|
|
1700
1724
|
}
|
|
1701
1725
|
startSession(row) {
|
|
1702
|
-
this.modal.openModal(StartSessionDialog, 'dialog', {
|
|
1726
|
+
const ref = this.modal.openModal(StartSessionDialog, 'dialog', {
|
|
1703
1727
|
header: this.transloco.translate('delegations.action.startSession'),
|
|
1704
1728
|
styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',
|
|
1705
1729
|
dismissableMask: true,
|
|
1706
1730
|
dismissible: true,
|
|
1707
1731
|
inputValues: { delegation: row, intent: 'start' },
|
|
1708
1732
|
});
|
|
1733
|
+
ref.onClose.subscribe((started) => {
|
|
1734
|
+
if (started)
|
|
1735
|
+
this.reloadCurrentTab();
|
|
1736
|
+
});
|
|
1709
1737
|
}
|
|
1710
1738
|
mark(key, on) {
|
|
1711
1739
|
this.busyIds.update((ids) => on ? [...ids, key] : ids.filter((id) => id !== key));
|
|
1712
1740
|
}
|
|
1713
1741
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DelegationsList, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1714
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: DelegationsList, isStandalone: true, selector: "mt-delegations-list", inputs: { showBreadcrumb: { classPropertyName: "showBreadcrumb", publicName: "showBreadcrumb", isSignal: true, isRequired: false, transformFunction: null }, adminMode: { classPropertyName: "adminMode", publicName: "adminMode", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "statusCol", first: true, predicate: ["statusCol"], descendants: true, isSignal: true }, { propertyName: "userCol", first: true, predicate: ["userCol"], descendants: true, isSignal: true }, { propertyName: "scopeCol", first: true, predicate: ["scopeCol"], descendants: true, isSignal: true }, { propertyName: "daysCol", first: true, predicate: ["daysCol"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col h-full gap-2 p-4\">\n @if (showBreadcrumb()) {\n <mt-breadcrumb [items]=\"breadcrumbItems()\"></mt-breadcrumb>\n }\n\n <div class=\"flex items-center gap-2 border-b border-gray-200\">\n @for (tab of tabs(); track tab.value) {\n <button\n type=\"button\"\n class=\"px-4 py-2 -mb-px border-b-2 text-sm font-medium transition-colors\"\n [class.border-primary]=\"activeTab() === tab.value\"\n [class.text-primary]=\"activeTab() === tab.value\"\n [class.border-transparent]=\"activeTab() !== tab.value\"\n [class.text-gray-500]=\"activeTab() !== tab.value\"\n (click)=\"switchTab(tab.value)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n\n <mt-table\n [data]=\"rows()\"\n [columns]=\"tableColumns()\"\n [actions]=\"tableActions()\"\n [rowActions]=\"rowActions()\"\n [loading]=\"isLoading()\"\n >\n <ng-template #statusCol let-row>\n <mt-delegation-status-chip\n [status]=\"row.effectiveStatus\"\n ></mt-delegation-status-chip>\n </ng-template>\n\n <ng-template #userCol let-row>\n @let party = activeTab() === \"my\" ? row.delegatedUser : row.delegator;\n <div class=\"flex items-center gap-2\">\n <mt-avatar icon=\"user.user-01\" styleClass=\"w-8! h-8!\"></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-sm text-gray-900 truncate\">\n {{ party?.displayName }}\n </span>\n @if (party?.email) {\n <span class=\"text-xs text-gray-500 truncate\">\n {{ party.email }}\n </span>\n }\n </div>\n </div>\n </ng-template>\n\n <ng-template #scopeCol let-row>\n <span class=\"text-sm text-gray-700\" [title]=\"row.scopeSummary\">\n {{ row.scopeSummary || \"\u2014\" }}\n </span>\n </ng-template>\n\n <ng-template #daysCol let-row>\n <span class=\"text-sm text-gray-700\">{{ formatDays(row) }}</span>\n </ng-template>\n </mt-table>\n </div>\n</ng-container>\n", styles: [":host{display:block;min-width:0}:host ::ng-deep mt-table .p-datatable-header>div,:host ::ng-deep mt-table .p-datatable-header>div>div{gap:.75rem;min-width:0;flex-wrap:wrap}:host ::ng-deep mt-table .p-datatable-header mt-tabs{display:block;max-width:100%;overflow-x:auto;padding-bottom:.25rem}:host ::ng-deep mt-table .p-datatable-header mt-text-field{display:block;flex:1 1 16rem;min-width:min(100%,16rem)}:host ::ng-deep mt-table .p-datatable-header .p-inputtext,:host ::ng-deep mt-table .p-datatable-header .p-inputwrapper,:host ::ng-deep mt-table .p-datatable-header .p-selectbutton{width:100%;max-width:100%}@media(max-width:1024px){:host ::ng-deep mt-table .p-datatable-header>div{flex-direction:column;align-items:stretch}:host ::ng-deep mt-table .p-datatable-header>div>div{width:100%;justify-content:flex-start}:host ::ng-deep mt-table .p-datatable-header mt-text-field{flex-basis:100%;min-width:0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "component", type: Breadcrumb, selector: "mt-breadcrumb", inputs: ["items", "styleClass"], outputs: ["onItemClick"] }, { kind: "component", type: Table, selector: "mt-table", inputs: ["filters", "data", "columns", "rowActions", "size", "showGridlines", "stripedRows", "selectableRows", "clickableRows", "generalSearch", "lazyLocalSearch", "showFilters", "filterMode", "loading", "updating", "lazy", "lazyLocalSort", "lazyTotalRecords", "reorderableColumns", "reorderableRows", "dataKey", "storageKey", "storageMode", "exportable", "printable", "groupable", "cellClickFilter", "freezeActions", "printTitle", "exportFilename", "actionShape", "rowActionsLoadingFn", "tableLayout", "noCard", "tabs", "tabsOptionLabel", "tabsOptionValue", "activeTab", "actions", "paginatorPosition", "alwaysShowPaginator", "rowsPerPageOptions", "pageSize", "currentPage", "first", "filterTerm", "groupBy"], outputs: ["selectionChange", "cellChange", "lazyLoad", "columnReorder", "rowReorder", "rowClick", "rowActionsRequested", "filtersChange", "activeTabChange", "onTabChange", "pageSizeChange", "currentPageChange", "firstChange", "filterTermChange", "groupByChange"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: DelegationStatusChip, selector: "mt-delegation-status-chip", inputs: ["status"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1742
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: DelegationsList, isStandalone: true, selector: "mt-delegations-list", inputs: { showBreadcrumb: { classPropertyName: "showBreadcrumb", publicName: "showBreadcrumb", isSignal: true, isRequired: false, transformFunction: null }, adminMode: { classPropertyName: "adminMode", publicName: "adminMode", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "statusCol", first: true, predicate: ["statusCol"], descendants: true, isSignal: true }, { propertyName: "userCol", first: true, predicate: ["userCol"], descendants: true, isSignal: true }, { propertyName: "scopeCol", first: true, predicate: ["scopeCol"], descendants: true, isSignal: true }, { propertyName: "daysCol", first: true, predicate: ["daysCol"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col h-full gap-2 p-4\">\n @if (showBreadcrumb()) {\n <mt-breadcrumb [items]=\"breadcrumbItems()\"></mt-breadcrumb>\n }\n\n <div class=\"flex items-center gap-2 border-b border-gray-200\">\n @for (tab of tabs(); track tab.value) {\n <button\n type=\"button\"\n class=\"px-4 py-2 -mb-px border-b-2 text-sm font-medium transition-colors\"\n [class.border-primary]=\"activeTab() === tab.value\"\n [class.text-primary]=\"activeTab() === tab.value\"\n [class.border-transparent]=\"activeTab() !== tab.value\"\n [class.text-gray-500]=\"activeTab() !== tab.value\"\n (click)=\"switchTab(tab.value)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n\n <mt-table\n [data]=\"rows()\"\n [columns]=\"tableColumns()\"\n [actions]=\"tableActions()\"\n [rowActions]=\"rowActions()\"\n [freezeActions]=\"true\"\n [loading]=\"isLoading()\"\n >\n <ng-template #statusCol let-row>\n <mt-delegation-status-chip\n [status]=\"row.effectiveStatus\"\n ></mt-delegation-status-chip>\n </ng-template>\n\n <ng-template #userCol let-row>\n @let party = activeTab() === \"my\" ? row.delegatedUser : row.delegator;\n <div class=\"flex items-center gap-2\">\n <mt-avatar icon=\"user.user-01\" styleClass=\"w-8! h-8!\"></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-sm text-gray-900 truncate\">\n {{ party?.displayName }}\n </span>\n @if (party?.email) {\n <span class=\"text-xs text-gray-500 truncate\">\n {{ party.email }}\n </span>\n }\n </div>\n </div>\n </ng-template>\n\n <ng-template #scopeCol let-row>\n <span class=\"text-sm text-gray-700\" [title]=\"row.scopeSummary\">\n {{ row.scopeSummary || \"\u2014\" }}\n </span>\n </ng-template>\n\n <ng-template #daysCol let-row>\n <span class=\"text-sm text-gray-700\">{{ formatDays(row) }}</span>\n </ng-template>\n </mt-table>\n </div>\n</ng-container>\n", styles: [":host{display:block;min-width:0}:host ::ng-deep mt-table .p-datatable-table{min-width:72rem}:host ::ng-deep mt-table .p-datatable-header>div,:host ::ng-deep mt-table .p-datatable-header>div>div{gap:.75rem;min-width:0;flex-wrap:wrap}:host ::ng-deep mt-table .p-datatable-header mt-tabs{display:block;max-width:100%;overflow-x:auto;padding-bottom:.25rem}:host ::ng-deep mt-table .p-datatable-header mt-text-field{display:block;flex:1 1 16rem;min-width:min(100%,16rem)}:host ::ng-deep mt-table .p-datatable-header .p-inputtext,:host ::ng-deep mt-table .p-datatable-header .p-inputwrapper,:host ::ng-deep mt-table .p-datatable-header .p-selectbutton{width:100%;max-width:100%}@media(max-width:1024px){:host ::ng-deep mt-table .p-datatable-header>div{flex-direction:column;align-items:stretch}:host ::ng-deep mt-table .p-datatable-header>div>div{width:100%;justify-content:flex-start}:host ::ng-deep mt-table .p-datatable-header mt-text-field{flex-basis:100%;min-width:0}}@media(max-width:768px){:host ::ng-deep mt-table .p-datatable-table{min-width:64rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "component", type: Breadcrumb, selector: "mt-breadcrumb", inputs: ["items", "styleClass"], outputs: ["onItemClick"] }, { kind: "component", type: Table, selector: "mt-table", inputs: ["filters", "data", "columns", "rowActions", "size", "showGridlines", "stripedRows", "selectableRows", "clickableRows", "generalSearch", "lazyLocalSearch", "showFilters", "filterMode", "loading", "updating", "lazy", "lazyLocalSort", "lazyTotalRecords", "reorderableColumns", "reorderableRows", "dataKey", "storageKey", "storageMode", "exportable", "printable", "groupable", "cellClickFilter", "freezeActions", "printTitle", "exportFilename", "actionShape", "rowActionsLoadingFn", "tableLayout", "noCard", "tabs", "tabsOptionLabel", "tabsOptionValue", "activeTab", "actions", "paginatorPosition", "alwaysShowPaginator", "rowsPerPageOptions", "pageSize", "currentPage", "first", "filterTerm", "groupBy"], outputs: ["selectionChange", "cellChange", "lazyLoad", "columnReorder", "rowReorder", "rowClick", "rowActionsRequested", "filtersChange", "activeTabChange", "onTabChange", "pageSizeChange", "currentPageChange", "firstChange", "filterTermChange", "groupByChange"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: DelegationStatusChip, selector: "mt-delegation-status-chip", inputs: ["status"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1715
1743
|
}
|
|
1716
1744
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DelegationsList, decorators: [{
|
|
1717
1745
|
type: Component,
|
|
@@ -1722,7 +1750,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
1722
1750
|
Table,
|
|
1723
1751
|
TranslocoDirective,
|
|
1724
1752
|
DelegationStatusChip,
|
|
1725
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col h-full gap-2 p-4\">\n @if (showBreadcrumb()) {\n <mt-breadcrumb [items]=\"breadcrumbItems()\"></mt-breadcrumb>\n }\n\n <div class=\"flex items-center gap-2 border-b border-gray-200\">\n @for (tab of tabs(); track tab.value) {\n <button\n type=\"button\"\n class=\"px-4 py-2 -mb-px border-b-2 text-sm font-medium transition-colors\"\n [class.border-primary]=\"activeTab() === tab.value\"\n [class.text-primary]=\"activeTab() === tab.value\"\n [class.border-transparent]=\"activeTab() !== tab.value\"\n [class.text-gray-500]=\"activeTab() !== tab.value\"\n (click)=\"switchTab(tab.value)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n\n <mt-table\n [data]=\"rows()\"\n [columns]=\"tableColumns()\"\n [actions]=\"tableActions()\"\n [rowActions]=\"rowActions()\"\n [loading]=\"isLoading()\"\n >\n <ng-template #statusCol let-row>\n <mt-delegation-status-chip\n [status]=\"row.effectiveStatus\"\n ></mt-delegation-status-chip>\n </ng-template>\n\n <ng-template #userCol let-row>\n @let party = activeTab() === \"my\" ? row.delegatedUser : row.delegator;\n <div class=\"flex items-center gap-2\">\n <mt-avatar icon=\"user.user-01\" styleClass=\"w-8! h-8!\"></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-sm text-gray-900 truncate\">\n {{ party?.displayName }}\n </span>\n @if (party?.email) {\n <span class=\"text-xs text-gray-500 truncate\">\n {{ party.email }}\n </span>\n }\n </div>\n </div>\n </ng-template>\n\n <ng-template #scopeCol let-row>\n <span class=\"text-sm text-gray-700\" [title]=\"row.scopeSummary\">\n {{ row.scopeSummary || \"\u2014\" }}\n </span>\n </ng-template>\n\n <ng-template #daysCol let-row>\n <span class=\"text-sm text-gray-700\">{{ formatDays(row) }}</span>\n </ng-template>\n </mt-table>\n </div>\n</ng-container>\n", styles: [":host{display:block;min-width:0}:host ::ng-deep mt-table .p-datatable-header>div,:host ::ng-deep mt-table .p-datatable-header>div>div{gap:.75rem;min-width:0;flex-wrap:wrap}:host ::ng-deep mt-table .p-datatable-header mt-tabs{display:block;max-width:100%;overflow-x:auto;padding-bottom:.25rem}:host ::ng-deep mt-table .p-datatable-header mt-text-field{display:block;flex:1 1 16rem;min-width:min(100%,16rem)}:host ::ng-deep mt-table .p-datatable-header .p-inputtext,:host ::ng-deep mt-table .p-datatable-header .p-inputwrapper,:host ::ng-deep mt-table .p-datatable-header .p-selectbutton{width:100%;max-width:100%}@media(max-width:1024px){:host ::ng-deep mt-table .p-datatable-header>div{flex-direction:column;align-items:stretch}:host ::ng-deep mt-table .p-datatable-header>div>div{width:100%;justify-content:flex-start}:host ::ng-deep mt-table .p-datatable-header mt-text-field{flex-basis:100%;min-width:0}}\n"] }]
|
|
1753
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col h-full gap-2 p-4\">\n @if (showBreadcrumb()) {\n <mt-breadcrumb [items]=\"breadcrumbItems()\"></mt-breadcrumb>\n }\n\n <div class=\"flex items-center gap-2 border-b border-gray-200\">\n @for (tab of tabs(); track tab.value) {\n <button\n type=\"button\"\n class=\"px-4 py-2 -mb-px border-b-2 text-sm font-medium transition-colors\"\n [class.border-primary]=\"activeTab() === tab.value\"\n [class.text-primary]=\"activeTab() === tab.value\"\n [class.border-transparent]=\"activeTab() !== tab.value\"\n [class.text-gray-500]=\"activeTab() !== tab.value\"\n (click)=\"switchTab(tab.value)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n\n <mt-table\n [data]=\"rows()\"\n [columns]=\"tableColumns()\"\n [actions]=\"tableActions()\"\n [rowActions]=\"rowActions()\"\n [freezeActions]=\"true\"\n [loading]=\"isLoading()\"\n >\n <ng-template #statusCol let-row>\n <mt-delegation-status-chip\n [status]=\"row.effectiveStatus\"\n ></mt-delegation-status-chip>\n </ng-template>\n\n <ng-template #userCol let-row>\n @let party = activeTab() === \"my\" ? row.delegatedUser : row.delegator;\n <div class=\"flex items-center gap-2\">\n <mt-avatar icon=\"user.user-01\" styleClass=\"w-8! h-8!\"></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-sm text-gray-900 truncate\">\n {{ party?.displayName }}\n </span>\n @if (party?.email) {\n <span class=\"text-xs text-gray-500 truncate\">\n {{ party.email }}\n </span>\n }\n </div>\n </div>\n </ng-template>\n\n <ng-template #scopeCol let-row>\n <span class=\"text-sm text-gray-700\" [title]=\"row.scopeSummary\">\n {{ row.scopeSummary || \"\u2014\" }}\n </span>\n </ng-template>\n\n <ng-template #daysCol let-row>\n <span class=\"text-sm text-gray-700\">{{ formatDays(row) }}</span>\n </ng-template>\n </mt-table>\n </div>\n</ng-container>\n", styles: [":host{display:block;min-width:0}:host ::ng-deep mt-table .p-datatable-table{min-width:72rem}:host ::ng-deep mt-table .p-datatable-header>div,:host ::ng-deep mt-table .p-datatable-header>div>div{gap:.75rem;min-width:0;flex-wrap:wrap}:host ::ng-deep mt-table .p-datatable-header mt-tabs{display:block;max-width:100%;overflow-x:auto;padding-bottom:.25rem}:host ::ng-deep mt-table .p-datatable-header mt-text-field{display:block;flex:1 1 16rem;min-width:min(100%,16rem)}:host ::ng-deep mt-table .p-datatable-header .p-inputtext,:host ::ng-deep mt-table .p-datatable-header .p-inputwrapper,:host ::ng-deep mt-table .p-datatable-header .p-selectbutton{width:100%;max-width:100%}@media(max-width:1024px){:host ::ng-deep mt-table .p-datatable-header>div{flex-direction:column;align-items:stretch}:host ::ng-deep mt-table .p-datatable-header>div>div{width:100%;justify-content:flex-start}:host ::ng-deep mt-table .p-datatable-header mt-text-field{flex-basis:100%;min-width:0}}@media(max-width:768px){:host ::ng-deep mt-table .p-datatable-table{min-width:64rem}}\n"] }]
|
|
1726
1754
|
}], propDecorators: { showBreadcrumb: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBreadcrumb", required: false }] }], adminMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "adminMode", required: false }] }], statusCol: [{ type: i0.ViewChild, args: ['statusCol', { isSignal: true }] }], userCol: [{ type: i0.ViewChild, args: ['userCol', { isSignal: true }] }], scopeCol: [{ type: i0.ViewChild, args: ['scopeCol', { isSignal: true }] }], daysCol: [{ type: i0.ViewChild, args: ['daysCol', { isSignal: true }] }] } });
|
|
1727
1755
|
|
|
1728
1756
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-delegations.mjs","sources":["../../../../packages/masterteam/delegations/src/lib/delegations/delegation-status-chip/delegation-status-chip.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.actions.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.model.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.state.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.facade.ts","../../../../packages/masterteam/delegations/src/lib/delegations/start-session-dialog/start-session-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/start-session-dialog/start-session-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/topbar-delegation-menu/topbar-delegation-menu.ts","../../../../packages/masterteam/delegations/src/lib/delegations/topbar-delegation-menu/topbar-delegation-menu.html","../../../../packages/masterteam/delegations/src/store/delegations/delegations.actions.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.model.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.state.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.facade.ts","../../../../packages/masterteam/delegations/src/lib/delegations/reject-delegation-dialog/reject-delegation-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/reject-delegation-dialog/reject-delegation-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegations.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegations.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/scope-picker/scope-picker.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/scope-picker/scope-picker.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/delegation-form.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/delegation-form.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-detail-drawer/delegation-detail-drawer.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-detail-drawer/delegation-detail-drawer.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegations-list/delegations-list.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegations-list/delegations-list.html","../../../../packages/masterteam/delegations/src/interceptors/app-delegation.interceptor.ts","../../../../packages/masterteam/delegations/src/store/index.ts","../../../../packages/masterteam/delegations/src/public-api.ts","../../../../packages/masterteam/delegations/src/masterteam-delegations.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Chip } from '@masterteam/components/chip';\nimport { DelegationEffectiveStatus } from '../../../store/delegations/delegations.model';\n\ninterface StatusVisual {\n i18nKey: string;\n styleClass: string;\n}\n\nconst STATUS_VISUAL: Record<DelegationEffectiveStatus, StatusVisual> = {\n Active: {\n i18nKey: 'delegations.status.active',\n styleClass: 'mt-status-chip mt-status-chip--active',\n },\n Scheduled: {\n i18nKey: 'delegations.status.scheduled',\n styleClass: 'mt-status-chip mt-status-chip--scheduled',\n },\n PendingApproval: {\n i18nKey: 'delegations.status.pendingApproval',\n styleClass: 'mt-status-chip mt-status-chip--pending',\n },\n InactiveToday: {\n i18nKey: 'delegations.status.inactiveToday',\n styleClass: 'mt-status-chip mt-status-chip--scheduled',\n },\n Expired: {\n i18nKey: 'delegations.status.expired',\n styleClass: 'mt-status-chip mt-status-chip--expired',\n },\n Rejected: {\n i18nKey: 'delegations.status.rejected',\n styleClass: 'mt-status-chip mt-status-chip--rejected',\n },\n Cancelled: {\n i18nKey: 'delegations.status.cancelled',\n styleClass: 'mt-status-chip mt-status-chip--cancelled',\n },\n};\n\n@Component({\n selector: 'mt-delegation-status-chip',\n standalone: true,\n imports: [Chip, TranslocoDirective],\n template: `\n <ng-container *transloco=\"let t\">\n @let v = visual();\n <mt-chip [label]=\"t(v.i18nKey)\" [styleClass]=\"v.styleClass\"></mt-chip>\n </ng-container>\n `,\n styles: [\n `\n :host {\n display: inline-flex;\n }\n :host ::ng-deep .mt-status-chip {\n font-weight: 500;\n font-size: 0.75rem;\n border-radius: 9999px;\n padding-inline: 0.625rem;\n padding-block: 0.125rem;\n }\n :host ::ng-deep .mt-status-chip--active {\n background-color: rgb(220 252 231);\n color: rgb(22 101 52);\n }\n :host ::ng-deep .mt-status-chip--scheduled {\n background-color: rgb(219 234 254);\n color: rgb(30 64 175);\n }\n :host ::ng-deep .mt-status-chip--pending {\n background-color: rgb(254 249 195);\n color: rgb(133 77 14);\n }\n :host ::ng-deep .mt-status-chip--expired {\n background-color: rgb(243 244 246);\n color: rgb(75 85 99);\n }\n :host ::ng-deep .mt-status-chip--rejected {\n background-color: rgb(254 226 226);\n color: rgb(153 27 27);\n }\n :host ::ng-deep .mt-status-chip--cancelled {\n background-color: rgb(229 231 235);\n color: rgb(55 65 81);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--active {\n background-color: rgba(34, 197, 94, 0.2);\n color: rgb(134 239 172);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--scheduled {\n background-color: rgba(59, 130, 246, 0.2);\n color: rgb(147 197 253);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--pending {\n background-color: rgba(234, 179, 8, 0.2);\n color: rgb(253 224 71);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--expired {\n background-color: rgba(148, 163, 184, 0.2);\n color: rgb(203 213 225);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--rejected {\n background-color: rgba(239, 68, 68, 0.2);\n color: rgb(252 165 165);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--cancelled {\n background-color: rgba(148, 163, 184, 0.15);\n color: rgb(203 213 225);\n }\n `,\n ],\n})\nexport class DelegationStatusChip {\n readonly status = input.required<DelegationEffectiveStatus>();\n\n protected readonly visual = computed<StatusVisual>(\n () => STATUS_VISUAL[this.status()] ?? STATUS_VISUAL.Scheduled,\n );\n}\n","import { DelegationRow } from '../delegations/delegations.model';\nimport { DelegationSessionInvalidationReason } from './delegation-session.model';\n\n/** Fetch the active delegations the current user may start (user/activedelegations). */\nexport class LoadDelegationCandidates {\n static readonly type = '[DelegationSession] Load Candidates';\n}\n\n/** Start a delegated session for the given assignment row. */\nexport class StartDelegationSession {\n static readonly type = '[DelegationSession] Start';\n constructor(public delegation: DelegationRow) {}\n}\n\n/** End the current delegated session. Client-local only (doc 05). */\nexport class EndDelegationSession {\n static readonly type = '[DelegationSession] End';\n constructor(public reason: DelegationSessionInvalidationReason = 'Manual') {}\n}\n\n/** Switch directly from the current session to another delegation. */\nexport class SwitchDelegationSession {\n static readonly type = '[DelegationSession] Switch';\n constructor(public delegation: DelegationRow) {}\n}\n","import { LoadingStateShape } from '../utils/state-helpers';\nimport { DelegationRow } from '../delegations/delegations.model';\n\n/**\n * Active delegated session. Memory-only by design (doc 05):\n * the delegation token is never persisted to long-lived storage.\n *\n * `delegation.delegatedUser` is the executed-by (actual logged-in) user and\n * `delegation.delegator` is the on-behalf-of user — both already present on the\n * row from the active-delegations endpoint.\n */\nexport interface ActiveDelegationSession {\n token: string;\n delegation: DelegationRow;\n}\n\nexport type DelegationSessionInvalidationReason =\n | 'TokenInvalid'\n | 'SessionMismatch'\n | 'ScopeChanged'\n | 'Forbidden'\n | 'Logout'\n | 'UserSwitch'\n | 'Manual';\n\nexport enum DelegationSessionActionKey {\n LoadCandidates = 'loadCandidates',\n StartSession = 'startSession',\n}\n\nexport interface DelegationSessionStateModel extends LoadingStateShape<DelegationSessionActionKey> {\n active: ActiveDelegationSession | null;\n candidates: DelegationRow[];\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport {\n Action,\n Actions,\n ofActionDispatched,\n ofActionSuccessful,\n Selector,\n State,\n StateContext,\n Store,\n} from '@ngxs/store';\nimport { handleApiRequest } from '@masterteam/components';\nimport { EMPTY, switchMap } from 'rxjs';\nimport { Response } from '../delegations/api.model';\nimport {\n DelegationPage,\n DelegationRow,\n} from '../delegations/delegations.model';\nimport {\n EndDelegationSession,\n LoadDelegationCandidates,\n StartDelegationSession,\n SwitchDelegationSession,\n} from './delegation-session.actions';\nimport {\n ActiveDelegationSession,\n DelegationSessionActionKey,\n DelegationSessionStateModel,\n} from './delegation-session.model';\n\nconst BASE = 'identity/delegations';\n\n// Action shells matching gateway-auth type strings — loose coupling, matched by\n// `type` only so this package does not depend on @masterteam/gateway-auth.\nclass GatewayLoginSuccessShell {\n static readonly type = '[Auth] Login Success';\n}\nclass GatewayLogoutShell {\n static readonly type = '[Auth] Logout';\n}\n\nfunction canStart(row: DelegationRow): boolean {\n return (\n row.effectiveStatus === 'Active' &&\n row.allowedActions?.includes('StartSession')\n );\n}\n\n@State<DelegationSessionStateModel>({\n name: 'delegationSession',\n defaults: {\n active: null,\n candidates: [],\n loadingActive: [],\n errors: {},\n },\n})\n@Injectable()\nexport class DelegationSessionState {\n private http = inject(HttpClient);\n private actions$ = inject(Actions);\n private store = inject(Store);\n\n constructor() {\n this.actions$\n .pipe(ofActionSuccessful(GatewayLoginSuccessShell))\n .subscribe(() => this.store.dispatch(new LoadDelegationCandidates()));\n\n this.actions$\n .pipe(ofActionDispatched(GatewayLogoutShell))\n .subscribe(() => this.store.dispatch(new EndDelegationSession('Logout')));\n }\n\n // ---------------------------------------------------------------------------\n // Selectors\n // ---------------------------------------------------------------------------\n\n @Selector()\n static getActive(\n state: DelegationSessionStateModel,\n ): ActiveDelegationSession | null {\n return state.active;\n }\n\n @Selector()\n static getCandidates(state: DelegationSessionStateModel): DelegationRow[] {\n return state.candidates;\n }\n\n @Selector()\n static isDelegated(state: DelegationSessionStateModel): boolean {\n return !!state.active;\n }\n\n @Selector()\n static getLoadingActive(state: DelegationSessionStateModel): string[] {\n return state.loadingActive;\n }\n\n @Selector()\n static getErrors(\n state: DelegationSessionStateModel,\n ): Record<string, string | null | undefined> {\n return state.errors;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n @Action(LoadDelegationCandidates)\n loadCandidates(ctx: StateContext<DelegationSessionStateModel>) {\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\n `${BASE}/user/activedelegations`,\n );\n return handleApiRequest({\n ctx,\n key: DelegationSessionActionKey.LoadCandidates,\n request$: req$,\n onSuccess: (response) => ({\n candidates: (response.data?.items ?? []).filter(canStart),\n }),\n });\n }\n\n @Action(StartDelegationSession)\n start(\n ctx: StateContext<DelegationSessionStateModel>,\n { delegation }: StartDelegationSession,\n ) {\n const req$ = this.http.post<Response<string>>(\n `${BASE}/delegationToken/${delegation.delegationId}`,\n {},\n );\n return handleApiRequest({\n ctx,\n key: DelegationSessionActionKey.StartSession,\n request$: req$,\n onSuccess: (response) => ({\n active: { token: response.data, delegation } as ActiveDelegationSession,\n }),\n });\n }\n\n @Action(EndDelegationSession)\n end(ctx: StateContext<DelegationSessionStateModel>) {\n // Client-local only — there is no server end-session endpoint (doc 05).\n ctx.patchState({ active: null });\n return EMPTY;\n }\n\n @Action(SwitchDelegationSession)\n switch(\n ctx: StateContext<DelegationSessionStateModel>,\n { delegation }: SwitchDelegationSession,\n ) {\n return this.store\n .dispatch(new EndDelegationSession('Manual'))\n .pipe(\n switchMap(() =>\n this.store.dispatch(new StartDelegationSession(delegation)),\n ),\n );\n }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { select, Store } from '@ngxs/store';\nimport {\n EndDelegationSession,\n LoadDelegationCandidates,\n StartDelegationSession,\n SwitchDelegationSession,\n} from './delegation-session.actions';\nimport {\n DelegationSessionActionKey,\n DelegationSessionInvalidationReason,\n} from './delegation-session.model';\nimport { DelegationSessionState } from './delegation-session.state';\nimport { DelegationRow } from '../delegations/delegations.model';\n\n@Injectable({ providedIn: 'root' })\nexport class DelegationSessionFacade {\n private readonly store = inject(Store);\n\n // ---------------------------------------------------------------------------\n // Data slices\n // ---------------------------------------------------------------------------\n readonly active = select(DelegationSessionState.getActive);\n readonly candidates = select(DelegationSessionState.getCandidates);\n readonly isDelegated = select(DelegationSessionState.isDelegated);\n\n private readonly loadingActive = select(\n DelegationSessionState.getLoadingActive,\n );\n\n // ---------------------------------------------------------------------------\n // Derived (interceptor + topbar)\n // ---------------------------------------------------------------------------\n /** Raw delegation token for the `app-delegation` header. */\n readonly token = computed(() => this.active()?.token ?? null);\n /** On-behalf-of (delegator). */\n readonly onBehalfOf = computed(\n () => this.active()?.delegation.delegator ?? null,\n );\n /** Executed-by (actual logged-in / delegated user). */\n readonly executedBy = computed(\n () => this.active()?.delegation.delegatedUser ?? null,\n );\n readonly hasCandidates = computed(() => this.candidates().length > 0);\n\n readonly isStarting = computed(() =>\n this.loadingActive().includes(DelegationSessionActionKey.StartSession),\n );\n readonly isLoadingCandidates = computed(() =>\n this.loadingActive().includes(DelegationSessionActionKey.LoadCandidates),\n );\n\n // ---------------------------------------------------------------------------\n // Dispatchers\n // ---------------------------------------------------------------------------\n loadCandidates() {\n return this.store.dispatch(new LoadDelegationCandidates());\n }\n startSession(delegation: DelegationRow) {\n return this.store.dispatch(new StartDelegationSession(delegation));\n }\n switchSession(delegation: DelegationRow) {\n return this.store.dispatch(new SwitchDelegationSession(delegation));\n }\n endSession(reason: DelegationSessionInvalidationReason = 'Manual') {\n return this.store.dispatch(new EndDelegationSession(reason));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\n\n/**\n * Confirmation dialog before starting (or switching to) a delegated session.\n * Calls the facade, which POSTs to `delegationToken/{id}` and stores the raw\n * token in memory only.\n */\n@Component({\n selector: 'mt-start-session-dialog',\n standalone: true,\n imports: [CommonModule, Avatar, Button, TranslocoDirective],\n templateUrl: './start-session-dialog.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class StartSessionDialog {\n readonly delegation = input.required<DelegationRow>();\n readonly intent = input<'start' | 'switch'>('start');\n\n private readonly ref: ModalRef = inject(ModalRef);\n private readonly facade = inject(DelegationSessionFacade);\n\n protected readonly isBusy = this.facade.isStarting;\n\n protected readonly bodyKey = computed(() =>\n this.intent() === 'switch'\n ? 'delegations.session.switchConfirmBody'\n : 'delegations.session.startConfirmBody',\n );\n\n confirm(): void {\n const row = this.delegation();\n const op$ =\n this.intent() === 'switch'\n ? this.facade.switchSession(row)\n : this.facade.startSession(row);\n op$.subscribe({\n next: () => this.ref.close(true),\n error: () => {\n /* error surfaced via shared toast pipeline; keep dialog open */\n },\n });\n }\n\n cancel(): void {\n this.ref.close(false);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col gap-4 p-2\">\n <div class=\"flex items-start gap-3\">\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-12! h-12! text-lg! bg-surface-200!\"\n ></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <div class=\"text-base font-medium text-gray-900 truncate\">\n {{ delegation().delegator.displayName }}\n </div>\n @if (delegation().delegator.email) {\n <div class=\"text-xs text-gray-500 truncate\">\n {{ delegation().delegator.email }}\n </div>\n }\n @if (delegation().scopeSummary) {\n <div class=\"text-xs text-gray-500 mt-1\">\n {{ t(\"delegations.column.scopeSummary\") }}:\n {{ delegation().scopeSummary }}\n </div>\n }\n </div>\n </div>\n\n <p class=\"text-sm text-gray-600 leading-relaxed\">\n {{ t(bodyKey()) }}\n </p>\n\n <div class=\"flex justify-end gap-2 pt-2 border-t border-gray-200\">\n <mt-button\n variant=\"outlined\"\n color=\"secondary\"\n [label]=\"t('delegations.common.cancel')\"\n [disabled]=\"isBusy()\"\n (click)=\"cancel()\"\n ></mt-button>\n <mt-button\n color=\"primary\"\n icon=\"user.users-check\"\n [label]=\"t('delegations.action.startSession')\"\n [loading]=\"isBusy()\"\n (click)=\"confirm()\"\n ></mt-button>\n </div>\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n viewChild,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { Button } from '@masterteam/components/button';\nimport { ModalService } from '@masterteam/components/modal';\nimport { Icon } from '@masterteam/icons';\nimport { Popover } from 'primeng/popover';\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\n\n/**\n * Topbar surface for the delegation runtime (doc 05, 09).\n *\n * State A — no candidates, no active session: renders nothing.\n * State B — candidates exist, no active session: lets the user start a session.\n * State C — active delegated session: shows \"Acting on behalf of {delegator}\" +\n * \"Executed by {actual user}\", plus Back / Switch.\n */\n@Component({\n selector: 'mt-topbar-delegation-menu',\n standalone: true,\n imports: [\n CommonModule,\n Avatar,\n Button,\n Icon,\n Popover,\n RouterLink,\n TranslocoDirective,\n DelegationStatusChip,\n ],\n templateUrl: './topbar-delegation-menu.html',\n styleUrls: ['./topbar-delegation-menu.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TopbarDelegationMenu {\n /** Path to the management page, e.g. `/control-panel/delegations` or `/delegations`. */\n readonly managePath = input<string>('/delegations');\n readonly compact = input<boolean>(false);\n\n private readonly facade = inject(DelegationSessionFacade);\n private readonly modal = inject(ModalService);\n private readonly transloco = inject(TranslocoService);\n\n protected readonly popover = viewChild.required<Popover>('popover');\n\n protected readonly active = this.facade.active;\n protected readonly candidates = this.facade.candidates;\n protected readonly hasCandidates = this.facade.hasCandidates;\n protected readonly onBehalfOf = this.facade.onBehalfOf;\n protected readonly executedBy = this.facade.executedBy;\n\n protected readonly mode = computed<'hidden' | 'candidates' | 'active'>(() => {\n if (this.active()) return 'active';\n if (this.hasCandidates()) return 'candidates';\n return 'hidden';\n });\n\n togglePopover(event: Event): void {\n this.popover().toggle(event);\n }\n\n start(row: DelegationRow, event: MouseEvent): void {\n event.stopPropagation();\n this.popover().hide();\n this.openConfirm(row, 'start');\n }\n\n switchTo(row: DelegationRow, event: MouseEvent): void {\n event.stopPropagation();\n this.popover().hide();\n this.openConfirm(row, 'switch');\n }\n\n endSession(event: MouseEvent): void {\n event.stopPropagation();\n this.popover().hide();\n this.facade.endSession('Manual').subscribe();\n }\n\n private openConfirm(row: DelegationRow, intent: 'start' | 'switch'): void {\n this.modal.openModal(StartSessionDialog, 'dialog', {\n header: this.transloco.translate('delegations.action.startSession'),\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegation: row, intent },\n });\n }\n}\n","<ng-container *transloco=\"let t\">\n @if (mode() !== \"hidden\") {\n <div class=\"mt-delegation-trigger flex items-center gap-2\">\n <button\n type=\"button\"\n class=\"mt-delegation-trigger__button flex items-center gap-2 px-2 py-1 rounded-full cursor-pointer hover:bg-surface-100\"\n [attr.aria-label]=\"t('delegations.title')\"\n (click)=\"togglePopover($event)\"\n >\n @if (mode() === \"active\") {\n <mt-icon\n icon=\"user.users-check\"\n styleClass=\"text-lg text-primary\"\n ></mt-icon>\n @if (!compact()) {\n <span class=\"mt-delegation-trigger__label text-sm font-medium\">\n {{\n t(\"delegations.session.banner\", {\n delegatorName: onBehalfOf()?.displayName,\n })\n }}\n </span>\n }\n <mt-delegation-status-chip\n status=\"Active\"\n ></mt-delegation-status-chip>\n } @else {\n <mt-icon\n icon=\"user.users-plus\"\n styleClass=\"text-lg text-primary\"\n ></mt-icon>\n @if (!compact()) {\n <span class=\"mt-delegation-trigger__label text-sm font-medium\">\n {{ t(\"delegations.session.availableTitle\") }}\n </span>\n }\n }\n </button>\n </div>\n\n <p-popover #popover [pt]=\"{ content: { class: 'p-0!' } }\">\n <div class=\"flex flex-col min-w-80 max-w-96 p-0\">\n @if (mode() === \"active\" && active(); as session) {\n <!-- STATE C — active session -->\n <div\n class=\"flex items-start gap-3 border-b border-gray-200 px-4 py-4\"\n >\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-11! h-11! text-xl! text-gray-600! bg-surface-300!\"\n ></mt-avatar>\n <div class=\"flex flex-col min-w-0 flex-1\">\n <div class=\"text-xs text-gray-500\">\n {{ t(\"delegations.session.actingOnBehalfOf\") }}\n </div>\n <div class=\"text-sm font-medium text-gray-900 truncate\">\n {{ onBehalfOf()?.displayName }}\n </div>\n <div class=\"text-xs text-gray-500 mt-1\">\n {{\n t(\"delegations.session.executedBy\", {\n actualUserName: executedBy()?.displayName,\n })\n }}\n </div>\n @if (session.delegation.scopeSummary) {\n <div\n class=\"text-xs text-gray-500 mt-1 truncate\"\n [title]=\"session.delegation.scopeSummary\"\n >\n {{ t(\"delegations.column.scopeSummary\") }}:\n {{ session.delegation.scopeSummary }}\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex flex-col gap-1 px-2 py-2\">\n <mt-button\n variant=\"text\"\n icon=\"arrow.arrow-left\"\n [label]=\"t('delegations.action.endSession')\"\n styleClass=\"w-full justify-start\"\n (click)=\"endSession($event)\"\n ></mt-button>\n </div>\n\n @if (candidates().length > 1) {\n <div class=\"border-t border-gray-200 pt-2 px-2 pb-2\">\n <div class=\"text-xs text-gray-500 px-2 pb-1\">\n {{ t(\"delegations.session.switchToAnother\") }}\n </div>\n @for (cand of candidates(); track cand.delegationId) {\n @if (cand.delegationId !== session.delegation.delegationId) {\n <button\n type=\"button\"\n class=\"flex items-center justify-between gap-2 w-full px-2 py-2 rounded-md hover:bg-surface-100 cursor-pointer\"\n (click)=\"switchTo(cand, $event)\"\n >\n <div class=\"flex items-center gap-2 min-w-0\">\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-7! h-7! text-sm! bg-surface-200!\"\n ></mt-avatar>\n <span class=\"text-sm text-gray-900 truncate\">\n {{ cand.delegator.displayName }}\n </span>\n </div>\n <mt-icon\n icon=\"arrow.switch-horizontal-01\"\n styleClass=\"text-base text-gray-400\"\n ></mt-icon>\n </button>\n }\n }\n </div>\n }\n } @else if (mode() === \"candidates\") {\n <!-- STATE B — candidates available -->\n <div class=\"border-b border-gray-200 px-4 py-3\">\n <div class=\"text-sm font-medium text-gray-900\">\n {{ t(\"delegations.session.youCanActAs\") }}\n </div>\n <div class=\"text-xs text-gray-500 mt-1\">\n {{ t(\"delegations.session.chooseDelegatorHint\") }}\n </div>\n </div>\n <div class=\"flex flex-col gap-1 px-2 py-2 max-h-72 overflow-y-auto\">\n @for (cand of candidates(); track cand.delegationId) {\n <button\n type=\"button\"\n class=\"flex items-center justify-between gap-2 w-full px-2 py-2 rounded-md hover:bg-surface-100 cursor-pointer text-start\"\n (click)=\"start(cand, $event)\"\n >\n <div class=\"flex items-center gap-2 min-w-0 flex-1\">\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-9! h-9! text-base! bg-surface-200!\"\n ></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-sm font-medium text-gray-900 truncate\">\n {{ cand.delegator.displayName }}\n </span>\n @if (cand.scopeSummary) {\n <span\n class=\"text-xs text-gray-500 truncate\"\n [title]=\"cand.scopeSummary\"\n >\n {{ cand.scopeSummary }}\n </span>\n }\n </div>\n </div>\n <mt-icon\n icon=\"arrow.arrow-right\"\n styleClass=\"text-base text-gray-400\"\n ></mt-icon>\n </button>\n }\n </div>\n }\n\n <!-- Footer -->\n <div class=\"border-t border-gray-200 px-2 py-2\">\n <a\n [routerLink]=\"managePath()\"\n (click)=\"popover().hide()\"\n class=\"flex items-center gap-2 px-3 py-2 rounded-md text-gray-700 hover:bg-surface-100 text-sm cursor-pointer\"\n >\n <mt-icon\n icon=\"general.settings-02\"\n styleClass=\"text-base\"\n ></mt-icon>\n <span>{{ t(\"delegations.session.manage\") }}</span>\n </a>\n </div>\n </div>\n </p-popover>\n }\n</ng-container>\n","import {\n ApproveDelegationRequest,\n CreateDelegationLegacyRequest,\n CreateDelegationV2Request,\n DelegationListQuery,\n DelegationScopeSelection,\n RejectDelegationRequest,\n UpdateDelegationLegacyRequest,\n UpdateDelegationV2Request,\n} from './delegations.model';\n\n// ---------------------------------------------------------------------------\n// Lists / detail\n// ---------------------------------------------------------------------------\n\nexport class GetMyDelegations {\n static readonly type = '[Delegations] Get My Delegations';\n constructor(public query: DelegationListQuery = {}) {}\n}\n\nexport class GetAssignedDelegations {\n static readonly type = '[Delegations] Get Assigned Delegations';\n constructor(public query: DelegationListQuery = {}) {}\n}\n\nexport class GetActiveAssignedDelegations {\n static readonly type = '[Delegations] Get Active Assigned Delegations';\n constructor(public query: DelegationListQuery = {}) {}\n}\n\nexport class GetDelegationDetail {\n static readonly type = '[Delegations] Get Delegation Detail';\n constructor(public id: number) {}\n}\n\nexport class ClearDelegationDetail {\n static readonly type = '[Delegations] Clear Delegation Detail';\n}\n\n// ---------------------------------------------------------------------------\n// Scope\n// ---------------------------------------------------------------------------\n\nexport class GetScopeOptions {\n static readonly type = '[Delegations] Get Scope Options';\n constructor(public delegatorUserId?: string) {}\n}\n\nexport class PreviewScope {\n static readonly type = '[Delegations] Preview Scope';\n constructor(public scope: DelegationScopeSelection) {}\n}\n\nexport class ClearScopePreview {\n static readonly type = '[Delegations] Clear Scope Preview';\n}\n\n// ---------------------------------------------------------------------------\n// Create / edit (legacy + v2)\n// ---------------------------------------------------------------------------\n\nexport class CreateDelegationLegacy {\n static readonly type = '[Delegations] Create Delegation (legacy)';\n constructor(public request: CreateDelegationLegacyRequest) {}\n}\n\nexport class CreateDelegationV2 {\n static readonly type = '[Delegations] Create Delegation (v2)';\n constructor(public request: CreateDelegationV2Request) {}\n}\n\nexport class UpdateDelegationLegacy {\n static readonly type = '[Delegations] Update Delegation (legacy)';\n constructor(\n public id: number,\n public request: UpdateDelegationLegacyRequest,\n ) {}\n}\n\nexport class UpdateDelegationV2 {\n static readonly type = '[Delegations] Update Delegation (v2)';\n constructor(\n public id: number,\n public request: UpdateDelegationV2Request,\n ) {}\n}\n\n// ---------------------------------------------------------------------------\n// Decisions\n// ---------------------------------------------------------------------------\n\nexport class ApproveDelegation {\n static readonly type = '[Delegations] Approve Delegation';\n constructor(\n public id: number,\n public request: ApproveDelegationRequest,\n ) {}\n}\n\nexport class RejectDelegation {\n static readonly type = '[Delegations] Reject Delegation';\n constructor(\n public id: number,\n public request: RejectDelegationRequest,\n ) {}\n}\n\nexport class CancelDelegation {\n static readonly type = '[Delegations] Cancel Delegation';\n constructor(\n public id: number,\n public rowVersion: string,\n public asAdmin: boolean = false,\n ) {}\n}\n","import { LoadingStateShape } from '../utils/state-helpers';\n\n// ============================================================================\n// Status / approval / actions (doc 01, 16)\n// ============================================================================\n\nexport type DelegationEffectiveStatus =\n | 'PendingApproval'\n | 'Scheduled'\n | 'Active'\n | 'InactiveToday'\n | 'Expired'\n | 'Rejected'\n | 'Cancelled';\n\nexport type DelegationApprovalStatus =\n | 'NotRequired'\n | 'Pending'\n | 'Approved'\n | 'Rejected';\n\nexport type DelegationAllowedAction =\n | 'View'\n | 'Edit'\n | 'Approve'\n | 'Reject'\n | 'Cancel'\n | 'StartSession'\n | 'EndSession';\n\nexport type DelegationDayRuleMode = 'FullRange' | 'SpecificDays';\n\n// ============================================================================\n// Parties + row (doc 02)\n// ============================================================================\n\nexport interface DelegationParty {\n userId: string;\n displayName: string;\n email?: string | null;\n}\n\nexport interface DelegationApprovalInfo {\n requiresApproval: boolean;\n approvalStatus: DelegationApprovalStatus;\n}\n\nexport interface DelegationCancellationInfo {\n cancelledBy?: DelegationParty | null;\n cancelledAtUtc?: string | null;\n cancellationReason?: string | null;\n}\n\nexport interface DelegationRow {\n delegationId: number;\n delegator: DelegationParty;\n delegatedUser: DelegationParty;\n startsAtUtc: string;\n endsAtUtc: string;\n timeZoneId: string;\n dayRuleMode: DelegationDayRuleMode;\n specificDays: number[];\n effectiveStatus: DelegationEffectiveStatus;\n statusReasonCode: string;\n createdBy: DelegationParty;\n createdAtUtc: string;\n approval: DelegationApprovalInfo;\n cancellation: DelegationCancellationInfo;\n allowedActions: DelegationAllowedAction[];\n scopeSummary: string;\n rowVersion: string;\n}\n\nexport interface DelegationPage<T> {\n items: T[];\n page: number;\n pageSize: number;\n totalCount: number;\n}\n\n// ============================================================================\n// Scope — grants based (doc 03, 04)\n// ============================================================================\n\nexport interface DelegationScopeTarget {\n applicationKey: string;\n targetType: string;\n targetKey: string;\n legacyModuleId?: number | null;\n targetId?: number | null;\n levelId?: number | null;\n levelModuleId?: number | null;\n domainModuleId?: number | null;\n moduleKey?: string | null;\n permissionModuleType?: string | null;\n permissionTargetId?: number | null;\n displayName?: string | null;\n}\n\nexport interface DelegationScopeAction {\n applicationKey: string;\n operationKey: string;\n operationKind: string;\n permissionCommand?: string | null;\n businessActionCode?: string | null;\n isHighRisk?: boolean;\n isDelegableSnapshot?: boolean;\n}\n\nexport interface DelegationGrant {\n /** Optional backend-provided stable grant identity; preferred for de-dup when present. */\n key?: string;\n applicationKey: string;\n target: DelegationScopeTarget;\n action: DelegationScopeAction;\n accessibilities: unknown[];\n dataFilters: unknown[];\n constraints: unknown[];\n}\n\nexport interface DelegationScopeSelection {\n grants: DelegationGrant[];\n metadata: Record<string, unknown>;\n}\n\n/** `scope/options` returns the grantable set in the same grants shape. */\nexport type DelegationScopeOptions = DelegationScopeSelection;\n\nexport interface DelegationScopeWarning {\n code?: string;\n message: string;\n}\n\nexport interface DelegationScopeDeniedItem {\n applicationKey: string;\n targetType: string;\n targetKey: string;\n operationKey: string;\n permissionCommand?: string;\n reasonCode: string;\n}\n\nexport interface DelegationScopePreview {\n isValid: boolean;\n normalizedScope: DelegationScopeSelection;\n scopeHash: string;\n summary: string;\n warnings: DelegationScopeWarning[];\n deniedItems: DelegationScopeDeniedItem[];\n}\n\n// ============================================================================\n// Detail (doc 02)\n// ============================================================================\n\nexport interface DelegationStatusInfo {\n effectiveStatus: DelegationEffectiveStatus;\n reasonCode: string;\n calculatedAtUtc: string;\n}\n\nexport interface DelegationDetail {\n row: DelegationRow;\n scope: DelegationScopeSelection;\n status: DelegationStatusInfo;\n}\n\n// ============================================================================\n// Legacy create/edit DTO returned by create/edit (doc 02)\n// ============================================================================\n\nexport interface DelegationDto {\n id: number;\n fromUserId: string;\n toUserId: string;\n description?: string;\n isActive?: boolean;\n delegationDaysType: DelegationDayRuleMode;\n specificDays: number[];\n applicationId?: number;\n requiresApproval?: boolean;\n effectiveStatus: DelegationEffectiveStatus;\n statusReasonCode: string;\n allowedActions: DelegationAllowedAction[];\n rowVersion: string;\n [extra: string]: unknown;\n}\n\n// ============================================================================\n// List query (doc 02)\n// ============================================================================\n\nexport type DelegationSortDirection =\n | 'asc'\n | 'ascending'\n | 'desc'\n | 'descending';\n\nexport interface DelegationListQuery {\n activeOnly?: boolean;\n status?: DelegationEffectiveStatus;\n search?: string;\n fromUtc?: string;\n toUtc?: string;\n sortBy?: string;\n sortDirection?: DelegationSortDirection;\n page?: number;\n pageSize?: number;\n // admin only\n delegatorUserId?: string;\n delegatedUserId?: string;\n}\n\n// ============================================================================\n// Create / edit / decision requests (doc 04)\n// ============================================================================\n\nexport interface CreateDelegationLegacyRequest {\n delegateFrom?: string | null;\n delegateTo: string;\n description?: string;\n delegateFromDateTime: string;\n delegateToDateTime: string;\n accessibilityIds?: number[];\n moduleIds?: number[];\n delegationDaysType: DelegationDayRuleMode;\n specificDays?: number[];\n isActive?: boolean;\n requiresApproval?: boolean;\n}\n\nexport interface CreateDelegationV2Request {\n delegateFrom?: string | null;\n delegateTo: string;\n description?: string;\n delegateFromDateTime: string;\n delegateToDateTime: string;\n delegationDaysType: DelegationDayRuleMode;\n specificDays?: number[];\n requiresApproval: boolean;\n scope: DelegationScopeSelection;\n}\n\nexport type UpdateDelegationLegacyRequest = CreateDelegationLegacyRequest & {\n rowVersion: string;\n};\n\nexport type UpdateDelegationV2Request = CreateDelegationV2Request & {\n rowVersion: string;\n};\n\nexport interface ApproveDelegationRequest {\n rowVersion: string;\n reason?: string;\n}\n\nexport interface RejectDelegationRequest {\n rowVersion: string;\n reason: string;\n}\n\n// ============================================================================\n// NGXS state shape + action keys\n// ============================================================================\n\nexport enum DelegationsActionKey {\n GetMy = 'getMy',\n GetAssigned = 'getAssigned',\n GetActive = 'getActive',\n GetDetail = 'getDetail',\n GetScopeOptions = 'getScopeOptions',\n PreviewScope = 'previewScope',\n Create = 'create',\n Update = 'update',\n Approve = 'approve',\n Reject = 'reject',\n Cancel = 'cancel',\n}\n\nexport interface DelegationsStateModel extends LoadingStateShape<DelegationsActionKey> {\n my: DelegationPage<DelegationRow> | null;\n assigned: DelegationPage<DelegationRow> | null;\n active: DelegationPage<DelegationRow> | null;\n detail: DelegationDetail | null;\n scopeOptions: DelegationScopeOptions | null;\n scopePreview: DelegationScopePreview | null;\n}\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\nimport { handleApiRequest } from '@masterteam/components';\nimport { Response } from './api.model';\nimport {\n ApproveDelegation,\n CancelDelegation,\n ClearDelegationDetail,\n ClearScopePreview,\n CreateDelegationLegacy,\n CreateDelegationV2,\n GetActiveAssignedDelegations,\n GetAssignedDelegations,\n GetDelegationDetail,\n GetMyDelegations,\n GetScopeOptions,\n PreviewScope,\n RejectDelegation,\n UpdateDelegationLegacy,\n UpdateDelegationV2,\n} from './delegations.actions';\nimport {\n DelegationDetail,\n DelegationDto,\n DelegationListQuery,\n DelegationPage,\n DelegationRow,\n DelegationScopeOptions,\n DelegationScopePreview,\n DelegationsActionKey,\n DelegationsStateModel,\n} from './delegations.model';\n\nconst BASE = 'identity/delegations';\n\nfunction buildListParams(query: DelegationListQuery): HttpParams {\n let params = new HttpParams();\n if (query.activeOnly != null)\n params = params.set('activeOnly', query.activeOnly);\n if (query.status) params = params.set('status', query.status);\n if (query.search) params = params.set('search', query.search);\n if (query.fromUtc) params = params.set('fromUtc', query.fromUtc);\n if (query.toUtc) params = params.set('toUtc', query.toUtc);\n if (query.sortBy) params = params.set('sortBy', query.sortBy);\n if (query.sortDirection)\n params = params.set('sortDirection', query.sortDirection);\n params = params.set('page', query.page ?? 1);\n params = params.set('pageSize', query.pageSize ?? 25);\n if (query.delegatorUserId)\n params = params.set('delegatorUserId', query.delegatorUserId);\n if (query.delegatedUserId)\n params = params.set('delegatedUserId', query.delegatedUserId);\n return params;\n}\n\n@State<DelegationsStateModel>({\n name: 'delegations',\n defaults: {\n my: null,\n assigned: null,\n active: null,\n detail: null,\n scopeOptions: null,\n scopePreview: null,\n loadingActive: [],\n errors: {},\n },\n})\n@Injectable()\nexport class DelegationsState {\n private http = inject(HttpClient);\n\n // ============================================================================\n // Selectors\n // ============================================================================\n\n @Selector()\n static getMy(\n state: DelegationsStateModel,\n ): DelegationPage<DelegationRow> | null {\n return state.my;\n }\n\n @Selector()\n static getAssigned(\n state: DelegationsStateModel,\n ): DelegationPage<DelegationRow> | null {\n return state.assigned;\n }\n\n @Selector()\n static getActive(\n state: DelegationsStateModel,\n ): DelegationPage<DelegationRow> | null {\n return state.active;\n }\n\n @Selector()\n static getDetail(state: DelegationsStateModel): DelegationDetail | null {\n return state.detail;\n }\n\n @Selector()\n static getScopeOptions(\n state: DelegationsStateModel,\n ): DelegationScopeOptions | null {\n return state.scopeOptions;\n }\n\n @Selector()\n static getScopePreview(\n state: DelegationsStateModel,\n ): DelegationScopePreview | null {\n return state.scopePreview;\n }\n\n @Selector()\n static getLoadingActive(state: DelegationsStateModel): string[] {\n return state.loadingActive;\n }\n\n @Selector()\n static getErrors(\n state: DelegationsStateModel,\n ): Record<string, string | null | undefined> {\n return state.errors;\n }\n\n // ============================================================================\n // Lists\n // ============================================================================\n\n @Action(GetMyDelegations)\n getMy(ctx: StateContext<DelegationsStateModel>, { query }: GetMyDelegations) {\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(BASE, {\n params: buildListParams(query),\n });\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetMy,\n request$: req$,\n onSuccess: (response) => ({ my: response.data }),\n });\n }\n\n @Action(GetAssignedDelegations)\n getAssigned(\n ctx: StateContext<DelegationsStateModel>,\n { query }: GetAssignedDelegations,\n ) {\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\n `${BASE}/assigned`,\n { params: buildListParams(query) },\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetAssigned,\n request$: req$,\n onSuccess: (response) => ({ assigned: response.data }),\n });\n }\n\n @Action(GetActiveAssignedDelegations)\n getActive(\n ctx: StateContext<DelegationsStateModel>,\n { query }: GetActiveAssignedDelegations,\n ) {\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\n `${BASE}/user/activedelegations`,\n { params: buildListParams(query) },\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetActive,\n request$: req$,\n onSuccess: (response) => ({ active: response.data }),\n });\n }\n\n @Action(GetDelegationDetail)\n getDetail(\n ctx: StateContext<DelegationsStateModel>,\n { id }: GetDelegationDetail,\n ) {\n const req$ = this.http.get<Response<DelegationDetail>>(`${BASE}/${id}`);\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetDetail,\n request$: req$,\n onSuccess: (response) => ({ detail: response.data ?? null }),\n });\n }\n\n @Action(ClearDelegationDetail)\n clearDetail(ctx: StateContext<DelegationsStateModel>) {\n ctx.patchState({ detail: null });\n }\n\n // ============================================================================\n // Scope\n // ============================================================================\n\n @Action(GetScopeOptions)\n getScopeOptions(\n ctx: StateContext<DelegationsStateModel>,\n { delegatorUserId }: GetScopeOptions,\n ) {\n let params = new HttpParams();\n if (delegatorUserId)\n params = params.set('delegatorUserId', delegatorUserId);\n const req$ = this.http.get<Response<DelegationScopeOptions>>(\n `${BASE}/scope/options`,\n { params },\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetScopeOptions,\n request$: req$,\n onSuccess: (response) => ({ scopeOptions: response.data ?? null }),\n });\n }\n\n @Action(PreviewScope)\n previewScope(\n ctx: StateContext<DelegationsStateModel>,\n { scope }: PreviewScope,\n ) {\n const req$ = this.http.post<Response<DelegationScopePreview>>(\n `${BASE}/scope/preview`,\n { scope },\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.PreviewScope,\n request$: req$,\n onSuccess: (response) => ({ scopePreview: response.data ?? null }),\n });\n }\n\n @Action(ClearScopePreview)\n clearScopePreview(ctx: StateContext<DelegationsStateModel>) {\n ctx.patchState({ scopePreview: null });\n }\n\n // ============================================================================\n // Create / edit (response is legacy DelegationDto — clients reload list/detail)\n // ============================================================================\n\n @Action(CreateDelegationLegacy)\n createLegacy(\n ctx: StateContext<DelegationsStateModel>,\n { request }: CreateDelegationLegacy,\n ) {\n const req$ = this.http.post<Response<DelegationDto>>(BASE, request);\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Create,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(CreateDelegationV2)\n createV2(\n ctx: StateContext<DelegationsStateModel>,\n { request }: CreateDelegationV2,\n ) {\n const req$ = this.http.post<Response<DelegationDto>>(`${BASE}/v2`, request);\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Create,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(UpdateDelegationLegacy)\n updateLegacy(\n ctx: StateContext<DelegationsStateModel>,\n { id, request }: UpdateDelegationLegacy,\n ) {\n const req$ = this.http.put<Response<DelegationDto>>(\n `${BASE}/${id}`,\n request,\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Update,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(UpdateDelegationV2)\n updateV2(\n ctx: StateContext<DelegationsStateModel>,\n { id, request }: UpdateDelegationV2,\n ) {\n const req$ = this.http.put<Response<DelegationDto>>(\n `${BASE}/v2/${id}`,\n request,\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Update,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n // ============================================================================\n // Decisions\n // ============================================================================\n\n @Action(ApproveDelegation)\n approve(\n ctx: StateContext<DelegationsStateModel>,\n { id, request }: ApproveDelegation,\n ) {\n const req$ = this.http.post<Response<DelegationDto>>(\n `${BASE}/${id}/approve`,\n request,\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Approve,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(RejectDelegation)\n reject(\n ctx: StateContext<DelegationsStateModel>,\n { id, request }: RejectDelegation,\n ) {\n const req$ = this.http.post<Response<DelegationDto>>(\n `${BASE}/${id}/reject`,\n request,\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Reject,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(CancelDelegation)\n cancel(\n ctx: StateContext<DelegationsStateModel>,\n { id, rowVersion, asAdmin }: CancelDelegation,\n ) {\n const path = asAdmin ? `${BASE}/Admin/${id}` : `${BASE}/${id}`;\n const req$ = this.http.delete<Response<boolean>>(path, {\n params: new HttpParams().set('rowVersion', rowVersion),\n });\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Cancel,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { select, Store } from '@ngxs/store';\nimport {\n ApproveDelegation,\n CancelDelegation,\n ClearDelegationDetail,\n ClearScopePreview,\n CreateDelegationLegacy,\n CreateDelegationV2,\n GetActiveAssignedDelegations,\n GetAssignedDelegations,\n GetDelegationDetail,\n GetMyDelegations,\n GetScopeOptions,\n PreviewScope,\n RejectDelegation,\n UpdateDelegationLegacy,\n UpdateDelegationV2,\n} from './delegations.actions';\nimport {\n ApproveDelegationRequest,\n CreateDelegationLegacyRequest,\n CreateDelegationV2Request,\n DelegationListQuery,\n DelegationScopeSelection,\n DelegationsActionKey,\n RejectDelegationRequest,\n UpdateDelegationLegacyRequest,\n UpdateDelegationV2Request,\n} from './delegations.model';\nimport { DelegationsState } from './delegations.state';\n\n@Injectable({ providedIn: 'root' })\nexport class DelegationsFacade {\n private readonly store = inject(Store);\n\n // ---------------------------------------------------------------------------\n // Data slices\n // ---------------------------------------------------------------------------\n readonly myPage = select(DelegationsState.getMy);\n readonly assignedPage = select(DelegationsState.getAssigned);\n readonly activePage = select(DelegationsState.getActive);\n readonly detail = select(DelegationsState.getDetail);\n readonly scopeOptions = select(DelegationsState.getScopeOptions);\n readonly scopePreview = select(DelegationsState.getScopePreview);\n\n private readonly loadingActive = select(DelegationsState.getLoadingActive);\n private readonly errors = select(DelegationsState.getErrors);\n\n // ---------------------------------------------------------------------------\n // Derived\n // ---------------------------------------------------------------------------\n readonly myItems = computed(() => this.myPage()?.items ?? []);\n readonly assignedItems = computed(() => this.assignedPage()?.items ?? []);\n readonly activeItems = computed(() => this.activePage()?.items ?? []);\n\n // ---------------------------------------------------------------------------\n // Loading\n // ---------------------------------------------------------------------------\n readonly isLoadingMy = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetMy),\n );\n readonly isLoadingAssigned = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetAssigned),\n );\n readonly isLoadingActive = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetActive),\n );\n readonly isLoadingDetail = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetDetail),\n );\n readonly isLoadingScopeOptions = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetScopeOptions),\n );\n readonly isPreviewingScope = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.PreviewScope),\n );\n readonly isSaving = computed(\n () =>\n this.loadingActive().includes(DelegationsActionKey.Create) ||\n this.loadingActive().includes(DelegationsActionKey.Update),\n );\n readonly isApproving = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.Approve),\n );\n readonly isRejecting = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.Reject),\n );\n readonly isCancelling = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.Cancel),\n );\n\n // ---------------------------------------------------------------------------\n // Errors\n // ---------------------------------------------------------------------------\n readonly errorMy = computed(\n () => this.errors()[DelegationsActionKey.GetMy] ?? null,\n );\n readonly errorAssigned = computed(\n () => this.errors()[DelegationsActionKey.GetAssigned] ?? null,\n );\n readonly errorDetail = computed(\n () => this.errors()[DelegationsActionKey.GetDetail] ?? null,\n );\n readonly errorSave = computed(\n () =>\n this.errors()[DelegationsActionKey.Create] ??\n this.errors()[DelegationsActionKey.Update] ??\n null,\n );\n\n // ---------------------------------------------------------------------------\n // Dispatchers\n // ---------------------------------------------------------------------------\n getMy(query: DelegationListQuery = {}) {\n return this.store.dispatch(new GetMyDelegations(query));\n }\n getAssigned(query: DelegationListQuery = {}) {\n return this.store.dispatch(new GetAssignedDelegations(query));\n }\n getActive(query: DelegationListQuery = {}) {\n return this.store.dispatch(new GetActiveAssignedDelegations(query));\n }\n getDetail(id: number) {\n return this.store.dispatch(new GetDelegationDetail(id));\n }\n clearDetail() {\n return this.store.dispatch(new ClearDelegationDetail());\n }\n loadScopeOptions(delegatorUserId?: string) {\n return this.store.dispatch(new GetScopeOptions(delegatorUserId));\n }\n previewScope(scope: DelegationScopeSelection) {\n return this.store.dispatch(new PreviewScope(scope));\n }\n clearScopePreview() {\n return this.store.dispatch(new ClearScopePreview());\n }\n createLegacy(request: CreateDelegationLegacyRequest) {\n return this.store.dispatch(new CreateDelegationLegacy(request));\n }\n createV2(request: CreateDelegationV2Request) {\n return this.store.dispatch(new CreateDelegationV2(request));\n }\n updateLegacy(id: number, request: UpdateDelegationLegacyRequest) {\n return this.store.dispatch(new UpdateDelegationLegacy(id, request));\n }\n updateV2(id: number, request: UpdateDelegationV2Request) {\n return this.store.dispatch(new UpdateDelegationV2(id, request));\n }\n approve(id: number, request: ApproveDelegationRequest) {\n return this.store.dispatch(new ApproveDelegation(id, request));\n }\n reject(id: number, request: RejectDelegationRequest) {\n return this.store.dispatch(new RejectDelegation(id, request));\n }\n cancel(id: number, rowVersion: string, asAdmin = false) {\n return this.store.dispatch(new CancelDelegation(id, rowVersion, asAdmin));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\n\n/**\n * Collects a required rejection reason before calling\n * POST identity/delegations/{id}/reject (doc 04 — reject requires a non-empty\n * reason for audit/governance). Closes with `true` on success so the caller\n * can reload the row.\n */\n@Component({\n selector: 'mt-reject-delegation-dialog',\n standalone: true,\n imports: [CommonModule, Button, TranslocoDirective],\n templateUrl: './reject-delegation-dialog.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class RejectDelegationDialog {\n readonly delegation = input.required<DelegationRow>();\n\n private readonly ref: ModalRef = inject(ModalRef);\n private readonly facade = inject(DelegationsFacade);\n\n protected readonly reason = signal('');\n protected readonly submitted = signal(false);\n protected readonly isBusy = this.facade.isRejecting;\n\n protected readonly isValid = computed(() => this.reason().trim().length > 0);\n\n protected onReasonInput(event: Event): void {\n this.reason.set((event.target as HTMLTextAreaElement).value);\n }\n\n confirm(): void {\n this.submitted.set(true);\n if (!this.isValid()) return;\n const row = this.delegation();\n this.facade\n .reject(row.delegationId, {\n rowVersion: row.rowVersion,\n reason: this.reason().trim(),\n })\n .subscribe({\n next: () => this.ref.close(true),\n error: () => {\n /* error surfaced via shared toast pipeline; keep dialog open */\n },\n });\n }\n\n cancel(): void {\n this.ref.close(false);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col gap-4 p-2\">\n <div class=\"flex flex-col gap-1\">\n <div class=\"text-sm text-gray-700\">\n {{ t(\"delegations.confirm.reject\") }}\n </div>\n <div class=\"text-xs text-gray-500\">\n {{ delegation().delegator.displayName }}\n </div>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium text-gray-800\" for=\"mt-reject-reason\">\n {{ t(\"delegations.form.rejectionReason\") }}\n <span class=\"text-red-600\">*</span>\n </label>\n <textarea\n id=\"mt-reject-reason\"\n rows=\"3\"\n class=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-primary focus:outline-none\"\n [class.border-red-400]=\"submitted() && !isValid()\"\n [value]=\"reason()\"\n (input)=\"onReasonInput($event)\"\n [attr.aria-invalid]=\"submitted() && !isValid()\"\n [placeholder]=\"t('delegations.form.rejectionReason')\"\n ></textarea>\n @if (submitted() && !isValid()) {\n <span class=\"text-xs text-red-600\">\n {{ t(\"delegations.form.rejectReasonRequired\") }}\n </span>\n }\n </div>\n\n <div class=\"flex justify-end gap-2 pt-2 border-t border-gray-200\">\n <mt-button\n variant=\"outlined\"\n color=\"secondary\"\n [label]=\"t('delegations.common.cancel')\"\n [disabled]=\"isBusy()\"\n (click)=\"cancel()\"\n ></mt-button>\n <mt-button\n color=\"danger\"\n icon=\"general.x-close\"\n [label]=\"t('delegations.action.reject')\"\n [loading]=\"isBusy()\"\n [disabled]=\"!isValid()\"\n (click)=\"confirm()\"\n ></mt-button>\n </div>\n </div>\n</ng-container>\n","import { Component, inject } from '@angular/core';\nimport { Router, RouterOutlet } from '@angular/router';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Page } from '@masterteam/components/page';\n\n@Component({\n selector: 'mt-delegations',\n imports: [Page, RouterOutlet, TranslocoDirective],\n templateUrl: './delegations.html',\n styleUrl: './delegations.css',\n})\nexport default class Delegations {\n private readonly router = inject(Router);\n\n goBack() {\n this.router.navigate(['control-panel/product-settings']);\n }\n}\n","<ng-container *transloco=\"let t\">\n <mt-page\n [title]=\"t('delegations.title')\"\n [avatarIcon]=\"'custom.hierarchy-structure'\"\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\n [avatarStyle]=\"{\n '--p-avatar-background': 'var(--p-indigo-50)',\n '--p-avatar-color': 'var(--p-indigo-700)',\n }\"\n (backButtonClick)=\"goBack()\"\n backButton\n >\n <router-outlet />\n </mt-page>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked,\n} from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Icon } from '@masterteam/icons';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { DelegationsFacade } from '../../../../store/delegations/delegations.facade';\nimport {\n DelegationGrant,\n DelegationScopeSelection,\n DelegationScopeTarget,\n} from '../../../../store/delegations/delegations.model';\n\ninterface TargetGroup {\n key: string;\n target: DelegationScopeTarget;\n grants: DelegationGrant[];\n}\n\nconst EMPTY_SCOPE: DelegationScopeSelection = { grants: [], metadata: {} };\n\nfunction targetKey(t: DelegationScopeTarget): string {\n return `${t.applicationKey}::${t.targetType}::${t.targetKey}`;\n}\n\n/**\n * Full grant identity. Two grants with the same target/action but different\n * accessibilities, data filters, or constraints are DIFFERENT grants and must\n * not collapse (backend scope contract). Prefer a backend-provided stable\n * `key`; otherwise hash the complete grant shape.\n */\nfunction grantKey(g: DelegationGrant): string {\n if (g.key) return g.key;\n return JSON.stringify({\n app: g.applicationKey,\n target: [\n g.target.applicationKey,\n g.target.targetType,\n g.target.targetKey,\n g.target.permissionModuleType ?? null,\n g.target.permissionTargetId ?? null,\n g.target.legacyModuleId ?? null,\n g.target.levelId ?? null,\n g.target.levelModuleId ?? null,\n g.target.domainModuleId ?? null,\n g.target.moduleKey ?? null,\n ],\n action: [\n g.action.applicationKey,\n g.action.operationKey,\n g.action.operationKind,\n g.action.permissionCommand ?? null,\n g.action.businessActionCode ?? null,\n ],\n accessibilities: g.accessibilities ?? [],\n dataFilters: g.dataFilters ?? [],\n constraints: g.constraints ?? [],\n });\n}\n\nfunction normalizeGrant(g: DelegationGrant): DelegationGrant {\n return {\n ...g,\n accessibilities: g.accessibilities ?? [],\n dataFilters: g.dataFilters ?? [],\n constraints: g.constraints ?? [],\n };\n}\n\n/**\n * Grants-based scope picker (doc 03). Driven entirely by `scope/options`:\n * - lists grantable target/action pairs returned by the backend,\n * - lets the user toggle each grant,\n * - calls `scope/preview` (debounced) and surfaces summary / warnings / denied.\n *\n * `[(scope)]` two-way binds a `DelegationScopeSelection`. The component never\n * invents permission metadata — it only echoes grants returned by options.\n */\n@Component({\n selector: 'mt-scope-picker',\n standalone: true,\n imports: [\n CommonModule,\n Icon,\n SkeletonModule,\n TooltipModule,\n TranslocoDirective,\n ],\n templateUrl: './scope-picker.html',\n styleUrls: ['./scope-picker.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ScopePicker {\n readonly scope = model<DelegationScopeSelection>(EMPTY_SCOPE);\n readonly readonly = input<boolean>(false);\n /**\n * Delegator whose grantable scope is loaded. Undefined = current user\n * (self-service). In admin mode the host rebinds this as the selected\n * delegator changes, and options reload reactively.\n */\n readonly delegatorUserId = input<string | undefined>(undefined);\n\n private readonly facade = inject(DelegationsFacade);\n\n protected readonly options = this.facade.scopeOptions;\n protected readonly preview = this.facade.scopePreview;\n protected readonly isLoadingOptions = this.facade.isLoadingScopeOptions;\n protected readonly isPreviewing = this.facade.isPreviewingScope;\n\n /** Grantable options grouped by target. */\n protected readonly groups = computed<TargetGroup[]>(() => {\n const grants = this.options()?.grants ?? [];\n const map = new Map<string, TargetGroup>();\n for (const g of grants) {\n const key = targetKey(g.target);\n const existing = map.get(key);\n if (existing) {\n existing.grants.push(g);\n } else {\n map.set(key, { key, target: g.target, grants: [g] });\n }\n }\n return Array.from(map.values());\n });\n\n /** Selected grant keys for O(1) checkbox state. */\n protected readonly selectedKeys = computed(\n () => new Set(this.scope().grants.map(grantKey)),\n );\n\n private readonly expanded = signal<Set<string>>(new Set());\n\n constructor() {\n // Load (and reload) grantable options whenever the delegator changes.\n effect(() => {\n const delegator = this.delegatorUserId();\n untracked(() => this.facade.loadScopeOptions(delegator));\n });\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n effect(() => {\n const s = this.scope();\n untracked(() => {\n if (!s.grants.length) {\n this.facade.clearScopePreview();\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => this.facade.previewScope(s), 300);\n });\n });\n }\n\n protected isExpanded(group: TargetGroup): boolean {\n return this.expanded().has(group.key);\n }\n\n protected toggleAccordion(group: TargetGroup): void {\n const next = new Set(this.expanded());\n if (next.has(group.key)) next.delete(group.key);\n else next.add(group.key);\n this.expanded.set(next);\n }\n\n protected isSelected(grant: DelegationGrant): boolean {\n return this.selectedKeys().has(grantKey(grant));\n }\n\n protected toggleGrant(grant: DelegationGrant): void {\n if (this.readonly()) return;\n const key = grantKey(grant);\n this.scope.update((s) => {\n const exists = s.grants.some((g) => grantKey(g) === key);\n const grants = exists\n ? s.grants.filter((g) => grantKey(g) !== key)\n : [...s.grants, normalizeGrant(grant)];\n return { ...s, grants };\n });\n }\n\n protected selectedCount(group: TargetGroup): number {\n const keys = this.selectedKeys();\n return group.grants.filter((g) => keys.has(grantKey(g))).length;\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"mt-scope-picker flex flex-col gap-4\">\n @if (isLoadingOptions() && !options()) {\n <p-skeleton height=\"2rem\"></p-skeleton>\n <p-skeleton height=\"6rem\"></p-skeleton>\n <p-skeleton height=\"6rem\"></p-skeleton>\n } @else if (options()) {\n <!-- Targets + actions -->\n <section class=\"flex flex-col gap-2\">\n <h4 class=\"text-sm font-medium text-gray-800\">\n {{ t(\"delegations.scope.permissionsTitle\") }}\n </h4>\n\n @if (groups().length === 0) {\n <p class=\"text-xs text-gray-500\">\n {{ t(\"delegations.scope.noGrantableOptions\") }}\n </p>\n }\n\n @for (group of groups(); track group.key) {\n <div class=\"border border-gray-200 rounded-md overflow-hidden\">\n <button\n type=\"button\"\n class=\"flex items-center justify-between w-full px-3 py-2 hover:bg-surface-50 cursor-pointer\"\n (click)=\"toggleAccordion(group)\"\n >\n <div class=\"flex items-center gap-2 min-w-0\">\n <mt-icon\n [icon]=\"\n isExpanded(group)\n ? 'arrow.chevron-down'\n : 'arrow.chevron-right'\n \"\n styleClass=\"text-base text-gray-400\"\n ></mt-icon>\n <span class=\"text-sm text-gray-900 truncate\">\n {{ group.target.displayName || group.target.targetKey }}\n </span>\n <span class=\"text-xs text-gray-400\">\n {{ group.target.targetType }}\n </span>\n </div>\n @if (selectedCount(group); as count) {\n @if (count > 0) {\n <span\n class=\"text-xs text-primary font-medium px-2 py-0.5 rounded-full bg-primary-50\"\n >\n {{ count }}\n </span>\n }\n }\n </button>\n\n @if (isExpanded(group)) {\n <div class=\"flex flex-col gap-1 px-3 py-2 bg-surface-50/40\">\n @for (grant of group.grants; track $index) {\n <label\n class=\"flex items-center gap-2 px-2 py-1.5 rounded-md cursor-pointer hover:bg-surface-100\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(grant)\"\n [disabled]=\"readonly()\"\n (change)=\"toggleGrant(grant)\"\n />\n <span class=\"text-sm\">\n {{ grant.action.operationKey }}\n </span>\n @if (grant.action.isHighRisk) {\n <mt-icon\n icon=\"alert.alert-triangle\"\n styleClass=\"text-sm text-amber-500\"\n [pTooltip]=\"t('delegations.scope.highRisk')\"\n tooltipPosition=\"top\"\n ></mt-icon>\n }\n </label>\n }\n </div>\n }\n </div>\n }\n </section>\n\n <!-- Preview -->\n <section\n class=\"flex flex-col gap-1 px-3 py-2 rounded-md border border-dashed border-gray-300 bg-surface-50\"\n >\n <div class=\"flex items-center justify-between gap-2\">\n <div class=\"text-xs font-medium text-gray-700\">\n {{ t(\"delegations.scope.previewTitle\") }}\n </div>\n @if (isPreviewing()) {\n <p-skeleton width=\"6rem\" height=\"0.75rem\"></p-skeleton>\n }\n </div>\n @if (preview(); as p) {\n @if (p.isValid) {\n <div class=\"text-sm text-gray-900\">\n {{ p.summary || t(\"delegations.column.scopeSummary\") }}\n </div>\n } @else {\n <div class=\"text-sm text-red-700\">\n {{ t(\"delegations.scope.previewInvalid\") }}\n </div>\n }\n @if (p.warnings.length > 0) {\n <ul class=\"text-xs text-amber-700 list-disc list-inside\">\n @for (w of p.warnings; track w.message) {\n <li>{{ w.message }}</li>\n }\n </ul>\n }\n @if (p.deniedItems.length > 0) {\n <ul class=\"text-xs text-red-700 list-disc list-inside\">\n @for (d of p.deniedItems; track d.operationKey) {\n <li>\n {{ d.targetKey }} / {{ d.operationKey }} —\n {{ d.reasonCode }}\n </li>\n }\n </ul>\n }\n } @else {\n <div class=\"text-xs text-gray-500\">\n {{ t(\"delegations.scope.noSelection\") }}\n </div>\n }\n </section>\n }\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnInit,\n signal,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { HttpContext } from '@angular/common/http';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport {\n DateFieldConfig,\n DynamicFormConfig,\n MultiSelectFieldConfig,\n RadioButtonFieldConfig,\n REQUEST_CONTEXT,\n TextareaFieldConfig,\n ToggleFieldConfig,\n UserSearchFieldConfig,\n ValidatorConfig,\n} from '@masterteam/components';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { ModalService } from '@masterteam/components/modal';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport { ScopePicker } from './scope-picker/scope-picker';\nimport {\n CreateDelegationV2Request,\n DelegationRow,\n DelegationScopeSelection,\n UpdateDelegationV2Request,\n} from '../../../store/delegations/delegations.model';\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\n\nconst EMPTY_SCOPE: DelegationScopeSelection = { grants: [], metadata: {} };\n\n/**\n * Delegation create/edit form (doc 04). Uses the v2 explicit-scope endpoints so\n * the persisted `DelegationScopeSelection` matches what scope/preview validated.\n *\n * - Delegator is server-derived; only the delegated user is collected.\n * - On edit, scope grants + rowVersion come from the loaded detail.\n * - Times are sent in UTC ISO; wrappers set timeZoneId = UTC.\n */\n@Component({\n selector: 'mt-delegation-form',\n standalone: true,\n imports: [\n CommonModule,\n Button,\n DynamicForm,\n ReactiveFormsModule,\n ScopePicker,\n TranslocoDirective,\n ],\n templateUrl: './delegation-form.html',\n styleUrls: ['./delegation-form.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class DelegationForm implements OnInit {\n readonly delegationForEdit = input<DelegationRow | null>(null);\n readonly readonly = input<boolean>(false);\n /**\n * Admin-managed mode: also collect the Delegator / From user, so an admin can\n * create a delegation between two selected users (Ahmed → Sara). Self-service\n * leaves this false; the delegator defaults to the current user server-side.\n */\n readonly adminMode = input<boolean>(false);\n\n private readonly halfWidth = 'flex flex-col gap-1 lg:col-span-6';\n private readonly fullWidth = 'flex flex-col gap-1 lg:col-span-12';\n\n modal = inject(ModalService);\n ref: ModalRef = inject(ModalRef);\n private readonly transloco = inject(TranslocoService);\n private readonly facade = inject(DelegationsFacade);\n\n delegationFormControl = new FormControl();\n formValue = toSignal(this.delegationFormControl.valueChanges);\n\n detail = this.facade.detail;\n isDetailLoading = this.facade.isLoadingDetail;\n isSaving = this.facade.isSaving;\n\n context = new HttpContext().set(REQUEST_CONTEXT, { useBaseUrl: false });\n\n protected readonly scope = signal<DelegationScopeSelection>(EMPTY_SCOPE);\n\n /** Selected delegator id (admin mode only); drives scope/options + create payload. */\n protected readonly selectedDelegatorId = computed<string | undefined>(() => {\n if (!this.adminMode()) return undefined;\n const v = this.formValue();\n return (\n v?.delegateFrom?.userId ??\n v?.delegateFrom?.id ??\n v?.delegateFrom ??\n undefined\n );\n });\n\n /** In admin mode the scope picker only loads once a delegator is chosen. */\n protected readonly showScopePicker = computed(\n () => !this.adminMode() || !!this.selectedDelegatorId(),\n );\n\n protected readonly specificDaysOptions = signal([\n { label: this.transloco.translate('delegations.days.sunday'), value: 0 },\n { label: this.transloco.translate('delegations.days.monday'), value: 1 },\n { label: this.transloco.translate('delegations.days.tuesday'), value: 2 },\n { label: this.transloco.translate('delegations.days.wednesday'), value: 3 },\n { label: this.transloco.translate('delegations.days.thursday'), value: 4 },\n { label: this.transloco.translate('delegations.days.friday'), value: 5 },\n { label: this.transloco.translate('delegations.days.saturday'), value: 6 },\n ]);\n\n protected readonly formConfig = computed<DynamicFormConfig>(() => ({\n sections: [\n {\n key: 'delegationForm',\n type: 'header',\n bodyClass: 'grid grid-cols-1 gap-4 items-start lg:grid-cols-12',\n order: 1,\n fields: [\n ...(this.adminMode()\n ? [\n new UserSearchFieldConfig({\n key: 'delegateFrom',\n label: this.transloco.translate(\n 'delegations.column.delegatorName',\n ),\n apiUrl: 'Identity/users',\n context: this.context,\n validators: [ValidatorConfig.required()],\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 0,\n disabled: this.readonly() || !!this.delegationForEdit(),\n }),\n ]\n : []),\n new UserSearchFieldConfig({\n key: 'delegateTo',\n label: this.transloco.translate('delegations.column.delegatedTo'),\n apiUrl: 'Identity/users',\n context: this.context,\n validators: [ValidatorConfig.required()],\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 1,\n disabled: this.readonly() || !!this.delegationForEdit(),\n }),\n new TextareaFieldConfig({\n key: 'description',\n label: this.transloco.translate('delegations.form.description'),\n placeholder: this.transloco.translate(\n 'delegations.form.description',\n ),\n cssClass: this.fullWidth,\n colSpan: 12,\n order: 2,\n disabled: this.readonly(),\n }),\n new DateFieldConfig({\n key: 'delegateFromDateTime',\n label: this.transloco.translate('delegations.column.startDate'),\n placeholder: this.transloco.translate(\n 'delegations.column.startDate',\n ),\n validators: [ValidatorConfig.required()],\n showTime: true,\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 3,\n disabled: this.readonly(),\n }),\n new DateFieldConfig({\n key: 'delegateToDateTime',\n label: this.transloco.translate('delegations.column.endDate'),\n placeholder: this.transloco.translate('delegations.column.endDate'),\n validators: [ValidatorConfig.required()],\n showTime: true,\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 4,\n disabled: this.readonly(),\n }),\n new RadioButtonFieldConfig({\n key: 'delegationDaysType',\n label: this.transloco.translate('delegations.form.daysApply'),\n options: [\n {\n label: this.transloco.translate('delegations.form.fullRange'),\n value: 'FullRange',\n },\n {\n label: this.transloco.translate(\n 'delegations.form.specificDays',\n ),\n value: 'SpecificDays',\n },\n ],\n optionLabel: 'label',\n optionValue: 'value',\n validators: [ValidatorConfig.required()],\n cssClass: this.fullWidth,\n colSpan: 12,\n order: 5,\n disabled: this.readonly(),\n }),\n new MultiSelectFieldConfig({\n key: 'specificDays',\n label: this.transloco.translate('delegations.form.specificDays'),\n options: this.specificDaysOptions(),\n optionLabel: 'label',\n optionValue: 'value',\n maxSelectedLabels: 7,\n relations: [\n {\n key: 'delegationDaysType',\n value: 'SpecificDays',\n action: 'show',\n },\n ],\n cssClass: this.fullWidth,\n colSpan: 12,\n order: 6,\n disabled: this.readonly(),\n }),\n new ToggleFieldConfig({\n key: 'requiresApproval',\n label: this.transloco.translate(\n 'delegations.form.requiresApproval',\n ),\n cssClass: `${this.fullWidth} mt-2`,\n order: 7,\n disabled: this.readonly(),\n }),\n ],\n },\n ],\n }));\n\n constructor() {\n effect(() => {\n const editing = this.delegationForEdit();\n const d = this.detail();\n if (editing && d && d.row.delegationId === editing.delegationId) {\n this.delegationFormControl.patchValue({\n delegateTo: d.row.delegatedUser,\n description: '',\n delegateFromDateTime: d.row.startsAtUtc,\n delegateToDateTime: d.row.endsAtUtc,\n delegationDaysType: d.row.dayRuleMode,\n specificDays: d.row.specificDays ?? [],\n requiresApproval: d.row.approval?.requiresApproval ?? false,\n });\n this.scope.set({\n grants: d.scope?.grants ?? [],\n metadata: d.scope?.metadata ?? {},\n });\n } else if (!editing) {\n this.delegationFormControl.reset({\n delegationDaysType: 'FullRange',\n requiresApproval: true,\n });\n this.scope.set(EMPTY_SCOPE);\n }\n });\n }\n\n ngOnInit(): void {\n const editing = this.delegationForEdit();\n if (editing) {\n this.facade.getDetail(editing.delegationId);\n }\n }\n\n protected readonly canSubmit = computed(\n () => !this.readonly() && this.scope().grants.length > 0,\n );\n\n onSubmit(): void {\n if (this.readonly() || !this.delegationFormControl.valid) return;\n if (this.scope().grants.length === 0) return;\n\n const v = this.delegationFormControl.value;\n const base = {\n // Admin mode sends the chosen delegator; self-service omits it so the\n // backend defaults delegateFrom to the current user (doc 04).\n delegateFrom: this.adminMode()\n ? (this.selectedDelegatorId() ?? null)\n : null,\n delegateTo: v?.delegateTo?.userId ?? v?.delegateTo?.id ?? v?.delegateTo,\n description: v?.description,\n delegateFromDateTime: v?.delegateFromDateTime,\n delegateToDateTime: v?.delegateToDateTime,\n delegationDaysType: (v?.delegationDaysType ?? 'FullRange') as\n | 'FullRange'\n | 'SpecificDays',\n specificDays:\n v?.delegationDaysType === 'SpecificDays' ? (v?.specificDays ?? []) : [],\n requiresApproval: !!v?.requiresApproval,\n scope: this.scope(),\n };\n\n const editing = this.delegationForEdit();\n if (editing) {\n // Prefer the freshest rowVersion from the loaded detail (the form loads\n // detail on open); fall back to the list row only if detail is absent.\n const latestRowVersion =\n this.detail()?.row?.rowVersion ?? editing.rowVersion;\n const req: UpdateDelegationV2Request = {\n ...base,\n rowVersion: latestRowVersion,\n };\n this.facade.updateV2(editing.delegationId, req).subscribe({\n next: () => this.ref.close(true),\n });\n } else {\n const req: CreateDelegationV2Request = base;\n this.facade.createV2(req).subscribe({\n next: () => this.ref.close(true),\n });\n }\n }\n}\n","<ng-container *transloco=\"let t\">\n <div\n [class]=\"\n 'delegation-form-content flex min-w-0 flex-col gap-3 overflow-x-hidden p-4 max-[640px]:p-3 ' +\n modal.contentClass\n \"\n >\n <mt-dynamic-form\n [formConfig]=\"formConfig()\"\n [formControl]=\"delegationFormControl\"\n />\n\n <div class=\"mt-2 border-t border-gray-200 pt-3 flex flex-col gap-2\">\n <h3 class=\"text-sm font-semibold text-gray-800\">\n {{ t(\"delegations.scope.permissionsTitle\") }}\n </h3>\n @if (showScopePicker()) {\n <mt-scope-picker\n [(scope)]=\"scope\"\n [readonly]=\"readonly()\"\n [delegatorUserId]=\"selectedDelegatorId()\"\n ></mt-scope-picker>\n } @else {\n <p class=\"text-xs text-gray-500\">\n {{ t(\"delegations.form.selectDelegatorFirst\") }}\n </p>\n }\n </div>\n </div>\n\n <div\n [class]=\"\n 'delegation-form-footer ' +\n modal.footerClass +\n ' flex-col gap-2 sm:flex-row sm:items-center sm:justify-end'\n \"\n >\n <mt-button\n [label]=\"t('delegations.common.cancel')\"\n variant=\"outlined\"\n (click)=\"ref.close()\"\n styleClass=\"w-full sm:w-auto\"\n />\n @if (!readonly()) {\n <mt-button\n [label]=\"\n delegationForEdit()\n ? t('delegations.common.update')\n : t('delegations.common.create')\n \"\n [loading]=\"isSaving()\"\n [disabled]=\"!delegationFormControl.valid || !canSubmit()\"\n (click)=\"onSubmit()\"\n styleClass=\"w-full sm:w-auto\"\n />\n }\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n OnInit,\n signal,\n} from '@angular/core';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\n\ntype DetailTab = 'overview' | 'scope';\n\n/**\n * Read-only drawer that shows the full `DelegationDetail` ({ row, scope, status }).\n */\n@Component({\n selector: 'mt-delegation-detail-drawer',\n standalone: true,\n imports: [\n CommonModule,\n Avatar,\n Button,\n SkeletonModule,\n TranslocoDirective,\n DelegationStatusChip,\n ],\n templateUrl: './delegation-detail-drawer.html',\n styleUrls: ['./delegation-detail-drawer.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class DelegationDetailDrawer implements OnInit {\n readonly delegationId = input.required<number>();\n\n private readonly facade = inject(DelegationsFacade);\n private readonly transloco = inject(TranslocoService);\n protected readonly ref: ModalRef = inject(ModalRef);\n\n protected readonly tabs: { key: DetailTab; i18n: string }[] = [\n { key: 'overview', i18n: 'delegations.action.view' },\n { key: 'scope', i18n: 'delegations.column.scopeSummary' },\n ];\n protected readonly activeTab = signal<DetailTab>('overview');\n\n protected readonly isLoading = this.facade.isLoadingDetail;\n protected readonly detail = this.facade.detail;\n protected readonly row = computed(() => this.detail()?.row ?? null);\n\n ngOnInit(): void {\n this.facade.getDetail(this.delegationId());\n }\n\n protected setTab(tab: DetailTab): void {\n this.activeTab.set(tab);\n }\n\n protected approvalLabel(): string {\n const s = this.row()?.approval?.approvalStatus ?? 'NotRequired';\n return this.transloco.translate(`delegations.approvalStatus.${s}`);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col h-full\">\n <!-- Tabs -->\n <div class=\"flex border-b border-gray-200 px-4\">\n @for (tab of tabs; track tab.key) {\n <button\n type=\"button\"\n class=\"px-3 py-2 -mb-px border-b-2 text-sm font-medium transition-colors\"\n [class.border-primary]=\"activeTab() === tab.key\"\n [class.text-primary]=\"activeTab() === tab.key\"\n [class.border-transparent]=\"activeTab() !== tab.key\"\n [class.text-gray-500]=\"activeTab() !== tab.key\"\n (click)=\"setTab(tab.key)\"\n >\n {{ t(tab.i18n) }}\n </button>\n }\n </div>\n\n <!-- Body -->\n <div class=\"flex-1 overflow-y-auto p-4\">\n @if (isLoading() && !detail()) {\n <p-skeleton height=\"2rem\" class=\"mb-3\"></p-skeleton>\n <p-skeleton height=\"6rem\" class=\"mb-3\"></p-skeleton>\n <p-skeleton height=\"6rem\"></p-skeleton>\n } @else if (detail(); as d) {\n @if (activeTab() === \"overview\") {\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex items-center gap-3 min-w-0\">\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-12! h-12! text-lg!\"\n ></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <div class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.delegatorName\") }}\n </div>\n <div class=\"text-base font-medium text-gray-900 truncate\">\n {{ d.row.delegator.displayName }}\n </div>\n @if (d.row.delegator.email) {\n <div class=\"text-xs text-gray-500 truncate\">\n {{ d.row.delegator.email }}\n </div>\n }\n </div>\n </div>\n <mt-delegation-status-chip\n [status]=\"d.status.effectiveStatus\"\n ></mt-delegation-status-chip>\n </div>\n\n <div class=\"grid grid-cols-2 gap-4\">\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.delegatedTo\") }}\n </span>\n <span class=\"text-sm text-gray-900\">\n {{ d.row.delegatedUser.displayName }}\n </span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.approval\") }}\n </span>\n <span class=\"text-sm text-gray-900\">{{ approvalLabel() }}</span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.startDate\") }}\n </span>\n <span class=\"text-sm text-gray-900\">\n {{ d.row.startsAtUtc | date: \"medium\" }}\n </span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.endDate\") }}\n </span>\n <span class=\"text-sm text-gray-900\">\n {{ d.row.endsAtUtc | date: \"medium\" }}\n </span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.form.timeZone\") }}\n </span>\n <span class=\"text-sm text-gray-900\">{{\n d.row.timeZoneId\n }}</span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.days\") }}\n </span>\n <span class=\"text-sm text-gray-900\">\n @if (d.row.dayRuleMode === \"FullRange\") {\n {{ t(\"delegations.form.fullRange\") }}\n } @else {\n {{ d.row.specificDays.join(\", \") }}\n }\n </span>\n </div>\n </div>\n\n @if (d.row.cancellation?.cancellationReason) {\n <div\n class=\"rounded-md border border-gray-200 bg-surface-50 p-3 text-sm text-gray-800\"\n >\n <div class=\"font-medium\">\n {{ t(\"delegations.form.cancellationReason\") }}\n </div>\n <div>{{ d.row.cancellation.cancellationReason }}</div>\n </div>\n }\n </div>\n } @else {\n <!-- Scope tab -->\n <div class=\"flex flex-col gap-3\">\n <div class=\"text-sm text-gray-900\">\n {{ d.row.scopeSummary || t(\"delegations.column.scopeSummary\") }}\n </div>\n <div class=\"flex flex-col gap-2\">\n @for (grant of d.scope.grants; track $index) {\n <div\n class=\"border border-gray-200 rounded-md px-3 py-2 flex flex-col gap-1\"\n >\n <div class=\"flex items-center justify-between gap-2\">\n <span class=\"text-sm font-medium text-gray-900\">\n {{ grant.target.displayName || grant.target.targetKey }}\n </span>\n <span class=\"text-xs text-gray-500\">\n {{ grant.target.targetType }}\n </span>\n </div>\n <span\n class=\"text-xs px-2 py-0.5 rounded-md bg-primary-50 text-primary w-fit\"\n >\n {{ grant.action.operationKey }}\n </span>\n </div>\n }\n @if (d.scope.grants.length === 0) {\n <p class=\"text-xs text-gray-500\">\n {{ t(\"delegations.scope.noSelection\") }}\n </p>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer -->\n <div\n class=\"border-t border-gray-200 px-4 py-3 flex items-center justify-end\"\n >\n <mt-button\n [label]=\"t('delegations.common.cancel')\"\n variant=\"outlined\"\n (click)=\"ref.close()\"\n ></mt-button>\n </div>\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n linkedSignal,\n OnInit,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { Breadcrumb } from '@masterteam/components/breadcrumb';\nimport { ModalService } from '@masterteam/components/modal';\nimport { ColumnDef, Table, TableAction } from '@masterteam/components/table';\nimport { finalize } from 'rxjs';\nimport {\n DelegationAllowedAction,\n DelegationListQuery,\n DelegationRow,\n} from '../../../store/delegations/delegations.model';\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\nimport DelegationForm from '../delegation-form/delegation-form';\nimport DelegationDetailDrawer from '../delegation-detail-drawer/delegation-detail-drawer';\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\nimport RejectDelegationDialog from '../reject-delegation-dialog/reject-delegation-dialog';\n\ntype DelegationTab = 'my' | 'assigned';\n\n/**\n * Delegations portal page (doc 02, 09): two lists — My Delegations (current user\n * is delegator) and Delegated To Me (current user is delegate). Rows render only\n * the BE-returned `allowedActions`; status comes from `effectiveStatus`.\n */\n@Component({\n selector: 'mt-delegations-list',\n standalone: true,\n imports: [\n CommonModule,\n Avatar,\n Breadcrumb,\n Table,\n TranslocoDirective,\n DelegationStatusChip,\n ],\n templateUrl: './delegations-list.html',\n styleUrl: './delegations-list.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class DelegationsList implements OnInit {\n /**\n * Admin/control-panel breadcrumb. Hidden on the client self-service surface\n * (its links point at /control-panel/*). Bound from route data via\n * `withComponentInputBinding()` — admin leaves it default; client passes\n * `data: { showBreadcrumb: false }`.\n */\n readonly showBreadcrumb = input<boolean>(true);\n\n /**\n * Admin-managed surface: the create/edit form also collects the Delegator /\n * From user (admin creates a delegation between two users). Client\n * self-service leaves this false. Bound from route data via\n * `withComponentInputBinding()` — admin passes `data: { adminMode: true }`.\n */\n readonly adminMode = input<boolean>(false);\n\n private readonly facade = inject(DelegationsFacade);\n private readonly modal = inject(ModalService);\n private readonly transloco = inject(TranslocoService);\n\n protected readonly breadcrumbItems = linkedSignal(() => [\n {\n label: '',\n icon: 'general.home-line',\n routerLink: '/control-panel/workspaces',\n },\n {\n label: this.transloco.translate('product-settings.product-settings'),\n routerLink: '/control-panel/product-settings',\n },\n {\n label: this.transloco.translate('delegations.title'),\n },\n ]);\n\n protected readonly activeTab = signal<DelegationTab>('my');\n protected readonly tabs = signal([\n {\n value: 'my' as DelegationTab,\n label: this.transloco.translate('delegations.myDelegations'),\n },\n {\n value: 'assigned' as DelegationTab,\n label: this.transloco.translate('delegations.delegatedToMe'),\n },\n ]);\n\n protected readonly isLoading = computed(() =>\n this.activeTab() === 'my'\n ? this.facade.isLoadingMy()\n : this.facade.isLoadingAssigned(),\n );\n protected readonly rows = computed(() =>\n this.activeTab() === 'my'\n ? this.facade.myItems()\n : this.facade.assignedItems(),\n );\n\n statusCol = viewChild.required<TemplateRef<unknown>>('statusCol');\n userCol = viewChild.required<TemplateRef<unknown>>('userCol');\n scopeCol = viewChild.required<TemplateRef<unknown>>('scopeCol');\n daysCol = viewChild.required<TemplateRef<unknown>>('daysCol');\n\n protected readonly tableActions = signal<TableAction[]>([\n {\n icon: 'general.plus',\n label: this.transloco.translate('delegations.action.create'),\n color: 'primary',\n action: () => this.openForm(null),\n },\n ]);\n\n protected readonly rowActions = signal<TableAction[]>([\n {\n icon: 'general.eye',\n tooltip: this.transloco.translate('delegations.action.view'),\n color: 'primary',\n variant: 'outlined',\n action: (row: DelegationRow) => this.viewDetails(row),\n hidden: (row: DelegationRow) => !this.has(row, 'View'),\n },\n {\n icon: 'custom.pencil',\n tooltip: this.transloco.translate('delegations.action.edit'),\n color: 'primary',\n action: (row: DelegationRow) => this.openForm(row),\n hidden: (row: DelegationRow) => !this.has(row, 'Edit'),\n },\n {\n icon: 'general.check',\n tooltip: this.transloco.translate('delegations.action.approve'),\n color: 'primary',\n action: (row: DelegationRow) => this.approve(row),\n hidden: (row: DelegationRow) => !this.has(row, 'Approve'),\n loading: (row: DelegationRow) =>\n this.busyIds().includes(`approve:${row.delegationId}`),\n confirmation: { type: 'popup' },\n },\n {\n icon: 'general.x-close',\n tooltip: this.transloco.translate('delegations.action.reject'),\n color: 'danger',\n variant: 'outlined',\n // Opens a dialog that collects a required reason (no inline popup confirm).\n action: (row: DelegationRow) => this.reject(row),\n hidden: (row: DelegationRow) => !this.has(row, 'Reject'),\n },\n {\n icon: 'general.trash-01',\n tooltip: this.transloco.translate('delegations.action.cancel'),\n color: 'danger',\n variant: 'outlined',\n action: (row: DelegationRow) => this.cancel(row),\n hidden: (row: DelegationRow) => !this.has(row, 'Cancel'),\n loading: (row: DelegationRow) =>\n this.busyIds().includes(`cancel:${row.delegationId}`),\n confirmation: { type: 'popup', confirmationType: 'delete' },\n },\n {\n icon: 'arrow.arrow-right',\n tooltip: this.transloco.translate('delegations.action.startSession'),\n color: 'primary',\n action: (row: DelegationRow) => this.startSession(row),\n hidden: (row: DelegationRow) => !this.has(row, 'StartSession'),\n },\n ]);\n\n protected readonly tableColumns = linkedSignal<ColumnDef[]>(() => [\n {\n key: 'effectiveStatus',\n label: this.transloco.translate('delegations.column.status'),\n type: 'custom',\n customCellTpl: this.statusCol(),\n },\n {\n key: this.activeTab() === 'my' ? 'delegatedUser' : 'delegator',\n label: this.transloco.translate(\n this.activeTab() === 'my'\n ? 'delegations.column.delegatedTo'\n : 'delegations.column.delegatorName',\n ),\n type: 'custom',\n customCellTpl: this.userCol(),\n },\n {\n key: 'scopeSummary',\n label: this.transloco.translate('delegations.column.scopeSummary'),\n type: 'custom',\n customCellTpl: this.scopeCol(),\n },\n {\n key: 'startsAtUtc',\n label: this.transloco.translate('delegations.column.startDate'),\n type: 'dateTime',\n },\n {\n key: 'endsAtUtc',\n label: this.transloco.translate('delegations.column.endDate'),\n type: 'dateTime',\n },\n {\n key: 'createdAtUtc',\n label: this.transloco.translate('delegations.column.createdDate'),\n type: 'dateTime',\n },\n {\n key: 'dayRuleMode',\n label: this.transloco.translate('delegations.column.days'),\n type: 'custom',\n customCellTpl: this.daysCol(),\n },\n ]);\n\n private readonly busyIds = signal<string[]>([]);\n\n private readonly weekdayKeys = [\n 'sunday',\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n ] as const;\n\n ngOnInit(): void {\n this.loadCurrentTab();\n }\n\n protected switchTab(tab: DelegationTab): void {\n this.activeTab.set(tab);\n this.loadCurrentTab();\n }\n\n private loadCurrentTab(\n query: DelegationListQuery = { page: 1, pageSize: 25 },\n ): void {\n if (this.activeTab() === 'my') {\n this.facade.getMy(query);\n } else {\n this.facade.getAssigned(query);\n }\n }\n\n private reloadCurrentTab(): void {\n this.loadCurrentTab();\n }\n\n protected has(row: DelegationRow, action: DelegationAllowedAction): boolean {\n return row.allowedActions?.includes(action) ?? false;\n }\n\n protected formatDays(row: DelegationRow): string {\n if (row.dayRuleMode === 'SpecificDays' && row.specificDays?.length) {\n return row.specificDays\n .filter((d) => d >= 0 && d < this.weekdayKeys.length)\n .map((d) =>\n this.transloco.translate(`delegations.days.${this.weekdayKeys[d]}`),\n )\n .join(', ');\n }\n return this.transloco.translate('delegations.form.fullRange');\n }\n\n private viewDetails(row: DelegationRow): void {\n this.modal.openModal(DelegationDetailDrawer, 'drawer', {\n header: this.transloco.translate('delegations.action.view'),\n styleClass:\n '!absolute !shadow-none !w-full !max-w-full sm:!w-[42rem] xl:!w-[50rem]',\n position: 'end',\n appendTo: 'page-content',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegationId: row.delegationId },\n });\n }\n\n private openForm(row: DelegationRow | null): void {\n const ref = this.modal.openModal(\n DelegationForm,\n row ? 'drawer' : 'dialog',\n {\n header: this.transloco.translate(\n row ? 'delegations.action.edit' : 'delegations.action.create',\n ),\n styleClass: row\n ? '!absolute !shadow-none !w-full !max-w-full sm:!w-[42rem] xl:!w-[50rem]'\n : '!w-[min(96vw,50rem)] !max-w-[96vw] !h-[min(90vh,40rem)] !max-h-[90vh]',\n position: row ? 'end' : '',\n appendTo: row ? 'page-content' : 'body',\n dismissableMask: true,\n dismissible: true,\n inputValues: {\n delegationForEdit: row,\n readonly: false,\n adminMode: this.adminMode(),\n },\n },\n );\n ref.onClose.subscribe((saved: boolean) => {\n if (saved) this.reloadCurrentTab();\n });\n }\n\n private approve(row: DelegationRow): void {\n this.mark(`approve:${row.delegationId}`, true);\n this.facade\n .approve(row.delegationId, { rowVersion: row.rowVersion })\n .pipe(finalize(() => this.mark(`approve:${row.delegationId}`, false)))\n .subscribe({ next: () => this.reloadCurrentTab() });\n }\n\n private reject(row: DelegationRow): void {\n const ref = this.modal.openModal(RejectDelegationDialog, 'dialog', {\n header: this.transloco.translate('delegations.action.reject'),\n styleClass: '!w-[min(96vw,30rem)] !max-w-[96vw]',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegation: row },\n });\n ref.onClose.subscribe((rejected: boolean) => {\n if (rejected) this.reloadCurrentTab();\n });\n }\n\n private cancel(row: DelegationRow): void {\n this.mark(`cancel:${row.delegationId}`, true);\n this.facade\n .cancel(row.delegationId, row.rowVersion)\n .pipe(finalize(() => this.mark(`cancel:${row.delegationId}`, false)))\n .subscribe({ next: () => this.reloadCurrentTab() });\n }\n\n private startSession(row: DelegationRow): void {\n this.modal.openModal(StartSessionDialog, 'dialog', {\n header: this.transloco.translate('delegations.action.startSession'),\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegation: row, intent: 'start' },\n });\n }\n\n private mark(key: string, on: boolean): void {\n this.busyIds.update((ids) =>\n on ? [...ids, key] : ids.filter((id) => id !== key),\n );\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col h-full gap-2 p-4\">\n @if (showBreadcrumb()) {\n <mt-breadcrumb [items]=\"breadcrumbItems()\"></mt-breadcrumb>\n }\n\n <div class=\"flex items-center gap-2 border-b border-gray-200\">\n @for (tab of tabs(); track tab.value) {\n <button\n type=\"button\"\n class=\"px-4 py-2 -mb-px border-b-2 text-sm font-medium transition-colors\"\n [class.border-primary]=\"activeTab() === tab.value\"\n [class.text-primary]=\"activeTab() === tab.value\"\n [class.border-transparent]=\"activeTab() !== tab.value\"\n [class.text-gray-500]=\"activeTab() !== tab.value\"\n (click)=\"switchTab(tab.value)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n\n <mt-table\n [data]=\"rows()\"\n [columns]=\"tableColumns()\"\n [actions]=\"tableActions()\"\n [rowActions]=\"rowActions()\"\n [loading]=\"isLoading()\"\n >\n <ng-template #statusCol let-row>\n <mt-delegation-status-chip\n [status]=\"row.effectiveStatus\"\n ></mt-delegation-status-chip>\n </ng-template>\n\n <ng-template #userCol let-row>\n @let party = activeTab() === \"my\" ? row.delegatedUser : row.delegator;\n <div class=\"flex items-center gap-2\">\n <mt-avatar icon=\"user.user-01\" styleClass=\"w-8! h-8!\"></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-sm text-gray-900 truncate\">\n {{ party?.displayName }}\n </span>\n @if (party?.email) {\n <span class=\"text-xs text-gray-500 truncate\">\n {{ party.email }}\n </span>\n }\n </div>\n </div>\n </ng-template>\n\n <ng-template #scopeCol let-row>\n <span class=\"text-sm text-gray-700\" [title]=\"row.scopeSummary\">\n {{ row.scopeSummary || \"—\" }}\n </span>\n </ng-template>\n\n <ng-template #daysCol let-row>\n <span class=\"text-sm text-gray-700\">{{ formatDays(row) }}</span>\n </ng-template>\n </mt-table>\n </div>\n</ng-container>\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { DelegationSessionFacade } from '../store/session/delegation-session.facade';\n\n/**\n * Endpoints that must NEVER carry the `app-delegation` header.\n * Starting a delegated session uses only the normal `Authorization` token\n * (doc 05). All other `identity/delegations` management calls are normal\n * (non-delegated) actions too, so the whole namespace is excluded.\n */\nconst EXCLUDE = /\\bidentity\\/delegations\\b/i;\n\n/**\n * Adds `app-delegation: Bearer <token>` to outgoing requests while a delegated\n * session is active. Register AFTER the gateway-auth interceptor (so the normal\n * `Authorization` header is set first) and BEFORE the message interceptor.\n */\nexport const appDelegationInterceptor: HttpInterceptorFn = (req, next) => {\n if (EXCLUDE.test(req.url)) {\n return next(req);\n }\n\n const token = inject(DelegationSessionFacade).token();\n if (!token) {\n return next(req);\n }\n\n return next(\n req.clone({ setHeaders: { 'app-delegation': `Bearer ${token}` } }),\n );\n};\n","// store/index.ts\nexport * from './delegations';\nexport * from './session';\n","// Runtime UI surfaces — projected into host topbars + opened via ModalService.\nexport { TopbarDelegationMenu } from './lib/delegations/topbar-delegation-menu/topbar-delegation-menu';\nexport { DelegationStatusChip } from './lib/delegations/delegation-status-chip/delegation-status-chip';\nexport { default as StartSessionDialog } from './lib/delegations/start-session-dialog/start-session-dialog';\nexport { default as RejectDelegationDialog } from './lib/delegations/reject-delegation-dialog/reject-delegation-dialog';\n\n// Management UI — portal page (My Delegations / Delegated To Me) + form + detail drawer.\nexport { default as Delegations } from './lib/delegations/delegations';\nexport { default as DelegationsList } from './lib/delegations/delegations-list/delegations-list';\nexport { default as DelegationForm } from './lib/delegations/delegation-form/delegation-form';\nexport { default as DelegationDetailDrawer } from './lib/delegations/delegation-detail-drawer/delegation-detail-drawer';\nexport { ScopePicker } from './lib/delegations/delegation-form/scope-picker/scope-picker';\n\n// HTTP\nexport { appDelegationInterceptor } from './interceptors/app-delegation.interceptor';\n\n// Store (models, actions, state, facades — both delegations and session)\nexport * from './store';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["BASE","__decorate","EMPTY_SCOPE","i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-delegations.mjs","sources":["../../../../packages/masterteam/delegations/src/lib/delegations/delegation-status-chip/delegation-status-chip.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.actions.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.model.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.state.ts","../../../../packages/masterteam/delegations/src/store/session/delegation-session.facade.ts","../../../../packages/masterteam/delegations/src/lib/delegations/start-session-dialog/start-session-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/start-session-dialog/start-session-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/topbar-delegation-menu/topbar-delegation-menu.ts","../../../../packages/masterteam/delegations/src/lib/delegations/topbar-delegation-menu/topbar-delegation-menu.html","../../../../packages/masterteam/delegations/src/store/delegations/delegations.actions.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.model.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.state.ts","../../../../packages/masterteam/delegations/src/store/delegations/delegations.facade.ts","../../../../packages/masterteam/delegations/src/lib/delegations/reject-delegation-dialog/reject-delegation-dialog.ts","../../../../packages/masterteam/delegations/src/lib/delegations/reject-delegation-dialog/reject-delegation-dialog.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegations.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegations.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/scope-picker/scope-picker.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/scope-picker/scope-picker.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/delegation-form.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-form/delegation-form.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-detail-drawer/delegation-detail-drawer.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegation-detail-drawer/delegation-detail-drawer.html","../../../../packages/masterteam/delegations/src/lib/delegations/delegations-list/delegations-list.ts","../../../../packages/masterteam/delegations/src/lib/delegations/delegations-list/delegations-list.html","../../../../packages/masterteam/delegations/src/interceptors/app-delegation.interceptor.ts","../../../../packages/masterteam/delegations/src/store/index.ts","../../../../packages/masterteam/delegations/src/public-api.ts","../../../../packages/masterteam/delegations/src/masterteam-delegations.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Chip } from '@masterteam/components/chip';\nimport { DelegationEffectiveStatus } from '../../../store/delegations/delegations.model';\n\ninterface StatusVisual {\n i18nKey: string;\n styleClass: string;\n}\n\nconst STATUS_VISUAL: Record<DelegationEffectiveStatus, StatusVisual> = {\n Active: {\n i18nKey: 'delegations.status.active',\n styleClass: 'mt-status-chip mt-status-chip--active',\n },\n Scheduled: {\n i18nKey: 'delegations.status.scheduled',\n styleClass: 'mt-status-chip mt-status-chip--scheduled',\n },\n PendingApproval: {\n i18nKey: 'delegations.status.pendingApproval',\n styleClass: 'mt-status-chip mt-status-chip--pending',\n },\n InactiveToday: {\n i18nKey: 'delegations.status.inactiveToday',\n styleClass: 'mt-status-chip mt-status-chip--scheduled',\n },\n Expired: {\n i18nKey: 'delegations.status.expired',\n styleClass: 'mt-status-chip mt-status-chip--expired',\n },\n Rejected: {\n i18nKey: 'delegations.status.rejected',\n styleClass: 'mt-status-chip mt-status-chip--rejected',\n },\n Cancelled: {\n i18nKey: 'delegations.status.cancelled',\n styleClass: 'mt-status-chip mt-status-chip--cancelled',\n },\n};\n\n@Component({\n selector: 'mt-delegation-status-chip',\n standalone: true,\n imports: [Chip, TranslocoDirective],\n template: `\n <ng-container *transloco=\"let t\">\n @let v = visual();\n <mt-chip [label]=\"t(v.i18nKey)\" [styleClass]=\"v.styleClass\"></mt-chip>\n </ng-container>\n `,\n styles: [\n `\n :host {\n display: inline-flex;\n }\n :host ::ng-deep .mt-status-chip {\n font-weight: 500;\n font-size: 0.75rem;\n border-radius: 9999px;\n padding-inline: 0.625rem;\n padding-block: 0.125rem;\n }\n :host ::ng-deep .mt-status-chip--active {\n background-color: rgb(220 252 231);\n color: rgb(22 101 52);\n }\n :host ::ng-deep .mt-status-chip--scheduled {\n background-color: rgb(219 234 254);\n color: rgb(30 64 175);\n }\n :host ::ng-deep .mt-status-chip--pending {\n background-color: rgb(254 249 195);\n color: rgb(133 77 14);\n }\n :host ::ng-deep .mt-status-chip--expired {\n background-color: rgb(243 244 246);\n color: rgb(75 85 99);\n }\n :host ::ng-deep .mt-status-chip--rejected {\n background-color: rgb(254 226 226);\n color: rgb(153 27 27);\n }\n :host ::ng-deep .mt-status-chip--cancelled {\n background-color: rgb(229 231 235);\n color: rgb(55 65 81);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--active {\n background-color: rgba(34, 197, 94, 0.2);\n color: rgb(134 239 172);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--scheduled {\n background-color: rgba(59, 130, 246, 0.2);\n color: rgb(147 197 253);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--pending {\n background-color: rgba(234, 179, 8, 0.2);\n color: rgb(253 224 71);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--expired {\n background-color: rgba(148, 163, 184, 0.2);\n color: rgb(203 213 225);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--rejected {\n background-color: rgba(239, 68, 68, 0.2);\n color: rgb(252 165 165);\n }\n :host-context(.dark) ::ng-deep .mt-status-chip--cancelled {\n background-color: rgba(148, 163, 184, 0.15);\n color: rgb(203 213 225);\n }\n `,\n ],\n})\nexport class DelegationStatusChip {\n readonly status = input.required<DelegationEffectiveStatus>();\n\n protected readonly visual = computed<StatusVisual>(\n () => STATUS_VISUAL[this.status()] ?? STATUS_VISUAL.Scheduled,\n );\n}\n","import { DelegationRow } from '../delegations/delegations.model';\nimport { DelegationSessionInvalidationReason } from './delegation-session.model';\n\n/** Fetch the active delegations the current user may start (user/activedelegations). */\nexport class LoadDelegationCandidates {\n static readonly type = '[DelegationSession] Load Candidates';\n}\n\n/** Start a delegated session for the given assignment row. */\nexport class StartDelegationSession {\n static readonly type = '[DelegationSession] Start';\n constructor(public delegation: DelegationRow) {}\n}\n\n/** End the current delegated session. Client-local only (doc 05). */\nexport class EndDelegationSession {\n static readonly type = '[DelegationSession] End';\n constructor(public reason: DelegationSessionInvalidationReason = 'Manual') {}\n}\n\n/** Switch directly from the current session to another delegation. */\nexport class SwitchDelegationSession {\n static readonly type = '[DelegationSession] Switch';\n constructor(public delegation: DelegationRow) {}\n}\n","import { LoadingStateShape } from '../utils/state-helpers';\nimport { DelegationRow } from '../delegations/delegations.model';\n\n/**\n * Active delegated session. Memory-only by design (doc 05):\n * the delegation token is never persisted to long-lived storage.\n *\n * `delegation.delegatedUser` is the executed-by (actual logged-in) user and\n * `delegation.delegator` is the on-behalf-of user — both already present on the\n * row from the active-delegations endpoint.\n */\nexport interface ActiveDelegationSession {\n token: string;\n delegation: DelegationRow;\n}\n\nexport type DelegationSessionInvalidationReason =\n | 'TokenInvalid'\n | 'SessionMismatch'\n | 'ScopeChanged'\n | 'Forbidden'\n | 'Logout'\n | 'UserSwitch'\n | 'Manual';\n\nexport enum DelegationSessionActionKey {\n LoadCandidates = 'loadCandidates',\n StartSession = 'startSession',\n}\n\nexport interface DelegationSessionStateModel extends LoadingStateShape<DelegationSessionActionKey> {\n active: ActiveDelegationSession | null;\n candidates: DelegationRow[];\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport {\n Action,\n Actions,\n ofActionDispatched,\n ofActionSuccessful,\n Selector,\n State,\n StateContext,\n Store,\n} from '@ngxs/store';\nimport { handleApiRequest } from '@masterteam/components';\nimport { EMPTY, switchMap } from 'rxjs';\nimport { Response } from '../delegations/api.model';\nimport {\n DelegationPage,\n DelegationRow,\n} from '../delegations/delegations.model';\nimport {\n EndDelegationSession,\n LoadDelegationCandidates,\n StartDelegationSession,\n SwitchDelegationSession,\n} from './delegation-session.actions';\nimport {\n ActiveDelegationSession,\n DelegationSessionActionKey,\n DelegationSessionStateModel,\n} from './delegation-session.model';\n\nconst BASE = 'identity/delegations';\n\n// Action shells matching gateway-auth type strings — loose coupling, matched by\n// `type` only so this package does not depend on @masterteam/gateway-auth.\nclass GatewayLoginSuccessShell {\n static readonly type = '[Auth] Login Success';\n}\nclass GatewayLogoutShell {\n static readonly type = '[Auth] Logout';\n}\n\nfunction canStart(row: DelegationRow): boolean {\n return (\n row.effectiveStatus === 'Active' &&\n row.allowedActions?.includes('StartSession')\n );\n}\n\n@State<DelegationSessionStateModel>({\n name: 'delegationSession',\n defaults: {\n active: null,\n candidates: [],\n loadingActive: [],\n errors: {},\n },\n})\n@Injectable()\nexport class DelegationSessionState {\n private http = inject(HttpClient);\n private actions$ = inject(Actions);\n private store = inject(Store);\n\n constructor() {\n this.actions$\n .pipe(ofActionSuccessful(GatewayLoginSuccessShell))\n .subscribe(() => this.store.dispatch(new LoadDelegationCandidates()));\n\n this.actions$\n .pipe(ofActionDispatched(GatewayLogoutShell))\n .subscribe(() => this.store.dispatch(new EndDelegationSession('Logout')));\n }\n\n // ---------------------------------------------------------------------------\n // Selectors\n // ---------------------------------------------------------------------------\n\n @Selector()\n static getActive(\n state: DelegationSessionStateModel,\n ): ActiveDelegationSession | null {\n return state.active;\n }\n\n @Selector()\n static getCandidates(state: DelegationSessionStateModel): DelegationRow[] {\n return state.candidates;\n }\n\n @Selector()\n static isDelegated(state: DelegationSessionStateModel): boolean {\n return !!state.active;\n }\n\n @Selector()\n static getLoadingActive(state: DelegationSessionStateModel): string[] {\n return state.loadingActive;\n }\n\n @Selector()\n static getErrors(\n state: DelegationSessionStateModel,\n ): Record<string, string | null | undefined> {\n return state.errors;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n @Action(LoadDelegationCandidates)\n loadCandidates(ctx: StateContext<DelegationSessionStateModel>) {\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\n `${BASE}/user/activedelegations`,\n );\n return handleApiRequest({\n ctx,\n key: DelegationSessionActionKey.LoadCandidates,\n request$: req$,\n onSuccess: (response) => ({\n candidates: (response.data?.items ?? []).filter(canStart),\n }),\n });\n }\n\n @Action(StartDelegationSession)\n start(\n ctx: StateContext<DelegationSessionStateModel>,\n { delegation }: StartDelegationSession,\n ) {\n const req$ = this.http.post<Response<string>>(\n `${BASE}/delegationToken/${delegation.delegationId}`,\n {},\n );\n return handleApiRequest({\n ctx,\n key: DelegationSessionActionKey.StartSession,\n request$: req$,\n onSuccess: (response) => ({\n active: { token: response.data, delegation } as ActiveDelegationSession,\n }),\n });\n }\n\n @Action(EndDelegationSession)\n end(ctx: StateContext<DelegationSessionStateModel>) {\n // Client-local only — there is no server end-session endpoint (doc 05).\n ctx.patchState({ active: null });\n return EMPTY;\n }\n\n @Action(SwitchDelegationSession)\n switch(\n ctx: StateContext<DelegationSessionStateModel>,\n { delegation }: SwitchDelegationSession,\n ) {\n return this.store\n .dispatch(new EndDelegationSession('Manual'))\n .pipe(\n switchMap(() =>\n this.store.dispatch(new StartDelegationSession(delegation)),\n ),\n );\n }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { select, Store } from '@ngxs/store';\nimport {\n EndDelegationSession,\n LoadDelegationCandidates,\n StartDelegationSession,\n SwitchDelegationSession,\n} from './delegation-session.actions';\nimport {\n DelegationSessionActionKey,\n DelegationSessionInvalidationReason,\n} from './delegation-session.model';\nimport { DelegationSessionState } from './delegation-session.state';\nimport { DelegationRow } from '../delegations/delegations.model';\n\n@Injectable({ providedIn: 'root' })\nexport class DelegationSessionFacade {\n private readonly store = inject(Store);\n\n // ---------------------------------------------------------------------------\n // Data slices\n // ---------------------------------------------------------------------------\n readonly active = select(DelegationSessionState.getActive);\n readonly candidates = select(DelegationSessionState.getCandidates);\n readonly isDelegated = select(DelegationSessionState.isDelegated);\n\n private readonly loadingActive = select(\n DelegationSessionState.getLoadingActive,\n );\n\n // ---------------------------------------------------------------------------\n // Derived (interceptor + topbar)\n // ---------------------------------------------------------------------------\n /** Raw delegation token for the `app-delegation` header. */\n readonly token = computed(() => this.active()?.token ?? null);\n /** On-behalf-of (delegator). */\n readonly onBehalfOf = computed(\n () => this.active()?.delegation.delegator ?? null,\n );\n /** Executed-by (actual logged-in / delegated user). */\n readonly executedBy = computed(\n () => this.active()?.delegation.delegatedUser ?? null,\n );\n readonly hasCandidates = computed(() => this.candidates().length > 0);\n\n readonly isStarting = computed(() =>\n this.loadingActive().includes(DelegationSessionActionKey.StartSession),\n );\n readonly isLoadingCandidates = computed(() =>\n this.loadingActive().includes(DelegationSessionActionKey.LoadCandidates),\n );\n\n // ---------------------------------------------------------------------------\n // Dispatchers\n // ---------------------------------------------------------------------------\n loadCandidates() {\n return this.store.dispatch(new LoadDelegationCandidates());\n }\n startSession(delegation: DelegationRow) {\n return this.store.dispatch(new StartDelegationSession(delegation));\n }\n switchSession(delegation: DelegationRow) {\n return this.store.dispatch(new SwitchDelegationSession(delegation));\n }\n endSession(reason: DelegationSessionInvalidationReason = 'Manual') {\n return this.store.dispatch(new EndDelegationSession(reason));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\n\n/**\n * Confirmation dialog before starting (or switching to) a delegated session.\n * Calls the facade, which POSTs to `delegationToken/{id}` and stores the raw\n * token in memory only.\n */\n@Component({\n selector: 'mt-start-session-dialog',\n standalone: true,\n imports: [CommonModule, Avatar, Button, TranslocoDirective],\n templateUrl: './start-session-dialog.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class StartSessionDialog {\n readonly delegation = input.required<DelegationRow>();\n readonly intent = input<'start' | 'switch'>('start');\n\n private readonly ref: ModalRef = inject(ModalRef);\n private readonly facade = inject(DelegationSessionFacade);\n\n protected readonly isBusy = this.facade.isStarting;\n\n protected readonly bodyKey = computed(() =>\n this.intent() === 'switch'\n ? 'delegations.session.switchConfirmBody'\n : 'delegations.session.startConfirmBody',\n );\n\n confirm(): void {\n const row = this.delegation();\n const op$ =\n this.intent() === 'switch'\n ? this.facade.switchSession(row)\n : this.facade.startSession(row);\n op$.subscribe({\n next: () => this.ref.close(true),\n error: () => {\n /* error surfaced via shared toast pipeline; keep dialog open */\n },\n });\n }\n\n cancel(): void {\n this.ref.close(false);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col gap-4 p-2\">\n <div class=\"flex items-start gap-3\">\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-12! h-12! text-lg! bg-surface-200!\"\n ></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <div class=\"text-base font-medium text-gray-900 truncate\">\n {{ delegation().delegator.displayName }}\n </div>\n @if (delegation().delegator.email) {\n <div class=\"text-xs text-gray-500 truncate\">\n {{ delegation().delegator.email }}\n </div>\n }\n @if (delegation().scopeSummary) {\n <div class=\"text-xs text-gray-500 mt-1\">\n {{ t(\"delegations.column.scopeSummary\") }}:\n {{ delegation().scopeSummary }}\n </div>\n }\n </div>\n </div>\n\n <p class=\"text-sm text-gray-600 leading-relaxed\">\n {{ t(bodyKey()) }}\n </p>\n\n <div class=\"flex justify-end gap-2 pt-2 border-t border-gray-200\">\n <mt-button\n variant=\"outlined\"\n color=\"secondary\"\n [label]=\"t('delegations.common.cancel')\"\n [disabled]=\"isBusy()\"\n (click)=\"cancel()\"\n ></mt-button>\n <mt-button\n color=\"primary\"\n icon=\"user.users-check\"\n [label]=\"t('delegations.action.startSession')\"\n [loading]=\"isBusy()\"\n (click)=\"confirm()\"\n ></mt-button>\n </div>\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n viewChild,\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { Button } from '@masterteam/components/button';\nimport { ModalService } from '@masterteam/components/modal';\nimport { Icon } from '@masterteam/icons';\nimport { Popover } from 'primeng/popover';\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\nimport { DelegationSessionFacade } from '../../../store/session/delegation-session.facade';\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\n\n/**\n * Topbar surface for the delegation runtime (doc 05, 09).\n *\n * State A — no candidates, no active session: renders nothing.\n * State B — candidates exist, no active session: lets the user start a session.\n * State C — active delegated session: shows \"Acting on behalf of {delegator}\" +\n * \"Executed by {actual user}\", plus Back / Switch.\n */\n@Component({\n selector: 'mt-topbar-delegation-menu',\n standalone: true,\n imports: [\n CommonModule,\n Avatar,\n Button,\n Icon,\n Popover,\n RouterLink,\n TranslocoDirective,\n DelegationStatusChip,\n ],\n templateUrl: './topbar-delegation-menu.html',\n styleUrls: ['./topbar-delegation-menu.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TopbarDelegationMenu {\n /** Path to the management page, e.g. `/control-panel/delegations` or `/delegations`. */\n readonly managePath = input<string>('/delegations');\n readonly compact = input<boolean>(false);\n\n private readonly facade = inject(DelegationSessionFacade);\n private readonly modal = inject(ModalService);\n private readonly transloco = inject(TranslocoService);\n\n protected readonly popover = viewChild.required<Popover>('popover');\n\n protected readonly active = this.facade.active;\n protected readonly candidates = this.facade.candidates;\n protected readonly hasCandidates = this.facade.hasCandidates;\n protected readonly onBehalfOf = this.facade.onBehalfOf;\n protected readonly executedBy = this.facade.executedBy;\n\n protected readonly mode = computed<'hidden' | 'candidates' | 'active'>(() => {\n if (this.active()) return 'active';\n if (this.hasCandidates()) return 'candidates';\n return 'hidden';\n });\n\n togglePopover(event: Event): void {\n this.popover().toggle(event);\n }\n\n start(row: DelegationRow, event: MouseEvent): void {\n event.stopPropagation();\n this.popover().hide();\n this.openConfirm(row, 'start');\n }\n\n switchTo(row: DelegationRow, event: MouseEvent): void {\n event.stopPropagation();\n this.popover().hide();\n this.openConfirm(row, 'switch');\n }\n\n endSession(event: MouseEvent): void {\n event.stopPropagation();\n this.popover().hide();\n this.facade.endSession('Manual').subscribe();\n }\n\n private openConfirm(row: DelegationRow, intent: 'start' | 'switch'): void {\n this.modal.openModal(StartSessionDialog, 'dialog', {\n header: this.transloco.translate('delegations.action.startSession'),\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegation: row, intent },\n });\n }\n}\n","<ng-container *transloco=\"let t\">\n @if (mode() !== \"hidden\") {\n <div class=\"mt-delegation-trigger flex items-center gap-2\">\n <button\n type=\"button\"\n class=\"mt-delegation-trigger__button flex items-center gap-2 px-2 py-1 rounded-full cursor-pointer hover:bg-surface-100\"\n [attr.aria-label]=\"t('delegations.title')\"\n (click)=\"togglePopover($event)\"\n >\n @if (mode() === \"active\") {\n <mt-icon\n icon=\"user.users-check\"\n styleClass=\"text-lg text-primary\"\n ></mt-icon>\n @if (!compact()) {\n <span class=\"mt-delegation-trigger__label text-sm font-medium\">\n {{\n t(\"delegations.session.banner\", {\n delegatorName: onBehalfOf()?.displayName,\n })\n }}\n </span>\n }\n <mt-delegation-status-chip\n status=\"Active\"\n ></mt-delegation-status-chip>\n } @else {\n <mt-icon\n icon=\"user.users-plus\"\n styleClass=\"text-lg text-primary\"\n ></mt-icon>\n @if (!compact()) {\n <span class=\"mt-delegation-trigger__label text-sm font-medium\">\n {{ t(\"delegations.session.availableTitle\") }}\n </span>\n }\n }\n </button>\n </div>\n\n <p-popover #popover [pt]=\"{ content: { class: 'p-0!' } }\">\n <div class=\"flex flex-col min-w-80 max-w-96 p-0\">\n @if (mode() === \"active\" && active(); as session) {\n <!-- STATE C — active session -->\n <div\n class=\"flex items-start gap-3 border-b border-gray-200 px-4 py-4\"\n >\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-11! h-11! text-xl! text-gray-600! bg-surface-300!\"\n ></mt-avatar>\n <div class=\"flex flex-col min-w-0 flex-1\">\n <div class=\"text-xs text-gray-500\">\n {{ t(\"delegations.session.actingOnBehalfOf\") }}\n </div>\n <div class=\"text-sm font-medium text-gray-900 truncate\">\n {{ onBehalfOf()?.displayName }}\n </div>\n <div class=\"text-xs text-gray-500 mt-1\">\n {{\n t(\"delegations.session.executedBy\", {\n actualUserName: executedBy()?.displayName,\n })\n }}\n </div>\n @if (session.delegation.scopeSummary) {\n <div\n class=\"text-xs text-gray-500 mt-1 truncate\"\n [title]=\"session.delegation.scopeSummary\"\n >\n {{ t(\"delegations.column.scopeSummary\") }}:\n {{ session.delegation.scopeSummary }}\n </div>\n }\n </div>\n </div>\n\n <div class=\"flex flex-col gap-1 px-2 py-2\">\n <mt-button\n variant=\"text\"\n icon=\"arrow.arrow-left\"\n [label]=\"t('delegations.action.endSession')\"\n styleClass=\"w-full justify-start\"\n (click)=\"endSession($event)\"\n ></mt-button>\n </div>\n\n @if (candidates().length > 1) {\n <div class=\"border-t border-gray-200 pt-2 px-2 pb-2\">\n <div class=\"text-xs text-gray-500 px-2 pb-1\">\n {{ t(\"delegations.session.switchToAnother\") }}\n </div>\n @for (cand of candidates(); track cand.delegationId) {\n @if (cand.delegationId !== session.delegation.delegationId) {\n <button\n type=\"button\"\n class=\"flex items-center justify-between gap-2 w-full px-2 py-2 rounded-md hover:bg-surface-100 cursor-pointer\"\n (click)=\"switchTo(cand, $event)\"\n >\n <div class=\"flex items-center gap-2 min-w-0\">\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-7! h-7! text-sm! bg-surface-200!\"\n ></mt-avatar>\n <span class=\"text-sm text-gray-900 truncate\">\n {{ cand.delegator.displayName }}\n </span>\n </div>\n <mt-icon\n icon=\"arrow.switch-horizontal-01\"\n styleClass=\"text-base text-gray-400\"\n ></mt-icon>\n </button>\n }\n }\n </div>\n }\n } @else if (mode() === \"candidates\") {\n <!-- STATE B — candidates available -->\n <div class=\"border-b border-gray-200 px-4 py-3\">\n <div class=\"text-sm font-medium text-gray-900\">\n {{ t(\"delegations.session.youCanActAs\") }}\n </div>\n <div class=\"text-xs text-gray-500 mt-1\">\n {{ t(\"delegations.session.chooseDelegatorHint\") }}\n </div>\n </div>\n <div class=\"flex flex-col gap-1 px-2 py-2 max-h-72 overflow-y-auto\">\n @for (cand of candidates(); track cand.delegationId) {\n <button\n type=\"button\"\n class=\"flex items-center justify-between gap-2 w-full px-2 py-2 rounded-md hover:bg-surface-100 cursor-pointer text-start\"\n (click)=\"start(cand, $event)\"\n >\n <div class=\"flex items-center gap-2 min-w-0 flex-1\">\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-9! h-9! text-base! bg-surface-200!\"\n ></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-sm font-medium text-gray-900 truncate\">\n {{ cand.delegator.displayName }}\n </span>\n @if (cand.scopeSummary) {\n <span\n class=\"text-xs text-gray-500 truncate\"\n [title]=\"cand.scopeSummary\"\n >\n {{ cand.scopeSummary }}\n </span>\n }\n </div>\n </div>\n <mt-icon\n icon=\"arrow.arrow-right\"\n styleClass=\"text-base text-gray-400\"\n ></mt-icon>\n </button>\n }\n </div>\n }\n\n <!-- Footer -->\n <div class=\"border-t border-gray-200 px-2 py-2\">\n <a\n [routerLink]=\"managePath()\"\n (click)=\"popover().hide()\"\n class=\"flex items-center gap-2 px-3 py-2 rounded-md text-gray-700 hover:bg-surface-100 text-sm cursor-pointer\"\n >\n <mt-icon\n icon=\"general.settings-02\"\n styleClass=\"text-base\"\n ></mt-icon>\n <span>{{ t(\"delegations.session.manage\") }}</span>\n </a>\n </div>\n </div>\n </p-popover>\n }\n</ng-container>\n","import {\n ApproveDelegationRequest,\n CreateDelegationLegacyRequest,\n CreateDelegationV2Request,\n DelegationListQuery,\n DelegationScopeSelection,\n RejectDelegationRequest,\n UpdateDelegationLegacyRequest,\n UpdateDelegationV2Request,\n} from './delegations.model';\n\n// ---------------------------------------------------------------------------\n// Lists / detail\n// ---------------------------------------------------------------------------\n\nexport class GetMyDelegations {\n static readonly type = '[Delegations] Get My Delegations';\n constructor(public query: DelegationListQuery = {}) {}\n}\n\nexport class GetAssignedDelegations {\n static readonly type = '[Delegations] Get Assigned Delegations';\n constructor(public query: DelegationListQuery = {}) {}\n}\n\nexport class GetActiveAssignedDelegations {\n static readonly type = '[Delegations] Get Active Assigned Delegations';\n constructor(public query: DelegationListQuery = {}) {}\n}\n\nexport class GetDelegationDetail {\n static readonly type = '[Delegations] Get Delegation Detail';\n constructor(public id: number) {}\n}\n\nexport class ClearDelegationDetail {\n static readonly type = '[Delegations] Clear Delegation Detail';\n}\n\n// ---------------------------------------------------------------------------\n// Scope\n// ---------------------------------------------------------------------------\n\nexport class GetScopeOptions {\n static readonly type = '[Delegations] Get Scope Options';\n constructor(public delegatorUserId?: string) {}\n}\n\nexport class PreviewScope {\n static readonly type = '[Delegations] Preview Scope';\n constructor(public scope: DelegationScopeSelection) {}\n}\n\nexport class ClearScopePreview {\n static readonly type = '[Delegations] Clear Scope Preview';\n}\n\n// ---------------------------------------------------------------------------\n// Create / edit (legacy + v2)\n// ---------------------------------------------------------------------------\n\nexport class CreateDelegationLegacy {\n static readonly type = '[Delegations] Create Delegation (legacy)';\n constructor(public request: CreateDelegationLegacyRequest) {}\n}\n\nexport class CreateDelegationV2 {\n static readonly type = '[Delegations] Create Delegation (v2)';\n constructor(public request: CreateDelegationV2Request) {}\n}\n\nexport class UpdateDelegationLegacy {\n static readonly type = '[Delegations] Update Delegation (legacy)';\n constructor(\n public id: number,\n public request: UpdateDelegationLegacyRequest,\n ) {}\n}\n\nexport class UpdateDelegationV2 {\n static readonly type = '[Delegations] Update Delegation (v2)';\n constructor(\n public id: number,\n public request: UpdateDelegationV2Request,\n ) {}\n}\n\n// ---------------------------------------------------------------------------\n// Decisions\n// ---------------------------------------------------------------------------\n\nexport class ApproveDelegation {\n static readonly type = '[Delegations] Approve Delegation';\n constructor(\n public id: number,\n public request: ApproveDelegationRequest,\n ) {}\n}\n\nexport class RejectDelegation {\n static readonly type = '[Delegations] Reject Delegation';\n constructor(\n public id: number,\n public request: RejectDelegationRequest,\n ) {}\n}\n\nexport class CancelDelegation {\n static readonly type = '[Delegations] Cancel Delegation';\n constructor(\n public id: number,\n public rowVersion: string,\n public asAdmin: boolean = false,\n ) {}\n}\n","import { LoadingStateShape } from '../utils/state-helpers';\n\n// ============================================================================\n// Status / approval / actions (doc 01, 16)\n// ============================================================================\n\nexport type DelegationEffectiveStatus =\n | 'PendingApproval'\n | 'Scheduled'\n | 'Active'\n | 'InactiveToday'\n | 'Expired'\n | 'Rejected'\n | 'Cancelled';\n\nexport type DelegationApprovalStatus =\n | 'NotRequired'\n | 'Pending'\n | 'Approved'\n | 'Rejected';\n\nexport type DelegationAllowedAction =\n | 'View'\n | 'Edit'\n | 'Approve'\n | 'Reject'\n | 'Cancel'\n | 'StartSession'\n | 'EndSession';\n\nexport type DelegationDayRuleMode = 'FullRange' | 'SpecificDays';\n\n// ============================================================================\n// Parties + row (doc 02)\n// ============================================================================\n\nexport interface DelegationParty {\n userId: string;\n displayName: string;\n email?: string | null;\n}\n\nexport interface DelegationApprovalInfo {\n requiresApproval: boolean;\n approvalStatus: DelegationApprovalStatus;\n}\n\nexport interface DelegationCancellationInfo {\n cancelledBy?: DelegationParty | null;\n cancelledAtUtc?: string | null;\n cancellationReason?: string | null;\n}\n\nexport interface DelegationRow {\n delegationId: number;\n delegator: DelegationParty;\n delegatedUser: DelegationParty;\n startsAtUtc: string;\n endsAtUtc: string;\n timeZoneId: string;\n dayRuleMode: DelegationDayRuleMode;\n specificDays: number[];\n effectiveStatus: DelegationEffectiveStatus;\n statusReasonCode: string;\n createdBy: DelegationParty;\n createdAtUtc: string;\n approval: DelegationApprovalInfo;\n cancellation: DelegationCancellationInfo;\n allowedActions: DelegationAllowedAction[];\n scopeSummary: string;\n rowVersion: string;\n}\n\nexport interface DelegationPage<T> {\n items: T[];\n page: number;\n pageSize: number;\n totalCount: number;\n}\n\n// ============================================================================\n// Scope — grants based (doc 03, 04)\n// ============================================================================\n\nexport interface DelegationScopeTarget {\n applicationKey: string;\n targetType: string;\n targetKey: string;\n legacyModuleId?: number | null;\n targetId?: number | null;\n levelId?: number | null;\n levelModuleId?: number | null;\n domainModuleId?: number | null;\n moduleKey?: string | null;\n permissionModuleType?: string | null;\n permissionTargetId?: number | null;\n displayName?: string | null;\n}\n\nexport interface DelegationScopeAction {\n applicationKey: string;\n operationKey: string;\n operationKind: string;\n permissionCommand?: string | null;\n businessActionCode?: string | null;\n isHighRisk?: boolean;\n isDelegableSnapshot?: boolean;\n}\n\nexport interface DelegationGrant {\n /** Optional backend-provided stable grant identity; preferred for de-dup when present. */\n key?: string;\n applicationKey: string;\n target: DelegationScopeTarget;\n action: DelegationScopeAction;\n accessibilities: unknown[];\n dataFilters: unknown[];\n constraints: unknown[];\n}\n\nexport interface DelegationScopeSelection {\n grants: DelegationGrant[];\n metadata: Record<string, unknown>;\n}\n\n/** `scope/options` returns the grantable set in the same grants shape. */\nexport type DelegationScopeOptions = DelegationScopeSelection;\n\nexport interface DelegationScopeWarning {\n code?: string;\n message: string;\n}\n\nexport interface DelegationScopeDeniedItem {\n applicationKey: string;\n targetType: string;\n targetKey: string;\n operationKey: string;\n permissionCommand?: string;\n reasonCode: string;\n}\n\nexport interface DelegationScopePreview {\n isValid: boolean;\n normalizedScope: DelegationScopeSelection;\n scopeHash: string;\n summary: string;\n warnings: DelegationScopeWarning[];\n deniedItems: DelegationScopeDeniedItem[];\n}\n\n// ============================================================================\n// Detail (doc 02)\n// ============================================================================\n\nexport interface DelegationStatusInfo {\n effectiveStatus: DelegationEffectiveStatus;\n reasonCode: string;\n calculatedAtUtc: string;\n}\n\nexport interface DelegationDetail {\n row: DelegationRow;\n scope: DelegationScopeSelection;\n status: DelegationStatusInfo;\n}\n\n// ============================================================================\n// Legacy create/edit DTO returned by create/edit (doc 02)\n// ============================================================================\n\nexport interface DelegationDto {\n id: number;\n fromUserId: string;\n toUserId: string;\n description?: string;\n isActive?: boolean;\n delegationDaysType: DelegationDayRuleMode;\n specificDays: number[];\n applicationId?: number;\n requiresApproval?: boolean;\n effectiveStatus: DelegationEffectiveStatus;\n statusReasonCode: string;\n allowedActions: DelegationAllowedAction[];\n rowVersion: string;\n [extra: string]: unknown;\n}\n\n// ============================================================================\n// List query (doc 02)\n// ============================================================================\n\nexport type DelegationSortDirection =\n | 'asc'\n | 'ascending'\n | 'desc'\n | 'descending';\n\nexport interface DelegationListQuery {\n activeOnly?: boolean;\n status?: DelegationEffectiveStatus;\n search?: string;\n fromUtc?: string;\n toUtc?: string;\n sortBy?: string;\n sortDirection?: DelegationSortDirection;\n page?: number;\n pageSize?: number;\n // admin only\n delegatorUserId?: string;\n delegatedUserId?: string;\n}\n\n// ============================================================================\n// Create / edit / decision requests (doc 04)\n// ============================================================================\n\nexport interface CreateDelegationLegacyRequest {\n delegateFrom?: string | null;\n delegateTo: string;\n description?: string;\n delegateFromDateTime: string;\n delegateToDateTime: string;\n accessibilityIds?: number[];\n moduleIds?: number[];\n delegationDaysType: DelegationDayRuleMode;\n specificDays?: number[];\n isActive?: boolean;\n requiresApproval?: boolean;\n}\n\nexport interface CreateDelegationV2Request {\n delegateFrom?: string | null;\n delegateTo: string;\n description?: string;\n delegateFromDateTime: string;\n delegateToDateTime: string;\n delegationDaysType: DelegationDayRuleMode;\n specificDays?: number[];\n requiresApproval: boolean;\n scope: DelegationScopeSelection;\n}\n\nexport type UpdateDelegationLegacyRequest = CreateDelegationLegacyRequest & {\n rowVersion: string;\n};\n\nexport type UpdateDelegationV2Request = CreateDelegationV2Request & {\n rowVersion: string;\n};\n\nexport interface ApproveDelegationRequest {\n rowVersion: string;\n reason?: string;\n}\n\nexport interface RejectDelegationRequest {\n rowVersion: string;\n reason: string;\n}\n\n// ============================================================================\n// NGXS state shape + action keys\n// ============================================================================\n\nexport enum DelegationsActionKey {\n GetMy = 'getMy',\n GetAssigned = 'getAssigned',\n GetActive = 'getActive',\n GetDetail = 'getDetail',\n GetScopeOptions = 'getScopeOptions',\n PreviewScope = 'previewScope',\n Create = 'create',\n Update = 'update',\n Approve = 'approve',\n Reject = 'reject',\n Cancel = 'cancel',\n}\n\nexport interface DelegationsStateModel extends LoadingStateShape<DelegationsActionKey> {\n my: DelegationPage<DelegationRow> | null;\n assigned: DelegationPage<DelegationRow> | null;\n active: DelegationPage<DelegationRow> | null;\n detail: DelegationDetail | null;\n scopeOptions: DelegationScopeOptions | null;\n scopePreview: DelegationScopePreview | null;\n}\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\nimport { handleApiRequest } from '@masterteam/components';\nimport { Response } from './api.model';\nimport {\n ApproveDelegation,\n CancelDelegation,\n ClearDelegationDetail,\n ClearScopePreview,\n CreateDelegationLegacy,\n CreateDelegationV2,\n GetActiveAssignedDelegations,\n GetAssignedDelegations,\n GetDelegationDetail,\n GetMyDelegations,\n GetScopeOptions,\n PreviewScope,\n RejectDelegation,\n UpdateDelegationLegacy,\n UpdateDelegationV2,\n} from './delegations.actions';\nimport {\n DelegationDetail,\n DelegationDto,\n DelegationListQuery,\n DelegationPage,\n DelegationRow,\n DelegationScopeOptions,\n DelegationScopePreview,\n DelegationsActionKey,\n DelegationsStateModel,\n} from './delegations.model';\n\nconst BASE = 'identity/delegations';\n\nfunction buildListParams(query: DelegationListQuery): HttpParams {\n let params = new HttpParams();\n if (query.activeOnly != null)\n params = params.set('activeOnly', query.activeOnly);\n if (query.status) params = params.set('status', query.status);\n if (query.search) params = params.set('search', query.search);\n if (query.fromUtc) params = params.set('fromUtc', query.fromUtc);\n if (query.toUtc) params = params.set('toUtc', query.toUtc);\n if (query.sortBy) params = params.set('sortBy', query.sortBy);\n if (query.sortDirection)\n params = params.set('sortDirection', query.sortDirection);\n params = params.set('page', query.page ?? 1);\n params = params.set('pageSize', query.pageSize ?? 25);\n if (query.delegatorUserId)\n params = params.set('delegatorUserId', query.delegatorUserId);\n if (query.delegatedUserId)\n params = params.set('delegatedUserId', query.delegatedUserId);\n return params;\n}\n\n@State<DelegationsStateModel>({\n name: 'delegations',\n defaults: {\n my: null,\n assigned: null,\n active: null,\n detail: null,\n scopeOptions: null,\n scopePreview: null,\n loadingActive: [],\n errors: {},\n },\n})\n@Injectable()\nexport class DelegationsState {\n private http = inject(HttpClient);\n\n // ============================================================================\n // Selectors\n // ============================================================================\n\n @Selector()\n static getMy(\n state: DelegationsStateModel,\n ): DelegationPage<DelegationRow> | null {\n return state.my;\n }\n\n @Selector()\n static getAssigned(\n state: DelegationsStateModel,\n ): DelegationPage<DelegationRow> | null {\n return state.assigned;\n }\n\n @Selector()\n static getActive(\n state: DelegationsStateModel,\n ): DelegationPage<DelegationRow> | null {\n return state.active;\n }\n\n @Selector()\n static getDetail(state: DelegationsStateModel): DelegationDetail | null {\n return state.detail;\n }\n\n @Selector()\n static getScopeOptions(\n state: DelegationsStateModel,\n ): DelegationScopeOptions | null {\n return state.scopeOptions;\n }\n\n @Selector()\n static getScopePreview(\n state: DelegationsStateModel,\n ): DelegationScopePreview | null {\n return state.scopePreview;\n }\n\n @Selector()\n static getLoadingActive(state: DelegationsStateModel): string[] {\n return state.loadingActive;\n }\n\n @Selector()\n static getErrors(\n state: DelegationsStateModel,\n ): Record<string, string | null | undefined> {\n return state.errors;\n }\n\n // ============================================================================\n // Lists\n // ============================================================================\n\n @Action(GetMyDelegations)\n getMy(ctx: StateContext<DelegationsStateModel>, { query }: GetMyDelegations) {\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(BASE, {\n params: buildListParams(query),\n });\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetMy,\n request$: req$,\n onSuccess: (response) => ({ my: response.data }),\n });\n }\n\n @Action(GetAssignedDelegations)\n getAssigned(\n ctx: StateContext<DelegationsStateModel>,\n { query }: GetAssignedDelegations,\n ) {\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\n `${BASE}/assigned`,\n { params: buildListParams(query) },\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetAssigned,\n request$: req$,\n onSuccess: (response) => ({ assigned: response.data }),\n });\n }\n\n @Action(GetActiveAssignedDelegations)\n getActive(\n ctx: StateContext<DelegationsStateModel>,\n { query }: GetActiveAssignedDelegations,\n ) {\n const req$ = this.http.get<Response<DelegationPage<DelegationRow>>>(\n `${BASE}/user/activedelegations`,\n { params: buildListParams(query) },\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetActive,\n request$: req$,\n onSuccess: (response) => ({ active: response.data }),\n });\n }\n\n @Action(GetDelegationDetail)\n getDetail(\n ctx: StateContext<DelegationsStateModel>,\n { id }: GetDelegationDetail,\n ) {\n const req$ = this.http.get<Response<DelegationDetail>>(`${BASE}/${id}`);\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetDetail,\n request$: req$,\n onSuccess: (response) => ({ detail: response.data ?? null }),\n });\n }\n\n @Action(ClearDelegationDetail)\n clearDetail(ctx: StateContext<DelegationsStateModel>) {\n ctx.patchState({ detail: null });\n }\n\n // ============================================================================\n // Scope\n // ============================================================================\n\n @Action(GetScopeOptions)\n getScopeOptions(\n ctx: StateContext<DelegationsStateModel>,\n { delegatorUserId }: GetScopeOptions,\n ) {\n let params = new HttpParams();\n if (delegatorUserId)\n params = params.set('delegatorUserId', delegatorUserId);\n const req$ = this.http.get<Response<DelegationScopeOptions>>(\n `${BASE}/scope/options`,\n { params },\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.GetScopeOptions,\n request$: req$,\n onSuccess: (response) => ({ scopeOptions: response.data ?? null }),\n });\n }\n\n @Action(PreviewScope)\n previewScope(\n ctx: StateContext<DelegationsStateModel>,\n { scope }: PreviewScope,\n ) {\n const req$ = this.http.post<Response<DelegationScopePreview>>(\n `${BASE}/scope/preview`,\n { scope },\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.PreviewScope,\n request$: req$,\n onSuccess: (response) => ({ scopePreview: response.data ?? null }),\n });\n }\n\n @Action(ClearScopePreview)\n clearScopePreview(ctx: StateContext<DelegationsStateModel>) {\n ctx.patchState({ scopePreview: null });\n }\n\n // ============================================================================\n // Create / edit (response is legacy DelegationDto — clients reload list/detail)\n // ============================================================================\n\n @Action(CreateDelegationLegacy)\n createLegacy(\n ctx: StateContext<DelegationsStateModel>,\n { request }: CreateDelegationLegacy,\n ) {\n const req$ = this.http.post<Response<DelegationDto>>(BASE, request);\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Create,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(CreateDelegationV2)\n createV2(\n ctx: StateContext<DelegationsStateModel>,\n { request }: CreateDelegationV2,\n ) {\n const req$ = this.http.post<Response<DelegationDto>>(`${BASE}/v2`, request);\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Create,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(UpdateDelegationLegacy)\n updateLegacy(\n ctx: StateContext<DelegationsStateModel>,\n { id, request }: UpdateDelegationLegacy,\n ) {\n const req$ = this.http.put<Response<DelegationDto>>(\n `${BASE}/${id}`,\n request,\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Update,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(UpdateDelegationV2)\n updateV2(\n ctx: StateContext<DelegationsStateModel>,\n { id, request }: UpdateDelegationV2,\n ) {\n const req$ = this.http.put<Response<DelegationDto>>(\n `${BASE}/v2/${id}`,\n request,\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Update,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n // ============================================================================\n // Decisions\n // ============================================================================\n\n @Action(ApproveDelegation)\n approve(\n ctx: StateContext<DelegationsStateModel>,\n { id, request }: ApproveDelegation,\n ) {\n const req$ = this.http.post<Response<DelegationDto>>(\n `${BASE}/${id}/approve`,\n request,\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Approve,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(RejectDelegation)\n reject(\n ctx: StateContext<DelegationsStateModel>,\n { id, request }: RejectDelegation,\n ) {\n const req$ = this.http.post<Response<DelegationDto>>(\n `${BASE}/${id}/reject`,\n request,\n );\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Reject,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n\n @Action(CancelDelegation)\n cancel(\n ctx: StateContext<DelegationsStateModel>,\n { id, rowVersion, asAdmin }: CancelDelegation,\n ) {\n const path = asAdmin ? `${BASE}/Admin/${id}` : `${BASE}/${id}`;\n const req$ = this.http.delete<Response<boolean>>(path, {\n params: new HttpParams().set('rowVersion', rowVersion),\n });\n return handleApiRequest({\n ctx,\n key: DelegationsActionKey.Cancel,\n request$: req$,\n onSuccess: () => ({}),\n });\n }\n}\n","import { computed, inject, Injectable } from '@angular/core';\nimport { select, Store } from '@ngxs/store';\nimport {\n ApproveDelegation,\n CancelDelegation,\n ClearDelegationDetail,\n ClearScopePreview,\n CreateDelegationLegacy,\n CreateDelegationV2,\n GetActiveAssignedDelegations,\n GetAssignedDelegations,\n GetDelegationDetail,\n GetMyDelegations,\n GetScopeOptions,\n PreviewScope,\n RejectDelegation,\n UpdateDelegationLegacy,\n UpdateDelegationV2,\n} from './delegations.actions';\nimport {\n ApproveDelegationRequest,\n CreateDelegationLegacyRequest,\n CreateDelegationV2Request,\n DelegationListQuery,\n DelegationScopeSelection,\n DelegationsActionKey,\n RejectDelegationRequest,\n UpdateDelegationLegacyRequest,\n UpdateDelegationV2Request,\n} from './delegations.model';\nimport { DelegationsState } from './delegations.state';\n\n@Injectable({ providedIn: 'root' })\nexport class DelegationsFacade {\n private readonly store = inject(Store);\n\n // ---------------------------------------------------------------------------\n // Data slices\n // ---------------------------------------------------------------------------\n readonly myPage = select(DelegationsState.getMy);\n readonly assignedPage = select(DelegationsState.getAssigned);\n readonly activePage = select(DelegationsState.getActive);\n readonly detail = select(DelegationsState.getDetail);\n readonly scopeOptions = select(DelegationsState.getScopeOptions);\n readonly scopePreview = select(DelegationsState.getScopePreview);\n\n private readonly loadingActive = select(DelegationsState.getLoadingActive);\n private readonly errors = select(DelegationsState.getErrors);\n\n // ---------------------------------------------------------------------------\n // Derived\n // ---------------------------------------------------------------------------\n readonly myItems = computed(() => this.myPage()?.items ?? []);\n readonly assignedItems = computed(() => this.assignedPage()?.items ?? []);\n readonly activeItems = computed(() => this.activePage()?.items ?? []);\n\n // ---------------------------------------------------------------------------\n // Loading\n // ---------------------------------------------------------------------------\n readonly isLoadingMy = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetMy),\n );\n readonly isLoadingAssigned = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetAssigned),\n );\n readonly isLoadingActive = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetActive),\n );\n readonly isLoadingDetail = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetDetail),\n );\n readonly isLoadingScopeOptions = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.GetScopeOptions),\n );\n readonly isPreviewingScope = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.PreviewScope),\n );\n readonly isSaving = computed(\n () =>\n this.loadingActive().includes(DelegationsActionKey.Create) ||\n this.loadingActive().includes(DelegationsActionKey.Update),\n );\n readonly isApproving = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.Approve),\n );\n readonly isRejecting = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.Reject),\n );\n readonly isCancelling = computed(() =>\n this.loadingActive().includes(DelegationsActionKey.Cancel),\n );\n\n // ---------------------------------------------------------------------------\n // Errors\n // ---------------------------------------------------------------------------\n readonly errorMy = computed(\n () => this.errors()[DelegationsActionKey.GetMy] ?? null,\n );\n readonly errorAssigned = computed(\n () => this.errors()[DelegationsActionKey.GetAssigned] ?? null,\n );\n readonly errorDetail = computed(\n () => this.errors()[DelegationsActionKey.GetDetail] ?? null,\n );\n readonly errorSave = computed(\n () =>\n this.errors()[DelegationsActionKey.Create] ??\n this.errors()[DelegationsActionKey.Update] ??\n null,\n );\n\n // ---------------------------------------------------------------------------\n // Dispatchers\n // ---------------------------------------------------------------------------\n getMy(query: DelegationListQuery = {}) {\n return this.store.dispatch(new GetMyDelegations(query));\n }\n getAssigned(query: DelegationListQuery = {}) {\n return this.store.dispatch(new GetAssignedDelegations(query));\n }\n getActive(query: DelegationListQuery = {}) {\n return this.store.dispatch(new GetActiveAssignedDelegations(query));\n }\n getDetail(id: number) {\n return this.store.dispatch(new GetDelegationDetail(id));\n }\n clearDetail() {\n return this.store.dispatch(new ClearDelegationDetail());\n }\n loadScopeOptions(delegatorUserId?: string) {\n return this.store.dispatch(new GetScopeOptions(delegatorUserId));\n }\n previewScope(scope: DelegationScopeSelection) {\n return this.store.dispatch(new PreviewScope(scope));\n }\n clearScopePreview() {\n return this.store.dispatch(new ClearScopePreview());\n }\n createLegacy(request: CreateDelegationLegacyRequest) {\n return this.store.dispatch(new CreateDelegationLegacy(request));\n }\n createV2(request: CreateDelegationV2Request) {\n return this.store.dispatch(new CreateDelegationV2(request));\n }\n updateLegacy(id: number, request: UpdateDelegationLegacyRequest) {\n return this.store.dispatch(new UpdateDelegationLegacy(id, request));\n }\n updateV2(id: number, request: UpdateDelegationV2Request) {\n return this.store.dispatch(new UpdateDelegationV2(id, request));\n }\n approve(id: number, request: ApproveDelegationRequest) {\n return this.store.dispatch(new ApproveDelegation(id, request));\n }\n reject(id: number, request: RejectDelegationRequest) {\n return this.store.dispatch(new RejectDelegation(id, request));\n }\n cancel(id: number, rowVersion: string, asAdmin = false) {\n return this.store.dispatch(new CancelDelegation(id, rowVersion, asAdmin));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\nimport { DelegationRow } from '../../../store/delegations/delegations.model';\n\n/**\n * Collects a required rejection reason before calling\n * POST identity/delegations/{id}/reject (doc 04 — reject requires a non-empty\n * reason for audit/governance). Closes with `true` on success so the caller\n * can reload the row.\n */\n@Component({\n selector: 'mt-reject-delegation-dialog',\n standalone: true,\n imports: [CommonModule, Button, TranslocoDirective],\n templateUrl: './reject-delegation-dialog.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class RejectDelegationDialog {\n readonly delegation = input.required<DelegationRow>();\n\n private readonly ref: ModalRef = inject(ModalRef);\n private readonly facade = inject(DelegationsFacade);\n\n protected readonly reason = signal('');\n protected readonly submitted = signal(false);\n protected readonly isBusy = this.facade.isRejecting;\n\n protected readonly isValid = computed(() => this.reason().trim().length > 0);\n\n protected onReasonInput(event: Event): void {\n this.reason.set((event.target as HTMLTextAreaElement).value);\n }\n\n confirm(): void {\n this.submitted.set(true);\n if (!this.isValid()) return;\n const row = this.delegation();\n this.facade\n .reject(row.delegationId, {\n rowVersion: row.rowVersion,\n reason: this.reason().trim(),\n })\n .subscribe({\n next: () => this.ref.close(true),\n error: () => {\n /* error surfaced via shared toast pipeline; keep dialog open */\n },\n });\n }\n\n cancel(): void {\n this.ref.close(false);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col gap-4 p-2\">\n <div class=\"flex flex-col gap-1\">\n <div class=\"text-sm text-gray-700\">\n {{ t(\"delegations.confirm.reject\") }}\n </div>\n <div class=\"text-xs text-gray-500\">\n {{ delegation().delegator.displayName }}\n </div>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium text-gray-800\" for=\"mt-reject-reason\">\n {{ t(\"delegations.form.rejectionReason\") }}\n <span class=\"text-red-600\">*</span>\n </label>\n <textarea\n id=\"mt-reject-reason\"\n rows=\"3\"\n class=\"w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-primary focus:outline-none\"\n [class.border-red-400]=\"submitted() && !isValid()\"\n [value]=\"reason()\"\n (input)=\"onReasonInput($event)\"\n [attr.aria-invalid]=\"submitted() && !isValid()\"\n [placeholder]=\"t('delegations.form.rejectionReason')\"\n ></textarea>\n @if (submitted() && !isValid()) {\n <span class=\"text-xs text-red-600\">\n {{ t(\"delegations.form.rejectReasonRequired\") }}\n </span>\n }\n </div>\n\n <div class=\"flex justify-end gap-2 pt-2 border-t border-gray-200\">\n <mt-button\n variant=\"outlined\"\n color=\"secondary\"\n [label]=\"t('delegations.common.cancel')\"\n [disabled]=\"isBusy()\"\n (click)=\"cancel()\"\n ></mt-button>\n <mt-button\n color=\"danger\"\n icon=\"general.x-close\"\n [label]=\"t('delegations.action.reject')\"\n [loading]=\"isBusy()\"\n [disabled]=\"!isValid()\"\n (click)=\"confirm()\"\n ></mt-button>\n </div>\n </div>\n</ng-container>\n","import { Component, inject } from '@angular/core';\nimport { Router, RouterOutlet } from '@angular/router';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Page } from '@masterteam/components/page';\n\n@Component({\n selector: 'mt-delegations',\n imports: [Page, RouterOutlet, TranslocoDirective],\n templateUrl: './delegations.html',\n styleUrl: './delegations.css',\n})\nexport default class Delegations {\n private readonly router = inject(Router);\n\n goBack() {\n this.router.navigate(['control-panel/product-settings']);\n }\n}\n","<ng-container *transloco=\"let t\">\n <mt-page\n [title]=\"t('delegations.title')\"\n [avatarIcon]=\"'custom.hierarchy-structure'\"\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\n [avatarStyle]=\"{\n '--p-avatar-background': 'var(--p-indigo-50)',\n '--p-avatar-color': 'var(--p-indigo-700)',\n }\"\n (backButtonClick)=\"goBack()\"\n backButton\n >\n <router-outlet />\n </mt-page>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n untracked,\n} from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Icon } from '@masterteam/icons';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { DelegationsFacade } from '../../../../store/delegations/delegations.facade';\nimport {\n DelegationGrant,\n DelegationScopeSelection,\n DelegationScopeTarget,\n} from '../../../../store/delegations/delegations.model';\n\ninterface TargetGroup {\n key: string;\n target: DelegationScopeTarget;\n grants: DelegationGrant[];\n}\n\nconst EMPTY_SCOPE: DelegationScopeSelection = { grants: [], metadata: {} };\n\nfunction targetKey(t: DelegationScopeTarget): string {\n return `${t.applicationKey}::${t.targetType}::${t.targetKey}`;\n}\n\n/**\n * Full grant identity. Two grants with the same target/action but different\n * accessibilities, data filters, or constraints are DIFFERENT grants and must\n * not collapse (backend scope contract). Prefer a backend-provided stable\n * `key`; otherwise hash the complete grant shape.\n */\nfunction grantKey(g: DelegationGrant): string {\n if (g.key) return g.key;\n return JSON.stringify({\n app: g.applicationKey,\n target: [\n g.target.applicationKey,\n g.target.targetType,\n g.target.targetKey,\n g.target.permissionModuleType ?? null,\n g.target.permissionTargetId ?? null,\n g.target.legacyModuleId ?? null,\n g.target.levelId ?? null,\n g.target.levelModuleId ?? null,\n g.target.domainModuleId ?? null,\n g.target.moduleKey ?? null,\n ],\n action: [\n g.action.applicationKey,\n g.action.operationKey,\n g.action.operationKind,\n g.action.permissionCommand ?? null,\n g.action.businessActionCode ?? null,\n ],\n accessibilities: g.accessibilities ?? [],\n dataFilters: g.dataFilters ?? [],\n constraints: g.constraints ?? [],\n });\n}\n\nfunction normalizeGrant(g: DelegationGrant): DelegationGrant {\n return {\n ...g,\n accessibilities: g.accessibilities ?? [],\n dataFilters: g.dataFilters ?? [],\n constraints: g.constraints ?? [],\n };\n}\n\n/**\n * Grants-based scope picker (doc 03). Driven entirely by `scope/options`:\n * - lists grantable target/action pairs returned by the backend,\n * - lets the user toggle each grant,\n * - calls `scope/preview` (debounced) and surfaces summary / warnings / denied.\n *\n * `[(scope)]` two-way binds a `DelegationScopeSelection`. The component never\n * invents permission metadata — it only echoes grants returned by options.\n */\n@Component({\n selector: 'mt-scope-picker',\n standalone: true,\n imports: [\n CommonModule,\n Icon,\n SkeletonModule,\n TooltipModule,\n TranslocoDirective,\n ],\n templateUrl: './scope-picker.html',\n styleUrls: ['./scope-picker.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ScopePicker {\n readonly scope = model<DelegationScopeSelection>(EMPTY_SCOPE);\n readonly readonly = input<boolean>(false);\n /**\n * Delegator whose grantable scope is loaded. Undefined = current user\n * (self-service). In admin mode the host rebinds this as the selected\n * delegator changes, and options reload reactively.\n */\n readonly delegatorUserId = input<string | undefined>(undefined);\n\n private readonly facade = inject(DelegationsFacade);\n\n protected readonly options = this.facade.scopeOptions;\n protected readonly preview = this.facade.scopePreview;\n protected readonly isLoadingOptions = this.facade.isLoadingScopeOptions;\n protected readonly isPreviewing = this.facade.isPreviewingScope;\n\n /** Grantable options grouped by target. */\n protected readonly groups = computed<TargetGroup[]>(() => {\n const grants = this.options()?.grants ?? [];\n const map = new Map<string, TargetGroup>();\n for (const g of grants) {\n const key = targetKey(g.target);\n const existing = map.get(key);\n if (existing) {\n existing.grants.push(g);\n } else {\n map.set(key, { key, target: g.target, grants: [g] });\n }\n }\n return Array.from(map.values());\n });\n\n /** Selected grant keys for O(1) checkbox state. */\n protected readonly selectedKeys = computed(\n () => new Set(this.scope().grants.map(grantKey)),\n );\n\n private readonly expanded = signal<Set<string>>(new Set());\n\n constructor() {\n // Load (and reload) grantable options whenever the delegator changes.\n effect(() => {\n const delegator = this.delegatorUserId();\n untracked(() => this.facade.loadScopeOptions(delegator));\n });\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n effect(() => {\n const s = this.scope();\n untracked(() => {\n if (!s.grants.length) {\n this.facade.clearScopePreview();\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => this.facade.previewScope(s), 300);\n });\n });\n }\n\n protected isExpanded(group: TargetGroup): boolean {\n return this.expanded().has(group.key);\n }\n\n protected toggleAccordion(group: TargetGroup): void {\n const next = new Set(this.expanded());\n if (next.has(group.key)) next.delete(group.key);\n else next.add(group.key);\n this.expanded.set(next);\n }\n\n protected isSelected(grant: DelegationGrant): boolean {\n return this.selectedKeys().has(grantKey(grant));\n }\n\n protected toggleGrant(grant: DelegationGrant): void {\n if (this.readonly()) return;\n const key = grantKey(grant);\n this.scope.update((s) => {\n const exists = s.grants.some((g) => grantKey(g) === key);\n const grants = exists\n ? s.grants.filter((g) => grantKey(g) !== key)\n : [...s.grants, normalizeGrant(grant)];\n return { ...s, grants };\n });\n }\n\n protected selectedCount(group: TargetGroup): number {\n const keys = this.selectedKeys();\n return group.grants.filter((g) => keys.has(grantKey(g))).length;\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"mt-scope-picker flex flex-col gap-4\">\n @if (isLoadingOptions() && !options()) {\n <p-skeleton height=\"2rem\"></p-skeleton>\n <p-skeleton height=\"6rem\"></p-skeleton>\n <p-skeleton height=\"6rem\"></p-skeleton>\n } @else if (options()) {\n <!-- Targets + actions -->\n <section class=\"flex flex-col gap-2\">\n <h4 class=\"text-sm font-medium text-gray-800\">\n {{ t(\"delegations.scope.permissionsTitle\") }}\n </h4>\n\n @if (groups().length === 0) {\n <p class=\"text-xs text-gray-500\">\n {{ t(\"delegations.scope.noGrantableOptions\") }}\n </p>\n }\n\n @for (group of groups(); track group.key) {\n <div class=\"border border-gray-200 rounded-md overflow-hidden\">\n <button\n type=\"button\"\n class=\"flex items-center justify-between w-full px-3 py-2 hover:bg-surface-50 cursor-pointer\"\n (click)=\"toggleAccordion(group)\"\n >\n <div class=\"flex items-center gap-2 min-w-0\">\n <mt-icon\n [icon]=\"\n isExpanded(group)\n ? 'arrow.chevron-down'\n : 'arrow.chevron-right'\n \"\n styleClass=\"text-base text-gray-400\"\n ></mt-icon>\n <span class=\"text-sm text-gray-900 truncate\">\n {{ group.target.displayName || group.target.targetKey }}\n </span>\n <span class=\"text-xs text-gray-400\">\n {{ group.target.targetType }}\n </span>\n </div>\n @if (selectedCount(group); as count) {\n @if (count > 0) {\n <span\n class=\"text-xs text-primary font-medium px-2 py-0.5 rounded-full bg-primary-50\"\n >\n {{ count }}\n </span>\n }\n }\n </button>\n\n @if (isExpanded(group)) {\n <div class=\"flex flex-col gap-1 px-3 py-2 bg-surface-50/40\">\n @for (grant of group.grants; track $index) {\n <label\n class=\"flex items-center gap-2 px-2 py-1.5 rounded-md cursor-pointer hover:bg-surface-100\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isSelected(grant)\"\n [disabled]=\"readonly()\"\n (change)=\"toggleGrant(grant)\"\n />\n <span class=\"text-sm\">\n {{ grant.action.operationKey }}\n </span>\n @if (grant.action.isHighRisk) {\n <mt-icon\n icon=\"alert.alert-triangle\"\n styleClass=\"text-sm text-amber-500\"\n [pTooltip]=\"t('delegations.scope.highRisk')\"\n tooltipPosition=\"top\"\n ></mt-icon>\n }\n </label>\n }\n </div>\n }\n </div>\n }\n </section>\n\n <!-- Preview -->\n <section\n class=\"flex flex-col gap-1 px-3 py-2 rounded-md border border-dashed border-gray-300 bg-surface-50\"\n >\n <div class=\"flex items-center justify-between gap-2\">\n <div class=\"text-xs font-medium text-gray-700\">\n {{ t(\"delegations.scope.previewTitle\") }}\n </div>\n @if (isPreviewing()) {\n <p-skeleton width=\"6rem\" height=\"0.75rem\"></p-skeleton>\n }\n </div>\n @if (preview(); as p) {\n @if (p.isValid) {\n <div class=\"text-sm text-gray-900\">\n {{ p.summary || t(\"delegations.column.scopeSummary\") }}\n </div>\n } @else {\n <div class=\"text-sm text-red-700\">\n {{ t(\"delegations.scope.previewInvalid\") }}\n </div>\n }\n @if (p.warnings.length > 0) {\n <ul class=\"text-xs text-amber-700 list-disc list-inside\">\n @for (w of p.warnings; track w.message) {\n <li>{{ w.message }}</li>\n }\n </ul>\n }\n @if (p.deniedItems.length > 0) {\n <ul class=\"text-xs text-red-700 list-disc list-inside\">\n @for (d of p.deniedItems; track d.operationKey) {\n <li>\n {{ d.targetKey }} / {{ d.operationKey }} —\n {{ d.reasonCode }}\n </li>\n }\n </ul>\n }\n } @else {\n <div class=\"text-xs text-gray-500\">\n {{ t(\"delegations.scope.noSelection\") }}\n </div>\n }\n </section>\n }\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n OnInit,\n signal,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { HttpContext } from '@angular/common/http';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport {\n DateFieldConfig,\n DynamicFormConfig,\n MultiSelectFieldConfig,\n RadioButtonFieldConfig,\n REQUEST_CONTEXT,\n TextareaFieldConfig,\n ToggleFieldConfig,\n UserSearchFieldConfig,\n ValidatorConfig,\n} from '@masterteam/components';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { ModalService } from '@masterteam/components/modal';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport { ScopePicker } from './scope-picker/scope-picker';\nimport {\n CreateDelegationV2Request,\n DelegationRow,\n DelegationScopeSelection,\n UpdateDelegationV2Request,\n} from '../../../store/delegations/delegations.model';\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\n\nconst EMPTY_SCOPE: DelegationScopeSelection = { grants: [], metadata: {} };\n\n/**\n * Delegation create/edit form (doc 04). Uses the v2 explicit-scope endpoints so\n * the persisted `DelegationScopeSelection` matches what scope/preview validated.\n *\n * - Delegator is server-derived; only the delegated user is collected.\n * - On edit, scope grants + rowVersion come from the loaded detail.\n * - Times are sent in UTC ISO; wrappers set timeZoneId = UTC.\n */\n@Component({\n selector: 'mt-delegation-form',\n standalone: true,\n imports: [\n CommonModule,\n Button,\n DynamicForm,\n ReactiveFormsModule,\n ScopePicker,\n TranslocoDirective,\n ],\n templateUrl: './delegation-form.html',\n styleUrls: ['./delegation-form.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class DelegationForm implements OnInit {\n readonly delegationForEdit = input<DelegationRow | null>(null);\n readonly readonly = input<boolean>(false);\n /**\n * Admin-managed mode: also collect the Delegator / From user, so an admin can\n * create a delegation between two selected users (Ahmed → Sara). Self-service\n * leaves this false; the delegator defaults to the current user server-side.\n */\n readonly adminMode = input<boolean>(false);\n\n private readonly halfWidth = 'flex flex-col gap-1 lg:col-span-6';\n private readonly fullWidth = 'flex flex-col gap-1 lg:col-span-12';\n\n modal = inject(ModalService);\n ref: ModalRef = inject(ModalRef);\n private readonly transloco = inject(TranslocoService);\n private readonly facade = inject(DelegationsFacade);\n\n delegationFormControl = new FormControl();\n formValue = toSignal(this.delegationFormControl.valueChanges);\n\n detail = this.facade.detail;\n isDetailLoading = this.facade.isLoadingDetail;\n scopePreview = this.facade.scopePreview;\n isPreviewingScope = this.facade.isPreviewingScope;\n isSaving = this.facade.isSaving;\n\n context = new HttpContext().set(REQUEST_CONTEXT, { useBaseUrl: false });\n\n protected readonly scope = signal<DelegationScopeSelection>(EMPTY_SCOPE);\n\n /** Selected delegator id (admin mode only); drives scope/options + create payload. */\n protected readonly selectedDelegatorId = computed<string | undefined>(() => {\n if (!this.adminMode()) return undefined;\n const v = this.formValue();\n return (\n v?.delegateFrom?.userId ??\n v?.delegateFrom?.id ??\n v?.delegateFrom ??\n undefined\n );\n });\n\n /** In admin mode the scope picker only loads once a delegator is chosen. */\n protected readonly showScopePicker = computed(\n () => !this.adminMode() || !!this.selectedDelegatorId(),\n );\n\n protected readonly specificDaysOptions = signal([\n { label: this.transloco.translate('delegations.days.sunday'), value: 0 },\n { label: this.transloco.translate('delegations.days.monday'), value: 1 },\n { label: this.transloco.translate('delegations.days.tuesday'), value: 2 },\n { label: this.transloco.translate('delegations.days.wednesday'), value: 3 },\n { label: this.transloco.translate('delegations.days.thursday'), value: 4 },\n { label: this.transloco.translate('delegations.days.friday'), value: 5 },\n { label: this.transloco.translate('delegations.days.saturday'), value: 6 },\n ]);\n\n protected readonly formConfig = computed<DynamicFormConfig>(() => ({\n sections: [\n {\n key: 'delegationForm',\n type: 'header',\n bodyClass: 'grid grid-cols-1 gap-4 items-start lg:grid-cols-12',\n order: 1,\n fields: [\n ...(this.adminMode()\n ? [\n new UserSearchFieldConfig({\n key: 'delegateFrom',\n label: this.transloco.translate(\n 'delegations.column.delegatorName',\n ),\n apiUrl: 'Identity/users',\n context: this.context,\n validators: [ValidatorConfig.required()],\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 0,\n disabled: this.readonly() || !!this.delegationForEdit(),\n }),\n ]\n : []),\n new UserSearchFieldConfig({\n key: 'delegateTo',\n label: this.transloco.translate('delegations.column.delegatedTo'),\n apiUrl: 'Identity/users',\n context: this.context,\n validators: [ValidatorConfig.required()],\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 1,\n disabled: this.readonly() || !!this.delegationForEdit(),\n }),\n new TextareaFieldConfig({\n key: 'description',\n label: this.transloco.translate('delegations.form.description'),\n placeholder: this.transloco.translate(\n 'delegations.form.description',\n ),\n cssClass: this.fullWidth,\n colSpan: 12,\n order: 2,\n disabled: this.readonly(),\n }),\n new DateFieldConfig({\n key: 'delegateFromDateTime',\n label: this.transloco.translate('delegations.column.startDate'),\n placeholder: this.transloco.translate(\n 'delegations.column.startDate',\n ),\n validators: [ValidatorConfig.required()],\n showTime: true,\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 3,\n disabled: this.readonly(),\n }),\n new DateFieldConfig({\n key: 'delegateToDateTime',\n label: this.transloco.translate('delegations.column.endDate'),\n placeholder: this.transloco.translate('delegations.column.endDate'),\n validators: [ValidatorConfig.required()],\n showTime: true,\n cssClass: this.halfWidth,\n colSpan: 6,\n order: 4,\n disabled: this.readonly(),\n }),\n new RadioButtonFieldConfig({\n key: 'delegationDaysType',\n label: this.transloco.translate('delegations.form.daysApply'),\n options: [\n {\n label: this.transloco.translate('delegations.form.fullRange'),\n value: 'FullRange',\n },\n {\n label: this.transloco.translate(\n 'delegations.form.specificDays',\n ),\n value: 'SpecificDays',\n },\n ],\n optionLabel: 'label',\n optionValue: 'value',\n validators: [ValidatorConfig.required()],\n cssClass: this.fullWidth,\n colSpan: 12,\n order: 5,\n disabled: this.readonly(),\n }),\n new MultiSelectFieldConfig({\n key: 'specificDays',\n label: this.transloco.translate('delegations.form.specificDays'),\n options: this.specificDaysOptions(),\n optionLabel: 'label',\n optionValue: 'value',\n maxSelectedLabels: 7,\n relations: [\n {\n key: 'delegationDaysType',\n value: 'SpecificDays',\n action: 'show',\n },\n ],\n cssClass: this.fullWidth,\n colSpan: 12,\n order: 6,\n disabled: this.readonly(),\n }),\n new ToggleFieldConfig({\n key: 'requiresApproval',\n label: this.transloco.translate(\n 'delegations.form.requiresApproval',\n ),\n cssClass: `${this.fullWidth} mt-2`,\n order: 7,\n disabled: this.readonly(),\n }),\n ],\n },\n ],\n }));\n\n constructor() {\n effect(() => {\n const editing = this.delegationForEdit();\n const d = this.detail();\n if (editing && d && d.row.delegationId === editing.delegationId) {\n this.delegationFormControl.patchValue({\n delegateTo: d.row.delegatedUser,\n description: '',\n delegateFromDateTime: d.row.startsAtUtc,\n delegateToDateTime: d.row.endsAtUtc,\n delegationDaysType: d.row.dayRuleMode,\n specificDays: d.row.specificDays ?? [],\n requiresApproval: d.row.approval?.requiresApproval ?? false,\n });\n this.scope.set({\n grants: d.scope?.grants ?? [],\n metadata: d.scope?.metadata ?? {},\n });\n } else if (!editing) {\n this.delegationFormControl.reset({\n delegationDaysType: 'FullRange',\n requiresApproval: true,\n });\n this.scope.set(EMPTY_SCOPE);\n }\n });\n }\n\n ngOnInit(): void {\n const editing = this.delegationForEdit();\n if (editing) {\n this.facade.getDetail(editing.delegationId);\n }\n }\n\n protected readonly canSubmit = computed(\n () =>\n !this.readonly() &&\n this.scope().grants.length > 0 &&\n !!this.scopePreview() &&\n this.scopePreview()!.isValid &&\n !this.isPreviewingScope(),\n );\n\n onSubmit(): void {\n if (this.readonly() || !this.delegationFormControl.valid) return;\n if (!this.canSubmit()) return;\n\n const v = this.delegationFormControl.value;\n const base = {\n // Admin mode sends the chosen delegator; self-service omits it so the\n // backend defaults delegateFrom to the current user (doc 04).\n delegateFrom: this.adminMode()\n ? (this.selectedDelegatorId() ?? null)\n : null,\n delegateTo: v?.delegateTo?.userId ?? v?.delegateTo?.id ?? v?.delegateTo,\n description: v?.description,\n delegateFromDateTime: v?.delegateFromDateTime,\n delegateToDateTime: v?.delegateToDateTime,\n delegationDaysType: (v?.delegationDaysType ?? 'FullRange') as\n | 'FullRange'\n | 'SpecificDays',\n specificDays:\n v?.delegationDaysType === 'SpecificDays' ? (v?.specificDays ?? []) : [],\n requiresApproval: !!v?.requiresApproval,\n scope: this.scope(),\n };\n\n const editing = this.delegationForEdit();\n if (editing) {\n // Prefer the freshest rowVersion from the loaded detail (the form loads\n // detail on open); fall back to the list row only if detail is absent.\n const latestRowVersion =\n this.detail()?.row?.rowVersion ?? editing.rowVersion;\n const req: UpdateDelegationV2Request = {\n ...base,\n rowVersion: latestRowVersion,\n };\n this.facade.updateV2(editing.delegationId, req).subscribe({\n next: () => this.ref.close(true),\n });\n } else {\n const req: CreateDelegationV2Request = base;\n this.facade.createV2(req).subscribe({\n next: () => this.ref.close(true),\n });\n }\n }\n}\n","<ng-container *transloco=\"let t\">\n <div\n [class]=\"\n 'delegation-form-content flex min-w-0 flex-col gap-3 overflow-x-hidden p-4 max-[640px]:p-3 ' +\n modal.contentClass\n \"\n >\n <mt-dynamic-form\n [formConfig]=\"formConfig()\"\n [formControl]=\"delegationFormControl\"\n />\n\n <div class=\"mt-2 border-t border-gray-200 pt-3 flex flex-col gap-2\">\n <h3 class=\"text-sm font-semibold text-gray-800\">\n {{ t(\"delegations.scope.permissionsTitle\") }}\n </h3>\n @if (showScopePicker()) {\n <mt-scope-picker\n [(scope)]=\"scope\"\n [readonly]=\"readonly()\"\n [delegatorUserId]=\"selectedDelegatorId()\"\n ></mt-scope-picker>\n } @else {\n <p class=\"text-xs text-gray-500\">\n {{ t(\"delegations.form.selectDelegatorFirst\") }}\n </p>\n }\n </div>\n </div>\n\n <div\n [class]=\"\n 'delegation-form-footer ' +\n modal.footerClass +\n ' flex-col gap-2 sm:flex-row sm:items-center sm:justify-end'\n \"\n >\n <mt-button\n [label]=\"t('delegations.common.cancel')\"\n variant=\"outlined\"\n (click)=\"ref.close()\"\n styleClass=\"w-full sm:w-auto\"\n />\n @if (!readonly()) {\n <mt-button\n [label]=\"\n delegationForEdit()\n ? t('delegations.common.update')\n : t('delegations.common.create')\n \"\n [loading]=\"isSaving()\"\n [disabled]=\"!delegationFormControl.valid || !canSubmit()\"\n (click)=\"onSubmit()\"\n styleClass=\"w-full sm:w-auto\"\n />\n }\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n OnInit,\n signal,\n} from '@angular/core';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\n\ntype DetailTab = 'overview' | 'scope';\n\n/**\n * Read-only drawer that shows the full `DelegationDetail` ({ row, scope, status }).\n */\n@Component({\n selector: 'mt-delegation-detail-drawer',\n standalone: true,\n imports: [\n CommonModule,\n Avatar,\n Button,\n SkeletonModule,\n TranslocoDirective,\n DelegationStatusChip,\n ],\n templateUrl: './delegation-detail-drawer.html',\n styleUrls: ['./delegation-detail-drawer.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class DelegationDetailDrawer implements OnInit {\n readonly delegationId = input.required<number>();\n\n private readonly facade = inject(DelegationsFacade);\n private readonly transloco = inject(TranslocoService);\n protected readonly ref: ModalRef = inject(ModalRef);\n\n protected readonly tabs: { key: DetailTab; i18n: string }[] = [\n { key: 'overview', i18n: 'delegations.action.view' },\n { key: 'scope', i18n: 'delegations.column.scopeSummary' },\n ];\n protected readonly activeTab = signal<DetailTab>('overview');\n\n protected readonly isLoading = this.facade.isLoadingDetail;\n protected readonly detail = this.facade.detail;\n protected readonly row = computed(() => this.detail()?.row ?? null);\n\n ngOnInit(): void {\n this.facade.getDetail(this.delegationId());\n }\n\n protected setTab(tab: DetailTab): void {\n this.activeTab.set(tab);\n }\n\n protected approvalLabel(): string {\n const s = this.row()?.approval?.approvalStatus ?? 'NotRequired';\n return this.transloco.translate(`delegations.approvalStatus.${s}`);\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col h-full\">\n <!-- Tabs -->\n <div class=\"flex border-b border-gray-200 px-4\">\n @for (tab of tabs; track tab.key) {\n <button\n type=\"button\"\n class=\"px-3 py-2 -mb-px border-b-2 text-sm font-medium transition-colors\"\n [class.border-primary]=\"activeTab() === tab.key\"\n [class.text-primary]=\"activeTab() === tab.key\"\n [class.border-transparent]=\"activeTab() !== tab.key\"\n [class.text-gray-500]=\"activeTab() !== tab.key\"\n (click)=\"setTab(tab.key)\"\n >\n {{ t(tab.i18n) }}\n </button>\n }\n </div>\n\n <!-- Body -->\n <div class=\"flex-1 overflow-y-auto p-4\">\n @if (isLoading() && !detail()) {\n <p-skeleton height=\"2rem\" class=\"mb-3\"></p-skeleton>\n <p-skeleton height=\"6rem\" class=\"mb-3\"></p-skeleton>\n <p-skeleton height=\"6rem\"></p-skeleton>\n } @else if (detail(); as d) {\n @if (activeTab() === \"overview\") {\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-3\">\n <div class=\"flex items-center gap-3 min-w-0\">\n <mt-avatar\n icon=\"user.user-01\"\n styleClass=\"w-12! h-12! text-lg!\"\n ></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <div class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.delegatorName\") }}\n </div>\n <div class=\"text-base font-medium text-gray-900 truncate\">\n {{ d.row.delegator.displayName }}\n </div>\n @if (d.row.delegator.email) {\n <div class=\"text-xs text-gray-500 truncate\">\n {{ d.row.delegator.email }}\n </div>\n }\n </div>\n </div>\n <mt-delegation-status-chip\n [status]=\"d.status.effectiveStatus\"\n ></mt-delegation-status-chip>\n </div>\n\n <div class=\"grid grid-cols-2 gap-4\">\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.delegatedTo\") }}\n </span>\n <span class=\"text-sm text-gray-900\">\n {{ d.row.delegatedUser.displayName }}\n </span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.approval\") }}\n </span>\n <span class=\"text-sm text-gray-900\">{{ approvalLabel() }}</span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.startDate\") }}\n </span>\n <span class=\"text-sm text-gray-900\">\n {{ d.row.startsAtUtc | date: \"medium\" }}\n </span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.endDate\") }}\n </span>\n <span class=\"text-sm text-gray-900\">\n {{ d.row.endsAtUtc | date: \"medium\" }}\n </span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.form.timeZone\") }}\n </span>\n <span class=\"text-sm text-gray-900\">{{\n d.row.timeZoneId\n }}</span>\n </div>\n <div class=\"flex flex-col\">\n <span class=\"text-xs text-gray-500\">\n {{ t(\"delegations.column.days\") }}\n </span>\n <span class=\"text-sm text-gray-900\">\n @if (d.row.dayRuleMode === \"FullRange\") {\n {{ t(\"delegations.form.fullRange\") }}\n } @else {\n {{ d.row.specificDays.join(\", \") }}\n }\n </span>\n </div>\n </div>\n\n @if (d.row.cancellation?.cancellationReason) {\n <div\n class=\"rounded-md border border-gray-200 bg-surface-50 p-3 text-sm text-gray-800\"\n >\n <div class=\"font-medium\">\n {{ t(\"delegations.form.cancellationReason\") }}\n </div>\n <div>{{ d.row.cancellation.cancellationReason }}</div>\n </div>\n }\n </div>\n } @else {\n <!-- Scope tab -->\n <div class=\"flex flex-col gap-3\">\n <div class=\"text-sm text-gray-900\">\n {{ d.row.scopeSummary || t(\"delegations.column.scopeSummary\") }}\n </div>\n <div class=\"flex flex-col gap-2\">\n @for (grant of d.scope.grants; track $index) {\n <div\n class=\"border border-gray-200 rounded-md px-3 py-2 flex flex-col gap-1\"\n >\n <div class=\"flex items-center justify-between gap-2\">\n <span class=\"text-sm font-medium text-gray-900\">\n {{ grant.target.displayName || grant.target.targetKey }}\n </span>\n <span class=\"text-xs text-gray-500\">\n {{ grant.target.targetType }}\n </span>\n </div>\n <span\n class=\"text-xs px-2 py-0.5 rounded-md bg-primary-50 text-primary w-fit\"\n >\n {{ grant.action.operationKey }}\n </span>\n </div>\n }\n @if (d.scope.grants.length === 0) {\n <p class=\"text-xs text-gray-500\">\n {{ t(\"delegations.scope.noSelection\") }}\n </p>\n }\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer -->\n <div\n class=\"border-t border-gray-200 px-4 py-3 flex items-center justify-end\"\n >\n <mt-button\n [label]=\"t('delegations.common.cancel')\"\n variant=\"outlined\"\n (click)=\"ref.close()\"\n ></mt-button>\n </div>\n </div>\n</ng-container>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n linkedSignal,\n OnInit,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Avatar } from '@masterteam/components/avatar';\nimport { Breadcrumb } from '@masterteam/components/breadcrumb';\nimport { ModalService } from '@masterteam/components/modal';\nimport { ColumnDef, Table, TableAction } from '@masterteam/components/table';\nimport { finalize } from 'rxjs';\nimport {\n DelegationAllowedAction,\n DelegationListQuery,\n DelegationRow,\n} from '../../../store/delegations/delegations.model';\nimport { DelegationsFacade } from '../../../store/delegations/delegations.facade';\nimport { DelegationStatusChip } from '../delegation-status-chip/delegation-status-chip';\nimport DelegationForm from '../delegation-form/delegation-form';\nimport DelegationDetailDrawer from '../delegation-detail-drawer/delegation-detail-drawer';\nimport StartSessionDialog from '../start-session-dialog/start-session-dialog';\nimport RejectDelegationDialog from '../reject-delegation-dialog/reject-delegation-dialog';\n\ntype DelegationTab = 'my' | 'assigned';\n\n/**\n * Delegations portal page (doc 02, 09): two lists — My Delegations (current user\n * is delegator) and Delegated To Me (current user is delegate). Rows render only\n * the BE-returned `allowedActions`; status comes from `effectiveStatus`.\n */\n@Component({\n selector: 'mt-delegations-list',\n standalone: true,\n imports: [\n CommonModule,\n Avatar,\n Breadcrumb,\n Table,\n TranslocoDirective,\n DelegationStatusChip,\n ],\n templateUrl: './delegations-list.html',\n styleUrl: './delegations-list.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class DelegationsList implements OnInit {\n /**\n * Admin/control-panel breadcrumb. Hidden on the client self-service surface\n * (its links point at /control-panel/*). Bound from route data via\n * `withComponentInputBinding()` — admin leaves it default; client passes\n * `data: { showBreadcrumb: false }`.\n */\n readonly showBreadcrumb = input<boolean>(true);\n\n /**\n * Admin-managed surface: the create/edit form also collects the Delegator /\n * From user (admin creates a delegation between two users). Client\n * self-service leaves this false. Bound from route data via\n * `withComponentInputBinding()` — admin passes `data: { adminMode: true }`.\n */\n readonly adminMode = input<boolean>(false);\n\n private readonly facade = inject(DelegationsFacade);\n private readonly modal = inject(ModalService);\n private readonly transloco = inject(TranslocoService);\n\n protected readonly breadcrumbItems = linkedSignal(() => [\n {\n label: '',\n icon: 'general.home-line',\n routerLink: '/control-panel/workspaces',\n },\n {\n label: this.transloco.translate('product-settings.product-settings'),\n routerLink: '/control-panel/product-settings',\n },\n {\n label: this.transloco.translate('delegations.title'),\n },\n ]);\n\n protected readonly activeTab = signal<DelegationTab>('my');\n protected readonly tabs = signal([\n {\n value: 'my' as DelegationTab,\n label: this.transloco.translate('delegations.myDelegations'),\n },\n {\n value: 'assigned' as DelegationTab,\n label: this.transloco.translate('delegations.delegatedToMe'),\n },\n ]);\n\n protected readonly isLoading = computed(() =>\n this.activeTab() === 'my'\n ? this.facade.isLoadingMy()\n : this.facade.isLoadingAssigned(),\n );\n protected readonly scopeOptions = this.facade.scopeOptions;\n protected readonly rows = computed(() =>\n this.activeTab() === 'my'\n ? this.facade.myItems()\n : this.facade.assignedItems(),\n );\n\n statusCol = viewChild.required<TemplateRef<unknown>>('statusCol');\n userCol = viewChild.required<TemplateRef<unknown>>('userCol');\n scopeCol = viewChild.required<TemplateRef<unknown>>('scopeCol');\n daysCol = viewChild.required<TemplateRef<unknown>>('daysCol');\n\n protected readonly canCreate = computed(() => {\n if (this.adminMode()) return true;\n return (this.scopeOptions()?.grants?.length ?? 0) > 0;\n });\n\n protected readonly tableActions = computed<TableAction[]>(() =>\n this.canCreate()\n ? [\n {\n icon: 'general.plus',\n label: this.transloco.translate('delegations.action.create'),\n color: 'primary',\n action: () => this.openForm(null),\n },\n ]\n : [],\n );\n\n protected readonly rowActions = signal<TableAction[]>([\n {\n icon: 'general.eye',\n tooltip: this.transloco.translate('delegations.action.view'),\n color: 'primary',\n variant: 'outlined',\n action: (row: DelegationRow) => this.viewDetails(row),\n hidden: (row: DelegationRow) => !this.has(row, 'View'),\n },\n {\n icon: 'custom.pencil',\n tooltip: this.transloco.translate('delegations.action.edit'),\n color: 'primary',\n action: (row: DelegationRow) => this.openForm(row),\n hidden: (row: DelegationRow) => !this.has(row, 'Edit'),\n },\n {\n icon: 'general.check',\n tooltip: this.transloco.translate('delegations.action.approve'),\n color: 'primary',\n action: (row: DelegationRow) => this.approve(row),\n hidden: (row: DelegationRow) => !this.has(row, 'Approve'),\n loading: (row: DelegationRow) =>\n this.busyIds().includes(`approve:${row.delegationId}`),\n confirmation: { type: 'popup' },\n },\n {\n icon: 'general.x-close',\n tooltip: this.transloco.translate('delegations.action.reject'),\n color: 'danger',\n variant: 'outlined',\n // Opens a dialog that collects a required reason (no inline popup confirm).\n action: (row: DelegationRow) => this.reject(row),\n hidden: (row: DelegationRow) => !this.has(row, 'Reject'),\n },\n {\n icon: 'general.trash-01',\n tooltip: this.transloco.translate('delegations.action.cancel'),\n color: 'danger',\n variant: 'outlined',\n action: (row: DelegationRow) => this.cancel(row),\n hidden: (row: DelegationRow) => !this.has(row, 'Cancel'),\n loading: (row: DelegationRow) =>\n this.busyIds().includes(`cancel:${row.delegationId}`),\n confirmation: { type: 'popup', confirmationType: 'delete' },\n },\n {\n icon: 'arrow.arrow-right',\n tooltip: this.transloco.translate('delegations.action.startSession'),\n color: 'primary',\n action: (row: DelegationRow) => this.startSession(row),\n hidden: (row: DelegationRow) => !this.has(row, 'StartSession'),\n },\n ]);\n\n protected readonly tableColumns = linkedSignal<ColumnDef[]>(() => [\n {\n key: 'effectiveStatus',\n label: this.transloco.translate('delegations.column.status'),\n type: 'custom',\n customCellTpl: this.statusCol(),\n width: '10rem',\n },\n {\n key: this.activeTab() === 'my' ? 'delegatedUser' : 'delegator',\n label: this.transloco.translate(\n this.activeTab() === 'my'\n ? 'delegations.column.delegatedTo'\n : 'delegations.column.delegatorName',\n ),\n type: 'custom',\n customCellTpl: this.userCol(),\n width: '16rem',\n },\n {\n key: 'scopeSummary',\n label: this.transloco.translate('delegations.column.scopeSummary'),\n type: 'custom',\n customCellTpl: this.scopeCol(),\n width: '16rem',\n },\n {\n key: 'startsAtUtc',\n label: this.transloco.translate('delegations.column.startDate'),\n type: 'dateTime',\n width: '11rem',\n },\n {\n key: 'endsAtUtc',\n label: this.transloco.translate('delegations.column.endDate'),\n type: 'dateTime',\n width: '11rem',\n },\n {\n key: 'createdAtUtc',\n label: this.transloco.translate('delegations.column.createdDate'),\n type: 'dateTime',\n width: '11rem',\n },\n {\n key: 'dayRuleMode',\n label: this.transloco.translate('delegations.column.days'),\n type: 'custom',\n customCellTpl: this.daysCol(),\n width: '12rem',\n },\n ]);\n\n private readonly busyIds = signal<string[]>([]);\n\n private readonly weekdayKeys = [\n 'sunday',\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n ] as const;\n\n ngOnInit(): void {\n if (!this.adminMode()) {\n this.facade.loadScopeOptions();\n }\n this.loadCurrentTab();\n }\n\n protected switchTab(tab: DelegationTab): void {\n this.activeTab.set(tab);\n this.loadCurrentTab();\n }\n\n private loadCurrentTab(\n query: DelegationListQuery = { page: 1, pageSize: 25 },\n ): void {\n if (this.activeTab() === 'my') {\n this.facade.getMy(query);\n } else {\n this.facade.getAssigned(query);\n }\n }\n\n private reloadCurrentTab(): void {\n this.loadCurrentTab();\n }\n\n protected has(row: DelegationRow, action: DelegationAllowedAction): boolean {\n return row.allowedActions?.includes(action) ?? false;\n }\n\n protected formatDays(row: DelegationRow): string {\n if (row.dayRuleMode === 'SpecificDays' && row.specificDays?.length) {\n return row.specificDays\n .filter((d) => d >= 0 && d < this.weekdayKeys.length)\n .map((d) =>\n this.transloco.translate(`delegations.days.${this.weekdayKeys[d]}`),\n )\n .join(', ');\n }\n return this.transloco.translate('delegations.form.fullRange');\n }\n\n private viewDetails(row: DelegationRow): void {\n this.modal.openModal(DelegationDetailDrawer, 'drawer', {\n header: this.transloco.translate('delegations.action.view'),\n styleClass:\n '!absolute !shadow-none !w-full !max-w-full sm:!w-[42rem] xl:!w-[50rem]',\n position: 'end',\n appendTo: 'page-content',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegationId: row.delegationId },\n });\n }\n\n private openForm(row: DelegationRow | null): void {\n const ref = this.modal.openModal(\n DelegationForm,\n row ? 'drawer' : 'dialog',\n {\n header: this.transloco.translate(\n row ? 'delegations.action.edit' : 'delegations.action.create',\n ),\n styleClass: row\n ? '!absolute !shadow-none !w-full !max-w-full sm:!w-[42rem] xl:!w-[50rem]'\n : '!w-[min(96vw,50rem)] !max-w-[96vw] !h-[min(90vh,40rem)] !max-h-[90vh]',\n position: row ? 'end' : '',\n appendTo: row ? 'page-content' : 'body',\n dismissableMask: true,\n dismissible: true,\n inputValues: {\n delegationForEdit: row,\n readonly: false,\n adminMode: this.adminMode(),\n },\n },\n );\n ref.onClose.subscribe((saved: boolean) => {\n if (saved) this.reloadCurrentTab();\n });\n }\n\n private approve(row: DelegationRow): void {\n this.mark(`approve:${row.delegationId}`, true);\n this.facade\n .approve(row.delegationId, { rowVersion: row.rowVersion })\n .pipe(finalize(() => this.mark(`approve:${row.delegationId}`, false)))\n .subscribe({ next: () => this.reloadCurrentTab() });\n }\n\n private reject(row: DelegationRow): void {\n const ref = this.modal.openModal(RejectDelegationDialog, 'dialog', {\n header: this.transloco.translate('delegations.action.reject'),\n styleClass: '!w-[min(96vw,30rem)] !max-w-[96vw]',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegation: row },\n });\n ref.onClose.subscribe((rejected: boolean) => {\n if (rejected) this.reloadCurrentTab();\n });\n }\n\n private cancel(row: DelegationRow): void {\n this.mark(`cancel:${row.delegationId}`, true);\n this.facade\n .cancel(row.delegationId, row.rowVersion)\n .pipe(finalize(() => this.mark(`cancel:${row.delegationId}`, false)))\n .subscribe({ next: () => this.reloadCurrentTab() });\n }\n\n private startSession(row: DelegationRow): void {\n const ref = this.modal.openModal(StartSessionDialog, 'dialog', {\n header: this.transloco.translate('delegations.action.startSession'),\n styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',\n dismissableMask: true,\n dismissible: true,\n inputValues: { delegation: row, intent: 'start' },\n });\n ref.onClose.subscribe((started: boolean) => {\n if (started) this.reloadCurrentTab();\n });\n }\n\n private mark(key: string, on: boolean): void {\n this.busyIds.update((ids) =>\n on ? [...ids, key] : ids.filter((id) => id !== key),\n );\n }\n}\n","<ng-container *transloco=\"let t\">\n <div class=\"flex flex-col h-full gap-2 p-4\">\n @if (showBreadcrumb()) {\n <mt-breadcrumb [items]=\"breadcrumbItems()\"></mt-breadcrumb>\n }\n\n <div class=\"flex items-center gap-2 border-b border-gray-200\">\n @for (tab of tabs(); track tab.value) {\n <button\n type=\"button\"\n class=\"px-4 py-2 -mb-px border-b-2 text-sm font-medium transition-colors\"\n [class.border-primary]=\"activeTab() === tab.value\"\n [class.text-primary]=\"activeTab() === tab.value\"\n [class.border-transparent]=\"activeTab() !== tab.value\"\n [class.text-gray-500]=\"activeTab() !== tab.value\"\n (click)=\"switchTab(tab.value)\"\n >\n {{ tab.label }}\n </button>\n }\n </div>\n\n <mt-table\n [data]=\"rows()\"\n [columns]=\"tableColumns()\"\n [actions]=\"tableActions()\"\n [rowActions]=\"rowActions()\"\n [freezeActions]=\"true\"\n [loading]=\"isLoading()\"\n >\n <ng-template #statusCol let-row>\n <mt-delegation-status-chip\n [status]=\"row.effectiveStatus\"\n ></mt-delegation-status-chip>\n </ng-template>\n\n <ng-template #userCol let-row>\n @let party = activeTab() === \"my\" ? row.delegatedUser : row.delegator;\n <div class=\"flex items-center gap-2\">\n <mt-avatar icon=\"user.user-01\" styleClass=\"w-8! h-8!\"></mt-avatar>\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-sm text-gray-900 truncate\">\n {{ party?.displayName }}\n </span>\n @if (party?.email) {\n <span class=\"text-xs text-gray-500 truncate\">\n {{ party.email }}\n </span>\n }\n </div>\n </div>\n </ng-template>\n\n <ng-template #scopeCol let-row>\n <span class=\"text-sm text-gray-700\" [title]=\"row.scopeSummary\">\n {{ row.scopeSummary || \"—\" }}\n </span>\n </ng-template>\n\n <ng-template #daysCol let-row>\n <span class=\"text-sm text-gray-700\">{{ formatDays(row) }}</span>\n </ng-template>\n </mt-table>\n </div>\n</ng-container>\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { DelegationSessionFacade } from '../store/session/delegation-session.facade';\n\n/**\n * Endpoints that must NEVER carry the `app-delegation` header.\n * Starting a delegated session uses only the normal `Authorization` token\n * (doc 05). All other `identity/delegations` management calls are normal\n * (non-delegated) actions too, so the whole namespace is excluded.\n */\nconst EXCLUDE = /\\bidentity\\/delegations\\b/i;\n\n/**\n * Adds `app-delegation: Bearer <token>` to outgoing requests while a delegated\n * session is active. Register AFTER the gateway-auth interceptor (so the normal\n * `Authorization` header is set first) and BEFORE the message interceptor.\n */\nexport const appDelegationInterceptor: HttpInterceptorFn = (req, next) => {\n if (EXCLUDE.test(req.url)) {\n return next(req);\n }\n\n const token = inject(DelegationSessionFacade).token();\n if (!token) {\n return next(req);\n }\n\n return next(\n req.clone({ setHeaders: { 'app-delegation': `Bearer ${token}` } }),\n );\n};\n","// store/index.ts\nexport * from './delegations';\nexport * from './session';\n","// Runtime UI surfaces — projected into host topbars + opened via ModalService.\nexport { TopbarDelegationMenu } from './lib/delegations/topbar-delegation-menu/topbar-delegation-menu';\nexport { DelegationStatusChip } from './lib/delegations/delegation-status-chip/delegation-status-chip';\nexport { default as StartSessionDialog } from './lib/delegations/start-session-dialog/start-session-dialog';\nexport { default as RejectDelegationDialog } from './lib/delegations/reject-delegation-dialog/reject-delegation-dialog';\n\n// Management UI — portal page (My Delegations / Delegated To Me) + form + detail drawer.\nexport { default as Delegations } from './lib/delegations/delegations';\nexport { default as DelegationsList } from './lib/delegations/delegations-list/delegations-list';\nexport { default as DelegationForm } from './lib/delegations/delegation-form/delegation-form';\nexport { default as DelegationDetailDrawer } from './lib/delegations/delegation-detail-drawer/delegation-detail-drawer';\nexport { ScopePicker } from './lib/delegations/delegation-form/scope-picker/scope-picker';\n\n// HTTP\nexport { appDelegationInterceptor } from './interceptors/app-delegation.interceptor';\n\n// Store (models, actions, state, facades — both delegations and session)\nexport * from './store';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["BASE","__decorate","EMPTY_SCOPE","i1","i2"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/delegations",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.17",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": "../../../dist/masterteam/delegations",
|
|
6
6
|
"linkDirectory": false,
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
"tailwindcss": "^4.2.2",
|
|
21
21
|
"tailwindcss-primeui": "^0.6.1",
|
|
22
22
|
"@ngxs/store": "^20.1.0",
|
|
23
|
+
"@masterteam/icons": "^0.0.15",
|
|
23
24
|
"@masterteam/forms": "^0.0.80",
|
|
24
|
-
"@masterteam/components": "^0.0.174"
|
|
25
|
-
"@masterteam/icons": "^0.0.15"
|
|
25
|
+
"@masterteam/components": "^0.0.174"
|
|
26
26
|
},
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"exports": {
|
|
@@ -239,7 +239,7 @@ declare class TopbarDelegationMenu {
|
|
|
239
239
|
protected readonly hasCandidates: _angular_core.Signal<boolean>;
|
|
240
240
|
protected readonly onBehalfOf: _angular_core.Signal<_masterteam_delegations.DelegationParty | null>;
|
|
241
241
|
protected readonly executedBy: _angular_core.Signal<_masterteam_delegations.DelegationParty | null>;
|
|
242
|
-
protected readonly mode: _angular_core.Signal<"
|
|
242
|
+
protected readonly mode: _angular_core.Signal<"active" | "candidates" | "hidden">;
|
|
243
243
|
togglePopover(event: Event): void;
|
|
244
244
|
start(row: DelegationRow, event: MouseEvent): void;
|
|
245
245
|
switchTo(row: DelegationRow, event: MouseEvent): void;
|
|
@@ -349,12 +349,14 @@ declare class DelegationsList implements OnInit {
|
|
|
349
349
|
label: string;
|
|
350
350
|
}[]>;
|
|
351
351
|
protected readonly isLoading: _angular_core.Signal<boolean>;
|
|
352
|
+
protected readonly scopeOptions: _angular_core.Signal<_masterteam_delegations.DelegationScopeSelection | null>;
|
|
352
353
|
protected readonly rows: _angular_core.Signal<DelegationRow[]>;
|
|
353
354
|
statusCol: _angular_core.Signal<TemplateRef<unknown>>;
|
|
354
355
|
userCol: _angular_core.Signal<TemplateRef<unknown>>;
|
|
355
356
|
scopeCol: _angular_core.Signal<TemplateRef<unknown>>;
|
|
356
357
|
daysCol: _angular_core.Signal<TemplateRef<unknown>>;
|
|
357
|
-
protected readonly
|
|
358
|
+
protected readonly canCreate: _angular_core.Signal<boolean>;
|
|
359
|
+
protected readonly tableActions: _angular_core.Signal<TableAction[]>;
|
|
358
360
|
protected readonly rowActions: _angular_core.WritableSignal<TableAction[]>;
|
|
359
361
|
protected readonly tableColumns: _angular_core.WritableSignal<ColumnDef[]>;
|
|
360
362
|
private readonly busyIds;
|
|
@@ -403,6 +405,8 @@ declare class DelegationForm implements OnInit {
|
|
|
403
405
|
formValue: _angular_core.Signal<any>;
|
|
404
406
|
detail: _angular_core.Signal<_masterteam_delegations.DelegationDetail | null>;
|
|
405
407
|
isDetailLoading: _angular_core.Signal<boolean>;
|
|
408
|
+
scopePreview: _angular_core.Signal<_masterteam_delegations.DelegationScopePreview | null>;
|
|
409
|
+
isPreviewingScope: _angular_core.Signal<boolean>;
|
|
406
410
|
isSaving: _angular_core.Signal<boolean>;
|
|
407
411
|
context: HttpContext;
|
|
408
412
|
protected readonly scope: _angular_core.WritableSignal<DelegationScopeSelection>;
|