@masterteam/audit-logs 0.0.4 → 0.0.6

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.
@@ -45,12 +45,12 @@ class AuditLogs {
45
45
  goBack() {
46
46
  this.router.navigate(['control-panel/product-settings']);
47
47
  }
48
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogs, deps: [], target: i0.ɵɵFactoryTarget.Component });
49
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.3", type: AuditLogs, isStandalone: true, selector: "mt-audit-logs", ngImport: i0, template: "<ng-container *transloco=\"let t\">\n <mt-page\n [title]=\"t('audit-logs.audit-logs')\"\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\n [avatarIcon]=\"'time.clock-fast-forward'\"\n [avatarStyle]=\"{\n '--p-avatar-background': 'var(--p-lime-50)',\n '--p-avatar-color': 'var(--p-lime-700)',\n }\"\n (backButtonClick)=\"goBack()\"\n backButton\n >\n <div class=\"flex min-h-0 flex-col gap-4\">\n <mt-breadcrumb\n [items]=\"breadcrumbItems\"\n [styleClass]=\"'mx-1 flex justify-start'\"\n />\n\n <router-outlet />\n </div>\n </mt-page>\n</ng-container>\n", styles: [":host{display:block;height:100%}\n"], dependencies: [{ kind: "component", type: Page, selector: "mt-page", inputs: ["backButton", "backButtonIcon", "avatarIcon", "avatarStyle", "avatarShape", "title", "tabs", "activeTab", "contentClass", "contentId"], outputs: ["backButtonClick", "tabChange"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: Breadcrumb, selector: "mt-breadcrumb", inputs: ["items", "styleClass"], outputs: ["onItemClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
48
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogs, deps: [], target: i0.ɵɵFactoryTarget.Component });
49
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: AuditLogs, isStandalone: true, selector: "mt-audit-logs", ngImport: i0, template: "<ng-container *transloco=\"let t\">\r\n <mt-page\r\n [title]=\"t('audit-logs.audit-logs')\"\r\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\r\n [avatarIcon]=\"'time.clock-fast-forward'\"\r\n [avatarStyle]=\"{\r\n '--p-avatar-background': 'var(--p-lime-50)',\r\n '--p-avatar-color': 'var(--p-lime-700)',\r\n }\"\r\n (backButtonClick)=\"goBack()\"\r\n backButton\r\n >\r\n <div class=\"flex min-h-0 flex-col gap-4\">\r\n <mt-breadcrumb\r\n [items]=\"breadcrumbItems\"\r\n [styleClass]=\"'mx-1 flex justify-start'\"\r\n />\r\n\r\n <router-outlet />\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n", styles: [":host{display:block;height:100%}\n"], dependencies: [{ kind: "component", type: Page, selector: "mt-page", inputs: ["backButton", "backButtonIcon", "avatarIcon", "avatarStyle", "avatarShape", "title", "tabs", "activeTab", "contentClass", "contentId"], outputs: ["backButtonClick", "tabChange"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: Breadcrumb, selector: "mt-breadcrumb", inputs: ["items", "styleClass"], outputs: ["onItemClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
50
50
  }
51
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogs, decorators: [{
51
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogs, decorators: [{
52
52
  type: Component,
53
- args: [{ selector: 'mt-audit-logs', imports: [Page, RouterOutlet, TranslocoDirective, Breadcrumb], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\n <mt-page\n [title]=\"t('audit-logs.audit-logs')\"\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\n [avatarIcon]=\"'time.clock-fast-forward'\"\n [avatarStyle]=\"{\n '--p-avatar-background': 'var(--p-lime-50)',\n '--p-avatar-color': 'var(--p-lime-700)',\n }\"\n (backButtonClick)=\"goBack()\"\n backButton\n >\n <div class=\"flex min-h-0 flex-col gap-4\">\n <mt-breadcrumb\n [items]=\"breadcrumbItems\"\n [styleClass]=\"'mx-1 flex justify-start'\"\n />\n\n <router-outlet />\n </div>\n </mt-page>\n</ng-container>\n", styles: [":host{display:block;height:100%}\n"] }]
53
+ args: [{ selector: 'mt-audit-logs', imports: [Page, RouterOutlet, TranslocoDirective, Breadcrumb], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *transloco=\"let t\">\r\n <mt-page\r\n [title]=\"t('audit-logs.audit-logs')\"\r\n [contentClass]=\"'max-[1025px]:p-4 max-[640px]:p-3'\"\r\n [avatarIcon]=\"'time.clock-fast-forward'\"\r\n [avatarStyle]=\"{\r\n '--p-avatar-background': 'var(--p-lime-50)',\r\n '--p-avatar-color': 'var(--p-lime-700)',\r\n }\"\r\n (backButtonClick)=\"goBack()\"\r\n backButton\r\n >\r\n <div class=\"flex min-h-0 flex-col gap-4\">\r\n <mt-breadcrumb\r\n [items]=\"breadcrumbItems\"\r\n [styleClass]=\"'mx-1 flex justify-start'\"\r\n />\r\n\r\n <router-outlet />\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n", styles: [":host{display:block;height:100%}\n"] }]
54
54
  }] });
55
55
 
56
56
  var AuditLogsActionKey;
@@ -194,8 +194,8 @@ let AuditLogsState = class AuditLogsState extends CrudStateBase {
194
194
  const { language: _language, ...rest } = filters;
195
195
  return rest;
196
196
  }
197
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogsState, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
198
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogsState });
197
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogsState, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
198
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogsState });
199
199
  };
200
200
  __decorate([
201
201
  Action(GetAuditLogs)
@@ -237,7 +237,7 @@ AuditLogsState = __decorate([
237
237
  },
238
238
  })
239
239
  ], AuditLogsState);
240
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogsState, decorators: [{
240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogsState, decorators: [{
241
241
  type: Injectable
242
242
  }], propDecorators: { getAuditLogs: [], getAuditLogDetail: [], clearAuditLogDetail: [] } });
243
243
 
@@ -249,11 +249,11 @@ class AuditLogsFacade {
249
249
  selectedEventDetail = select(AuditLogsState.getSelectedEventDetail);
250
250
  loadingActive = select(AuditLogsState.getLoadingActive);
251
251
  errors = select(AuditLogsState.getErrors);
252
- isLoadingAuditLogs = computed(() => this.loadingActive().includes(AuditLogsActionKey.GetAuditLogs), ...(ngDevMode ? [{ debugName: "isLoadingAuditLogs" }] : []));
253
- isLoadingAuditLogDetail = computed(() => this.loadingActive().includes(AuditLogsActionKey.GetAuditLogDetail), ...(ngDevMode ? [{ debugName: "isLoadingAuditLogDetail" }] : []));
254
- getAuditLogsError = computed(() => this.errors()[AuditLogsActionKey.GetAuditLogs] ?? null, ...(ngDevMode ? [{ debugName: "getAuditLogsError" }] : []));
255
- getAuditLogDetailError = computed(() => this.errors()[AuditLogsActionKey.GetAuditLogDetail] ?? null, ...(ngDevMode ? [{ debugName: "getAuditLogDetailError" }] : []));
256
- activeFilterCount = computed(() => Object.values(this.filters()).filter((value) => value !== null && value !== undefined && value !== '').length, ...(ngDevMode ? [{ debugName: "activeFilterCount" }] : []));
252
+ isLoadingAuditLogs = computed(() => this.loadingActive().includes(AuditLogsActionKey.GetAuditLogs), ...(ngDevMode ? [{ debugName: "isLoadingAuditLogs" }] : /* istanbul ignore next */ []));
253
+ isLoadingAuditLogDetail = computed(() => this.loadingActive().includes(AuditLogsActionKey.GetAuditLogDetail), ...(ngDevMode ? [{ debugName: "isLoadingAuditLogDetail" }] : /* istanbul ignore next */ []));
254
+ getAuditLogsError = computed(() => this.errors()[AuditLogsActionKey.GetAuditLogs] ?? null, ...(ngDevMode ? [{ debugName: "getAuditLogsError" }] : /* istanbul ignore next */ []));
255
+ getAuditLogDetailError = computed(() => this.errors()[AuditLogsActionKey.GetAuditLogDetail] ?? null, ...(ngDevMode ? [{ debugName: "getAuditLogDetailError" }] : /* istanbul ignore next */ []));
256
+ activeFilterCount = computed(() => Object.values(this.filters()).filter((value) => value !== null && value !== undefined && value !== '').length, ...(ngDevMode ? [{ debugName: "activeFilterCount" }] : /* istanbul ignore next */ []));
257
257
  getAuditLogs(page = 1, pageSize = 20, filters = {}) {
258
258
  return this.store.dispatch(new GetAuditLogs(page, pageSize, filters));
259
259
  }
@@ -263,10 +263,10 @@ class AuditLogsFacade {
263
263
  clearAuditLogDetail() {
264
264
  return this.store.dispatch(new ClearAuditLogDetail());
265
265
  }
266
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogsFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
267
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogsFacade, providedIn: 'root' });
266
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogsFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
267
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogsFacade, providedIn: 'root' });
268
268
  }
269
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogsFacade, decorators: [{
269
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogsFacade, decorators: [{
270
270
  type: Injectable,
271
271
  args: [{ providedIn: 'root' }]
272
272
  }] });
