@masterteam/audit-logs 0.0.3 → 0.0.5

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.
@@ -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/date-normalizer.util.ts","../../../../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 { Component, inject } from '@angular/core';\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})\r\nexport default class AuditLogs {\r\n private readonly router = inject(Router);\r\n private readonly translocoService = inject(TranslocoService);\r\n\r\n breadcrumbItems: { label?: string; routerLink?: string; icon?: string }[] = [\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 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 [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 <h3 class=\"font-bold text-xl\">{{ t(\"audit-logs.audit-logs\") }}</h3>\r\n <mt-breadcrumb\r\n [items]=\"breadcrumbItems\"\r\n [styleClass]=\"'flex justify-start mx-1 mb-4'\"\r\n ></mt-breadcrumb>\r\n <router-outlet />\r\n </mt-page>\r\n</ng-container>\r\n","import { LoadingStateShape } from '../utils/state-helpers';\r\n\r\nexport interface AuditLog {\r\n event?: string;\r\n module?: string;\r\n originalUserId?: {\r\n id?: string;\r\n userId?: string;\r\n displayName?: string;\r\n mobile?: string;\r\n userName?: string;\r\n email?: string;\r\n photo?: string;\r\n };\r\n date?: {\r\n displayValue?: string;\r\n actualValue?: string;\r\n };\r\n description?: string;\r\n title?: string;\r\n userIpAddress?: string;\r\n}\r\n\r\nexport enum AuditLogsActionKey {\r\n GetAuditLogs = 'getAuditLogs',\r\n}\r\n\r\nexport interface AuditLogsStateModel extends LoadingStateShape<AuditLogsActionKey> {\r\n auditLogs: {\r\n items: AuditLog[];\r\n page?: number;\r\n pageSize?: number;\r\n totalCount?: number;\r\n };\r\n page: number;\r\n pageSize: number;\r\n}\r\n","export class GetAuditLogs {\r\n static readonly type = '[AuditLogs] Get Audit Logs';\r\n constructor(\r\n public page: number,\r\n public pageSize: number,\r\n public filters?: Record<string, any>,\r\n ) {}\r\n}\r\n","import { State, Action, StateContext, Selector } from '@ngxs/store';\r\nimport { GetAuditLogs } from './audit-logs.actions';\r\nimport {\r\n AuditLog,\r\n AuditLogsActionKey,\r\n AuditLogsStateModel,\r\n} from './audit-logs.model';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Response } from './api.model';\r\nimport { CrudStateBase, handleApiRequest } from '@masterteam/components';\r\n\r\n@State<AuditLogsStateModel>({\r\n name: 'auditLogs',\r\n defaults: {\r\n auditLogs: { items: [] },\r\n page: 1,\r\n pageSize: 10,\r\n loadingActive: [],\r\n errors: {},\r\n },\r\n})\r\n@Injectable()\r\nexport class AuditLogsState extends CrudStateBase<\r\n AuditLog,\r\n AuditLogsStateModel,\r\n AuditLogsActionKey\r\n> {\r\n private http = inject(HttpClient);\r\n\r\n // ============================================================================\r\n // Selectors - Individual data selectors for fine-grained reactivity\r\n // ============================================================================\r\n\r\n @Selector()\r\n static getAuditLogs(state: AuditLogsStateModel) {\r\n return state.auditLogs;\r\n }\r\n\r\n @Selector()\r\n static getPage(state: AuditLogsStateModel): number {\r\n return state.page;\r\n }\r\n\r\n @Selector()\r\n static getPageSize(state: AuditLogsStateModel): number {\r\n return state.pageSize;\r\n }\r\n\r\n // ============================================================================\r\n // Loading/Error Slice Selectors - REQUIRED for optimal performance\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 // ============================================================================\r\n // Actions\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 params = {\r\n page: page.toString(),\r\n pageSize: pageSize.toString(),\r\n ...filters,\r\n };\r\n const req$ = this.http.get<Response<AuditLog[]>>(`app/audittrail`, {\r\n params: params,\r\n });\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: AuditLogsActionKey.GetAuditLogs,\r\n request$: req$,\r\n onSuccess: (response: any) => ({\r\n auditLogs: response.data ?? [],\r\n page,\r\n pageSize,\r\n }),\r\n });\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\nimport { GetAuditLogs } from './audit-logs.actions';\r\nimport { AuditLogsActionKey } 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 // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly auditLogs = select(AuditLogsState.getAuditLogs);\r\n readonly page = select(AuditLogsState.getPage);\r\n readonly pageSize = select(AuditLogsState.getPageSize);\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(AuditLogsState.getLoadingActive);\r\n private readonly errors = select(AuditLogsState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingAuditLogs = computed(() =>\r\n this.loadingActive().includes(AuditLogsActionKey.GetAuditLogs),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly getAuditLogsError = computed(\r\n () => this.errors()[AuditLogsActionKey.GetAuditLogs] ?? null,\r\n );\r\n\r\n // ============================================================================\r\n // Action Dispatchers\r\n // ============================================================================\r\n getAuditLogs(\r\n page: number = 1,\r\n pageSize: number = 10,\r\n filters?: Record<string, any>,\r\n ) {\r\n return this.store.dispatch(new GetAuditLogs(page, pageSize, filters));\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 Component,\r\n computed,\r\n inject,\r\n linkedSignal,\r\n TemplateRef,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { ColumnDef, Table } from '@masterteam/components/table';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { Avatar } from '@masterteam/components/avatar';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { AuditLogsFacade } from '../../../store/audit-logs';\r\nimport { normalizeDates } from '../../utils/date-normalizer.util';\r\nimport { HttpContext } from '@angular/common/http';\r\nimport { REQUEST_CONTEXT } from '@masterteam/components';\r\n\r\n@Component({\r\n selector: 'mt-audit-logs-list',\r\n styleUrl: './audit-logs-list.css',\r\n templateUrl: './audit-logs-list.html',\r\n standalone: true,\r\n imports: [CommonModule, SkeletonModule, Table, Avatar, TranslocoDirective],\r\n})\r\nexport default class AuditLogsList {\r\n userCol = viewChild.required<TemplateRef<any>>('userCol');\r\n\r\n private readonly facade = inject(AuditLogsFacade);\r\n private readonly translocoService = inject(TranslocoService);\r\n context = new HttpContext().set(REQUEST_CONTEXT, {\r\n useBaseUrl: true,\r\n });\r\n auditLogs = computed(() => this.facade.auditLogs()?.items);\r\n fullDataAuditLogs = computed(() => this.facade.auditLogs());\r\n\r\n tableColumns = linkedSignal<ColumnDef[]>(() => [\r\n {\r\n key: 'name',\r\n label: this.translocoService.translate('audit-logs.title'),\r\n },\r\n {\r\n key: 'module',\r\n label: this.translocoService.translate('audit-logs.module'),\r\n },\r\n {\r\n key: 'originalUserId.userName',\r\n label: this.translocoService.translate('audit-logs.user'),\r\n type: 'custom',\r\n customCellTpl: this.userCol(),\r\n filterConfig: {\r\n type: 'user',\r\n label: this.translocoService.translate('audit-logs.user'),\r\n context: this.context,\r\n apiUrl: 'Identity/users',\r\n },\r\n },\r\n {\r\n key: 'description',\r\n label: this.translocoService.translate('audit-logs.activity'),\r\n },\r\n {\r\n key: 'userIpAddress',\r\n label: this.translocoService.translate('audit-logs.ip-address'),\r\n },\r\n {\r\n key: 'date.displayValue',\r\n label: this.translocoService.translate('audit-logs.date'),\r\n filterConfig: {\r\n type: 'date',\r\n label: this.translocoService.translate('audit-logs.start-date'),\r\n },\r\n },\r\n ]);\r\n\r\n loading = this.facade.isLoadingAuditLogs;\r\n\r\n onLazyLoad(event: any) {\r\n // Transform filters to API format\r\n const apiFilters: Record<string, any> = {};\r\n\r\n if (event.filters) {\r\n // Handle date filter transformation\r\n if (event.filters['date.displayValue']) {\r\n const dateFilter = event.filters['date.displayValue'];\r\n if (dateFilter.from) {\r\n apiFilters['startDate'] = normalizeDates(dateFilter.from);\r\n }\r\n if (dateFilter.to) {\r\n apiFilters['endDate'] = normalizeDates(dateFilter.to);\r\n }\r\n }\r\n if (event.filters['generalSearch']) {\r\n apiFilters['searchTerm'] = event.filters['generalSearch'];\r\n }\r\n if (event.filters['originalUserId.userName']) {\r\n const userFilter = event.filters['originalUserId.userName'];\r\n apiFilters['userId'] = userFilter?.userId;\r\n }\r\n }\r\n\r\n this.facade.getAuditLogs(event.currentPage, event.pageSize, apiFilters);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t\">\r\n <mt-table\r\n [data]=\"auditLogs()\"\r\n [columns]=\"tableColumns()\"\r\n [loading]=\"loading()\"\r\n [lazy]=\"true\"\r\n [showFilters]=\"true\"\r\n [exportable]=\"true\"\r\n [generalSearch]=\"true\"\r\n [lazyTotalRecords]=\"fullDataAuditLogs().totalCount\"\r\n (lazyLoad)=\"onLazyLoad($event)\"\r\n >\r\n </mt-table>\r\n\r\n <ng-template #userCol let-row>\r\n <div class=\"flex items-center gap-2\">\r\n <mt-avatar [icon]=\"'custom.user-pp'\"> </mt-avatar>\r\n {{ row.originalUserId?.displayName }}\r\n </div>\r\n </ng-template>\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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"}
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 -&gt;\r\n </div>\r\n\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.to\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.newValue)) {\r\n <span class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.newValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"flex flex-col gap-4\">\r\n @if (group.label || group.key) {\r\n <h5 class=\"font-semibold text-surface-900\">\r\n {{ group.label || humanizeKey(group.key) }}\r\n </h5>\r\n }\r\n\r\n <div class=\"flex flex-col gap-5\">\r\n @for (\r\n change of group.changes;\r\n track change.fieldKey + \"-\" + $index\r\n ) {\r\n <div class=\"flex flex-col gap-3\">\r\n <div\r\n class=\"flex flex-wrap items-start justify-between gap-2\"\r\n >\r\n <div class=\"flex flex-col gap-1\">\r\n <span class=\"font-medium text-surface-900\">\r\n {{ getFieldLabel(change) }}\r\n </span>\r\n\r\n <div\r\n class=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-surface-500\"\r\n >\r\n @if (\r\n getChangeSource(change);\r\n as changeSource\r\n ) {\r\n <span>\r\n {{ t(\"drawer.change-source\") }}:\r\n {{ changeSource }}\r\n </span>\r\n }\r\n\r\n <span>\r\n {{ t(\"drawer.value-kind\") }}:\r\n {{ change.valueKind }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]\"\r\n >\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-50 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.from\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.oldValue)) {\r\n <span class=\"text-sm text-surface-400\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.oldValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.oldValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div\r\n class=\"flex items-center justify-center text-xl text-surface-300\"\r\n >\r\n -&gt;\r\n </div>\r\n\r\n <div\r\n class=\"rounded-xl border border-surface-200 bg-surface-0 p-4\"\r\n >\r\n <p\r\n class=\"mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-surface-500\"\r\n >\r\n {{ t(\"drawer.to\") }}\r\n </p>\r\n\r\n @if (isEmptyValue(change.newValue)) {\r\n <span class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.empty-value\") }}\r\n </span>\r\n } @else if (\r\n isJsonValue(\r\n change.valueKind,\r\n change.newValue\r\n )\r\n ) {\r\n <pre class=\"audit-json-value\">{{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}</pre>\r\n } @else {\r\n <span class=\"text-sm text-surface-700\">\r\n {{\r\n formatValue(\r\n change.newValue,\r\n change.valueKind\r\n )\r\n }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.no-changes\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n\r\n <div class=\"flex min-w-0 flex-col gap-5\">\r\n <mt-card [title]=\"t('drawer.request-context')\">\r\n <dl class=\"grid gap-4\">\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"drawer.actor\") }}\r\n </dt>\r\n <dd class=\"text-sm text-surface-800\">\r\n @if (\r\n getActorUserEntity(event.requestContext.actorUser);\r\n as actorUserEntity\r\n ) {\r\n <mt-entity-user [data]=\"actorUserEntity\" />\r\n } @else {\r\n <span class=\"break-all\">\r\n {{ event.requestContext.actorUserId || \"system\" }}\r\n </span>\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"drawer.occurred-at\") }}\r\n </dt>\r\n <dd class=\"text-sm text-surface-800\">\r\n {{ event.requestContext.occurredAtUtc | date: \"medium\" }}\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"category\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"category\", event.category);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"operation\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"operation\", event.operation);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"importance\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"importance\", event.importance);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n\r\n <div class=\"grid gap-1\">\r\n <dt\r\n class=\"text-xs font-semibold uppercase text-surface-500\"\r\n >\r\n {{ t(\"surface\") }}\r\n </dt>\r\n <dd>\r\n @if (\r\n getStatusEntity(\"surface\", event.surface);\r\n as status\r\n ) {\r\n <mt-entity-status [data]=\"status\" />\r\n }\r\n </dd>\r\n </div>\r\n </dl>\r\n </mt-card>\r\n\r\n <mt-card [title]=\"t('drawer.subjects')\">\r\n @if (event.subjects.length > 0) {\r\n <div\r\n class=\"overflow-hidden rounded-xl border border-surface-200\"\r\n >\r\n <div class=\"divide-y divide-surface-100\">\r\n @for (\r\n subject of event.subjects;\r\n track subject.subjectType + \"-\" + subject.subjectId\r\n ) {\r\n <div class=\"flex flex-col gap-3 px-4 py-4\">\r\n <div\r\n class=\"flex flex-wrap items-start justify-between gap-3\"\r\n >\r\n <div class=\"flex flex-col gap-1\">\r\n <span class=\"font-medium text-surface-900\">\r\n {{ getSubjectLabel(subject) }}\r\n </span>\r\n <span class=\"text-xs text-surface-500\">\r\n {{ humanizeKey(subject.subjectType) }}\r\n </span>\r\n </div>\r\n\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1 text-xs font-medium text-surface-700\"\r\n >\r\n {{ humanizeKey(subject.relation) }}\r\n </span>\r\n </div>\r\n\r\n <div\r\n class=\"flex flex-wrap gap-2 text-xs text-surface-500\"\r\n >\r\n <span class=\"rounded-full bg-surface-100 px-3 py-1\">\r\n {{ t(\"drawer.scope\") }}: {{ subject.subjectId }}\r\n </span>\r\n @if (\r\n subject.levelId !== null &&\r\n subject.levelId !== undefined\r\n ) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.level-id\") }}:\r\n {{ subject.levelId }}\r\n </span>\r\n }\r\n @if (\r\n subject.levelDataId !== null &&\r\n subject.levelDataId !== undefined\r\n ) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.level-data-id\") }}:\r\n {{ subject.levelDataId }}\r\n </span>\r\n }\r\n @if (\r\n subject.moduleDataId !== null &&\r\n subject.moduleDataId !== undefined\r\n ) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.module-data-id\") }}:\r\n {{ subject.moduleDataId }}\r\n </span>\r\n }\r\n @if (subject.moduleKey) {\r\n <span\r\n class=\"rounded-full bg-surface-100 px-3 py-1\"\r\n >\r\n {{ t(\"drawer.module-key\") }}:\r\n {{ subject.moduleKey }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.no-subjects\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n </div>\r\n\r\n <mt-card [title]=\"t('drawer.evidence')\">\r\n <p class=\"mb-4 text-sm text-surface-500\">\r\n {{ t(\"drawer.advanced-description\") }}\r\n </p>\r\n\r\n @if (event.evidence.length > 0) {\r\n <div class=\"overflow-hidden rounded-xl border border-surface-200\">\r\n <div class=\"divide-y divide-surface-100\">\r\n @for (\r\n evidence of event.evidence;\r\n track evidence.type + \"-\" + $index\r\n ) {\r\n <section>\r\n <div\r\n class=\"flex flex-wrap items-center justify-between gap-3 px-4 py-3\"\r\n >\r\n <span class=\"font-medium text-surface-900\">\r\n {{ evidence.type || t(\"drawer.technical-evidence\") }}\r\n </span>\r\n\r\n <mt-button\r\n [label]=\"t('drawer.view-json')\"\r\n severity=\"secondary\"\r\n variant=\"text\"\r\n size=\"small\"\r\n (onClick)=\"toggleEvidence($index)\"\r\n />\r\n </div>\r\n\r\n @if (isEvidenceExpanded($index)) {\r\n <pre class=\"audit-json-panel\">{{\r\n formatJson(evidence.contentJson)\r\n }}</pre>\r\n }\r\n </section>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"text-sm text-surface-500\">\r\n {{ t(\"drawer.no-evidence\") }}\r\n </div>\r\n }\r\n </mt-card>\r\n </div>\r\n </div>\r\n } @else {\r\n <div [class]=\"modal.contentClass + ' h-full overflow-y-auto p-5'\">\r\n <mt-card class=\"min-h-[28rem]\">\r\n <div\r\n class=\"flex min-h-[28rem] items-center justify-center p-6 text-center\"\r\n >\r\n <p class=\"max-w-2xl text-sm text-surface-500\">\r\n {{ t(\"drawer.no-event-selected\") }}\r\n </p>\r\n </div>\r\n </mt-card>\r\n </div>\r\n }\r\n </ng-container>\r\n</mt-drawer>\r\n","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",
3
+ "version": "0.0.5",
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.0.3",
11
- "@angular/core": "^21.0.3",
12
- "@angular/forms": "^21.0.3",
13
- "@angular/cdk": "^21.0.2",
14
- "@primeuix/themes": "^2.0.2",
15
- "@tailwindcss/postcss": "^4.1.17",
16
- "@jsverse/transloco": "^8.0.2",
17
- "postcss": "^8.5.6",
18
- "primeng": "21.0.1",
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.1.17",
20
+ "tailwindcss": "^4.2.2",
21
21
  "tailwindcss-primeui": "^0.6.1",
22
22
  "@ngxs/store": "^20.1.0",
23
- "@masterteam/icons": "^0.0.14",
24
- "@masterteam/components": "^0.0.124",
25
- "@masterteam/forms": "^0.0.59"
23
+ "@masterteam/components": "^0.0.139",
24
+ "@masterteam/forms": "^0.0.65",
25
+ "@masterteam/icons": "^0.0.14"
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
  }