@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.
- package/assets/audit-logs.css +1 -1
- package/assets/i18n/ar.json +71 -71
- package/assets/i18n/en.json +71 -71
- package/fesm2022/masterteam-audit-logs.mjs +35 -35
- package/fesm2022/masterteam-audit-logs.mjs.map +1 -1
- package/package.json +14 -13
|
@@ -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.
|
|
49
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.
|
|
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.
|
|
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.
|
|
198
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
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.
|
|
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.
|
|
267
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
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.
|
|
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()
|
|
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.
|
|
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 ->\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 ->\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 ->\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 ->\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.
|
|
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 ->\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 ->\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 ->\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 ->\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.
|
|
781
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
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.
|
|
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
|