@@ -380,16 +380,16 @@ function normalizeDates(value) {
380
380
 
381
381
  class AuditLogDetailDrawer {
382
382
  modal = inject(ModalService);
383
- visible = input(false, ...(ngDevMode ? [{ debugName: "visible" }] : []));
384
- detail = input(null, ...(ngDevMode ? [{ debugName: "detail" }] : []));
385
- loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
386
- error = input(null, ...(ngDevMode ? [{ debugName: "error" }] : []));
383
+ visible = input(false, ...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
384
+ detail = input(null, ...(ngDevMode ? [{ debugName: "detail" }] : /* istanbul ignore next */ []));
385
+ loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
386
+ error = input(null, ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
387
387
  visibleChange = output();
388
- expandedEvidence = signal({}, ...(ngDevMode ? [{ debugName: "expandedEvidence" }] : []));
389
- drawerTitle = computed(() => this.detail()?.summary ?? '', ...(ngDevMode ? [{ debugName: "drawerTitle" }] : []));
388
+ expandedEvidence = signal({}, ...(ngDevMode ? [{ debugName: "expandedEvidence" }] : /* istanbul ignore next */ []));
389
+ drawerTitle = computed(() => this.detail()?.summary ?? '', ...(ngDevMode ? [{ debugName: "drawerTitle" }] : /* istanbul ignore next */ []));
390
390
  constructor() {
391
391
  effect(() => {
392
- this.detail()?.eventId;
392
+ this.detail();
393
393
  this.expandedEvidence.set({});
394
394
  });
395
395
  }
@@ -476,10 +476,10 @@ class AuditLogDetailDrawer {
476
476
  .trim()
477
477
  .replace(/\b\w/g, (char) => char.toUpperCase());
478
478
  }
479
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogDetailDrawer, deps: [], target: i0.ɵɵFactoryTarget.Component });
480
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: AuditLogDetailDrawer, isStandalone: true, selector: "mt-audit-log-detail-drawer", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, detail: { classPropertyName: "detail", publicName: "detail", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, host: { classAttribute: "block h-full" }, ngImport: i0, template: "<mt-drawer\n [visible]=\"visible()\"\n [title]=\"drawerTitle()\"\n [loadingHeader]=\"loading()\"\n styleClass=\"mt-audit-log-drawer !absolute !w-[90%] xl:!w-[68rem]\"\n appendTo=\"page-content\"\n position=\"right\"\n (visibleChange)=\"onDrawerVisibleChange($event)\"\n *transloco=\"let t; prefix: 'audit-logs'\"\n>\n <ng-container content>\n @if (loading()) {\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\n <div class=\"flex flex-col gap-5\">\n <div class=\"flex flex-wrap gap-3\">\n @for (_ of [1, 2, 3, 4]; track $index) {\n <p-skeleton width=\"7rem\" height=\"2rem\" borderRadius=\"0.5rem\" />\n }\n </div>\n\n <div class=\"grid gap-5 xl:grid-cols-[minmax(0,1.35fr)_minmax(18rem,0.85fr)]\">\n <div class=\"flex flex-col gap-5\">\n <mt-card [title]=\"t('drawer.change-groups')\">\n <div class=\"flex flex-col gap-4\">\n <p-skeleton height=\"12rem\" borderRadius=\"1rem\" />\n <p-skeleton height=\"14rem\" borderRadius=\"1rem\" />\n </div>\n </mt-card>\n\n <mt-card [title]=\"t('drawer.evidence')\">\n <div class=\"flex flex-col gap-4\">\n <p-skeleton height=\"9rem\" borderRadius=\"1rem\" />\n </div>\n </mt-card>\n </div>\n\n <div class=\"flex flex-col gap-5\">\n <mt-card [title]=\"t('drawer.request-context')\">\n <div class=\"flex flex-col gap-4\">\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\n <p-skeleton height=\"3rem\" borderRadius=\"0.75rem\" />\n </div>\n </mt-card>\n\n <mt-card [title]=\"t('drawer.subjects')\">\n <div class=\"flex flex-col gap-4\">\n <p-skeleton height=\"8rem\" borderRadius=\"1rem\" />\n </div>\n </mt-card>\n </div>\n </div>\n </div>\n </div>\n } @else if (error(); as errorMessage) {\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\n <mt-card class=\"min-h-[28rem]\">\n <div\n class=\"flex min-h-[28rem] items-center justify-center p-6 text-center\"\n >\n <p class=\"max-w-2xl text-sm font-medium text-rose-700\">\n {{ errorMessage }}\n </p>\n </div>\n </mt-card>\n </div>\n } @else if (detail(); as event) {\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\n <div class=\"flex flex-col gap-5\">\n <div\n class=\"grid gap-5 xl:grid-cols-[minmax(0,1.35fr)_minmax(18rem,0.85fr)]\"\n >\n <div class=\"flex min-w-0 flex-col gap-5\">\n <mt-card [title]=\"t('drawer.change-groups')\">\n @if (event.changeGroups.length > 0) {\n @let hasMultipleChangeGroups = event.changeGroups.length > 1;\n <div class=\"flex flex-col gap-5\">\n @for (group of event.changeGroups; track group.key) {\n @if (hasMultipleChangeGroups) {\n <div\n class=\"overflow-hidden rounded-xl border border-surface-200\"\n >\n <div class=\"border-b border-surface-200 px-4 py-3\">\n <h5 class=\"font-semibold text-surface-900\">\n {{ group.label || humanizeKey(group.key) }}\n </h5>\n </div>\n\n <div class=\"divide-y divide-surface-100\">\n @for (\n change of group.changes;\n track change.fieldKey + \"-\" + $index\n ) {\n <div class=\"flex flex-col gap-3 px-4 py-4\">\n <div\n class=\"flex flex-wrap items-start justify-between gap-2\"\n >\n <div class=\"flex flex-col gap-1\">\n <span class=\"font-medium text-surface-900\">\n {{ getFieldLabel(change) }}\n </span>\n\n <div\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\n >\n @if (\n getChangeSource(change);\n as changeSource\n ) {\n <span>\n {{ t(\"drawer.change-source\") }}:\n {{ changeSource }}\n </span>\n }\n\n <span>\n {{ t(\"drawer.value-kind\") }}:\n {{ change.valueKind }}\n </span>\n </div>\n </div>\n </div>\n\n <div\n class=\"grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]\"\n >\n <div\n class=\"rounded-xl border border-surface-200 bg-surface-50 p-4\"\n >\n <p\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\n >\n {{ t(\"drawer.from\") }}\n </p>\n\n @if (isEmptyValue(change.oldValue)) {\n <span class=\"text-sm text-surface-400\">\n {{ t(\"drawer.empty-value\") }}\n </span>\n } @else if (\n isJsonValue(\n change.valueKind,\n change.oldValue\n )\n ) {\n <pre class=\"audit-json-value\">{{\n formatValue(\n change.oldValue,\n change.valueKind\n )\n }}</pre>\n } @else {\n <span class=\"text-sm text-surface-700\">\n {{\n formatValue(\n change.oldValue,\n change.valueKind\n )\n }}\n </span>\n }\n </div>\n\n <div\n class=\"flex items-center justify-center text-xl text-surface-300\"\n >\n -&gt;\n </div>\n\n <div\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\n >\n <p\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\n >\n {{ t(\"drawer.to\") }}\n </p>\n\n @if (isEmptyValue(change.newValue)) {\n <span class=\"text-sm text-surface-500\">\n {{ t(\"drawer.empty-value\") }}\n </span>\n } @else if (\n isJsonValue(\n change.valueKind,\n change.newValue\n )\n ) {\n <pre class=\"audit-json-value\">{{\n formatValue(\n change.newValue,\n change.valueKind\n )\n }}</pre>\n } @else {\n <span class=\"text-sm text-surface-700\">\n {{\n formatValue(\n change.newValue,\n change.valueKind\n )\n }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-4\">\n @if (group.label || group.key) {\n <h5 class=\"font-semibold text-surface-900\">\n {{ group.label || humanizeKey(group.key) }}\n </h5>\n }\n\n <div class=\"flex flex-col gap-5\">\n @for (\n change of group.changes;\n track change.fieldKey + \"-\" + $index\n ) {\n <div class=\"flex flex-col gap-3\">\n <div\n class=\"flex flex-wrap items-start justify-between gap-2\"\n >\n <div class=\"flex flex-col gap-1\">\n <span class=\"font-medium text-surface-900\">\n {{ getFieldLabel(change) }}\n </span>\n\n <div\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\n >\n @if (\n getChangeSource(change);\n as changeSource\n ) {\n <span>\n {{ t(\"drawer.change-source\") }}:\n {{ changeSource }}\n </span>\n }\n\n <span>\n {{ t(\"drawer.value-kind\") }}:\n {{ change.valueKind }}\n </span>\n </div>\n </div>\n </div>\n\n <div\n class=\"grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]\"\n >\n <div\n class=\"rounded-xl border border-surface-200 bg-surface-50 p-4\"\n >\n <p\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\n >\n {{ t(\"drawer.from\") }}\n </p>\n\n @if (isEmptyValue(change.oldValue)) {\n <span class=\"text-sm text-surface-400\">\n {{ t(\"drawer.empty-value\") }}\n </span>\n } @else if (\n isJsonValue(\n change.valueKind,\n change.oldValue\n )\n ) {\n <pre class=\"audit-json-value\">{{\n formatValue(\n change.oldValue,\n change.valueKind\n )\n }}</pre>\n } @else {\n <span class=\"text-sm text-surface-700\">\n {{\n formatValue(\n change.oldValue,\n change.valueKind\n )\n }}\n </span>\n }\n </div>\n\n <div\n class=\"flex items-center justify-center text-xl text-surface-300\"\n >\n -&gt;\n </div>\n\n <div\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\n >\n <p\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\n >\n {{ t(\"drawer.to\") }}\n </p>\n\n @if (isEmptyValue(change.newValue)) {\n <span class=\"text-sm text-surface-500\">\n {{ t(\"drawer.empty-value\") }}\n </span>\n } @else if (\n isJsonValue(\n change.valueKind,\n change.newValue\n )\n ) {\n <pre class=\"audit-json-value\">{{\n formatValue(\n change.newValue,\n change.valueKind\n )\n }}</pre>\n } @else {\n <span class=\"text-sm text-surface-700\">\n {{\n formatValue(\n change.newValue,\n change.valueKind\n )\n }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"text-sm text-surface-500\">\n {{ t(\"drawer.no-changes\") }}\n </div>\n }\n </mt-card>\n </div>\n\n <div class=\"flex min-w-0 flex-col gap-5\">\n <mt-card [title]=\"t('drawer.request-context')\">\n <dl class=\"grid gap-4\">\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"drawer.actor\") }}\n </dt>\n <dd class=\"text-sm text-surface-800\">\n @if (\n getActorUserEntity(event.requestContext.actorUser);\n as actorUserEntity\n ) {\n <mt-entity-user [data]=\"actorUserEntity\" />\n } @else {\n <span class=\"break-all\">\n {{ event.requestContext.actorUserId || \"system\" }}\n </span>\n }\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"drawer.occurred-at\") }}\n </dt>\n <dd class=\"text-sm text-surface-800\">\n {{ event.requestContext.occurredAtUtc | date: \"medium\" }}\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"category\") }}\n </dt>\n <dd>\n @if (getStatusEntity('category', event.category); as status) {\n <mt-entity-status [data]=\"status\" />\n }\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"operation\") }}\n </dt>\n <dd>\n @if (\n getStatusEntity('operation', event.operation);\n as status\n ) {\n <mt-entity-status [data]=\"status\" />\n }\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"importance\") }}\n </dt>\n <dd>\n @if (\n getStatusEntity('importance', event.importance);\n as status\n ) {\n <mt-entity-status [data]=\"status\" />\n }\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"surface\") }}\n </dt>\n <dd>\n @if (getStatusEntity('surface', event.surface); as status) {\n <mt-entity-status [data]=\"status\" />\n }\n </dd>\n </div>\n </dl>\n </mt-card>\n\n <mt-card [title]=\"t('drawer.subjects')\">\n @if (event.subjects.length > 0) {\n <div\n class=\"overflow-hidden rounded-xl border border-surface-200\"\n >\n <div class=\"divide-y divide-surface-100\">\n @for (\n subject of event.subjects;\n track subject.subjectType + \"-\" + subject.subjectId\n ) {\n <div class=\"flex flex-col gap-3 px-4 py-4\">\n <div\n class=\"flex flex-wrap items-start justify-between gap-3\"\n >\n <div class=\"flex flex-col gap-1\">\n <span class=\"font-medium text-surface-900\">\n {{ getSubjectLabel(subject) }}\n </span>\n <span class=\"text-xs text-surface-500\">\n {{ humanizeKey(subject.subjectType) }}\n </span>\n </div>\n\n <span\n class=\"rounded-full bg-surface-100 px-3 py-1 text-xs font-medium text-surface-700\"\n >\n {{ humanizeKey(subject.relation) }}\n </span>\n </div>\n\n <div\n class=\"flex flex-wrap gap-2 text-xs text-surface-500\"\n >\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.scope\") }}: {{ subject.subjectId }}\n </span>\n @if (\n subject.levelId !== null &&\n subject.levelId !== undefined\n ) {\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.level-id\") }}:\n {{ subject.levelId }}\n </span>\n }\n @if (\n subject.levelDataId !== null &&\n subject.levelDataId !== undefined\n ) {\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.level-data-id\") }}:\n {{ subject.levelDataId }}\n </span>\n }\n @if (\n subject.moduleDataId !== null &&\n subject.moduleDataId !== undefined\n ) {\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.module-data-id\") }}:\n {{ subject.moduleDataId }}\n </span>\n }\n @if (subject.moduleKey) {\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.module-key\") }}:\n {{ subject.moduleKey }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"text-sm text-surface-500\">\n {{ t(\"drawer.no-subjects\") }}\n </div>\n }\n </mt-card>\n </div>\n </div>\n\n <mt-card [title]=\"t('drawer.evidence')\">\n <p class=\"mb-4 text-sm text-surface-500\">\n {{ t(\"drawer.advanced-description\") }}\n </p>\n\n @if (event.evidence.length > 0) {\n <div class=\"overflow-hidden rounded-xl border border-surface-200\">\n <div class=\"divide-y divide-surface-100\">\n @for (\n evidence of event.evidence;\n track evidence.type + \"-\" + $index\n ) {\n <section>\n <div\n class=\"flex flex-wrap items-center justify-between gap-3 px-4 py-3\"\n >\n <span class=\"font-medium text-surface-900\">\n {{ evidence.type || t(\"drawer.technical-evidence\") }}\n </span>\n\n <mt-button\n [label]=\"t('drawer.view-json')\"\n severity=\"secondary\"\n variant=\"text\"\n size=\"small\"\n (onClick)=\"toggleEvidence($index)\"\n />\n </div>\n\n @if (isEvidenceExpanded($index)) {\n <pre class=\"audit-json-panel\">{{\n formatJson(evidence.contentJson)\n }}</pre>\n }\n </section>\n }\n </div>\n </div>\n } @else {\n <div class=\"text-sm text-surface-500\">\n {{ t(\"drawer.no-evidence\") }}\n </div>\n }\n </mt-card>\n </div>\n </div>\n } @else {\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\n <mt-card class=\"min-h-[28rem]\">\n <div\n class=\"flex min-h-[28rem] items-center justify-center p-6 text-center\"\n >\n <p class=\"max-w-2xl text-sm text-surface-500\">\n {{ t(\"drawer.no-event-selected\") }}\n </p>\n </div>\n </mt-card>\n </div>\n }\n </ng-container>\n</mt-drawer>\n", styles: [":host{display:block}.audit-json-panel,.audit-json-value{margin:0;overflow-x:auto;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.audit-json-panel{border-top:1px solid var(--p-surface-100);background:color-mix(in srgb,var(--p-surface-50) 80%,white);padding:1rem;font-size:.8rem;line-height:1.55}.audit-json-value{font-size:.78rem;line-height:1.55;color:var(--p-surface-700)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: Drawer, selector: "mt-drawer", inputs: ["visible", "position", "fullScreen", "closeOnEscape", "blockScroll", "dismissible", "title", "subtitle", "loadingHeader", "styleClass", "transitionOptions", "appendTo", "modal"], outputs: ["visibleChange", "onShow", "onHide"] }, { 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: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: EntityStatus, selector: "mt-entity-status", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityUser, selector: "mt-entity-user", inputs: ["data"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i1.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
479
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogDetailDrawer, deps: [], target: i0.ɵɵFactoryTarget.Component });
480
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: AuditLogDetailDrawer, isStandalone: true, selector: "mt-audit-log-detail-drawer", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, detail: { classPropertyName: "detail", publicName: "detail", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange" }, host: { classAttribute: "block h-full" }, ngImport: i0, template: "<mt-drawer\r\n [visible]=\"visible()\"\r\n [title]=\"drawerTitle()\"\r\n [loadingHeader]=\"loading()\"\r\n styleClass=\"mt-audit-log-drawer !absolute !w-[90%] xl:!w-[68rem]\"\r\n appendTo=\"page-content\"\r\n position=\"right\"\r\n (visibleChange)=\"onDrawerVisibleChange($event)\"\r\n *transloco=\"let t; prefix: 'audit-logs'\"\r\n>\r\n <ng-container content>\r\n @if (loading()) {\r\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\r\n <div class=\"flex flex-col gap-5\">\r\n <div class=\"flex flex-wrap gap-3\">\r\n @for (_ of [1, 2, 3, 4]; track $index) {\r\n <p-skeleton width=\"7rem\" height=\"2rem\" borderRadius=\"0.5rem\" />\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"grid gap-5 xl:grid-cols-[minmax(0,1.35fr)_minmax(18rem,0.85fr)]\"\r\n >\r\n <div class=\"flex flex-col gap-5\">\r\n <mt-card [title]=\"t('drawer.change-groups')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton height=\"12rem\" class=\"rounded-lg\" />\r\n <p-skeleton height=\"14rem\" class=\"rounded-lg\" />\r\n </div>\r\n </mt-card>\r\n\r\n <mt-card [title]=\"t('drawer.evidence')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton height=\"9rem\" class=\"rounded-lg\" />\r\n </div>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-5\">\r\n <mt-card [title]=\"t('drawer.request-context')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton height=\"3rem\" borderRadius=\"0.75rem\" />\r\n </div>\r\n </mt-card>\r\n\r\n <mt-card [title]=\"t('drawer.subjects')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton height=\"8rem\" class=\"rounded-lg\" />\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n } @else if (error(); as errorMessage) {\r\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\r\n <mt-card class=\"min-h-[28rem]\">\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center p-6 text-center\"\r\n >\r\n <p class=\"max-w-2xl text-sm font-medium text-rose-700\">\r\n {{ errorMessage }}\r\n </p>\r\n </div>\r\n </mt-card>\r\n </div>\r\n } @else if (detail(); as event) {\r\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\r\n <div class=\"flex flex-col gap-5\">\r\n <div\r\n class=\"grid gap-5 xl:grid-cols-[minmax(0,1.35fr)_minmax(18rem,0.85fr)]\"\r\n >\r\n <div class=\"flex min-w-0 flex-col gap-5\">\r\n <mt-card [title]=\"t('drawer.change-groups')\">\r\n @if (event.changeGroups.length > 0) {\r\n @let hasMultipleChangeGroups = event.changeGroups.length > 1;\r\n <div class=\"flex flex-col gap-5\">\r\n @for (group of event.changeGroups; track group.key) {\r\n @if (hasMultipleChangeGroups) {\r\n <div\r\n class=\"overflow-hidden rounded-xl border border-surface-200\"\r\n >\r\n <div class=\"border-b border-surface-200 px-4 py-3\">\r\n <h5 class=\"font-semibold text-surface-900\">\r\n {{ group.label || humanizeKey(group.key) }}\r\n </h5>\r\n </div>\r\n\r\n <div class=\"divide-y divide-surface-100\">\r\n @for (\r\n change of group.changes;\r\n track change.fieldKey + \"-\" + $index\r\n ) {\r\n <div class=\"flex flex-col gap-3 px-4 py-4\">\r\n <div\r\n class=\"flex flex-wrap items-start justify-between gap-2\"\r\n >\r\n <div class=\"flex flex-col gap-1\">\r\n <span class=\"font-medium text-surface-900\">\r\n {{ getFieldLabel(change) }}\r\n </span>\r\n\r\n <div\r\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\r\n >\r\n @if (\r\n getChangeSource(change);\r\n as changeSource\r\n ) {\r\n <span>\r\n {{ t(\"drawer.change-source\") }}:\r\n {{ changeSource }}\r\n </span>\r\n }\r\n\r\n <span>\r\n {{ t(\"drawer.value-kind\") }}:\r\n {{ change.valueKind }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]\"\r\n >\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-50 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.from\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.oldValue)) {\r\n <span class=\"text-sm text-surface-400\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.oldValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex items-center justify-center text-xl text-surface-300\"\r\n >\r\n -&gt;\r\n </div>\r\n\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.to\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.newValue)) {\r\n <span class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.newValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (group.label || group.key) {\r\n <h5 class=\"font-semibold text-surface-900\">\r\n {{ group.label || humanizeKey(group.key) }}\r\n </h5>\r\n }\r\n\r\n <div class=\"flex flex-col gap-5\">\r\n @for (\r\n change of group.changes;\r\n track change.fieldKey + \"-\" + $index\r\n ) {\r\n <div class=\"flex flex-col gap-3\">\r\n <div\r\n class=\"flex flex-wrap items-start justify-between gap-2\"\r\n >\r\n <div class=\"flex flex-col gap-1\">\r\n <span class=\"font-medium text-surface-900\">\r\n {{ getFieldLabel(change) }}\r\n </span>\r\n\r\n <div\r\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\r\n >\r\n @if (\r\n getChangeSource(change);\r\n as changeSource\r\n ) {\r\n <span>\r\n {{ t(\"drawer.change-source\") }}:\r\n {{ changeSource }}\r\n </span>\r\n }\r\n\r\n <span>\r\n {{ t(\"drawer.value-kind\") }}:\r\n {{ change.valueKind }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]\"\r\n >\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-50 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.from\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.oldValue)) {\r\n <span class=\"text-sm text-surface-400\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.oldValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex items-center justify-center text-xl text-surface-300\"\r\n >\r\n -&gt;\r\n </div>\r\n\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.to\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.newValue)) {\r\n <span class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.newValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.no-changes\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"flex min-w-0 flex-col gap-5\">\r\n <mt-card [title]=\"t('drawer.request-context')\">\r\n <dl class=\"grid gap-4\">\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"drawer.actor\") }}\r\n </dt>\r\n <dd class=\"text-sm text-surface-800\">\r\n @if (\r\n getActorUserEntity(event.requestContext.actorUser);\r\n as actorUserEntity\r\n ) {\r\n <mt-entity-user [data]=\"actorUserEntity\" />\r\n } @else {\r\n <span class=\"break-all\">\r\n {{ event.requestContext.actorUserId || \"system\" }}\r\n </span>\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"drawer.occurred-at\") }}\r\n </dt>\r\n <dd class=\"text-sm text-surface-800\">\r\n {{ event.requestContext.occurredAtUtc | date: \"medium\" }}\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"category\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"category\", event.category);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"operation\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"operation\", event.operation);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"importance\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"importance\", event.importance);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"surface\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"surface\", event.surface);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n </dl>\r\n </mt-card>\r\n\r\n <mt-card [title]=\"t('drawer.subjects')\">\r\n @if (event.subjects.length > 0) {\r\n <div\r\n class=\"overflow-hidden rounded-xl border border-surface-200\"\r\n >\r\n <div class=\"divide-y divide-surface-100\">\r\n @for (\r\n subject of event.subjects;\r\n track subject.subjectType + \"-\" + subject.subjectId\r\n ) {\r\n <div class=\"flex flex-col gap-3 px-4 py-4\">\r\n <div\r\n class=\"flex flex-wrap items-start justify-between gap-3\"\r\n >\r\n <div class=\"flex flex-col gap-1\">\r\n <span class=\"font-medium text-surface-900\">\r\n {{ getSubjectLabel(subject) }}\r\n </span>\r\n <span class=\"text-xs text-surface-500\">\r\n {{ humanizeKey(subject.subjectType) }}\r\n </span>\r\n </div>\r\n\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1 text-xs font-medium text-surface-700\"\r\n >\r\n {{ humanizeKey(subject.relation) }}\r\n </span>\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-wrap gap-2 text-xs text-surface-500\"\r\n >\r\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\r\n {{ t(\"drawer.scope\") }}: {{ subject.subjectId }}\r\n </span>\r\n @if (\r\n subject.levelId !== null &&\r\n subject.levelId !== undefined\r\n ) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.level-id\") }}:\r\n {{ subject.levelId }}\r\n </span>\r\n }\r\n @if (\r\n subject.levelDataId !== null &&\r\n subject.levelDataId !== undefined\r\n ) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.level-data-id\") }}:\r\n {{ subject.levelDataId }}\r\n </span>\r\n }\r\n @if (\r\n subject.moduleDataId !== null &&\r\n subject.moduleDataId !== undefined\r\n ) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.module-data-id\") }}:\r\n {{ subject.moduleDataId }}\r\n </span>\r\n }\r\n @if (subject.moduleKey) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.module-key\") }}:\r\n {{ subject.moduleKey }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.no-subjects\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n </div>\r\n\r\n <mt-card [title]=\"t('drawer.evidence')\">\r\n <p class=\"mb-4 text-sm text-surface-500\">\r\n {{ t(\"drawer.advanced-description\") }}\r\n </p>\r\n\r\n @if (event.evidence.length > 0) {\r\n <div class=\"overflow-hidden rounded-xl border border-surface-200\">\r\n <div class=\"divide-y divide-surface-100\">\r\n @for (\r\n evidence of event.evidence;\r\n track evidence.type + \"-\" + $index\r\n ) {\r\n <section>\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-3 px-4 py-3\"\r\n >\r\n <span class=\"font-medium text-surface-900\">\r\n {{ evidence.type || t(\"drawer.technical-evidence\") }}\r\n </span>\r\n\r\n <mt-button\r\n [label]=\"t('drawer.view-json')\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n size=\"small\"\r\n (onClick)=\"toggleEvidence($index)\"\r\n />\r\n </div>\r\n\r\n @if (isEvidenceExpanded($index)) {\r\n <pre class=\"audit-json-panel\">{{\r\n formatJson(evidence.contentJson)\r\n }}</pre>\r\n }\r\n </section>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.no-evidence\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n </div>\r\n } @else {\r\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\r\n <mt-card class=\"min-h-[28rem]\">\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center p-6 text-center\"\r\n >\r\n <p class=\"max-w-2xl text-sm text-surface-500\">\r\n {{ t(\"drawer.no-event-selected\") }}\r\n </p>\r\n </div>\r\n </mt-card>\r\n </div>\r\n }\r\n </ng-container>\r\n</mt-drawer>\r\n", styles: [":host{display:block}.audit-json-panel,.audit-json-value{margin:0;overflow-x:auto;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.audit-json-panel{border-top:1px solid var(--p-surface-100);background:color-mix(in srgb,var(--p-surface-50) 80%,white);padding:1rem;font-size:.8rem;line-height:1.55}.audit-json-value{font-size:.78rem;line-height:1.55;color:var(--p-surface-700)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: Drawer, selector: "mt-drawer", inputs: ["visible", "position", "fullScreen", "closeOnEscape", "blockScroll", "dismissible", "title", "subtitle", "loadingHeader", "styleClass", "transitionOptions", "appendTo", "modal"], outputs: ["visibleChange", "onShow", "onHide"] }, { 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: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: EntityStatus, selector: "mt-entity-status", inputs: ["data", "name", "value"] }, { kind: "component", type: EntityUser, selector: "mt-entity-user", inputs: ["data"] }, { kind: "ngmodule", type: SkeletonModule }, { kind: "component", type: i1.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
481
481
  }
482
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogDetailDrawer, decorators: [{
482
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogDetailDrawer, decorators: [{
483
483
  type: Component,
484
484
  args: [{ selector: 'mt-audit-log-detail-drawer', imports: [
485
485
  CommonModule,
@@ -492,7 +492,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
492
492
  SkeletonModule,
493
493
  ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
494
494
  class: 'block h-full',
495
- }, template: "<mt-drawer\n [visible]=\"visible()\"\n [title]=\"drawerTitle()\"\n [loadingHeader]=\"loading()\"\n styleClass=\"mt-audit-log-drawer !absolute !w-[90%] xl:!w-[68rem]\"\n appendTo=\"page-content\"\n position=\"right\"\n (visibleChange)=\"onDrawerVisibleChange($event)\"\n *transloco=\"let t; prefix: 'audit-logs'\"\n>\n <ng-container content>\n @if (loading()) {\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\n <div class=\"flex flex-col gap-5\">\n <div class=\"flex flex-wrap gap-3\">\n @for (_ of [1, 2, 3, 4]; track $index) {\n <p-skeleton width=\"7rem\" height=\"2rem\" borderRadius=\"0.5rem\" />\n }\n </div>\n\n <div class=\"grid gap-5 xl:grid-cols-[minmax(0,1.35fr)_minmax(18rem,0.85fr)]\">\n <div class=\"flex flex-col gap-5\">\n <mt-card [title]=\"t('drawer.change-groups')\">\n <div class=\"flex flex-col gap-4\">\n <p-skeleton height=\"12rem\" borderRadius=\"1rem\" />\n <p-skeleton height=\"14rem\" borderRadius=\"1rem\" />\n </div>\n </mt-card>\n\n <mt-card [title]=\"t('drawer.evidence')\">\n <div class=\"flex flex-col gap-4\">\n <p-skeleton height=\"9rem\" borderRadius=\"1rem\" />\n </div>\n </mt-card>\n </div>\n\n <div class=\"flex flex-col gap-5\">\n <mt-card [title]=\"t('drawer.request-context')\">\n <div class=\"flex flex-col gap-4\">\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\n <p-skeleton height=\"3rem\" borderRadius=\"0.75rem\" />\n </div>\n </mt-card>\n\n <mt-card [title]=\"t('drawer.subjects')\">\n <div class=\"flex flex-col gap-4\">\n <p-skeleton height=\"8rem\" borderRadius=\"1rem\" />\n </div>\n </mt-card>\n </div>\n </div>\n </div>\n </div>\n } @else if (error(); as errorMessage) {\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\n <mt-card class=\"min-h-[28rem]\">\n <div\n class=\"flex min-h-[28rem] items-center justify-center p-6 text-center\"\n >\n <p class=\"max-w-2xl text-sm font-medium text-rose-700\">\n {{ errorMessage }}\n </p>\n </div>\n </mt-card>\n </div>\n } @else if (detail(); as event) {\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\n <div class=\"flex flex-col gap-5\">\n <div\n class=\"grid gap-5 xl:grid-cols-[minmax(0,1.35fr)_minmax(18rem,0.85fr)]\"\n >\n <div class=\"flex min-w-0 flex-col gap-5\">\n <mt-card [title]=\"t('drawer.change-groups')\">\n @if (event.changeGroups.length > 0) {\n @let hasMultipleChangeGroups = event.changeGroups.length > 1;\n <div class=\"flex flex-col gap-5\">\n @for (group of event.changeGroups; track group.key) {\n @if (hasMultipleChangeGroups) {\n <div\n class=\"overflow-hidden rounded-xl border border-surface-200\"\n >\n <div class=\"border-b border-surface-200 px-4 py-3\">\n <h5 class=\"font-semibold text-surface-900\">\n {{ group.label || humanizeKey(group.key) }}\n </h5>\n </div>\n\n <div class=\"divide-y divide-surface-100\">\n @for (\n change of group.changes;\n track change.fieldKey + \"-\" + $index\n ) {\n <div class=\"flex flex-col gap-3 px-4 py-4\">\n <div\n class=\"flex flex-wrap items-start justify-between gap-2\"\n >\n <div class=\"flex flex-col gap-1\">\n <span class=\"font-medium text-surface-900\">\n {{ getFieldLabel(change) }}\n </span>\n\n <div\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\n >\n @if (\n getChangeSource(change);\n as changeSource\n ) {\n <span>\n {{ t(\"drawer.change-source\") }}:\n {{ changeSource }}\n </span>\n }\n\n <span>\n {{ t(\"drawer.value-kind\") }}:\n {{ change.valueKind }}\n </span>\n </div>\n </div>\n </div>\n\n <div\n class=\"grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]\"\n >\n <div\n class=\"rounded-xl border border-surface-200 bg-surface-50 p-4\"\n >\n <p\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\n >\n {{ t(\"drawer.from\") }}\n </p>\n\n @if (isEmptyValue(change.oldValue)) {\n <span class=\"text-sm text-surface-400\">\n {{ t(\"drawer.empty-value\") }}\n </span>\n } @else if (\n isJsonValue(\n change.valueKind,\n change.oldValue\n )\n ) {\n <pre class=\"audit-json-value\">{{\n formatValue(\n change.oldValue,\n change.valueKind\n )\n }}</pre>\n } @else {\n <span class=\"text-sm text-surface-700\">\n {{\n formatValue(\n change.oldValue,\n change.valueKind\n )\n }}\n </span>\n }\n </div>\n\n <div\n class=\"flex items-center justify-center text-xl text-surface-300\"\n >\n -&gt;\n </div>\n\n <div\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\n >\n <p\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\n >\n {{ t(\"drawer.to\") }}\n </p>\n\n @if (isEmptyValue(change.newValue)) {\n <span class=\"text-sm text-surface-500\">\n {{ t(\"drawer.empty-value\") }}\n </span>\n } @else if (\n isJsonValue(\n change.valueKind,\n change.newValue\n )\n ) {\n <pre class=\"audit-json-value\">{{\n formatValue(\n change.newValue,\n change.valueKind\n )\n }}</pre>\n } @else {\n <span class=\"text-sm text-surface-700\">\n {{\n formatValue(\n change.newValue,\n change.valueKind\n )\n }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-4\">\n @if (group.label || group.key) {\n <h5 class=\"font-semibold text-surface-900\">\n {{ group.label || humanizeKey(group.key) }}\n </h5>\n }\n\n <div class=\"flex flex-col gap-5\">\n @for (\n change of group.changes;\n track change.fieldKey + \"-\" + $index\n ) {\n <div class=\"flex flex-col gap-3\">\n <div\n class=\"flex flex-wrap items-start justify-between gap-2\"\n >\n <div class=\"flex flex-col gap-1\">\n <span class=\"font-medium text-surface-900\">\n {{ getFieldLabel(change) }}\n </span>\n\n <div\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\n >\n @if (\n getChangeSource(change);\n as changeSource\n ) {\n <span>\n {{ t(\"drawer.change-source\") }}:\n {{ changeSource }}\n </span>\n }\n\n <span>\n {{ t(\"drawer.value-kind\") }}:\n {{ change.valueKind }}\n </span>\n </div>\n </div>\n </div>\n\n <div\n class=\"grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]\"\n >\n <div\n class=\"rounded-xl border border-surface-200 bg-surface-50 p-4\"\n >\n <p\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\n >\n {{ t(\"drawer.from\") }}\n </p>\n\n @if (isEmptyValue(change.oldValue)) {\n <span class=\"text-sm text-surface-400\">\n {{ t(\"drawer.empty-value\") }}\n </span>\n } @else if (\n isJsonValue(\n change.valueKind,\n change.oldValue\n )\n ) {\n <pre class=\"audit-json-value\">{{\n formatValue(\n change.oldValue,\n change.valueKind\n )\n }}</pre>\n } @else {\n <span class=\"text-sm text-surface-700\">\n {{\n formatValue(\n change.oldValue,\n change.valueKind\n )\n }}\n </span>\n }\n </div>\n\n <div\n class=\"flex items-center justify-center text-xl text-surface-300\"\n >\n -&gt;\n </div>\n\n <div\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\n >\n <p\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\n >\n {{ t(\"drawer.to\") }}\n </p>\n\n @if (isEmptyValue(change.newValue)) {\n <span class=\"text-sm text-surface-500\">\n {{ t(\"drawer.empty-value\") }}\n </span>\n } @else if (\n isJsonValue(\n change.valueKind,\n change.newValue\n )\n ) {\n <pre class=\"audit-json-value\">{{\n formatValue(\n change.newValue,\n change.valueKind\n )\n }}</pre>\n } @else {\n <span class=\"text-sm text-surface-700\">\n {{\n formatValue(\n change.newValue,\n change.valueKind\n )\n }}\n </span>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"text-sm text-surface-500\">\n {{ t(\"drawer.no-changes\") }}\n </div>\n }\n </mt-card>\n </div>\n\n <div class=\"flex min-w-0 flex-col gap-5\">\n <mt-card [title]=\"t('drawer.request-context')\">\n <dl class=\"grid gap-4\">\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"drawer.actor\") }}\n </dt>\n <dd class=\"text-sm text-surface-800\">\n @if (\n getActorUserEntity(event.requestContext.actorUser);\n as actorUserEntity\n ) {\n <mt-entity-user [data]=\"actorUserEntity\" />\n } @else {\n <span class=\"break-all\">\n {{ event.requestContext.actorUserId || \"system\" }}\n </span>\n }\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"drawer.occurred-at\") }}\n </dt>\n <dd class=\"text-sm text-surface-800\">\n {{ event.requestContext.occurredAtUtc | date: \"medium\" }}\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"category\") }}\n </dt>\n <dd>\n @if (getStatusEntity('category', event.category); as status) {\n <mt-entity-status [data]=\"status\" />\n }\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"operation\") }}\n </dt>\n <dd>\n @if (\n getStatusEntity('operation', event.operation);\n as status\n ) {\n <mt-entity-status [data]=\"status\" />\n }\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"importance\") }}\n </dt>\n <dd>\n @if (\n getStatusEntity('importance', event.importance);\n as status\n ) {\n <mt-entity-status [data]=\"status\" />\n }\n </dd>\n </div>\n\n <div class=\"grid gap-1\">\n <dt class=\"text-xs font-semibold uppercase text-surface-500\">\n {{ t(\"surface\") }}\n </dt>\n <dd>\n @if (getStatusEntity('surface', event.surface); as status) {\n <mt-entity-status [data]=\"status\" />\n }\n </dd>\n </div>\n </dl>\n </mt-card>\n\n <mt-card [title]=\"t('drawer.subjects')\">\n @if (event.subjects.length > 0) {\n <div\n class=\"overflow-hidden rounded-xl border border-surface-200\"\n >\n <div class=\"divide-y divide-surface-100\">\n @for (\n subject of event.subjects;\n track subject.subjectType + \"-\" + subject.subjectId\n ) {\n <div class=\"flex flex-col gap-3 px-4 py-4\">\n <div\n class=\"flex flex-wrap items-start justify-between gap-3\"\n >\n <div class=\"flex flex-col gap-1\">\n <span class=\"font-medium text-surface-900\">\n {{ getSubjectLabel(subject) }}\n </span>\n <span class=\"text-xs text-surface-500\">\n {{ humanizeKey(subject.subjectType) }}\n </span>\n </div>\n\n <span\n class=\"rounded-full bg-surface-100 px-3 py-1 text-xs font-medium text-surface-700\"\n >\n {{ humanizeKey(subject.relation) }}\n </span>\n </div>\n\n <div\n class=\"flex flex-wrap gap-2 text-xs text-surface-500\"\n >\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.scope\") }}: {{ subject.subjectId }}\n </span>\n @if (\n subject.levelId !== null &&\n subject.levelId !== undefined\n ) {\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.level-id\") }}:\n {{ subject.levelId }}\n </span>\n }\n @if (\n subject.levelDataId !== null &&\n subject.levelDataId !== undefined\n ) {\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.level-data-id\") }}:\n {{ subject.levelDataId }}\n </span>\n }\n @if (\n subject.moduleDataId !== null &&\n subject.moduleDataId !== undefined\n ) {\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.module-data-id\") }}:\n {{ subject.moduleDataId }}\n </span>\n }\n @if (subject.moduleKey) {\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\n {{ t(\"drawer.module-key\") }}:\n {{ subject.moduleKey }}\n </span>\n }\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"text-sm text-surface-500\">\n {{ t(\"drawer.no-subjects\") }}\n </div>\n }\n </mt-card>\n </div>\n </div>\n\n <mt-card [title]=\"t('drawer.evidence')\">\n <p class=\"mb-4 text-sm text-surface-500\">\n {{ t(\"drawer.advanced-description\") }}\n </p>\n\n @if (event.evidence.length > 0) {\n <div class=\"overflow-hidden rounded-xl border border-surface-200\">\n <div class=\"divide-y divide-surface-100\">\n @for (\n evidence of event.evidence;\n track evidence.type + \"-\" + $index\n ) {\n <section>\n <div\n class=\"flex flex-wrap items-center justify-between gap-3 px-4 py-3\"\n >\n <span class=\"font-medium text-surface-900\">\n {{ evidence.type || t(\"drawer.technical-evidence\") }}\n </span>\n\n <mt-button\n [label]=\"t('drawer.view-json')\"\n severity=\"secondary\"\n variant=\"text\"\n size=\"small\"\n (onClick)=\"toggleEvidence($index)\"\n />\n </div>\n\n @if (isEvidenceExpanded($index)) {\n <pre class=\"audit-json-panel\">{{\n formatJson(evidence.contentJson)\n }}</pre>\n }\n </section>\n }\n </div>\n </div>\n } @else {\n <div class=\"text-sm text-surface-500\">\n {{ t(\"drawer.no-evidence\") }}\n </div>\n }\n </mt-card>\n </div>\n </div>\n } @else {\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\n <mt-card class=\"min-h-[28rem]\">\n <div\n class=\"flex min-h-[28rem] items-center justify-center p-6 text-center\"\n >\n <p class=\"max-w-2xl text-sm text-surface-500\">\n {{ t(\"drawer.no-event-selected\") }}\n </p>\n </div>\n </mt-card>\n </div>\n }\n </ng-container>\n</mt-drawer>\n", styles: [":host{display:block}.audit-json-panel,.audit-json-value{margin:0;overflow-x:auto;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.audit-json-panel{border-top:1px solid var(--p-surface-100);background:color-mix(in srgb,var(--p-surface-50) 80%,white);padding:1rem;font-size:.8rem;line-height:1.55}.audit-json-value{font-size:.78rem;line-height:1.55;color:var(--p-surface-700)}\n"] }]
495
+ }, template: "<mt-drawer\r\n [visible]=\"visible()\"\r\n [title]=\"drawerTitle()\"\r\n [loadingHeader]=\"loading()\"\r\n styleClass=\"mt-audit-log-drawer !absolute !w-[90%] xl:!w-[68rem]\"\r\n appendTo=\"page-content\"\r\n position=\"right\"\r\n (visibleChange)=\"onDrawerVisibleChange($event)\"\r\n *transloco=\"let t; prefix: 'audit-logs'\"\r\n>\r\n <ng-container content>\r\n @if (loading()) {\r\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\r\n <div class=\"flex flex-col gap-5\">\r\n <div class=\"flex flex-wrap gap-3\">\r\n @for (_ of [1, 2, 3, 4]; track $index) {\r\n <p-skeleton width=\"7rem\" height=\"2rem\" borderRadius=\"0.5rem\" />\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"grid gap-5 xl:grid-cols-[minmax(0,1.35fr)_minmax(18rem,0.85fr)]\"\r\n >\r\n <div class=\"flex flex-col gap-5\">\r\n <mt-card [title]=\"t('drawer.change-groups')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton height=\"12rem\" class=\"rounded-lg\" />\r\n <p-skeleton height=\"14rem\" class=\"rounded-lg\" />\r\n </div>\r\n </mt-card>\r\n\r\n <mt-card [title]=\"t('drawer.evidence')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton height=\"9rem\" class=\"rounded-lg\" />\r\n </div>\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"flex flex-col gap-5\">\r\n <mt-card [title]=\"t('drawer.request-context')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton height=\"1rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton height=\"3rem\" borderRadius=\"0.75rem\" />\r\n </div>\r\n </mt-card>\r\n\r\n <mt-card [title]=\"t('drawer.subjects')\">\r\n <div class=\"flex flex-col gap-4\">\r\n <p-skeleton height=\"8rem\" class=\"rounded-lg\" />\r\n </div>\r\n </mt-card>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n } @else if (error(); as errorMessage) {\r\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\r\n <mt-card class=\"min-h-[28rem]\">\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center p-6 text-center\"\r\n >\r\n <p class=\"max-w-2xl text-sm font-medium text-rose-700\">\r\n {{ errorMessage }}\r\n </p>\r\n </div>\r\n </mt-card>\r\n </div>\r\n } @else if (detail(); as event) {\r\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\r\n <div class=\"flex flex-col gap-5\">\r\n <div\r\n class=\"grid gap-5 xl:grid-cols-[minmax(0,1.35fr)_minmax(18rem,0.85fr)]\"\r\n >\r\n <div class=\"flex min-w-0 flex-col gap-5\">\r\n <mt-card [title]=\"t('drawer.change-groups')\">\r\n @if (event.changeGroups.length > 0) {\r\n @let hasMultipleChangeGroups = event.changeGroups.length > 1;\r\n <div class=\"flex flex-col gap-5\">\r\n @for (group of event.changeGroups; track group.key) {\r\n @if (hasMultipleChangeGroups) {\r\n <div\r\n class=\"overflow-hidden rounded-xl border border-surface-200\"\r\n >\r\n <div class=\"border-b border-surface-200 px-4 py-3\">\r\n <h5 class=\"font-semibold text-surface-900\">\r\n {{ group.label || humanizeKey(group.key) }}\r\n </h5>\r\n </div>\r\n\r\n <div class=\"divide-y divide-surface-100\">\r\n @for (\r\n change of group.changes;\r\n track change.fieldKey + \"-\" + $index\r\n ) {\r\n <div class=\"flex flex-col gap-3 px-4 py-4\">\r\n <div\r\n class=\"flex flex-wrap items-start justify-between gap-2\"\r\n >\r\n <div class=\"flex flex-col gap-1\">\r\n <span class=\"font-medium text-surface-900\">\r\n {{ getFieldLabel(change) }}\r\n </span>\r\n\r\n <div\r\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\r\n >\r\n @if (\r\n getChangeSource(change);\r\n as changeSource\r\n ) {\r\n <span>\r\n {{ t(\"drawer.change-source\") }}:\r\n {{ changeSource }}\r\n </span>\r\n }\r\n\r\n <span>\r\n {{ t(\"drawer.value-kind\") }}:\r\n {{ change.valueKind }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]\"\r\n >\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-50 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.from\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.oldValue)) {\r\n <span class=\"text-sm text-surface-400\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.oldValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex items-center justify-center text-xl text-surface-300\"\r\n >\r\n -&gt;\r\n </div>\r\n\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.to\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.newValue)) {\r\n <span class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.newValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (group.label || group.key) {\r\n <h5 class=\"font-semibold text-surface-900\">\r\n {{ group.label || humanizeKey(group.key) }}\r\n </h5>\r\n }\r\n\r\n <div class=\"flex flex-col gap-5\">\r\n @for (\r\n change of group.changes;\r\n track change.fieldKey + \"-\" + $index\r\n ) {\r\n <div class=\"flex flex-col gap-3\">\r\n <div\r\n class=\"flex flex-wrap items-start justify-between gap-2\"\r\n >\r\n <div class=\"flex flex-col gap-1\">\r\n <span class=\"font-medium text-surface-900\">\r\n {{ getFieldLabel(change) }}\r\n </span>\r\n\r\n <div\r\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\r\n >\r\n @if (\r\n getChangeSource(change);\r\n as changeSource\r\n ) {\r\n <span>\r\n {{ t(\"drawer.change-source\") }}:\r\n {{ changeSource }}\r\n </span>\r\n }\r\n\r\n <span>\r\n {{ t(\"drawer.value-kind\") }}:\r\n {{ change.valueKind }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]\"\r\n >\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-50 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.from\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.oldValue)) {\r\n <span class=\"text-sm text-surface-400\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.oldValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex items-center justify-center text-xl text-surface-300\"\r\n >\r\n -&gt;\r\n </div>\r\n\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.to\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.newValue)) {\r\n <span class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.newValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.no-changes\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"flex min-w-0 flex-col gap-5\">\r\n <mt-card [title]=\"t('drawer.request-context')\">\r\n <dl class=\"grid gap-4\">\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"drawer.actor\") }}\r\n </dt>\r\n <dd class=\"text-sm text-surface-800\">\r\n @if (\r\n getActorUserEntity(event.requestContext.actorUser);\r\n as actorUserEntity\r\n ) {\r\n <mt-entity-user [data]=\"actorUserEntity\" />\r\n } @else {\r\n <span class=\"break-all\">\r\n {{ event.requestContext.actorUserId || \"system\" }}\r\n </span>\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"drawer.occurred-at\") }}\r\n </dt>\r\n <dd class=\"text-sm text-surface-800\">\r\n {{ event.requestContext.occurredAtUtc | date: \"medium\" }}\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"category\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"category\", event.category);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"operation\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"operation\", event.operation);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"importance\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"importance\", event.importance);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"surface\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"surface\", event.surface);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n </dl>\r\n </mt-card>\r\n\r\n <mt-card [title]=\"t('drawer.subjects')\">\r\n @if (event.subjects.length > 0) {\r\n <div\r\n class=\"overflow-hidden rounded-xl border border-surface-200\"\r\n >\r\n <div class=\"divide-y divide-surface-100\">\r\n @for (\r\n subject of event.subjects;\r\n track subject.subjectType + \"-\" + subject.subjectId\r\n ) {\r\n <div class=\"flex flex-col gap-3 px-4 py-4\">\r\n <div\r\n class=\"flex flex-wrap items-start justify-between gap-3\"\r\n >\r\n <div class=\"flex flex-col gap-1\">\r\n <span class=\"font-medium text-surface-900\">\r\n {{ getSubjectLabel(subject) }}\r\n </span>\r\n <span class=\"text-xs text-surface-500\">\r\n {{ humanizeKey(subject.subjectType) }}\r\n </span>\r\n </div>\r\n\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1 text-xs font-medium text-surface-700\"\r\n >\r\n {{ humanizeKey(subject.relation) }}\r\n </span>\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-wrap gap-2 text-xs text-surface-500\"\r\n >\r\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\r\n {{ t(\"drawer.scope\") }}: {{ subject.subjectId }}\r\n </span>\r\n @if (\r\n subject.levelId !== null &&\r\n subject.levelId !== undefined\r\n ) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.level-id\") }}:\r\n {{ subject.levelId }}\r\n </span>\r\n }\r\n @if (\r\n subject.levelDataId !== null &&\r\n subject.levelDataId !== undefined\r\n ) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.level-data-id\") }}:\r\n {{ subject.levelDataId }}\r\n </span>\r\n }\r\n @if (\r\n subject.moduleDataId !== null &&\r\n subject.moduleDataId !== undefined\r\n ) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.module-data-id\") }}:\r\n {{ subject.moduleDataId }}\r\n </span>\r\n }\r\n @if (subject.moduleKey) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.module-key\") }}:\r\n {{ subject.moduleKey }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.no-subjects\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n </div>\r\n\r\n <mt-card [title]=\"t('drawer.evidence')\">\r\n <p class=\"mb-4 text-sm text-surface-500\">\r\n {{ t(\"drawer.advanced-description\") }}\r\n </p>\r\n\r\n @if (event.evidence.length > 0) {\r\n <div class=\"overflow-hidden rounded-xl border border-surface-200\">\r\n <div class=\"divide-y divide-surface-100\">\r\n @for (\r\n evidence of event.evidence;\r\n track evidence.type + \"-\" + $index\r\n ) {\r\n <section>\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-3 px-4 py-3\"\r\n >\r\n <span class=\"font-medium text-surface-900\">\r\n {{ evidence.type || t(\"drawer.technical-evidence\") }}\r\n </span>\r\n\r\n <mt-button\r\n [label]=\"t('drawer.view-json')\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n size=\"small\"\r\n (onClick)=\"toggleEvidence($index)\"\r\n />\r\n </div>\r\n\r\n @if (isEvidenceExpanded($index)) {\r\n <pre class=\"audit-json-panel\">{{\r\n formatJson(evidence.contentJson)\r\n }}</pre>\r\n }\r\n </section>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.no-evidence\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n </div>\r\n } @else {\r\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\r\n <mt-card class=\"min-h-[28rem]\">\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center p-6 text-center\"\r\n >\r\n <p class=\"max-w-2xl text-sm text-surface-500\">\r\n {{ t(\"drawer.no-event-selected\") }}\r\n </p>\r\n </div>\r\n </mt-card>\r\n </div>\r\n }\r\n </ng-container>\r\n</mt-drawer>\r\n", styles: [":host{display:block}.audit-json-panel,.audit-json-value{margin:0;overflow-x:auto;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.audit-json-panel{border-top:1px solid var(--p-surface-100);background:color-mix(in srgb,var(--p-surface-50) 80%,white);padding:1rem;font-size:.8rem;line-height:1.55}.audit-json-value{font-size:.78rem;line-height:1.55;color:var(--p-surface-700)}\n"] }]
496
496
  }], ctorParameters: () => [], propDecorators: { visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }], detail: [{ type: i0.Input, args: [{ isSignal: true, alias: "detail", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], visibleChange: [{ type: i0.Output, args: ["visibleChange"] }] } });
497
497
 
498
498
  const CATEGORY_OPTIONS = [
@@ -548,8 +548,8 @@ class AuditLogsList {
548
548
  detail = this.facade.selectedEventDetail;
549
549
  detailError = this.facade.getAuditLogDetailError;
550
550
  loadingDetail = this.facade.isLoadingAuditLogDetail;
551
- drawerVisible = signal(false, ...(ngDevMode ? [{ debugName: "drawerVisible" }] : []));
552
- tableFilters = signal({}, ...(ngDevMode ? [{ debugName: "tableFilters" }] : []));
551
+ drawerVisible = signal(false, ...(ngDevMode ? [{ debugName: "drawerVisible" }] : /* istanbul ignore next */ []));
552
+ tableFilters = signal({}, ...(ngDevMode ? [{ debugName: "tableFilters" }] : /* istanbul ignore next */ []));
553
553
  summaryCards = computed(() => {
554
554
  this.activeLang();
555
555
  const response = this.auditLogs();
@@ -584,7 +584,7 @@ class AuditLogsList {
584
584
  color: 'violet',
585
585
  },
586
586
  ];
587
- }, ...(ngDevMode ? [{ debugName: "summaryCards" }] : []));
587
+ }, ...(ngDevMode ? [{ debugName: "summaryCards" }] : /* istanbul ignore next */ []));
588
588
  activeFilterBadges = computed(() => {
589
589
  this.activeLang();
590
590
  const filters = this.appliedFilters();
@@ -602,7 +602,7 @@ class AuditLogsList {
602
602
  badges.push(`${this.translate('to')}: ${this.formatFilterDate(filters.toUtc)}`);
603
603
  }
604
604
  return badges;
605
- }, ...(ngDevMode ? [{ debugName: "activeFilterBadges" }] : []));
605
+ }, ...(ngDevMode ? [{ debugName: "activeFilterBadges" }] : /* istanbul ignore next */ []));
606
606
  tableColumns = linkedSignal(() => {
607
607
  this.activeLang();
608
608
  return [
@@ -670,7 +670,7 @@ class AuditLogsList {
670
670
  width: '12rem',
671
671
  },
672
672
  ];
673
- }, ...(ngDevMode ? [{ debugName: "tableColumns" }] : []));
673
+ }, ...(ngDevMode ? [{ debugName: "tableColumns" }] : /* istanbul ignore next */ []));
674
674
  onLazyLoad(event) {
675
675
  const filters = event.filters ?? {};
676
676
  const apiFilters = {
@@ -777,10 +777,10 @@ class AuditLogsList {
777
777
  }
778
778
  return normalizeDates(normalizedDate);
779
779
  }
780
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogsList, deps: [], target: i0.ɵɵFactoryTarget.Component });
781
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: AuditLogsList, isStandalone: true, selector: "mt-audit-logs-list", host: { classAttribute: "block h-full" }, viewQueries: [{ propertyName: "summaryCol", first: true, predicate: ["summaryCol"], descendants: true, isSignal: true }, { propertyName: "actorCol", first: true, predicate: ["actorCol"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'audit-logs'\">\n <div class=\"flex flex-col gap-4\">\n @if (activeFilterBadges().length > 0) {\n <div class=\"flex flex-wrap gap-2\">\n @for (badge of activeFilterBadges(); track badge) {\n <mt-chip\n [label]=\"badge\"\n styleClass=\"border border-surface-200 !bg-surface-0 !text-surface-700 text-xs\"\n />\n }\n </div>\n }\n\n <div class=\"grid gap-3 md:grid-cols-2 xl:grid-cols-4\">\n @for (card of summaryCards(); track card.subTitle) {\n <mt-statistic-card [data]=\"card\" cardClass=\"shadow-sm\" />\n }\n </div>\n\n @if (error(); as errorMessage) {\n <section\n class=\"flex flex-col gap-3 rounded-xl border border-rose-200 bg-rose-50 px-5 py-4 lg:flex-row lg:items-center lg:justify-between\"\n >\n <div class=\"space-y-1\">\n <p class=\"text-sm font-semibold text-rose-700\">\n {{ t(\"load-error-title\") }}\n </p>\n <p class=\"text-sm text-rose-600\">\n {{ errorMessage }}\n </p>\n </div>\n\n <mt-button\n severity=\"danger\"\n variant=\"outlined\"\n icon=\"general.refresh-cw-05\"\n [label]=\"t('retry')\"\n (onClick)=\"retry()\"\n />\n </section>\n }\n\n <mt-table\n [(filters)]=\"tableFilters\"\n [data]=\"auditLogs().items\"\n [columns]=\"tableColumns()\"\n [loading]=\"loading()\"\n [lazy]=\"true\"\n [showFilters]=\"true\"\n [generalSearch]=\"true\"\n [clickableRows]=\"true\"\n [lazyTotalRecords]=\"auditLogs().totalCount\"\n dataKey=\"eventId\"\n (lazyLoad)=\"onLazyLoad($event)\"\n (rowClick)=\"openEventDetail($event)\"\n />\n </div>\n\n <ng-template #summaryCol let-row>\n <div class=\"flex flex-col gap-2 py-1\">\n <p class=\"line-clamp-2 text-sm font-semibold text-surface-900\">\n {{ row.summary }}\n </p>\n <div\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\n >\n <span>{{ t(\"event-id\") }}: {{ row.eventId }}</span>\n @if (row.primarySubjectType) {\n <span>{{ formatSubjectType(row) }}</span>\n }\n </div>\n </div>\n </ng-template>\n\n <ng-template #actorCol let-row>\n <div class=\"flex flex-col gap-1 py-1\">\n <span class=\"break-all text-sm font-medium text-surface-800\">\n {{ row.actorUserId || t(\"actor-unknown\") }}\n </span>\n <span class=\"text-xs text-surface-500\">\n {{ row.moduleKey || row.levelDataId || row.moduleDataId || \"audit\" }}\n </span>\n </div>\n </ng-template>\n\n <mt-audit-log-detail-drawer\n [visible]=\"drawerVisible()\"\n [detail]=\"detail()\"\n [loading]=\"loadingDetail()\"\n [error]=\"detailError()\"\n (visibleChange)=\"onDrawerVisibleChange($event)\"\n />\n</ng-container>\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Table, selector: "mt-table", inputs: ["filters", "data", "columns", "rowActions", "size", "showGridlines", "stripedRows", "selectableRows", "clickableRows", "generalSearch", "lazyLocalSearch", "showFilters", "loading", "updating", "lazy", "lazyLocalSort", "lazyTotalRecords", "reorderableColumns", "reorderableRows", "dataKey", "exportable", "exportFilename", "actionShape", "tabs", "tabsOptionLabel", "tabsOptionValue", "activeTab", "actions", "paginatorPosition", "pageSize", "currentPage", "first", "filterTerm"], outputs: ["selectionChange", "cellChange", "lazyLoad", "columnReorder", "rowReorder", "rowClick", "filtersChange", "activeTabChange", "onTabChange", "pageSizeChange", "currentPageChange", "firstChange", "filterTermChange"] }, { kind: "component", type: Chip, selector: "mt-chip", inputs: ["label", "icon", "image", "removable", "removeIcon", "styleClass"], outputs: ["onRemove", "onImageError"] }, { 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: StatisticCard, selector: "mt-statistic-card", inputs: ["data", "cardClass"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: AuditLogDetailDrawer, selector: "mt-audit-log-detail-drawer", inputs: ["visible", "detail", "loading", "error"], outputs: ["visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
780
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogsList, deps: [], target: i0.ɵɵFactoryTarget.Component });
781
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: AuditLogsList, isStandalone: true, selector: "mt-audit-logs-list", host: { classAttribute: "block h-full" }, viewQueries: [{ propertyName: "summaryCol", first: true, predicate: ["summaryCol"], descendants: true, isSignal: true }, { propertyName: "actorCol", first: true, predicate: ["actorCol"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-container *transloco=\"let t; prefix: 'audit-logs'\">\r\n <div class=\"flex flex-col gap-4\">\r\n @if (activeFilterBadges().length > 0) {\r\n <div class=\"flex flex-wrap gap-2\">\r\n @for (badge of activeFilterBadges(); track badge) {\r\n <mt-chip\r\n [label]=\"badge\"\r\n styleClass=\"border border-surface-200 !bg-surface-0 !text-surface-700 text-xs\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"grid gap-3 md:grid-cols-2 xl:grid-cols-4\">\r\n @for (card of summaryCards(); track card.subTitle) {\r\n <mt-statistic-card [data]=\"card\" cardClass=\"shadow-sm\" />\r\n }\r\n </div>\r\n\r\n @if (error(); as errorMessage) {\r\n <section\r\n class=\"flex flex-col gap-3 rounded-xl border border-rose-200 bg-rose-50 px-5 py-4 lg:flex-row lg:items-center lg:justify-between\"\r\n >\r\n <div class=\"space-y-1\">\r\n <p class=\"text-sm font-semibold text-rose-700\">\r\n {{ t(\"load-error-title\") }}\r\n </p>\r\n <p class=\"text-sm text-rose-600\">\r\n {{ errorMessage }}\r\n </p>\r\n </div>\r\n\r\n <mt-button\r\n severity=\"danger\"\r\n variant=\"outlined\"\r\n icon=\"general.refresh-cw-05\"\r\n [label]=\"t('retry')\"\r\n (onClick)=\"retry()\"\r\n />\r\n </section>\r\n }\r\n\r\n <mt-table\r\n [(filters)]=\"tableFilters\"\r\n [data]=\"auditLogs().items\"\r\n [columns]=\"tableColumns()\"\r\n [loading]=\"loading()\"\r\n [lazy]=\"true\"\r\n [showFilters]=\"true\"\r\n [generalSearch]=\"true\"\r\n [clickableRows]=\"true\"\r\n [lazyTotalRecords]=\"auditLogs().totalCount\"\r\n dataKey=\"eventId\"\r\n storageKey=\"audit-logs-list-table\"\r\n (lazyLoad)=\"onLazyLoad($event)\"\r\n (rowClick)=\"openEventDetail($event)\"\r\n />\r\n </div>\r\n\r\n <ng-template #summaryCol let-row>\r\n <div class=\"flex flex-col gap-2 py-1\">\r\n <p class=\"line-clamp-2 text-sm font-semibold text-surface-900\">\r\n {{ row.summary }}\r\n </p>\r\n <div\r\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\r\n >\r\n <span>{{ t(\"event-id\") }}: {{ row.eventId }}</span>\r\n @if (row.primarySubjectType) {\r\n <span>{{ formatSubjectType(row) }}</span>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #actorCol let-row>\r\n <div class=\"flex flex-col gap-1 py-1\">\r\n <span class=\"break-all text-sm font-medium text-surface-800\">\r\n {{ row.actorUserId || t(\"actor-unknown\") }}\r\n </span>\r\n <span class=\"text-xs text-surface-500\">\r\n {{ row.moduleKey || row.levelDataId || row.moduleDataId || \"audit\" }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n\r\n <mt-audit-log-detail-drawer\r\n [visible]=\"drawerVisible()\"\r\n [detail]=\"detail()\"\r\n [loading]=\"loadingDetail()\"\r\n [error]=\"detailError()\"\r\n (visibleChange)=\"onDrawerVisibleChange($event)\"\r\n />\r\n</ng-container>\r\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: Table, selector: "mt-table", inputs: ["filters", "data", "columns", "rowActions", "size", "showGridlines", "stripedRows", "selectableRows", "clickableRows", "generalSearch", "lazyLocalSearch", "showFilters", "loading", "updating", "lazy", "lazyLocalSort", "lazyTotalRecords", "reorderableColumns", "reorderableRows", "dataKey", "storageKey", "storageMode", "exportable", "exportFilename", "actionShape", "tableLayout", "tabs", "tabsOptionLabel", "tabsOptionValue", "activeTab", "actions", "paginatorPosition", "alwaysShowPaginator", "rowsPerPageOptions", "pageSize", "currentPage", "first", "filterTerm"], outputs: ["selectionChange", "cellChange", "lazyLoad", "columnReorder", "rowReorder", "rowClick", "filtersChange", "activeTabChange", "onTabChange", "pageSizeChange", "currentPageChange", "firstChange", "filterTermChange"] }, { kind: "component", type: Chip, selector: "mt-chip", inputs: ["label", "icon", "image", "removable", "removeIcon", "styleClass"], outputs: ["onRemove", "onImageError"] }, { 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: StatisticCard, selector: "mt-statistic-card", inputs: ["data", "cardClass"] }, { kind: "directive", type: TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: AuditLogDetailDrawer, selector: "mt-audit-log-detail-drawer", inputs: ["visible", "detail", "loading", "error"], outputs: ["visibleChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
782
782
  }
783
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: AuditLogsList, decorators: [{
783
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AuditLogsList, decorators: [{
784
784
  type: Component,
785
785
  args: [{ selector: 'mt-audit-logs-list', imports: [
786
786
  CommonModule,
@@ -792,7 +792,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
792
792
  AuditLogDetailDrawer,
793
793
  ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
794
794
  class: 'block h-full',
795
- }, template: "<ng-container *transloco=\"let t; prefix: 'audit-logs'\">\n <div class=\"flex flex-col gap-4\">\n @if (activeFilterBadges().length > 0) {\n <div class=\"flex flex-wrap gap-2\">\n @for (badge of activeFilterBadges(); track badge) {\n <mt-chip\n [label]=\"badge\"\n styleClass=\"border border-surface-200 !bg-surface-0 !text-surface-700 text-xs\"\n />\n }\n </div>\n }\n\n <div class=\"grid gap-3 md:grid-cols-2 xl:grid-cols-4\">\n @for (card of summaryCards(); track card.subTitle) {\n <mt-statistic-card [data]=\"card\" cardClass=\"shadow-sm\" />\n }\n </div>\n\n @if (error(); as errorMessage) {\n <section\n class=\"flex flex-col gap-3 rounded-xl border border-rose-200 bg-rose-50 px-5 py-4 lg:flex-row lg:items-center lg:justify-between\"\n >\n <div class=\"space-y-1\">\n <p class=\"text-sm font-semibold text-rose-700\">\n {{ t(\"load-error-title\") }}\n </p>\n <p class=\"text-sm text-rose-600\">\n {{ errorMessage }}\n </p>\n </div>\n\n <mt-button\n severity=\"danger\"\n variant=\"outlined\"\n icon=\"general.refresh-cw-05\"\n [label]=\"t('retry')\"\n (onClick)=\"retry()\"\n />\n </section>\n }\n\n <mt-table\n [(filters)]=\"tableFilters\"\n [data]=\"auditLogs().items\"\n [columns]=\"tableColumns()\"\n [loading]=\"loading()\"\n [lazy]=\"true\"\n [showFilters]=\"true\"\n [generalSearch]=\"true\"\n [clickableRows]=\"true\"\n [lazyTotalRecords]=\"auditLogs().totalCount\"\n dataKey=\"eventId\"\n (lazyLoad)=\"onLazyLoad($event)\"\n (rowClick)=\"openEventDetail($event)\"\n />\n </div>\n\n <ng-template #summaryCol let-row>\n <div class=\"flex flex-col gap-2 py-1\">\n <p class=\"line-clamp-2 text-sm font-semibold text-surface-900\">\n {{ row.summary }}\n </p>\n <div\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\n >\n <span>{{ t(\"event-id\") }}: {{ row.eventId }}</span>\n @if (row.primarySubjectType) {\n <span>{{ formatSubjectType(row) }}</span>\n }\n </div>\n </div>\n </ng-template>\n\n <ng-template #actorCol let-row>\n <div class=\"flex flex-col gap-1 py-1\">\n <span class=\"break-all text-sm font-medium text-surface-800\">\n {{ row.actorUserId || t(\"actor-unknown\") }}\n </span>\n <span class=\"text-xs text-surface-500\">\n {{ row.moduleKey || row.levelDataId || row.moduleDataId || \"audit\" }}\n </span>\n </div>\n </ng-template>\n\n <mt-audit-log-detail-drawer\n [visible]=\"drawerVisible()\"\n [detail]=\"detail()\"\n [loading]=\"loadingDetail()\"\n [error]=\"detailError()\"\n (visibleChange)=\"onDrawerVisibleChange($event)\"\n />\n</ng-container>\n", styles: [":host{display:block}\n"] }]
795
+ }, template: "<ng-container *transloco=\"let t; prefix: 'audit-logs'\">\r\n <div class=\"flex flex-col gap-4\">\r\n @if (activeFilterBadges().length > 0) {\r\n <div class=\"flex flex-wrap gap-2\">\r\n @for (badge of activeFilterBadges(); track badge) {\r\n <mt-chip\r\n [label]=\"badge\"\r\n styleClass=\"border border-surface-200 !bg-surface-0 !text-surface-700 text-xs\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"grid gap-3 md:grid-cols-2 xl:grid-cols-4\">\r\n @for (card of summaryCards(); track card.subTitle) {\r\n <mt-statistic-card [data]=\"card\" cardClass=\"shadow-sm\" />\r\n }\r\n </div>\r\n\r\n @if (error(); as errorMessage) {\r\n <section\r\n class=\"flex flex-col gap-3 rounded-xl border border-rose-200 bg-rose-50 px-5 py-4 lg:flex-row lg:items-center lg:justify-between\"\r\n >\r\n <div class=\"space-y-1\">\r\n <p class=\"text-sm font-semibold text-rose-700\">\r\n {{ t(\"load-error-title\") }}\r\n </p>\r\n <p class=\"text-sm text-rose-600\">\r\n {{ errorMessage }}\r\n </p>\r\n </div>\r\n\r\n <mt-button\r\n severity=\"danger\"\r\n variant=\"outlined\"\r\n icon=\"general.refresh-cw-05\"\r\n [label]=\"t('retry')\"\r\n (onClick)=\"retry()\"\r\n />\r\n </section>\r\n }\r\n\r\n <mt-table\r\n [(filters)]=\"tableFilters\"\r\n [data]=\"auditLogs().items\"\r\n [columns]=\"tableColumns()\"\r\n [loading]=\"loading()\"\r\n [lazy]=\"true\"\r\n [showFilters]=\"true\"\r\n [generalSearch]=\"true\"\r\n [clickableRows]=\"true\"\r\n [lazyTotalRecords]=\"auditLogs().totalCount\"\r\n dataKey=\"eventId\"\r\n storageKey=\"audit-logs-list-table\"\r\n (lazyLoad)=\"onLazyLoad($event)\"\r\n (rowClick)=\"openEventDetail($event)\"\r\n />\r\n </div>\r\n\r\n <ng-template #summaryCol let-row>\r\n <div class=\"flex flex-col gap-2 py-1\">\r\n <p class=\"line-clamp-2 text-sm font-semibold text-surface-900\">\r\n {{ row.summary }}\r\n </p>\r\n <div\r\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\r\n >\r\n <span>{{ t(\"event-id\") }}: {{ row.eventId }}</span>\r\n @if (row.primarySubjectType) {\r\n <span>{{ formatSubjectType(row) }}</span>\r\n }\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template #actorCol let-row>\r\n <div class=\"flex flex-col gap-1 py-1\">\r\n <span class=\"break-all text-sm font-medium text-surface-800\">\r\n {{ row.actorUserId || t(\"actor-unknown\") }}\r\n </span>\r\n <span class=\"text-xs text-surface-500\">\r\n {{ row.moduleKey || row.levelDataId || row.moduleDataId || \"audit\" }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n\r\n <mt-audit-log-detail-drawer\r\n [visible]=\"drawerVisible()\"\r\n [detail]=\"detail()\"\r\n [loading]=\"loadingDetail()\"\r\n [error]=\"detailError()\"\r\n (visibleChange)=\"onDrawerVisibleChange($event)\"\r\n />\r\n</ng-container>\r\n", styles: [":host{display:block}\n"] }]
796
796
  }], propDecorators: { summaryCol: [{ type: i0.ViewChild, args: ['summaryCol', { isSignal: true }] }], actorCol: [{ type: i0.ViewChild, args: ['actorCol', { isSignal: true }] }] } });
797
797
 
798
798
  // store/index.ts