@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-audit-logs.mjs","sources":["../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-logs.ts","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-logs.html","../../../../packages/masterteam/audit-logs/src/store/audit-logs/audit-logs.model.ts","../../../../packages/masterteam/audit-logs/src/store/audit-logs/audit-logs.actions.ts","../../../../packages/masterteam/audit-logs/src/store/audit-logs/audit-logs.state.ts","../../../../packages/masterteam/audit-logs/src/store/audit-logs/audit-logs.facade.ts","../../../../packages/masterteam/audit-logs/src/lib/utils/audit-status.utils.ts","../../../../packages/masterteam/audit-logs/src/lib/utils/date-normalizer.util.ts","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-log-detail-drawer/audit-log-detail-drawer.ts","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-log-detail-drawer/audit-log-detail-drawer.html","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-logs-list/audit-logs-list.ts","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-logs-list/audit-logs-list.html","../../../../packages/masterteam/audit-logs/src/store/index.ts","../../../../packages/masterteam/audit-logs/src/masterteam-audit-logs.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { Router, RouterOutlet } from '@angular/router';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Breadcrumb } from '@masterteam/components/breadcrumb';\nimport { Page } from '@masterteam/components/page';\n\n@Component({\n selector: 'mt-audit-logs',\n imports: [Page, RouterOutlet, TranslocoDirective, Breadcrumb],\n templateUrl: './audit-logs.html',\n styleUrl: './audit-logs.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class AuditLogs {\n private readonly router = inject(Router);\n private readonly translocoService = inject(TranslocoService);\n private readonly activeLang = toSignal(this.translocoService.langChanges$, {\n initialValue: this.translocoService.getActiveLang(),\n });\n\n protected get breadcrumbItems() {\n this.activeLang();\n\n return [\n {\n label: '',\n icon: 'general.home-line',\n routerLink: '/control-panel/workspaces',\n },\n {\n label: this.translocoService.translate(\n 'product-settings.product-settings',\n ),\n routerLink: '/control-panel/product-settings',\n },\n { label: this.translocoService.translate('audit-logs.audit-logs') },\n ];\n }\n\n goBack() {\n this.router.navigate(['control-panel/product-settings']);\n }\n}\n","<ng-container *transloco=\"let t\">\n <mt-page\n [title]=\"t('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","import type { EntityUserValue } from '@masterteam/components/entities';\nimport { LoadingStateShape } from '../utils/state-helpers';\n\nexport interface AuditTrailCodeLabel {\n code: string;\n label: string;\n}\n\nexport interface AuditTrailListItem {\n eventId: string;\n summary: string;\n category: AuditTrailCodeLabel;\n operation: AuditTrailCodeLabel;\n importance: AuditTrailCodeLabel;\n surface: AuditTrailCodeLabel;\n occurredAtUtc: string;\n actorUserId?: string | null;\n primarySubjectType?: string | null;\n primarySubjectId?: string | null;\n levelId?: number | null;\n levelDataId?: number | null;\n moduleDataId?: number | null;\n moduleKey?: string | null;\n}\n\nexport interface AuditTrailSearchResponse {\n totalCount: number;\n page: number;\n pageSize: number;\n items: AuditTrailListItem[];\n}\n\nexport interface AuditTrailRequestContext {\n eventName: string;\n aggregateType: string;\n aggregateId: string;\n action: string;\n correlationId?: string | null;\n actorUserId?: string | null;\n actorUser?: EntityUserValue | null;\n occurredAtUtc: string;\n}\n\nexport interface AuditTrailSubject {\n subjectType: string;\n subjectId: string;\n relation: string;\n label: string;\n levelId?: number | null;\n levelDataId?: number | null;\n moduleDataId?: number | null;\n moduleKey?: string | null;\n}\n\nexport type AuditTrailValueKind =\n | 'Empty'\n | 'Text'\n | 'Number'\n | 'Boolean'\n | 'DateTime'\n | 'Json'\n | string;\n\nexport interface AuditTrailChange {\n fieldKey: string;\n fieldLabel: string;\n oldValue?: string | null;\n newValue?: string | null;\n valueKind: AuditTrailValueKind;\n changeSource?: string | null;\n}\n\nexport interface AuditTrailChangeGroup {\n key: string;\n label: string;\n changes: AuditTrailChange[];\n}\n\nexport interface AuditTrailEvidence {\n type: string;\n contentJson: string;\n}\n\nexport interface AuditTrailEventDetail {\n eventId: string;\n summary: string;\n category: AuditTrailCodeLabel;\n operation: AuditTrailCodeLabel;\n importance: AuditTrailCodeLabel;\n surface: AuditTrailCodeLabel;\n requestContext: AuditTrailRequestContext;\n subjects: AuditTrailSubject[];\n changeGroups: AuditTrailChangeGroup[];\n evidence: AuditTrailEvidence[];\n}\n\nexport interface AuditTrailSearchFilters {\n search?: string;\n category?: string;\n operation?: string;\n importance?: string;\n surface?: string;\n actorUserId?: string;\n subjectType?: string;\n subjectId?: string;\n fromUtc?: string;\n toUtc?: string;\n language?: string;\n}\n\nexport interface AuditTrailOption {\n label: string;\n value: string;\n}\n\nexport enum AuditLogsActionKey {\n GetAuditLogs = 'getAuditLogs',\n GetAuditLogDetail = 'getAuditLogDetail',\n}\n\nexport interface AuditLogsStateModel extends LoadingStateShape<AuditLogsActionKey> {\n auditLogs: AuditTrailSearchResponse;\n filters: AuditTrailSearchFilters;\n selectedEventId: string | null;\n selectedEventDetail: AuditTrailEventDetail | null;\n}\n","import { AuditTrailSearchFilters } from './audit-logs.model';\n\nexport class GetAuditLogs {\n static readonly type = '[AuditLogs] Get Audit Trail Search';\n\n constructor(\n public page: number = 1,\n public pageSize: number = 20,\n public filters: AuditTrailSearchFilters = {},\n ) {}\n}\n\nexport class GetAuditLogDetail {\n static readonly type = '[AuditLogs] Get Audit Trail Detail';\n\n constructor(\n public eventId: string,\n public language?: string,\n ) {}\n}\n\nexport class ClearAuditLogDetail {\n static readonly type = '[AuditLogs] Clear Audit Trail Detail';\n}\n","import { HttpClient, HttpContext } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { REQUEST_CONTEXT } from '@masterteam/components';\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\nimport { Response } from './api.model';\nimport {\n ClearAuditLogDetail,\n GetAuditLogDetail,\n GetAuditLogs,\n} from './audit-logs.actions';\nimport {\n AuditLogsActionKey,\n AuditLogsStateModel,\n AuditTrailEventDetail,\n AuditTrailListItem,\n AuditTrailSearchFilters,\n AuditTrailSearchResponse,\n} from './audit-logs.model';\n\nconst DEFAULT_SEARCH_RESPONSE: AuditTrailSearchResponse = {\n totalCount: 0,\n page: 1,\n pageSize: 20,\n items: [],\n};\n\n@State<AuditLogsStateModel>({\n name: 'auditLogs',\n defaults: {\n auditLogs: DEFAULT_SEARCH_RESPONSE,\n filters: {},\n selectedEventId: null,\n selectedEventDetail: null,\n loadingActive: [],\n errors: {},\n },\n})\n@Injectable()\nexport class AuditLogsState extends CrudStateBase<\n AuditTrailListItem,\n AuditLogsStateModel,\n AuditLogsActionKey\n> {\n private readonly http = inject(HttpClient);\n private readonly context = new HttpContext().set(REQUEST_CONTEXT, {\n useBaseUrl: false,\n });\n private readonly baseUrl = 'control-panel/audit-trail';\n\n @Selector()\n static getAuditLogs(state: AuditLogsStateModel): AuditTrailSearchResponse {\n return state.auditLogs;\n }\n\n @Selector()\n static getFilters(state: AuditLogsStateModel): AuditTrailSearchFilters {\n return state.filters;\n }\n\n @Selector()\n static getSelectedEventId(state: AuditLogsStateModel): string | null {\n return state.selectedEventId;\n }\n\n @Selector()\n static getSelectedEventDetail(\n state: AuditLogsStateModel,\n ): AuditTrailEventDetail | null {\n return state.selectedEventDetail;\n }\n\n @Selector()\n static getLoadingActive(state: AuditLogsStateModel): string[] {\n return state.loadingActive;\n }\n\n @Selector()\n static getErrors(state: AuditLogsStateModel): Record<string, string | null> {\n return state.errors;\n }\n\n @Action(GetAuditLogs)\n getAuditLogs(\n ctx: StateContext<AuditLogsStateModel>,\n { page, pageSize, filters }: GetAuditLogs,\n ) {\n const query = this.buildQueryParams({\n ...filters,\n page: String(page),\n pageSize: String(pageSize),\n });\n\n return handleApiRequest({\n ctx,\n key: AuditLogsActionKey.GetAuditLogs,\n request$: this.http.get<Response<AuditTrailSearchResponse>>(\n `${this.baseUrl}/search`,\n {\n params: query,\n context: this.context,\n },\n ),\n onSuccess: (response) => ({\n auditLogs: response.data\n ? {\n ...DEFAULT_SEARCH_RESPONSE,\n ...response.data,\n items: response.data.items ?? [],\n }\n : {\n ...DEFAULT_SEARCH_RESPONSE,\n page,\n pageSize,\n },\n filters: this.sanitizeFilters(filters),\n }),\n onError: () => ({\n filters: this.sanitizeFilters(filters),\n }),\n });\n }\n\n @Action(GetAuditLogDetail)\n getAuditLogDetail(\n ctx: StateContext<AuditLogsStateModel>,\n { eventId, language }: GetAuditLogDetail,\n ) {\n ctx.patchState({\n selectedEventId: eventId,\n selectedEventDetail: null,\n });\n\n return handleApiRequest({\n ctx,\n key: AuditLogsActionKey.GetAuditLogDetail,\n request$: this.http.get<Response<AuditTrailEventDetail>>(\n `${this.baseUrl}/events/${encodeURIComponent(eventId)}`,\n {\n params: this.buildQueryParams(language ? { language } : undefined),\n context: this.context,\n },\n ),\n onSuccess: (response, state) =>\n state.selectedEventId === eventId\n ? {\n selectedEventDetail: response.data ?? null,\n }\n : {},\n onError: (_error, state) =>\n state.selectedEventId === eventId\n ? {\n selectedEventDetail: null,\n }\n : {},\n });\n }\n\n @Action(ClearAuditLogDetail)\n clearAuditLogDetail(ctx: StateContext<AuditLogsStateModel>) {\n ctx.patchState({\n selectedEventId: null,\n selectedEventDetail: null,\n });\n }\n\n private buildQueryParams(\n query?: Record<string, string | undefined>,\n ): Record<string, string> {\n return Object.entries(query ?? {}).reduce<Record<string, string>>(\n (params, [key, value]) => {\n if (value === null || value === undefined || value.trim() === '') {\n return params;\n }\n\n params[key] = value;\n return params;\n },\n {},\n );\n }\n\n private sanitizeFilters(\n filters: AuditTrailSearchFilters,\n ): AuditTrailSearchFilters {\n const { language: _language, ...rest } = filters;\n return rest;\n }\n}\n","import { Injectable, computed, inject } from '@angular/core';\nimport { Store, select } from '@ngxs/store';\nimport {\n ClearAuditLogDetail,\n GetAuditLogDetail,\n GetAuditLogs,\n} from './audit-logs.actions';\nimport {\n AuditLogsActionKey,\n AuditTrailSearchFilters,\n} from './audit-logs.model';\nimport { AuditLogsState } from './audit-logs.state';\n\n@Injectable({ providedIn: 'root' })\nexport class AuditLogsFacade {\n private readonly store = inject(Store);\n\n readonly auditLogs = select(AuditLogsState.getAuditLogs);\n readonly filters = select(AuditLogsState.getFilters);\n readonly selectedEventId = select(AuditLogsState.getSelectedEventId);\n readonly selectedEventDetail = select(AuditLogsState.getSelectedEventDetail);\n\n private readonly loadingActive = select(AuditLogsState.getLoadingActive);\n private readonly errors = select(AuditLogsState.getErrors);\n\n readonly isLoadingAuditLogs = computed(() =>\n this.loadingActive().includes(AuditLogsActionKey.GetAuditLogs),\n );\n readonly isLoadingAuditLogDetail = computed(() =>\n this.loadingActive().includes(AuditLogsActionKey.GetAuditLogDetail),\n );\n\n readonly getAuditLogsError = computed(\n () => this.errors()[AuditLogsActionKey.GetAuditLogs] ?? null,\n );\n readonly getAuditLogDetailError = computed(\n () => this.errors()[AuditLogsActionKey.GetAuditLogDetail] ?? null,\n );\n\n readonly activeFilterCount = computed(\n () =>\n Object.values(this.filters()).filter(\n (value) => value !== null && value !== undefined && value !== '',\n ).length,\n );\n\n getAuditLogs(\n page: number = 1,\n pageSize: number = 20,\n filters: AuditTrailSearchFilters = {},\n ) {\n return this.store.dispatch(new GetAuditLogs(page, pageSize, filters));\n }\n\n getAuditLogDetail(eventId: string, language?: string) {\n return this.store.dispatch(new GetAuditLogDetail(eventId, language));\n }\n\n clearAuditLogDetail() {\n return this.store.dispatch(new ClearAuditLogDetail());\n }\n}\n","import { EntityData } from '@masterteam/components/entities';\nimport { ColumnDef } from '@masterteam/components/table';\nimport { AuditTrailCodeLabel } from '../../store/audit-logs';\n\nexport type AuditStatusKind =\n | 'category'\n | 'operation'\n | 'importance'\n | 'surface';\n\ntype AuditStatusMap = NonNullable<ColumnDef['statusMap']>;\n\nconst FALLBACK_STATUS_COLOR = '#475569';\n\nconst STATUS_COLOR_MAPS: Record<AuditStatusKind, Record<string, string>> = {\n category: {\n Runtime: '#047857',\n ControlPanel: '#0369a1',\n Discussion: '#7c3aed',\n Process: '#0f766e',\n Escalation: '#c2410c',\n PhaseGate: '#0e7490',\n Governance: '#b45309',\n System: '#475569',\n },\n operation: {\n Create: '#047857',\n Update: '#0369a1',\n Delete: '#be123c',\n Close: '#475569',\n Move: '#b45309',\n Progress: '#0e7490',\n Configure: '#4338ca',\n Comment: '#7c3aed',\n BulkUpdate: '#1d4ed8',\n Change: '#0369a1',\n Unknown: '#475569',\n },\n importance: {\n Low: '#475569',\n Medium: '#0369a1',\n High: '#b45309',\n Critical: '#be123c',\n },\n surface: {\n Runtime: '#047857',\n ControlPanel: '#4338ca',\n Background: '#b45309',\n System: '#475569',\n },\n};\n\nconst STATUS_LABELS: Record<AuditStatusKind, string> = {\n category: 'Category',\n operation: 'Operation',\n importance: 'Importance',\n surface: 'Surface',\n};\n\nexport function getAuditStatusMap(kind: AuditStatusKind): AuditStatusMap {\n return Object.fromEntries(\n Object.entries(STATUS_COLOR_MAPS[kind]).map(([key, color]) => [\n key,\n { color },\n ]),\n );\n}\n\nexport function getAuditStatusColor(\n kind: AuditStatusKind,\n code?: string | null,\n): string {\n if (!code) {\n return FALLBACK_STATUS_COLOR;\n }\n\n return STATUS_COLOR_MAPS[kind][code] ?? FALLBACK_STATUS_COLOR;\n}\n\nexport function getAuditStatusEntity(\n kind: AuditStatusKind,\n item?: AuditTrailCodeLabel | null,\n): EntityData | null {\n const display = item?.label || item?.code;\n const code = item?.code || display;\n\n if (!display || !code) {\n return null;\n }\n\n return {\n name: STATUS_LABELS[kind],\n viewType: 'Status',\n value: {\n key: code,\n display,\n color: getAuditStatusColor(kind, code),\n },\n configuration: {\n hideName: true,\n },\n };\n}\n","/**\r\n * Recursively normalizes Date objects to YYYY-MM-DDTHH:mm:ss format.\r\n * Prevents UTC timezone leaks by converting dates to local datetime strings.\r\n */\r\nexport function normalizeDates(value: any): any {\r\n if (value instanceof Date) {\r\n const y = value.getFullYear();\r\n const m = String(value.getMonth() + 1).padStart(2, '0');\r\n const d = String(value.getDate()).padStart(2, '0');\r\n const h = String(value.getHours()).padStart(2, '0');\r\n const min = String(value.getMinutes()).padStart(2, '0');\r\n const s = String(value.getSeconds()).padStart(2, '0');\r\n return `${y}-${m}-${d}T${h}:${min}:${s}`;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((v) => normalizeDates(v));\r\n }\r\n\r\n // Skip special objects that shouldn't be normalized (FormData, File, Blob, etc.)\r\n if (value !== null && typeof value === 'object') {\r\n // Check if it's a plain object (not FormData, File, Blob, or other special objects)\r\n if (value.constructor !== Object) {\r\n return value;\r\n }\r\n\r\n return Object.keys(value).reduce((acc, key) => {\r\n acc[key] = normalizeDates(value[key]);\r\n return acc;\r\n }, {} as any);\r\n }\r\n\r\n return value;\r\n}\r\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { Card } from '@masterteam/components/card';\nimport { Drawer } from '@masterteam/components/drawer';\nimport {\n EntityData,\n EntityStatus,\n EntityUser,\n EntityUserValue,\n} from '@masterteam/components/entities';\nimport { ModalService } from '@masterteam/components/modal';\nimport { SkeletonModule } from 'primeng/skeleton';\nimport {\n AuditTrailChange,\n AuditTrailCodeLabel,\n AuditTrailEventDetail,\n AuditTrailSubject,\n} from '../../../store/audit-logs';\nimport {\n AuditStatusKind,\n getAuditStatusEntity,\n} from '../../utils/audit-status.utils';\n\n@Component({\n selector: 'mt-audit-log-detail-drawer',\n imports: [\n CommonModule,\n TranslocoDirective,\n Drawer,\n Button,\n Card,\n EntityStatus,\n EntityUser,\n SkeletonModule,\n ],\n templateUrl: './audit-log-detail-drawer.html',\n styleUrl: './audit-log-detail-drawer.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'block h-full',\n },\n})\nexport class AuditLogDetailDrawer {\n readonly modal = inject(ModalService);\n\n readonly visible = input(false);\n readonly detail = input<AuditTrailEventDetail | null>(null);\n readonly loading = input(false);\n readonly error = input<string | null>(null);\n\n readonly visibleChange = output<boolean>();\n\n private readonly expandedEvidence = signal<Record<string, boolean>>({});\n\n protected readonly drawerTitle = computed(() => this.detail()?.summary ?? '');\n\n constructor() {\n effect(() => {\n this.detail()?.eventId;\n this.expandedEvidence.set({});\n });\n }\n\n protected onDrawerVisibleChange(visible: boolean): void {\n this.visibleChange.emit(visible);\n }\n\n protected getStatusEntity(\n kind: AuditStatusKind,\n item?: AuditTrailCodeLabel | null,\n ): EntityData | null {\n return getAuditStatusEntity(kind, item);\n }\n\n protected isEmptyValue(value?: string | null): boolean {\n return value === null || value === undefined || value === '';\n }\n\n protected formatValue(\n value?: string | null,\n valueKind?: string | null,\n ): string {\n if (this.isEmptyValue(value)) {\n return '';\n }\n\n if (this.isJsonValue(valueKind, value)) {\n return this.formatJson(value);\n }\n\n if (valueKind === 'Boolean') {\n if (value === 'true') {\n return 'True';\n }\n\n if (value === 'false') {\n return 'False';\n }\n }\n\n return value ?? '';\n }\n\n protected isJsonValue(\n valueKind?: string | null,\n value?: string | null,\n ): boolean {\n if (valueKind === 'Json') {\n return true;\n }\n\n const trimmed = value?.trim();\n return !!trimmed && (trimmed.startsWith('{') || trimmed.startsWith('['));\n }\n\n protected formatJson(value?: string | null): string {\n if (!value) {\n return '';\n }\n\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n\n protected getFieldLabel(change: AuditTrailChange): string {\n return change.fieldLabel || this.humanizeKey(change.fieldKey);\n }\n\n protected getChangeSource(change: AuditTrailChange): string | null {\n return change.changeSource ? this.humanizeKey(change.changeSource) : null;\n }\n\n protected getSubjectLabel(subject: AuditTrailSubject): string {\n return (\n subject.label ||\n `${this.humanizeKey(subject.subjectType)} ${subject.subjectId}`.trim()\n );\n }\n\n protected getActorUserEntity(value?: EntityUserValue | null): EntityData | null {\n if (!value) {\n return null;\n }\n\n return {\n viewType: 'User',\n value,\n };\n }\n\n protected isEvidenceExpanded(index: number): boolean {\n return !!this.expandedEvidence()[String(index)];\n }\n\n protected toggleEvidence(index: number): void {\n const key = String(index);\n\n this.expandedEvidence.update((state) => ({\n ...state,\n [key]: !state[key],\n }));\n }\n\n protected humanizeKey(value?: string | null): string {\n if (!value) {\n return '';\n }\n\n return value\n .replace(/[_-]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n }\n}\n","<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","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n computed,\n inject,\n linkedSignal,\n signal,\n viewChild,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { Chip } from '@masterteam/components/chip';\nimport {\n StatisticCard,\n StatisticCardData,\n} from '@masterteam/components/statistic-card';\nimport { ColumnDef, Table, TableFilters } from '@masterteam/components/table';\nimport {\n AuditLogsFacade,\n AuditTrailListItem,\n AuditTrailOption,\n AuditTrailSearchFilters,\n} from '../../../store/audit-logs';\nimport { getAuditStatusMap } from '../../utils/audit-status.utils';\nimport { normalizeDates } from '../../utils/date-normalizer.util';\nimport { AuditLogDetailDrawer } from '../audit-log-detail-drawer/audit-log-detail-drawer';\n\nconst CATEGORY_OPTIONS: AuditTrailOption[] = [\n 'Runtime',\n 'ControlPanel',\n 'Discussion',\n 'Process',\n 'Escalation',\n 'PhaseGate',\n 'Governance',\n 'System',\n].map((value) => ({\n label: value,\n value,\n}));\n\nconst OPERATION_OPTIONS: AuditTrailOption[] = [\n 'Create',\n 'Update',\n 'Delete',\n 'Close',\n 'Move',\n 'Progress',\n 'Configure',\n 'Comment',\n 'BulkUpdate',\n 'Change',\n 'Unknown',\n].map((value) => ({\n label: value,\n value,\n}));\n\nconst IMPORTANCE_OPTIONS: AuditTrailOption[] = [\n 'Low',\n 'Medium',\n 'High',\n 'Critical',\n].map((value) => ({\n label: value,\n value,\n}));\n\n@Component({\n selector: 'mt-audit-logs-list',\n templateUrl: './audit-logs-list.html',\n styleUrl: './audit-logs-list.css',\n imports: [\n CommonModule,\n Table,\n Chip,\n Button,\n StatisticCard,\n TranslocoDirective,\n AuditLogDetailDrawer,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'block h-full',\n },\n})\nexport default class AuditLogsList {\n readonly summaryCol = viewChild.required<TemplateRef<any>>('summaryCol');\n readonly actorCol = viewChild.required<TemplateRef<any>>('actorCol');\n\n private readonly facade = inject(AuditLogsFacade);\n private readonly translocoService = inject(TranslocoService);\n private readonly activeLang = toSignal(this.translocoService.langChanges$, {\n initialValue: this.translocoService.getActiveLang(),\n });\n\n readonly auditLogs = this.facade.auditLogs;\n readonly appliedFilters = this.facade.filters;\n readonly loading = this.facade.isLoadingAuditLogs;\n readonly error = this.facade.getAuditLogsError;\n readonly detail = this.facade.selectedEventDetail;\n readonly detailError = this.facade.getAuditLogDetailError;\n readonly loadingDetail = this.facade.isLoadingAuditLogDetail;\n\n readonly drawerVisible = signal(false);\n readonly tableFilters = signal<TableFilters>({});\n\n readonly summaryCards = computed<StatisticCardData[]>(() => {\n this.activeLang();\n\n const response = this.auditLogs();\n const items = response.items ?? [];\n const elevatedCount = items.filter((item) =>\n ['High', 'Critical'].includes(item.importance?.code ?? ''),\n ).length;\n const uniqueActors = new Set(\n items\n .map((item) => item.actorUserId?.trim())\n .filter((value): value is string => !!value),\n ).size;\n\n return [\n {\n title: String(response.totalCount ?? 0),\n subTitle: this.translate('total-events'),\n icon: 'file.file-05',\n color: 'blue',\n },\n {\n title: String(items.length),\n subTitle: this.translate('visible-results'),\n icon: 'general.building-02',\n color: 'emerald',\n },\n {\n title: String(elevatedCount),\n subTitle: this.translate('high-impact'),\n icon: 'alert.bell-02',\n color: 'amber',\n },\n {\n title: String(uniqueActors),\n subTitle: this.translate('unique-actors'),\n icon: 'custom.user-pp',\n color: 'violet',\n },\n ];\n });\n\n readonly activeFilterBadges = computed(() => {\n this.activeLang();\n\n const filters = this.appliedFilters();\n const badges: string[] = [];\n\n this.pushFilterBadge(badges, this.translate('search'), filters.search);\n this.pushFilterBadge(badges, this.translate('category'), filters.category);\n this.pushFilterBadge(\n badges,\n this.translate('operation'),\n filters.operation,\n );\n this.pushFilterBadge(\n badges,\n this.translate('importance'),\n filters.importance,\n );\n this.pushFilterBadge(badges, this.translate('surface'), filters.surface);\n this.pushFilterBadge(badges, this.translate('actor'), filters.actorUserId);\n\n if (filters.fromUtc) {\n badges.push(\n `${this.translate('from')}: ${this.formatFilterDate(filters.fromUtc)}`,\n );\n }\n\n if (filters.toUtc) {\n badges.push(\n `${this.translate('to')}: ${this.formatFilterDate(filters.toUtc)}`,\n );\n }\n\n return badges;\n });\n\n readonly tableColumns = linkedSignal<ColumnDef[]>(() => {\n this.activeLang();\n\n return [\n {\n key: 'summary',\n label: this.translate('summary'),\n type: 'custom',\n customCellTpl: this.summaryCol(),\n width: '27rem',\n },\n {\n key: 'category.code',\n label: this.translate('category'),\n type: 'status',\n statusMap: getAuditStatusMap('category'),\n filterConfig: {\n type: 'select',\n label: this.translate('category'),\n options: CATEGORY_OPTIONS,\n },\n width: '10rem',\n },\n {\n key: 'operation.code',\n label: this.translate('operation'),\n type: 'status',\n statusMap: getAuditStatusMap('operation'),\n filterConfig: {\n type: 'select',\n label: this.translate('operation'),\n options: OPERATION_OPTIONS,\n },\n width: '10rem',\n },\n {\n key: 'importance.code',\n label: this.translate('importance'),\n type: 'status',\n statusMap: getAuditStatusMap('importance'),\n filterConfig: {\n type: 'select',\n label: this.translate('importance'),\n options: IMPORTANCE_OPTIONS,\n },\n width: '10rem',\n },\n {\n key: 'actorUser',\n label: this.translate('actor'),\n type: 'user',\n filterConfig: {\n type: 'user',\n label: this.translate('actor'),\n },\n width: '14rem',\n },\n {\n key: 'occurredAtUtc',\n label: this.translate('occurred-at'),\n type: 'date',\n filterConfig: {\n type: 'date',\n label: this.translate('occurred-at'),\n },\n width: '12rem',\n },\n ];\n });\n\n onLazyLoad(event: {\n currentPage?: number;\n pageSize?: number;\n filters?: TableFilters;\n }): void {\n const filters = event.filters ?? {};\n const apiFilters: AuditTrailSearchFilters = {\n language: this.currentLanguage(),\n };\n\n const generalSearch = this.readFilterValue(filters['generalSearch']);\n if (generalSearch) {\n apiFilters.search = generalSearch;\n }\n\n const category = this.readFilterValue(filters['category.code']);\n if (category) {\n apiFilters.category = category;\n }\n\n const operation = this.readFilterValue(filters['operation.code']);\n if (operation) {\n apiFilters.operation = operation;\n }\n\n const importance = this.readFilterValue(filters['importance.code']);\n if (importance) {\n apiFilters.importance = importance;\n }\n\n const surface = this.readFilterValue(filters['surface.code']);\n if (surface) {\n apiFilters.surface = surface;\n }\n\n const actorUserId = this.readFilterValue(filters['actorUserId']);\n if (actorUserId) {\n apiFilters.actorUserId = actorUserId;\n }\n\n const occurredAtRange = filters['occurredAtUtc'] as\n | {\n from?: Date | null;\n to?: Date | null;\n }\n | undefined;\n\n if (occurredAtRange?.from) {\n apiFilters.fromUtc = this.normalizeDateBoundary(\n occurredAtRange.from,\n 'start',\n );\n }\n\n if (occurredAtRange?.to) {\n apiFilters.toUtc = this.normalizeDateBoundary(occurredAtRange.to, 'end');\n }\n\n this.facade.getAuditLogs(\n event.currentPage ?? 1,\n event.pageSize ?? this.auditLogs().pageSize ?? 20,\n apiFilters,\n );\n }\n\n openEventDetail(row: AuditTrailListItem): void {\n this.drawerVisible.set(true);\n this.facade.getAuditLogDetail(row.eventId, this.currentLanguage());\n }\n\n onDrawerVisibleChange(visible: boolean): void {\n this.drawerVisible.set(visible);\n\n if (!visible) {\n this.facade.clearAuditLogDetail();\n }\n }\n\n retry(): void {\n const response = this.auditLogs();\n\n this.facade.getAuditLogs(response.page || 1, response.pageSize || 20, {\n ...this.appliedFilters(),\n language: this.currentLanguage(),\n });\n }\n\n protected formatSubjectType(row: AuditTrailListItem): string {\n return row.primarySubjectType || this.translate('subject-type-unknown');\n }\n\n private currentLanguage(): string {\n return this.activeLang() === 'ar' ? 'ar' : 'en';\n }\n\n private translate(key: string): string {\n this.activeLang();\n return this.translocoService.translate(`audit-logs.${key}`);\n }\n\n private pushFilterBadge(\n badges: string[],\n label: string,\n value?: string | null,\n ): void {\n if (!value) {\n return;\n }\n\n badges.push(`${label}: ${value}`);\n }\n\n private formatFilterDate(value: string): string {\n const date = new Date(value);\n\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n\n return new Intl.DateTimeFormat(\n this.currentLanguage() === 'ar' ? 'ar' : undefined,\n {\n dateStyle: 'medium',\n },\n ).format(date);\n }\n\n private readFilterValue(value: unknown): string | undefined {\n if (typeof value === 'string' && value.trim().length > 0) {\n return value.trim();\n }\n\n if (typeof value === 'number') {\n return String(value);\n }\n\n if (\n value &&\n typeof value === 'object' &&\n 'value' in value &&\n typeof value.value === 'string' &&\n value.value.trim().length > 0\n ) {\n return value.value.trim();\n }\n\n return undefined;\n }\n\n private normalizeDateBoundary(\n value: Date,\n boundary: 'start' | 'end',\n ): string {\n const normalizedDate = new Date(value);\n\n if (boundary === 'start') {\n normalizedDate.setHours(0, 0, 0, 0);\n } else {\n normalizedDate.setHours(23, 59, 59, 999);\n }\n\n return normalizeDates(normalizedDate);\n }\n}\n","<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","// store/index.ts\r\nexport * from './audit-logs';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-audit-logs.mjs","sources":["../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-logs.ts","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-logs.html","../../../../packages/masterteam/audit-logs/src/store/audit-logs/audit-logs.model.ts","../../../../packages/masterteam/audit-logs/src/store/audit-logs/audit-logs.actions.ts","../../../../packages/masterteam/audit-logs/src/store/audit-logs/audit-logs.state.ts","../../../../packages/masterteam/audit-logs/src/store/audit-logs/audit-logs.facade.ts","../../../../packages/masterteam/audit-logs/src/lib/utils/audit-status.utils.ts","../../../../packages/masterteam/audit-logs/src/lib/utils/date-normalizer.util.ts","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-log-detail-drawer/audit-log-detail-drawer.ts","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-log-detail-drawer/audit-log-detail-drawer.html","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-logs-list/audit-logs-list.ts","../../../../packages/masterteam/audit-logs/src/lib/audit-logs/audit-logs-list/audit-logs-list.html","../../../../packages/masterteam/audit-logs/src/store/index.ts","../../../../packages/masterteam/audit-logs/src/masterteam-audit-logs.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { Router, RouterOutlet } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Breadcrumb } from '@masterteam/components/breadcrumb';\r\nimport { Page } from '@masterteam/components/page';\r\n\r\n@Component({\r\n selector: 'mt-audit-logs',\r\n imports: [Page, RouterOutlet, TranslocoDirective, Breadcrumb],\r\n templateUrl: './audit-logs.html',\r\n styleUrl: './audit-logs.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class AuditLogs {\r\n private readonly router = inject(Router);\r\n private readonly translocoService = inject(TranslocoService);\r\n private readonly activeLang = toSignal(this.translocoService.langChanges$, {\r\n initialValue: this.translocoService.getActiveLang(),\r\n });\r\n\r\n protected get breadcrumbItems() {\r\n this.activeLang();\r\n\r\n return [\r\n {\r\n label: '',\r\n icon: 'general.home-line',\r\n routerLink: '/control-panel/workspaces',\r\n },\r\n {\r\n label: this.translocoService.translate(\r\n 'product-settings.product-settings',\r\n ),\r\n routerLink: '/control-panel/product-settings',\r\n },\r\n { label: this.translocoService.translate('audit-logs.audit-logs') },\r\n ];\r\n }\r\n\r\n goBack() {\r\n this.router.navigate(['control-panel/product-settings']);\r\n }\r\n}\r\n","<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","import type { EntityUserValue } from '@masterteam/components/entities';\r\nimport { LoadingStateShape } from '../utils/state-helpers';\r\n\r\nexport interface AuditTrailCodeLabel {\r\n code: string;\r\n label: string;\r\n}\r\n\r\nexport interface AuditTrailListItem {\r\n eventId: string;\r\n summary: string;\r\n category: AuditTrailCodeLabel;\r\n operation: AuditTrailCodeLabel;\r\n importance: AuditTrailCodeLabel;\r\n surface: AuditTrailCodeLabel;\r\n occurredAtUtc: string;\r\n actorUserId?: string | null;\r\n primarySubjectType?: string | null;\r\n primarySubjectId?: string | null;\r\n levelId?: number | null;\r\n levelDataId?: number | null;\r\n moduleDataId?: number | null;\r\n moduleKey?: string | null;\r\n}\r\n\r\nexport interface AuditTrailSearchResponse {\r\n totalCount: number;\r\n page: number;\r\n pageSize: number;\r\n items: AuditTrailListItem[];\r\n}\r\n\r\nexport interface AuditTrailRequestContext {\r\n eventName: string;\r\n aggregateType: string;\r\n aggregateId: string;\r\n action: string;\r\n correlationId?: string | null;\r\n actorUserId?: string | null;\r\n actorUser?: EntityUserValue | null;\r\n occurredAtUtc: string;\r\n}\r\n\r\nexport interface AuditTrailSubject {\r\n subjectType: string;\r\n subjectId: string;\r\n relation: string;\r\n label: string;\r\n levelId?: number | null;\r\n levelDataId?: number | null;\r\n moduleDataId?: number | null;\r\n moduleKey?: string | null;\r\n}\r\n\r\nexport type AuditTrailValueKind =\r\n | 'Empty'\r\n | 'Text'\r\n | 'Number'\r\n | 'Boolean'\r\n | 'DateTime'\r\n | 'Json'\r\n | string;\r\n\r\nexport interface AuditTrailChange {\r\n fieldKey: string;\r\n fieldLabel: string;\r\n oldValue?: string | null;\r\n newValue?: string | null;\r\n valueKind: AuditTrailValueKind;\r\n changeSource?: string | null;\r\n}\r\n\r\nexport interface AuditTrailChangeGroup {\r\n key: string;\r\n label: string;\r\n changes: AuditTrailChange[];\r\n}\r\n\r\nexport interface AuditTrailEvidence {\r\n type: string;\r\n contentJson: string;\r\n}\r\n\r\nexport interface AuditTrailEventDetail {\r\n eventId: string;\r\n summary: string;\r\n category: AuditTrailCodeLabel;\r\n operation: AuditTrailCodeLabel;\r\n importance: AuditTrailCodeLabel;\r\n surface: AuditTrailCodeLabel;\r\n requestContext: AuditTrailRequestContext;\r\n subjects: AuditTrailSubject[];\r\n changeGroups: AuditTrailChangeGroup[];\r\n evidence: AuditTrailEvidence[];\r\n}\r\n\r\nexport interface AuditTrailSearchFilters {\r\n search?: string;\r\n category?: string;\r\n operation?: string;\r\n importance?: string;\r\n surface?: string;\r\n actorUserId?: string;\r\n subjectType?: string;\r\n subjectId?: string;\r\n fromUtc?: string;\r\n toUtc?: string;\r\n language?: string;\r\n}\r\n\r\nexport interface AuditTrailOption {\r\n label: string;\r\n value: string;\r\n}\r\n\r\nexport enum AuditLogsActionKey {\r\n GetAuditLogs = 'getAuditLogs',\r\n GetAuditLogDetail = 'getAuditLogDetail',\r\n}\r\n\r\nexport interface AuditLogsStateModel extends LoadingStateShape<AuditLogsActionKey> {\r\n auditLogs: AuditTrailSearchResponse;\r\n filters: AuditTrailSearchFilters;\r\n selectedEventId: string | null;\r\n selectedEventDetail: AuditTrailEventDetail | null;\r\n}\r\n","import { AuditTrailSearchFilters } from './audit-logs.model';\r\n\r\nexport class GetAuditLogs {\r\n static readonly type = '[AuditLogs] Get Audit Trail Search';\r\n\r\n constructor(\r\n public page: number = 1,\r\n public pageSize: number = 20,\r\n public filters: AuditTrailSearchFilters = {},\r\n ) {}\r\n}\r\n\r\nexport class GetAuditLogDetail {\r\n static readonly type = '[AuditLogs] Get Audit Trail Detail';\r\n\r\n constructor(\r\n public eventId: string,\r\n public language?: string,\r\n ) {}\r\n}\r\n\r\nexport class ClearAuditLogDetail {\r\n static readonly type = '[AuditLogs] Clear Audit Trail Detail';\r\n}\r\n","import { HttpClient, HttpContext } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { REQUEST_CONTEXT } from '@masterteam/components';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport { Response } from './api.model';\r\nimport {\r\n ClearAuditLogDetail,\r\n GetAuditLogDetail,\r\n GetAuditLogs,\r\n} from './audit-logs.actions';\r\nimport {\r\n AuditLogsActionKey,\r\n AuditLogsStateModel,\r\n AuditTrailEventDetail,\r\n AuditTrailListItem,\r\n AuditTrailSearchFilters,\r\n AuditTrailSearchResponse,\r\n} from './audit-logs.model';\r\n\r\nconst DEFAULT_SEARCH_RESPONSE: AuditTrailSearchResponse = {\r\n totalCount: 0,\r\n page: 1,\r\n pageSize: 20,\r\n items: [],\r\n};\r\n\r\n@State<AuditLogsStateModel>({\r\n name: 'auditLogs',\r\n defaults: {\r\n auditLogs: DEFAULT_SEARCH_RESPONSE,\r\n filters: {},\r\n selectedEventId: null,\r\n selectedEventDetail: null,\r\n loadingActive: [],\r\n errors: {},\r\n },\r\n})\r\n@Injectable()\r\nexport class AuditLogsState extends CrudStateBase<\r\n AuditTrailListItem,\r\n AuditLogsStateModel,\r\n AuditLogsActionKey\r\n> {\r\n private readonly http = inject(HttpClient);\r\n private readonly context = new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: false,\r\n });\r\n private readonly baseUrl = 'control-panel/audit-trail';\r\n\r\n @Selector()\r\n static getAuditLogs(state: AuditLogsStateModel): AuditTrailSearchResponse {\r\n return state.auditLogs;\r\n }\r\n\r\n @Selector()\r\n static getFilters(state: AuditLogsStateModel): AuditTrailSearchFilters {\r\n return state.filters;\r\n }\r\n\r\n @Selector()\r\n static getSelectedEventId(state: AuditLogsStateModel): string | null {\r\n return state.selectedEventId;\r\n }\r\n\r\n @Selector()\r\n static getSelectedEventDetail(\r\n state: AuditLogsStateModel,\r\n ): AuditTrailEventDetail | null {\r\n return state.selectedEventDetail;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: AuditLogsStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(state: AuditLogsStateModel): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n @Action(GetAuditLogs)\r\n getAuditLogs(\r\n ctx: StateContext<AuditLogsStateModel>,\r\n { page, pageSize, filters }: GetAuditLogs,\r\n ) {\r\n const query = this.buildQueryParams({\r\n ...filters,\r\n page: String(page),\r\n pageSize: String(pageSize),\r\n });\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: AuditLogsActionKey.GetAuditLogs,\r\n request$: this.http.get<Response<AuditTrailSearchResponse>>(\r\n `${this.baseUrl}/search`,\r\n {\r\n params: query,\r\n context: this.context,\r\n },\r\n ),\r\n onSuccess: (response) => ({\r\n auditLogs: response.data\r\n ? {\r\n ...DEFAULT_SEARCH_RESPONSE,\r\n ...response.data,\r\n items: response.data.items ?? [],\r\n }\r\n : {\r\n ...DEFAULT_SEARCH_RESPONSE,\r\n page,\r\n pageSize,\r\n },\r\n filters: this.sanitizeFilters(filters),\r\n }),\r\n onError: () => ({\r\n filters: this.sanitizeFilters(filters),\r\n }),\r\n });\r\n }\r\n\r\n @Action(GetAuditLogDetail)\r\n getAuditLogDetail(\r\n ctx: StateContext<AuditLogsStateModel>,\r\n { eventId, language }: GetAuditLogDetail,\r\n ) {\r\n ctx.patchState({\r\n selectedEventId: eventId,\r\n selectedEventDetail: null,\r\n });\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: AuditLogsActionKey.GetAuditLogDetail,\r\n request$: this.http.get<Response<AuditTrailEventDetail>>(\r\n `${this.baseUrl}/events/${encodeURIComponent(eventId)}`,\r\n {\r\n params: this.buildQueryParams(language ? { language } : undefined),\r\n context: this.context,\r\n },\r\n ),\r\n onSuccess: (response, state) =>\r\n state.selectedEventId === eventId\r\n ? {\r\n selectedEventDetail: response.data ?? null,\r\n }\r\n : {},\r\n onError: (_error, state) =>\r\n state.selectedEventId === eventId\r\n ? {\r\n selectedEventDetail: null,\r\n }\r\n : {},\r\n });\r\n }\r\n\r\n @Action(ClearAuditLogDetail)\r\n clearAuditLogDetail(ctx: StateContext<AuditLogsStateModel>) {\r\n ctx.patchState({\r\n selectedEventId: null,\r\n selectedEventDetail: null,\r\n });\r\n }\r\n\r\n private buildQueryParams(\r\n query?: Record<string, string | undefined>,\r\n ): Record<string, string> {\r\n return Object.entries(query ?? {}).reduce<Record<string, string>>(\r\n (params, [key, value]) => {\r\n if (value === null || value === undefined || value.trim() === '') {\r\n return params;\r\n }\r\n\r\n params[key] = value;\r\n return params;\r\n },\r\n {},\r\n );\r\n }\r\n\r\n private sanitizeFilters(\r\n filters: AuditTrailSearchFilters,\r\n ): AuditTrailSearchFilters {\r\n const { language: _language, ...rest } = filters;\r\n return rest;\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\nimport {\r\n ClearAuditLogDetail,\r\n GetAuditLogDetail,\r\n GetAuditLogs,\r\n} from './audit-logs.actions';\r\nimport {\r\n AuditLogsActionKey,\r\n AuditTrailSearchFilters,\r\n} from './audit-logs.model';\r\nimport { AuditLogsState } from './audit-logs.state';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuditLogsFacade {\r\n private readonly store = inject(Store);\r\n\r\n readonly auditLogs = select(AuditLogsState.getAuditLogs);\r\n readonly filters = select(AuditLogsState.getFilters);\r\n readonly selectedEventId = select(AuditLogsState.getSelectedEventId);\r\n readonly selectedEventDetail = select(AuditLogsState.getSelectedEventDetail);\r\n\r\n private readonly loadingActive = select(AuditLogsState.getLoadingActive);\r\n private readonly errors = select(AuditLogsState.getErrors);\r\n\r\n readonly isLoadingAuditLogs = computed(() =>\r\n this.loadingActive().includes(AuditLogsActionKey.GetAuditLogs),\r\n );\r\n readonly isLoadingAuditLogDetail = computed(() =>\r\n this.loadingActive().includes(AuditLogsActionKey.GetAuditLogDetail),\r\n );\r\n\r\n readonly getAuditLogsError = computed(\r\n () => this.errors()[AuditLogsActionKey.GetAuditLogs] ?? null,\r\n );\r\n readonly getAuditLogDetailError = computed(\r\n () => this.errors()[AuditLogsActionKey.GetAuditLogDetail] ?? null,\r\n );\r\n\r\n readonly activeFilterCount = computed(\r\n () =>\r\n Object.values(this.filters()).filter(\r\n (value) => value !== null && value !== undefined && value !== '',\r\n ).length,\r\n );\r\n\r\n getAuditLogs(\r\n page: number = 1,\r\n pageSize: number = 20,\r\n filters: AuditTrailSearchFilters = {},\r\n ) {\r\n return this.store.dispatch(new GetAuditLogs(page, pageSize, filters));\r\n }\r\n\r\n getAuditLogDetail(eventId: string, language?: string) {\r\n return this.store.dispatch(new GetAuditLogDetail(eventId, language));\r\n }\r\n\r\n clearAuditLogDetail() {\r\n return this.store.dispatch(new ClearAuditLogDetail());\r\n }\r\n}\r\n","import { EntityData } from '@masterteam/components/entities';\r\nimport { ColumnDef } from '@masterteam/components/table';\r\nimport { AuditTrailCodeLabel } from '../../store/audit-logs';\r\n\r\nexport type AuditStatusKind =\r\n | 'category'\r\n | 'operation'\r\n | 'importance'\r\n | 'surface';\r\n\r\ntype AuditStatusMap = NonNullable<ColumnDef['statusMap']>;\r\n\r\nconst FALLBACK_STATUS_COLOR = '#475569';\r\n\r\nconst STATUS_COLOR_MAPS: Record<AuditStatusKind, Record<string, string>> = {\r\n category: {\r\n Runtime: '#047857',\r\n ControlPanel: '#0369a1',\r\n Discussion: '#7c3aed',\r\n Process: '#0f766e',\r\n Escalation: '#c2410c',\r\n PhaseGate: '#0e7490',\r\n Governance: '#b45309',\r\n System: '#475569',\r\n },\r\n operation: {\r\n Create: '#047857',\r\n Update: '#0369a1',\r\n Delete: '#be123c',\r\n Close: '#475569',\r\n Move: '#b45309',\r\n Progress: '#0e7490',\r\n Configure: '#4338ca',\r\n Comment: '#7c3aed',\r\n BulkUpdate: '#1d4ed8',\r\n Change: '#0369a1',\r\n Unknown: '#475569',\r\n },\r\n importance: {\r\n Low: '#475569',\r\n Medium: '#0369a1',\r\n High: '#b45309',\r\n Critical: '#be123c',\r\n },\r\n surface: {\r\n Runtime: '#047857',\r\n ControlPanel: '#4338ca',\r\n Background: '#b45309',\r\n System: '#475569',\r\n },\r\n};\r\n\r\nconst STATUS_LABELS: Record<AuditStatusKind, string> = {\r\n category: 'Category',\r\n operation: 'Operation',\r\n importance: 'Importance',\r\n surface: 'Surface',\r\n};\r\n\r\nexport function getAuditStatusMap(kind: AuditStatusKind): AuditStatusMap {\r\n return Object.fromEntries(\r\n Object.entries(STATUS_COLOR_MAPS[kind]).map(([key, color]) => [\r\n key,\r\n { color },\r\n ]),\r\n );\r\n}\r\n\r\nexport function getAuditStatusColor(\r\n kind: AuditStatusKind,\r\n code?: string | null,\r\n): string {\r\n if (!code) {\r\n return FALLBACK_STATUS_COLOR;\r\n }\r\n\r\n return STATUS_COLOR_MAPS[kind][code] ?? FALLBACK_STATUS_COLOR;\r\n}\r\n\r\nexport function getAuditStatusEntity(\r\n kind: AuditStatusKind,\r\n item?: AuditTrailCodeLabel | null,\r\n): EntityData | null {\r\n const display = item?.label || item?.code;\r\n const code = item?.code || display;\r\n\r\n if (!display || !code) {\r\n return null;\r\n }\r\n\r\n return {\r\n name: STATUS_LABELS[kind],\r\n viewType: 'Status',\r\n value: {\r\n key: code,\r\n display,\r\n color: getAuditStatusColor(kind, code),\r\n },\r\n configuration: {\r\n hideName: true,\r\n },\r\n };\r\n}\r\n","/**\r\n * Recursively normalizes Date objects to YYYY-MM-DDTHH:mm:ss format.\r\n * Prevents UTC timezone leaks by converting dates to local datetime strings.\r\n */\r\nexport function normalizeDates(value: any): any {\r\n if (value instanceof Date) {\r\n const y = value.getFullYear();\r\n const m = String(value.getMonth() + 1).padStart(2, '0');\r\n const d = String(value.getDate()).padStart(2, '0');\r\n const h = String(value.getHours()).padStart(2, '0');\r\n const min = String(value.getMinutes()).padStart(2, '0');\r\n const s = String(value.getSeconds()).padStart(2, '0');\r\n return `${y}-${m}-${d}T${h}:${min}:${s}`;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((v) => normalizeDates(v));\r\n }\r\n\r\n // Skip special objects that shouldn't be normalized (FormData, File, Blob, etc.)\r\n if (value !== null && typeof value === 'object') {\r\n // Check if it's a plain object (not FormData, File, Blob, or other special objects)\r\n if (value.constructor !== Object) {\r\n return value;\r\n }\r\n\r\n return Object.keys(value).reduce((acc, key) => {\r\n acc[key] = normalizeDates(value[key]);\r\n return acc;\r\n }, {} as any);\r\n }\r\n\r\n return value;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Drawer } from '@masterteam/components/drawer';\r\nimport {\r\n EntityData,\r\n EntityStatus,\r\n EntityUser,\r\n EntityUserValue,\r\n} from '@masterteam/components/entities';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport {\r\n AuditTrailChange,\r\n AuditTrailCodeLabel,\r\n AuditTrailEventDetail,\r\n AuditTrailSubject,\r\n} from '../../../store/audit-logs';\r\nimport {\r\n AuditStatusKind,\r\n getAuditStatusEntity,\r\n} from '../../utils/audit-status.utils';\r\n\r\n@Component({\r\n selector: 'mt-audit-log-detail-drawer',\r\n imports: [\r\n CommonModule,\r\n TranslocoDirective,\r\n Drawer,\r\n Button,\r\n Card,\r\n EntityStatus,\r\n EntityUser,\r\n SkeletonModule,\r\n ],\r\n templateUrl: './audit-log-detail-drawer.html',\r\n styleUrl: './audit-log-detail-drawer.css',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block h-full',\r\n },\r\n})\r\nexport class AuditLogDetailDrawer {\r\n readonly modal = inject(ModalService);\r\n\r\n readonly visible = input(false);\r\n readonly detail = input<AuditTrailEventDetail | null>(null);\r\n readonly loading = input(false);\r\n readonly error = input<string | null>(null);\r\n\r\n readonly visibleChange = output<boolean>();\r\n\r\n private readonly expandedEvidence = signal<Record<string, boolean>>({});\r\n\r\n protected readonly drawerTitle = computed(() => this.detail()?.summary ?? '');\r\n\r\n constructor() {\r\n effect(() => {\r\n this.detail();\r\n this.expandedEvidence.set({});\r\n });\r\n }\r\n\r\n protected onDrawerVisibleChange(visible: boolean): void {\r\n this.visibleChange.emit(visible);\r\n }\r\n\r\n protected getStatusEntity(\r\n kind: AuditStatusKind,\r\n item?: AuditTrailCodeLabel | null,\r\n ): EntityData | null {\r\n return getAuditStatusEntity(kind, item);\r\n }\r\n\r\n protected isEmptyValue(value?: string | null): boolean {\r\n return value === null || value === undefined || value === '';\r\n }\r\n\r\n protected formatValue(\r\n value?: string | null,\r\n valueKind?: string | null,\r\n ): string {\r\n if (this.isEmptyValue(value)) {\r\n return '';\r\n }\r\n\r\n if (this.isJsonValue(valueKind, value)) {\r\n return this.formatJson(value);\r\n }\r\n\r\n if (valueKind === 'Boolean') {\r\n if (value === 'true') {\r\n return 'True';\r\n }\r\n\r\n if (value === 'false') {\r\n return 'False';\r\n }\r\n }\r\n\r\n return value ?? '';\r\n }\r\n\r\n protected isJsonValue(\r\n valueKind?: string | null,\r\n value?: string | null,\r\n ): boolean {\r\n if (valueKind === 'Json') {\r\n return true;\r\n }\r\n\r\n const trimmed = value?.trim();\r\n return !!trimmed && (trimmed.startsWith('{') || trimmed.startsWith('['));\r\n }\r\n\r\n protected formatJson(value?: string | null): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n try {\r\n return JSON.stringify(JSON.parse(value), null, 2);\r\n } catch {\r\n return value;\r\n }\r\n }\r\n\r\n protected getFieldLabel(change: AuditTrailChange): string {\r\n return change.fieldLabel || this.humanizeKey(change.fieldKey);\r\n }\r\n\r\n protected getChangeSource(change: AuditTrailChange): string | null {\r\n return change.changeSource ? this.humanizeKey(change.changeSource) : null;\r\n }\r\n\r\n protected getSubjectLabel(subject: AuditTrailSubject): string {\r\n return (\r\n subject.label ||\r\n `${this.humanizeKey(subject.subjectType)} ${subject.subjectId}`.trim()\r\n );\r\n }\r\n\r\n protected getActorUserEntity(value?: EntityUserValue | null): EntityData | null {\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n return {\r\n viewType: 'User',\r\n value,\r\n };\r\n }\r\n\r\n protected isEvidenceExpanded(index: number): boolean {\r\n return !!this.expandedEvidence()[String(index)];\r\n }\r\n\r\n protected toggleEvidence(index: number): void {\r\n const key = String(index);\r\n\r\n this.expandedEvidence.update((state) => ({\r\n ...state,\r\n [key]: !state[key],\r\n }));\r\n }\r\n\r\n protected humanizeKey(value?: string | null): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n return value\r\n .replace(/[_-]+/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\r\n }\r\n}\r\n","<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","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n TemplateRef,\r\n computed,\r\n inject,\r\n linkedSignal,\r\n signal,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Chip } from '@masterteam/components/chip';\r\nimport {\r\n StatisticCard,\r\n StatisticCardData,\r\n} from '@masterteam/components/statistic-card';\r\nimport { ColumnDef, Table, TableFilters } from '@masterteam/components/table';\r\nimport {\r\n AuditLogsFacade,\r\n AuditTrailListItem,\r\n AuditTrailOption,\r\n AuditTrailSearchFilters,\r\n} from '../../../store/audit-logs';\r\nimport { getAuditStatusMap } from '../../utils/audit-status.utils';\r\nimport { normalizeDates } from '../../utils/date-normalizer.util';\r\nimport { AuditLogDetailDrawer } from '../audit-log-detail-drawer/audit-log-detail-drawer';\r\n\r\nconst CATEGORY_OPTIONS: AuditTrailOption[] = [\r\n 'Runtime',\r\n 'ControlPanel',\r\n 'Discussion',\r\n 'Process',\r\n 'Escalation',\r\n 'PhaseGate',\r\n 'Governance',\r\n 'System',\r\n].map((value) => ({\r\n label: value,\r\n value,\r\n}));\r\n\r\nconst OPERATION_OPTIONS: AuditTrailOption[] = [\r\n 'Create',\r\n 'Update',\r\n 'Delete',\r\n 'Close',\r\n 'Move',\r\n 'Progress',\r\n 'Configure',\r\n 'Comment',\r\n 'BulkUpdate',\r\n 'Change',\r\n 'Unknown',\r\n].map((value) => ({\r\n label: value,\r\n value,\r\n}));\r\n\r\nconst IMPORTANCE_OPTIONS: AuditTrailOption[] = [\r\n 'Low',\r\n 'Medium',\r\n 'High',\r\n 'Critical',\r\n].map((value) => ({\r\n label: value,\r\n value,\r\n}));\r\n\r\n@Component({\r\n selector: 'mt-audit-logs-list',\r\n templateUrl: './audit-logs-list.html',\r\n styleUrl: './audit-logs-list.css',\r\n imports: [\r\n CommonModule,\r\n Table,\r\n Chip,\r\n Button,\r\n StatisticCard,\r\n TranslocoDirective,\r\n AuditLogDetailDrawer,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block h-full',\r\n },\r\n})\r\nexport default class AuditLogsList {\r\n readonly summaryCol = viewChild.required<TemplateRef<any>>('summaryCol');\r\n readonly actorCol = viewChild.required<TemplateRef<any>>('actorCol');\r\n\r\n private readonly facade = inject(AuditLogsFacade);\r\n private readonly translocoService = inject(TranslocoService);\r\n private readonly activeLang = toSignal(this.translocoService.langChanges$, {\r\n initialValue: this.translocoService.getActiveLang(),\r\n });\r\n\r\n readonly auditLogs = this.facade.auditLogs;\r\n readonly appliedFilters = this.facade.filters;\r\n readonly loading = this.facade.isLoadingAuditLogs;\r\n readonly error = this.facade.getAuditLogsError;\r\n readonly detail = this.facade.selectedEventDetail;\r\n readonly detailError = this.facade.getAuditLogDetailError;\r\n readonly loadingDetail = this.facade.isLoadingAuditLogDetail;\r\n\r\n readonly drawerVisible = signal(false);\r\n readonly tableFilters = signal<TableFilters>({});\r\n\r\n readonly summaryCards = computed<StatisticCardData[]>(() => {\r\n this.activeLang();\r\n\r\n const response = this.auditLogs();\r\n const items = response.items ?? [];\r\n const elevatedCount = items.filter((item) =>\r\n ['High', 'Critical'].includes(item.importance?.code ?? ''),\r\n ).length;\r\n const uniqueActors = new Set(\r\n items\r\n .map((item) => item.actorUserId?.trim())\r\n .filter((value): value is string => !!value),\r\n ).size;\r\n\r\n return [\r\n {\r\n title: String(response.totalCount ?? 0),\r\n subTitle: this.translate('total-events'),\r\n icon: 'file.file-05',\r\n color: 'blue',\r\n },\r\n {\r\n title: String(items.length),\r\n subTitle: this.translate('visible-results'),\r\n icon: 'general.building-02',\r\n color: 'emerald',\r\n },\r\n {\r\n title: String(elevatedCount),\r\n subTitle: this.translate('high-impact'),\r\n icon: 'alert.bell-02',\r\n color: 'amber',\r\n },\r\n {\r\n title: String(uniqueActors),\r\n subTitle: this.translate('unique-actors'),\r\n icon: 'custom.user-pp',\r\n color: 'violet',\r\n },\r\n ];\r\n });\r\n\r\n readonly activeFilterBadges = computed(() => {\r\n this.activeLang();\r\n\r\n const filters = this.appliedFilters();\r\n const badges: string[] = [];\r\n\r\n this.pushFilterBadge(badges, this.translate('search'), filters.search);\r\n this.pushFilterBadge(badges, this.translate('category'), filters.category);\r\n this.pushFilterBadge(\r\n badges,\r\n this.translate('operation'),\r\n filters.operation,\r\n );\r\n this.pushFilterBadge(\r\n badges,\r\n this.translate('importance'),\r\n filters.importance,\r\n );\r\n this.pushFilterBadge(badges, this.translate('surface'), filters.surface);\r\n this.pushFilterBadge(badges, this.translate('actor'), filters.actorUserId);\r\n\r\n if (filters.fromUtc) {\r\n badges.push(\r\n `${this.translate('from')}: ${this.formatFilterDate(filters.fromUtc)}`,\r\n );\r\n }\r\n\r\n if (filters.toUtc) {\r\n badges.push(\r\n `${this.translate('to')}: ${this.formatFilterDate(filters.toUtc)}`,\r\n );\r\n }\r\n\r\n return badges;\r\n });\r\n\r\n readonly tableColumns = linkedSignal<ColumnDef[]>(() => {\r\n this.activeLang();\r\n\r\n return [\r\n {\r\n key: 'summary',\r\n label: this.translate('summary'),\r\n type: 'custom',\r\n customCellTpl: this.summaryCol(),\r\n width: '27rem',\r\n },\r\n {\r\n key: 'category.code',\r\n label: this.translate('category'),\r\n type: 'status',\r\n statusMap: getAuditStatusMap('category'),\r\n filterConfig: {\r\n type: 'select',\r\n label: this.translate('category'),\r\n options: CATEGORY_OPTIONS,\r\n },\r\n width: '10rem',\r\n },\r\n {\r\n key: 'operation.code',\r\n label: this.translate('operation'),\r\n type: 'status',\r\n statusMap: getAuditStatusMap('operation'),\r\n filterConfig: {\r\n type: 'select',\r\n label: this.translate('operation'),\r\n options: OPERATION_OPTIONS,\r\n },\r\n width: '10rem',\r\n },\r\n {\r\n key: 'importance.code',\r\n label: this.translate('importance'),\r\n type: 'status',\r\n statusMap: getAuditStatusMap('importance'),\r\n filterConfig: {\r\n type: 'select',\r\n label: this.translate('importance'),\r\n options: IMPORTANCE_OPTIONS,\r\n },\r\n width: '10rem',\r\n },\r\n {\r\n key: 'actorUser',\r\n label: this.translate('actor'),\r\n type: 'user',\r\n filterConfig: {\r\n type: 'user',\r\n label: this.translate('actor'),\r\n },\r\n width: '14rem',\r\n },\r\n {\r\n key: 'occurredAtUtc',\r\n label: this.translate('occurred-at'),\r\n type: 'date',\r\n filterConfig: {\r\n type: 'date',\r\n label: this.translate('occurred-at'),\r\n },\r\n width: '12rem',\r\n },\r\n ];\r\n });\r\n\r\n onLazyLoad(event: {\r\n currentPage?: number;\r\n pageSize?: number;\r\n filters?: TableFilters;\r\n }): void {\r\n const filters = event.filters ?? {};\r\n const apiFilters: AuditTrailSearchFilters = {\r\n language: this.currentLanguage(),\r\n };\r\n\r\n const generalSearch = this.readFilterValue(filters['generalSearch']);\r\n if (generalSearch) {\r\n apiFilters.search = generalSearch;\r\n }\r\n\r\n const category = this.readFilterValue(filters['category.code']);\r\n if (category) {\r\n apiFilters.category = category;\r\n }\r\n\r\n const operation = this.readFilterValue(filters['operation.code']);\r\n if (operation) {\r\n apiFilters.operation = operation;\r\n }\r\n\r\n const importance = this.readFilterValue(filters['importance.code']);\r\n if (importance) {\r\n apiFilters.importance = importance;\r\n }\r\n\r\n const surface = this.readFilterValue(filters['surface.code']);\r\n if (surface) {\r\n apiFilters.surface = surface;\r\n }\r\n\r\n const actorUserId = this.readFilterValue(filters['actorUserId']);\r\n if (actorUserId) {\r\n apiFilters.actorUserId = actorUserId;\r\n }\r\n\r\n const occurredAtRange = filters['occurredAtUtc'] as\r\n | {\r\n from?: Date | null;\r\n to?: Date | null;\r\n }\r\n | undefined;\r\n\r\n if (occurredAtRange?.from) {\r\n apiFilters.fromUtc = this.normalizeDateBoundary(\r\n occurredAtRange.from,\r\n 'start',\r\n );\r\n }\r\n\r\n if (occurredAtRange?.to) {\r\n apiFilters.toUtc = this.normalizeDateBoundary(occurredAtRange.to, 'end');\r\n }\r\n\r\n this.facade.getAuditLogs(\r\n event.currentPage ?? 1,\r\n event.pageSize ?? this.auditLogs().pageSize ?? 20,\r\n apiFilters,\r\n );\r\n }\r\n\r\n openEventDetail(row: AuditTrailListItem): void {\r\n this.drawerVisible.set(true);\r\n this.facade.getAuditLogDetail(row.eventId, this.currentLanguage());\r\n }\r\n\r\n onDrawerVisibleChange(visible: boolean): void {\r\n this.drawerVisible.set(visible);\r\n\r\n if (!visible) {\r\n this.facade.clearAuditLogDetail();\r\n }\r\n }\r\n\r\n retry(): void {\r\n const response = this.auditLogs();\r\n\r\n this.facade.getAuditLogs(response.page || 1, response.pageSize || 20, {\r\n ...this.appliedFilters(),\r\n language: this.currentLanguage(),\r\n });\r\n }\r\n\r\n protected formatSubjectType(row: AuditTrailListItem): string {\r\n return row.primarySubjectType || this.translate('subject-type-unknown');\r\n }\r\n\r\n private currentLanguage(): string {\r\n return this.activeLang() === 'ar' ? 'ar' : 'en';\r\n }\r\n\r\n private translate(key: string): string {\r\n this.activeLang();\r\n return this.translocoService.translate(`audit-logs.${key}`);\r\n }\r\n\r\n private pushFilterBadge(\r\n badges: string[],\r\n label: string,\r\n value?: string | null,\r\n ): void {\r\n if (!value) {\r\n return;\r\n }\r\n\r\n badges.push(`${label}: ${value}`);\r\n }\r\n\r\n private formatFilterDate(value: string): string {\r\n const date = new Date(value);\r\n\r\n if (Number.isNaN(date.getTime())) {\r\n return value;\r\n }\r\n\r\n return new Intl.DateTimeFormat(\r\n this.currentLanguage() === 'ar' ? 'ar' : undefined,\r\n {\r\n dateStyle: 'medium',\r\n },\r\n ).format(date);\r\n }\r\n\r\n private readFilterValue(value: unknown): string | undefined {\r\n if (typeof value === 'string' && value.trim().length > 0) {\r\n return value.trim();\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return String(value);\r\n }\r\n\r\n if (\r\n value &&\r\n typeof value === 'object' &&\r\n 'value' in value &&\r\n typeof value.value === 'string' &&\r\n value.value.trim().length > 0\r\n ) {\r\n return value.value.trim();\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private normalizeDateBoundary(\r\n value: Date,\r\n boundary: 'start' | 'end',\r\n ): string {\r\n const normalizedDate = new Date(value);\r\n\r\n if (boundary === 'start') {\r\n normalizedDate.setHours(0, 0, 0, 0);\r\n } else {\r\n normalizedDate.setHours(23, 59, 59, 999);\r\n }\r\n\r\n return normalizeDates(normalizedDate);\r\n }\r\n}\r\n","<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","// store/index.ts\r\nexport * from './audit-logs';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@masterteam/audit-logs",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"directory": "../../../dist/masterteam/audit-logs",
|
|
6
6
|
"linkDirectory": false,
|
|
7
7
|
"access": "public"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@angular/common": "^21.
|
|
11
|
-
"@angular/core": "^21.
|
|
12
|
-
"@angular/forms": "^21.
|
|
13
|
-
"@angular/cdk": "^21.
|
|
14
|
-
"@primeuix/themes": "^2.0.
|
|
15
|
-
"@tailwindcss/postcss": "^4.
|
|
16
|
-
"@jsverse/transloco": "^8.0
|
|
17
|
-
"postcss": "^8.5.
|
|
18
|
-
"primeng": "21.
|
|
10
|
+
"@angular/common": "^21.2.8",
|
|
11
|
+
"@angular/core": "^21.2.8",
|
|
12
|
+
"@angular/forms": "^21.2.8",
|
|
13
|
+
"@angular/cdk": "^21.2.6",
|
|
14
|
+
"@primeuix/themes": "^2.0.3",
|
|
15
|
+
"@tailwindcss/postcss": "^4.2.2",
|
|
16
|
+
"@jsverse/transloco": "^8.3.0",
|
|
17
|
+
"postcss": "^8.5.9",
|
|
18
|
+
"primeng": "21.1.5",
|
|
19
19
|
"rxjs": "^7.8.2",
|
|
20
|
-
"tailwindcss": "^4.
|
|
20
|
+
"tailwindcss": "^4.2.2",
|
|
21
21
|
"tailwindcss-primeui": "^0.6.1",
|
|
22
22
|
"@ngxs/store": "^20.1.0",
|
|
23
|
-
"@masterteam/
|
|
23
|
+
"@masterteam/forms": "^0.0.66",
|
|
24
24
|
"@masterteam/icons": "^0.0.14",
|
|
25
|
-
"@masterteam/
|
|
25
|
+
"@masterteam/components": "^0.0.143"
|
|
26
26
|
},
|
|
27
27
|
"sideEffects": false,
|
|
28
28
|
"exports": {
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
},
|
|
43
43
|
"module": "fesm2022/masterteam-audit-logs.mjs",
|
|
44
44
|
"typings": "types/masterteam-audit-logs.d.ts",
|
|
45
|
+
"type": "module",
|
|
45
46
|
"dependencies": {
|
|
46
47
|
"tslib": "^2.8.1"
|
|
47
48
|
}
|