@masterteam/delegations 0.0.15 → 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.
package/assets/i18n/ar.json
CHANGED
|
@@ -56,7 +56,8 @@
|
|
|
56
56
|
"timeZone": "المنطقة الزمنية",
|
|
57
57
|
"cancellationReason": "سبب الإلغاء",
|
|
58
58
|
"rejectionReason": "سبب الرفض",
|
|
59
|
-
"rejectReasonRequired": "يلزم إدخال سبب للرفض."
|
|
59
|
+
"rejectReasonRequired": "يلزم إدخال سبب للرفض.",
|
|
60
|
+
"selectDelegatorFirst": "اختر المفوّض لتحديد الصلاحيات القابلة للتفويض."
|
|
60
61
|
},
|
|
61
62
|
"days": {
|
|
62
63
|
"sunday": "الأحد",
|
package/assets/i18n/en.json
CHANGED
|
@@ -56,7 +56,8 @@
|
|
|
56
56
|
"timeZone": "Time zone",
|
|
57
57
|
"cancellationReason": "Cancellation reason",
|
|
58
58
|
"rejectionReason": "Rejection reason",
|
|
59
|
-
"rejectReasonRequired": "A reason is required to reject."
|
|
59
|
+
"rejectReasonRequired": "A reason is required to reject.",
|
|
60
|
+
"selectDelegatorFirst": "Select a delegator to choose delegable permissions."
|
|
60
61
|
},
|
|
61
62
|
"days": {
|
|
62
63
|
"sunday": "Sunday",
|
|
@@ -1044,6 +1044,11 @@ function normalizeGrant(g) {
|
|
|
1044
1044
|
class ScopePicker {
|
|
1045
1045
|
scope = model(EMPTY_SCOPE$1, ...(ngDevMode ? [{ debugName: "scope" }] : /* istanbul ignore next */ []));
|
|
1046
1046
|
readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
|
|
1047
|
+
/**
|
|
1048
|
+
* Delegator whose grantable scope is loaded. Undefined = current user
|
|
1049
|
+
* (self-service). In admin mode the host rebinds this as the selected
|
|
1050
|
+
* delegator changes, and options reload reactively.
|
|
1051
|
+
*/
|
|
1047
1052
|
delegatorUserId = input(undefined, ...(ngDevMode ? [{ debugName: "delegatorUserId" }] : /* istanbul ignore next */ []));
|
|
1048
1053
|
facade = inject(DelegationsFacade);
|
|
1049
1054
|
options = this.facade.scopeOptions;
|
|
@@ -1069,10 +1074,12 @@ class ScopePicker {
|
|
|
1069
1074
|
/** Selected grant keys for O(1) checkbox state. */
|
|
1070
1075
|
selectedKeys = computed(() => new Set(this.scope().grants.map(grantKey)), ...(ngDevMode ? [{ debugName: "selectedKeys" }] : /* istanbul ignore next */ []));
|
|
1071
1076
|
expanded = signal(new Set(), ...(ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []));
|
|
1072
|
-
ngOnInit() {
|
|
1073
|
-
this.facade.loadScopeOptions(this.delegatorUserId());
|
|
1074
|
-
}
|
|
1075
1077
|
constructor() {
|
|
1078
|
+
// Load (and reload) grantable options whenever the delegator changes.
|
|
1079
|
+
effect(() => {
|
|
1080
|
+
const delegator = this.delegatorUserId();
|
|
1081
|
+
untracked(() => this.facade.loadScopeOptions(delegator));
|
|
1082
|
+
});
|
|
1076
1083
|
let timer = null;
|
|
1077
1084
|
effect(() => {
|
|
1078
1085
|
const s = this.scope();
|
|
@@ -1143,6 +1150,12 @@ const EMPTY_SCOPE = { grants: [], metadata: {} };
|
|
|
1143
1150
|
class DelegationForm {
|
|
1144
1151
|
delegationForEdit = input(null, ...(ngDevMode ? [{ debugName: "delegationForEdit" }] : /* istanbul ignore next */ []));
|
|
1145
1152
|
readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
|
|
1153
|
+
/**
|
|
1154
|
+
* Admin-managed mode: also collect the Delegator / From user, so an admin can
|
|
1155
|
+
* create a delegation between two selected users (Ahmed → Sara). Self-service
|
|
1156
|
+
* leaves this false; the delegator defaults to the current user server-side.
|
|
1157
|
+
*/
|
|
1158
|
+
adminMode = input(false, ...(ngDevMode ? [{ debugName: "adminMode" }] : /* istanbul ignore next */ []));
|
|
1146
1159
|
halfWidth = 'flex flex-col gap-1 lg:col-span-6';
|
|
1147
1160
|
fullWidth = 'flex flex-col gap-1 lg:col-span-12';
|
|
1148
1161
|
modal = inject(ModalService);
|
|
@@ -1153,9 +1166,23 @@ class DelegationForm {
|
|
|
1153
1166
|
formValue = toSignal(this.delegationFormControl.valueChanges);
|
|
1154
1167
|
detail = this.facade.detail;
|
|
1155
1168
|
isDetailLoading = this.facade.isLoadingDetail;
|
|
1169
|
+
scopePreview = this.facade.scopePreview;
|
|
1170
|
+
isPreviewingScope = this.facade.isPreviewingScope;
|
|
1156
1171
|
isSaving = this.facade.isSaving;
|
|
1157
1172
|
context = new HttpContext().set(REQUEST_CONTEXT, { useBaseUrl: false });
|
|
1158
1173
|
scope = signal(EMPTY_SCOPE, ...(ngDevMode ? [{ debugName: "scope" }] : /* istanbul ignore next */ []));
|
|
1174
|
+
/** Selected delegator id (admin mode only); drives scope/options + create payload. */
|
|
1175
|
+
selectedDelegatorId = computed(() => {
|
|
1176
|
+
if (!this.adminMode())
|
|
1177
|
+
return undefined;
|
|
1178
|
+
const v = this.formValue();
|
|
1179
|
+
return (v?.delegateFrom?.userId ??
|
|
1180
|
+
v?.delegateFrom?.id ??
|
|
1181
|
+
v?.delegateFrom ??
|
|
1182
|
+
undefined);
|
|
1183
|
+
}, ...(ngDevMode ? [{ debugName: "selectedDelegatorId" }] : /* istanbul ignore next */ []));
|
|
1184
|
+
/** In admin mode the scope picker only loads once a delegator is chosen. */
|
|
1185
|
+
showScopePicker = computed(() => !this.adminMode() || !!this.selectedDelegatorId(), ...(ngDevMode ? [{ debugName: "showScopePicker" }] : /* istanbul ignore next */ []));
|
|
1159
1186
|
specificDaysOptions = signal([
|
|
1160
1187
|
{ label: this.transloco.translate('delegations.days.sunday'), value: 0 },
|
|
1161
1188
|
{ label: this.transloco.translate('delegations.days.monday'), value: 1 },
|
|
@@ -1173,6 +1200,21 @@ class DelegationForm {
|
|
|
1173
1200
|
bodyClass: 'grid grid-cols-1 gap-4 items-start lg:grid-cols-12',
|
|
1174
1201
|
order: 1,
|
|
1175
1202
|
fields: [
|
|
1203
|
+
...(this.adminMode()
|
|
1204
|
+
? [
|
|
1205
|
+
new UserSearchFieldConfig({
|
|
1206
|
+
key: 'delegateFrom',
|
|
1207
|
+
label: this.transloco.translate('delegations.column.delegatorName'),
|
|
1208
|
+
apiUrl: 'Identity/users',
|
|
1209
|
+
context: this.context,
|
|
1210
|
+
validators: [ValidatorConfig.required()],
|
|
1211
|
+
cssClass: this.halfWidth,
|
|
1212
|
+
colSpan: 6,
|
|
1213
|
+
order: 0,
|
|
1214
|
+
disabled: this.readonly() || !!this.delegationForEdit(),
|
|
1215
|
+
}),
|
|
1216
|
+
]
|
|
1217
|
+
: []),
|
|
1176
1218
|
new UserSearchFieldConfig({
|
|
1177
1219
|
key: 'delegateTo',
|
|
1178
1220
|
label: this.transloco.translate('delegations.column.delegatedTo'),
|
|
@@ -1300,14 +1342,23 @@ class DelegationForm {
|
|
|
1300
1342
|
this.facade.getDetail(editing.delegationId);
|
|
1301
1343
|
}
|
|
1302
1344
|
}
|
|
1303
|
-
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 */ []));
|
|
1304
1350
|
onSubmit() {
|
|
1305
1351
|
if (this.readonly() || !this.delegationFormControl.valid)
|
|
1306
1352
|
return;
|
|
1307
|
-
if (this.
|
|
1353
|
+
if (!this.canSubmit())
|
|
1308
1354
|
return;
|
|
1309
1355
|
const v = this.delegationFormControl.value;
|
|
1310
1356
|
const base = {
|
|
1357
|
+
// Admin mode sends the chosen delegator; self-service omits it so the
|
|
1358
|
+
// backend defaults delegateFrom to the current user (doc 04).
|
|
1359
|
+
delegateFrom: this.adminMode()
|
|
1360
|
+
? (this.selectedDelegatorId() ?? null)
|
|
1361
|
+
: null,
|
|
1311
1362
|
delegateTo: v?.delegateTo?.userId ?? v?.delegateTo?.id ?? v?.delegateTo,
|
|
1312
1363
|
description: v?.description,
|
|
1313
1364
|
delegateFromDateTime: v?.delegateFromDateTime,
|
|
@@ -1338,7 +1389,7 @@ class DelegationForm {
|
|
|
1338
1389
|
}
|
|
1339
1390
|
}
|
|
1340
1391
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DelegationForm, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1341
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: DelegationForm, isStandalone: true, selector: "mt-delegation-form", inputs: { delegationForEdit: { classPropertyName: "delegationForEdit", publicName: "delegationForEdit", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<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 <mt-scope-picker\n
|
|
1392
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: DelegationForm, isStandalone: true, selector: "mt-delegation-form", inputs: { delegationForEdit: { classPropertyName: "delegationForEdit", publicName: "delegationForEdit", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, adminMode: { classPropertyName: "adminMode", publicName: "adminMode", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<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", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig", "forcedHiddenFieldKeys", "preserveForcedHiddenValues", "visibleSectionKeys"], outputs: ["runtimeMessagesChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ScopePicker, selector: "mt-scope-picker", inputs: ["scope", "readonly", "delegatorUserId"], outputs: ["scopeChange"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1342
1393
|
}
|
|
1343
1394
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DelegationForm, decorators: [{
|
|
1344
1395
|
type: Component,
|
|
@@ -1349,8 +1400,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
1349
1400
|
ReactiveFormsModule,
|
|
1350
1401
|
ScopePicker,
|
|
1351
1402
|
TranslocoDirective,
|
|
1352
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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 <mt-scope-picker\n
|
|
1353
|
-
}], ctorParameters: () => [], propDecorators: { delegationForEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "delegationForEdit", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }] } });
|
|
1403
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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" }]
|
|
1404
|
+
}], ctorParameters: () => [], propDecorators: { delegationForEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "delegationForEdit", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], adminMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "adminMode", required: false }] }] } });
|
|
1354
1405
|
|
|
1355
1406
|
/**
|
|
1356
1407
|
* Read-only drawer that shows the full `DelegationDetail` ({ row, scope, status }).
|
|
@@ -1406,6 +1457,13 @@ class DelegationsList {
|
|
|
1406
1457
|
* `data: { showBreadcrumb: false }`.
|
|
1407
1458
|
*/
|
|
1408
1459
|
showBreadcrumb = input(true, ...(ngDevMode ? [{ debugName: "showBreadcrumb" }] : /* istanbul ignore next */ []));
|
|
1460
|
+
/**
|
|
1461
|
+
* Admin-managed surface: the create/edit form also collects the Delegator /
|
|
1462
|
+
* From user (admin creates a delegation between two users). Client
|
|
1463
|
+
* self-service leaves this false. Bound from route data via
|
|
1464
|
+
* `withComponentInputBinding()` — admin passes `data: { adminMode: true }`.
|
|
1465
|
+
*/
|
|
1466
|
+
adminMode = input(false, ...(ngDevMode ? [{ debugName: "adminMode" }] : /* istanbul ignore next */ []));
|
|
1409
1467
|
facade = inject(DelegationsFacade);
|
|
1410
1468
|
modal = inject(ModalService);
|
|
1411
1469
|
transloco = inject(TranslocoService);
|
|
@@ -1437,6 +1495,7 @@ class DelegationsList {
|
|
|
1437
1495
|
isLoading = computed(() => this.activeTab() === 'my'
|
|
1438
1496
|
? this.facade.isLoadingMy()
|
|
1439
1497
|
: this.facade.isLoadingAssigned(), ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
|
|
1498
|
+
scopeOptions = this.facade.scopeOptions;
|
|
1440
1499
|
rows = computed(() => this.activeTab() === 'my'
|
|
1441
1500
|
? this.facade.myItems()
|
|
1442
1501
|
: this.facade.assignedItems(), ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
|
|
@@ -1444,14 +1503,21 @@ class DelegationsList {
|
|
|
1444
1503
|
userCol = viewChild.required('userCol');
|
|
1445
1504
|
scopeCol = viewChild.required('scopeCol');
|
|
1446
1505
|
daysCol = viewChild.required('daysCol');
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
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 */ []));
|
|
1455
1521
|
rowActions = signal([
|
|
1456
1522
|
{
|
|
1457
1523
|
icon: 'general.eye',
|
|
@@ -1510,6 +1576,7 @@ class DelegationsList {
|
|
|
1510
1576
|
label: this.transloco.translate('delegations.column.status'),
|
|
1511
1577
|
type: 'custom',
|
|
1512
1578
|
customCellTpl: this.statusCol(),
|
|
1579
|
+
width: '10rem',
|
|
1513
1580
|
},
|
|
1514
1581
|
{
|
|
1515
1582
|
key: this.activeTab() === 'my' ? 'delegatedUser' : 'delegator',
|
|
@@ -1518,33 +1585,39 @@ class DelegationsList {
|
|
|
1518
1585
|
: 'delegations.column.delegatorName'),
|
|
1519
1586
|
type: 'custom',
|
|
1520
1587
|
customCellTpl: this.userCol(),
|
|
1588
|
+
width: '16rem',
|
|
1521
1589
|
},
|
|
1522
1590
|
{
|
|
1523
1591
|
key: 'scopeSummary',
|
|
1524
1592
|
label: this.transloco.translate('delegations.column.scopeSummary'),
|
|
1525
1593
|
type: 'custom',
|
|
1526
1594
|
customCellTpl: this.scopeCol(),
|
|
1595
|
+
width: '16rem',
|
|
1527
1596
|
},
|
|
1528
1597
|
{
|
|
1529
1598
|
key: 'startsAtUtc',
|
|
1530
1599
|
label: this.transloco.translate('delegations.column.startDate'),
|
|
1531
1600
|
type: 'dateTime',
|
|
1601
|
+
width: '11rem',
|
|
1532
1602
|
},
|
|
1533
1603
|
{
|
|
1534
1604
|
key: 'endsAtUtc',
|
|
1535
1605
|
label: this.transloco.translate('delegations.column.endDate'),
|
|
1536
1606
|
type: 'dateTime',
|
|
1607
|
+
width: '11rem',
|
|
1537
1608
|
},
|
|
1538
1609
|
{
|
|
1539
1610
|
key: 'createdAtUtc',
|
|
1540
1611
|
label: this.transloco.translate('delegations.column.createdDate'),
|
|
1541
1612
|
type: 'dateTime',
|
|
1613
|
+
width: '11rem',
|
|
1542
1614
|
},
|
|
1543
1615
|
{
|
|
1544
1616
|
key: 'dayRuleMode',
|
|
1545
1617
|
label: this.transloco.translate('delegations.column.days'),
|
|
1546
1618
|
type: 'custom',
|
|
1547
1619
|
customCellTpl: this.daysCol(),
|
|
1620
|
+
width: '12rem',
|
|
1548
1621
|
},
|
|
1549
1622
|
], ...(ngDevMode ? [{ debugName: "tableColumns" }] : /* istanbul ignore next */ []));
|
|
1550
1623
|
busyIds = signal([], ...(ngDevMode ? [{ debugName: "busyIds" }] : /* istanbul ignore next */ []));
|
|
@@ -1558,6 +1631,9 @@ class DelegationsList {
|
|
|
1558
1631
|
'saturday',
|
|
1559
1632
|
];
|
|
1560
1633
|
ngOnInit() {
|
|
1634
|
+
if (!this.adminMode()) {
|
|
1635
|
+
this.facade.loadScopeOptions();
|
|
1636
|
+
}
|
|
1561
1637
|
this.loadCurrentTab();
|
|
1562
1638
|
}
|
|
1563
1639
|
switchTab(tab) {
|
|
@@ -1608,7 +1684,11 @@ class DelegationsList {
|
|
|
1608
1684
|
appendTo: row ? 'page-content' : 'body',
|
|
1609
1685
|
dismissableMask: true,
|
|
1610
1686
|
dismissible: true,
|
|
1611
|
-
inputValues: {
|
|
1687
|
+
inputValues: {
|
|
1688
|
+
delegationForEdit: row,
|
|
1689
|
+
readonly: false,
|
|
1690
|
+
adminMode: this.adminMode(),
|
|
1691
|
+
},
|
|
1612
1692
|
});
|
|
1613
1693
|
ref.onClose.subscribe((saved) => {
|
|
1614
1694
|
if (saved)
|
|
@@ -1643,19 +1723,23 @@ class DelegationsList {
|
|
|
1643
1723
|
.subscribe({ next: () => this.reloadCurrentTab() });
|
|
1644
1724
|
}
|
|
1645
1725
|
startSession(row) {
|
|
1646
|
-
this.modal.openModal(StartSessionDialog, 'dialog', {
|
|
1726
|
+
const ref = this.modal.openModal(StartSessionDialog, 'dialog', {
|
|
1647
1727
|
header: this.transloco.translate('delegations.action.startSession'),
|
|
1648
1728
|
styleClass: '!w-[min(96vw,28rem)] !max-w-[96vw]',
|
|
1649
1729
|
dismissableMask: true,
|
|
1650
1730
|
dismissible: true,
|
|
1651
1731
|
inputValues: { delegation: row, intent: 'start' },
|
|
1652
1732
|
});
|
|
1733
|
+
ref.onClose.subscribe((started) => {
|
|
1734
|
+
if (started)
|
|
1735
|
+
this.reloadCurrentTab();
|
|
1736
|
+
});
|
|
1653
1737
|
}
|
|
1654
1738
|
mark(key, on) {
|
|
1655
1739
|
this.busyIds.update((ids) => on ? [...ids, key] : ids.filter((id) => id !== key));
|
|
1656
1740
|
}
|
|
1657
1741
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DelegationsList, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1658
|
-
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 } }, 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 });
|
|
1659
1743
|
}
|
|
1660
1744
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DelegationsList, decorators: [{
|
|
1661
1745
|
type: Component,
|
|
@@ -1666,8 +1750,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
1666
1750
|
Table,
|
|
1667
1751
|
TranslocoDirective,
|
|
1668
1752
|
DelegationStatusChip,
|
|
1669
|
-
], 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"] }]
|
|
1670
|
-
}], propDecorators: { showBreadcrumb: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBreadcrumb", 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 }] }] } });
|
|
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"] }]
|
|
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 }] }] } });
|
|
1671
1755
|
|
|
1672
1756
|
/**
|
|
1673
1757
|
* Endpoints that must NEVER carry the `app-delegation` header.
|