@maro-tech/card 0.1.3 → 0.1.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":"maro-tech-card.mjs","sources":["../../../src/lib/card-config.ts","../../../src/lib/card-events.ts","../../../src/lib/components/card-section-header.component.ts","../../../src/lib/tabs/html/html-tab.component.ts","../../../src/lib/tabs/html/html-tab.component.html","../../../src/lib/tabs/images/images-viewer/images-viewer.component.ts","../../../src/lib/tabs/images/images-viewer/images-viewer.component.html","../../../src/lib/tabs/details-grid/details-grid.component.ts","../../../src/lib/tabs/details-grid/details-grid.component.html","../../../src/lib/tabs/images/images.component.ts","../../../src/lib/tabs/images/images.component.html","../../../src/lib/tabs/table/table.component.ts","../../../src/lib/tabs/table/table.component.html","../../../src/lib/card-tab-registry.token.ts","../../../src/lib/layouts/panels/ui-card-panels-layout.component.ts","../../../src/lib/layouts/panels/ui-card-panels-layout.component.html","../../../src/lib/layouts/tabs/ui-card-tabs-layout.component.ts","../../../src/lib/layouts/tabs/ui-card-tabs-layout.component.html","../../../src/lib/card.component.ts","../../../src/lib/card.component.html","../../../src/lib/card-host.token.ts","../../../src/lib/card-api.ts","../../../src/lib/tabs/documents/documents.service.ts","../../../src/lib/tabs/documents/upload-modal/documents-upload-modal.component.ts","../../../src/lib/tabs/documents/upload-modal/documents-upload-modal.component.html","../../../src/lib/tabs/documents/text-modal/documents-text-modal.component.ts","../../../src/lib/tabs/documents/text-modal/documents-text-modal.component.html","../../../src/lib/tabs/documents/image-preview-modal/documents-image-preview-modal.component.ts","../../../src/lib/tabs/documents/image-preview-modal/documents-image-preview-modal.component.html","../../../src/lib/tabs/documents/documents.component.ts","../../../src/lib/tabs/documents/documents.component.html","../../../src/lib/tabs/history/history-tab.component.ts","../../../src/lib/tabs/history/history-tab.component.html","../../../src/maro-tech-card.ts"],"sourcesContent":["import type { UiEntityCardAction } from './card-host.token';\nimport type { UiCardLayoutInput, UiCardTabField } from './card.models';\n\nexport type CardData = Record<string, unknown>;\n\nexport type CardField = UiCardTabField;\nexport type CardAction = UiEntityCardAction;\n\nexport interface CardSection {\n id: string;\n title?: string;\n header?: boolean;\n col?: number;\n layout?: UiCardLayoutInput;\n component?: string;\n html?: string;\n props?: Record<string, unknown>;\n actions?: CardAction[];\n tabs?: CardSection[];\n panels?: CardSection[];\n}\n\nexport type CardTab = CardSection;\n\nexport interface CardConfig {\n title: string;\n layout?: UiCardLayoutInput;\n actions?: CardAction[];\n tabs: CardSection[];\n data?: CardData | null;\n}\n\nexport interface CardPanelInput {\n config: CardSection;\n data: CardData | null;\n}\n\nexport function normalizeCardConfig<T extends CardConfig>(config: T): T {\n return {\n ...config,\n tabs: normalizeSections(config.tabs),\n actions: normalizeActions(config.actions),\n } as T;\n}\n\nexport function resolveCardConfig<T extends CardConfig>(config: T, data: CardData | null): T {\n return {\n ...config,\n data,\n actions: resolveActions(config.actions, data),\n tabs: resolveSections(config.tabs, data),\n } as T;\n}\n\nfunction normalizeSections(sections: CardSection[] | undefined): CardSection[] {\n return (sections || []).map((section) => ({\n ...section,\n component: section.component || (section.html ? 'html' : undefined),\n actions: normalizeActions(section.actions),\n tabs: section.tabs?.length ? normalizeSections(section.tabs) : section.tabs,\n panels: section.panels?.length ? normalizeSections(section.panels) : section.panels,\n }));\n}\n\nfunction normalizeActions<T extends CardAction>(actions: T[] | undefined): T[] {\n return (actions || []).filter(Boolean) as T[];\n}\n\nfunction resolveSections(sections: CardSection[] | undefined, data: CardData | null): CardSection[] {\n return (sections || []).map((section) => ({\n ...section,\n props: resolveValue(section.props, data) as Record<string, unknown> | undefined,\n actions: resolveActions(section.actions, data),\n tabs: section.tabs?.length ? resolveSections(section.tabs, data) : section.tabs,\n panels: section.panels?.length ? resolveSections(section.panels, data) : section.panels,\n }));\n}\n\nfunction resolveActions(actions: CardAction[] | undefined, data: CardData | null): CardAction[] {\n return resolveValue(actions, data) as CardAction[];\n}\n\nfunction resolveValue(value: unknown, data: CardData | null): unknown {\n if (typeof value === 'string') {\n const match = value.match(/^\\{\\{([a-zA-Z0-9_.-]+)\\}\\}$/);\n return match ? getByPath(data, match[1]) : value;\n }\n if (Array.isArray(value)) return value.map((item) => resolveValue(item, data));\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .map(([key, item]) => [key, resolveValue(item, data)])\n );\n }\n return value;\n}\n\nfunction getByPath(source: CardData | null, path: string): unknown {\n return path.split('.').reduce<unknown>((current, segment) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[segment];\n }, source);\n}\n","import type { CardActionContext, UiEntityCardAction } from './card-host.token';\n\nexport type { CardActionContext } from './card-host.token';\n\nexport const CARD_ACTION_REQUESTED = 'card.action.requested';\nexport const CARD_ACTION_STARTED = 'card.action.started';\nexport const CARD_ACTION_COMPLETED = 'card.action.completed';\nexport const CARD_ACTION_FINISHED = 'card.action.finished';\nexport const ENTITY_UPDATED = 'entity.updated';\n\nexport interface CardActionRequestedEvent {\n action: UiEntityCardAction;\n context: CardActionContext;\n}\n\nexport interface CardActionLifecycleEvent {\n actionId: string;\n context: CardActionContext;\n}\n\nexport interface EntityUpdatedEvent {\n entity?: string;\n recordId?: string;\n source?: string;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, inject, input, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EventBus, UiButtonComponent } from '@maro-tech/core';\nimport type { UiEntityCardAction } from '../card-host.token';\nimport {\n CARD_ACTION_FINISHED,\n CARD_ACTION_REQUESTED,\n CardActionLifecycleEvent,\n CardActionRequestedEvent,\n} from '../card-events';\n\n@Component({\n selector: 'app-card-section-header',\n standalone: true,\n imports: [CommonModule, UiButtonComponent],\n template: `\n @if (variant() === 'tabs') {\n <header class=\"mb-4 flex justify-end\">\n <div class=\"flex flex-wrap gap-2 md:justify-end\">\n @for (action of actions(); track trackAction($index, action); let i = $index) {\n <ui-button\n [variant]=\"i === 0 ? 'primary' : 'ghost'\"\n [icon]=\"action.icon || ''\"\n size=\"sm\"\n [disabled]=\"isActionPending(action)\"\n (click)=\"onActionClick(action)\"\n >\n {{ isActionPending(action) ? 'Зачекайте...' : action.label }}\n </ui-button>\n }\n </div>\n </header>\n } @else {\n <header class=\"mb-4 flex flex-col gap-3 border-b border-slate-100 pb-3 md:flex-row md:items-center md:justify-between\">\n @if (title()) {\n <h3 class=\"text-lg font-semibold text-slate-900\">{{ title() }}</h3>\n } @else {\n <span></span>\n }\n\n @if (actions().length) {\n <div class=\"flex flex-wrap gap-2 md:justify-end\">\n @for (action of actions(); track trackAction($index, action); let i = $index) {\n <ui-button\n [variant]=\"i === 0 ? 'primary' : 'ghost'\"\n [icon]=\"action.icon || ''\"\n size=\"sm\"\n [disabled]=\"isActionPending(action)\"\n (click)=\"onActionClick(action)\"\n >\n {{ isActionPending(action) ? 'Зачекайте...' : action.label }}\n </ui-button>\n }\n </div>\n }\n </header>\n }\n `,\n})\nexport class CardSectionHeaderComponent {\n readonly variant = input<'tabs' | 'panels'>('panels');\n readonly title = input<string>('');\n readonly actions = input<UiEntityCardAction[]>([]);\n readonly data = input<Record<string, unknown> | null>(null);\n\n private readonly eventBus = inject(EventBus);\n private readonly destroyRef = inject(DestroyRef);\n private readonly pendingActionIdSignal = signal('');\n\n constructor() {\n this.eventBus.on<CardActionLifecycleEvent>(CARD_ACTION_FINISHED)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (this.matchesContext(event.context)) {\n this.pendingActionIdSignal.set('');\n }\n });\n }\n\n trackAction(_: number, action: UiEntityCardAction): string {\n return action.id || `${action.label}:${action.type}:${action.api || ''}:${action.formId || ''}`;\n }\n\n isActionPending(action: UiEntityCardAction): boolean {\n const pendingId = String(this.pendingActionIdSignal() || '').trim();\n const actionId = String(action.id || '').trim();\n return !!pendingId && !!actionId && pendingId === actionId;\n }\n\n onActionClick(action: UiEntityCardAction): void {\n const context = action.context || { entity: '', data: this.data() };\n this.pendingActionIdSignal.set(String(action.id || '').trim());\n this.eventBus.emit<CardActionRequestedEvent>(CARD_ACTION_REQUESTED, { action, context });\n }\n\n private matchesContext(context: { entity: string; recordId?: string }): boolean {\n return this.actions().some((action) => action.context?.entity === context.entity\n && (!context.recordId || action.context?.recordId === context.recordId));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { EventBus } from '@maro-tech/core';\nimport type { UiEntityCardAction } from '../../card-host.token';\nimport { CARD_ACTION_REQUESTED, CardActionRequestedEvent } from '../../card-events';\n\n@Component({\n selector: 'app-card-html-tab',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './html-tab.component.html',\n})\nexport class CardHtmlTabComponent {\n readonly html = input('');\n\n private readonly eventBus = inject(EventBus);\n private readonly sanitizer = inject(DomSanitizer);\n\n readonly safeHtml = computed<SafeHtml>(() => this.sanitizer.bypassSecurityTrustHtml(this.html()));\n\n onClick(event: MouseEvent): void {\n this.dispatchFromEvent(event);\n }\n\n onKeydown(event: Event): void {\n this.dispatchFromEvent(event as KeyboardEvent);\n }\n\n private dispatchFromEvent(event: MouseEvent | KeyboardEvent): void {\n const target = event.target as HTMLElement | null;\n const actionElement = target?.closest?.('[data-card-action]') as HTMLElement | null;\n if (!actionElement) return;\n\n const action = this.resolveAction(actionElement);\n if (!action) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.eventBus.emit<CardActionRequestedEvent>(CARD_ACTION_REQUESTED, {\n action,\n context: action.context || { entity: '', data: null },\n });\n }\n\n private resolveAction(actionElement: HTMLElement | null): UiEntityCardAction | null {\n const raw = actionElement?.getAttribute('data-card-action');\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return null;\n\n const action = parsed as Record<string, unknown>;\n const id = String(action['id'] || '').trim();\n const type = String(action['type'] || '').trim();\n if (!id || !type) return null;\n\n return {\n ...action,\n id,\n type,\n label: String(action['label'] || actionElement?.textContent || id).trim(),\n context: action['context'] as UiEntityCardAction['context'] || { entity: '', data: null },\n } as UiEntityCardAction;\n } catch {\n return null;\n }\n }\n\n}\n","<section\n (click)=\"onClick($event)\"\n (keydown.enter)=\"onKeydown($event)\"\n (keydown.space)=\"onKeydown($event)\"\n>\n <div [innerHTML]=\"safeHtml()\"></div>\n</section>\n","import { CommonModule } from '@angular/common';\nimport { Component, HostListener, effect, input, output, signal } from '@angular/core';\n\n@Component({\n selector: 'app-images-viewer',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './images-viewer.component.html',\n})\nexport class ImagesViewerComponent {\n readonly urls = input<string[]>([]);\n readonly initialIndex = input(0);\n readonly currentIndex = signal(0);\n\n readonly closed = output<void>();\n\n constructor() {\n effect(() => {\n const urls = this.urls();\n if (!urls.length) {\n this.currentIndex.set(0);\n return;\n }\n\n const maxIndex = urls.length - 1;\n const startIndex = Math.max(0, Math.min(this.initialIndex(), maxIndex));\n this.currentIndex.set(startIndex);\n });\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.closed.emit();\n }\n\n @HostListener('document:keydown.arrowleft')\n onArrowLeft(): void {\n this.showPreviousImage();\n }\n\n @HostListener('document:keydown.arrowright')\n onArrowRight(): void {\n this.showNextImage();\n }\n\n closeViewer(): void {\n this.closed.emit();\n }\n\n showPreviousImage(): void {\n const total = this.urls().length;\n if (total <= 1) return;\n this.currentIndex.set((this.currentIndex() - 1 + total) % total);\n }\n\n showNextImage(): void {\n const total = this.urls().length;\n if (total <= 1) return;\n this.currentIndex.set((this.currentIndex() + 1) % total);\n }\n\n get imageViewerTransform(): string {\n return `translate3d(-${this.currentIndex() * 100}%, 0, 0)`;\n }\n\n get imageViewerTransitionStyle(): string {\n return 'transform 320ms cubic-bezier(0.22, 1, 0.36, 1)';\n }\n\n getThumbnailUrl(url: string): string {\n const match = String(url || '').match(/^(.*\\/api\\/files\\/[^/?#]+)(?:\\?.*)?$/i);\n return match ? `${match[1]}/preview?scale=25` : url;\n }\n}\n","<div class=\"fixed inset-0 z-[2300] flex items-center justify-center bg-black/80 p-3 md:p-4\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Перегляд фото\">\n <button type=\"button\" class=\"absolute inset-0\" aria-label=\"Закрити перегляд\" (click)=\"closeViewer()\"></button>\n <div class=\"relative z-[1] flex h-full w-full max-w-[1500px] flex-col items-center justify-center gap-4\" (click)=\"$event.stopPropagation()\">\n <button\n type=\"button\"\n class=\"absolute right-2 top-2 z-20 inline-flex h-11 w-11 items-center justify-center rounded-full bg-white/90 text-slate-900 shadow-[0_12px_28px_rgba(15,23,42,0.22)] transition hover:bg-white md:right-3 md:top-3\"\n aria-label=\"Закрити\"\n (click)=\"closeViewer()\">\n ✕\n </button>\n\n <div class=\"relative flex min-h-0 w-full flex-1 items-center justify-center overflow-hidden rounded-[18px]\">\n <div class=\"h-full w-full overflow-hidden rounded-[18px]\">\n <div\n class=\"flex h-full w-full\"\n style=\"will-change: transform; backface-visibility: hidden;\"\n [style.transition]=\"imageViewerTransitionStyle\"\n [style.transform]=\"imageViewerTransform\">\n @for (url of urls(); track $index; let idx = $index) {\n <div class=\"flex h-full w-full min-w-full shrink-0 items-center justify-center overflow-hidden\">\n <img\n [src]=\"idx === currentIndex() ? url : getThumbnailUrl(url)\"\n [attr.alt]=\"'Фото ' + (idx + 1)\"\n [attr.loading]=\"idx === currentIndex() ? 'eager' : 'lazy'\"\n decoding=\"async\"\n class=\"block max-h-[74vh] max-w-[96vw] object-contain md:max-h-[78vh]\">\n </div>\n }\n </div>\n </div>\n\n @if (urls().length > 1) {\n <button type=\"button\" class=\"absolute left-0 top-0 z-10 flex h-full w-1/4 min-w-12 items-center justify-start pl-2 md:pl-3\" aria-label=\"Попереднє фото\" (click)=\"showPreviousImage()\">\n <span class=\"inline-flex h-11 w-11 items-center justify-center rounded-full bg-white/90 text-slate-900 shadow-[0_12px_28px_rgba(15,23,42,0.22)] transition hover:bg-white\">‹</span>\n </button>\n <button type=\"button\" class=\"absolute right-0 top-0 z-10 flex h-full w-1/4 min-w-12 items-center justify-end pr-2 md:pr-3\" aria-label=\"Наступне фото\" (click)=\"showNextImage()\">\n <span class=\"inline-flex h-11 w-11 items-center justify-center rounded-full bg-white/90 text-slate-900 shadow-[0_12px_28px_rgba(15,23,42,0.22)] transition hover:bg-white\">›</span>\n </button>\n }\n </div>\n\n @if (urls().length > 1) {\n <div class=\"flex w-full flex-col items-center gap-3 pb-1 md:pb-2\">\n <div class=\"flex max-w-[92vw] flex-wrap justify-center gap-2 md:max-w-[80vw]\">\n @for (url of urls(); track url; let idx = $index) {\n <button\n type=\"button\"\n class=\"h-14 w-14 overflow-hidden rounded-xl border bg-white p-1 transition\"\n [class.border-slate-900]=\"idx === currentIndex()\"\n [class.shadow-[0_0_0_2px_rgba(15,23,42,0.16)]]=\"idx === currentIndex()\"\n [class.border-slate-300]=\"idx !== currentIndex()\"\n [attr.aria-label]=\"'Фото ' + (idx + 1)\"\n (click)=\"currentIndex.set(idx)\">\n <img class=\"block aspect-square w-full rounded-lg object-contain\" [src]=\"getThumbnailUrl(url)\" [attr.alt]=\"'Мініатюра ' + (idx + 1)\" loading=\"lazy\" decoding=\"async\">\n </button>\n }\n </div>\n <div class=\"rounded-full bg-white/95 px-3 py-1.5 text-xs font-semibold text-slate-900 shadow-[0_12px_28px_rgba(15,23,42,0.2)]\">\n {{ currentIndex() + 1 }} / {{ urls().length }}\n </div>\n </div>\n }\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal } from '@angular/core';\n\nimport { UiCardTabConfig, UiCardTabField } from '../../card.models';\nimport { ImagesViewerComponent } from '../images/images-viewer/images-viewer.component';\n\ninterface UiDetailsGridDisplayField extends UiCardTabField {\n displayValue: string;\n imageSrc?: string | null;\n}\n\n@Component({\n selector: 'app-details-grid',\n standalone: true,\n imports: [CommonModule, ImagesViewerComponent],\n templateUrl: './details-grid.component.html',\n})\nexport class DetailsGridComponent {\n readonly config = input<UiCardTabConfig | null>(null);\n readonly data = input<Record<string, unknown> | null>(null);\n readonly hasExplicitColumns = computed(() => this.resolveFields().some((field) => this.isValidColumnSpan(field.col)));\n readonly displayFields = computed<UiDetailsGridDisplayField[]>(() =>\n this.resolveFields().map((field) => ({\n ...field,\n displayValue: this.formatFieldValue(field),\n imageSrc: this.getImageSrc(field),\n }))\n );\n readonly selectedImageSrc = signal<string | null>(null);\n\n openViewer(imageSrc: string): void {\n this.selectedImageSrc.set(imageSrc);\n }\n\n closeViewer(): void {\n this.selectedImageSrc.set(null);\n }\n\n private resolveFields(): UiCardTabField[] {\n const value = this.config()?.props?.['fields'];\n if (!Array.isArray(value)) return [];\n\n const data = this.data() || {};\n return (value as Partial<UiCardTabField>[]).map((field) => ({\n ...field,\n type: field.type || 'text',\n value: field.value ?? (field.id\n ? this.toFieldValue(data[`${field.id}_data`] ?? data[field.id])\n : undefined),\n })) as UiCardTabField[];\n }\n\n private toFieldValue(value: unknown): UiCardTabField['value'] {\n if (value == null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value as UiCardTabField['value'];\n }\n if (Array.isArray(value)) {\n return value.map((item) => this.toFieldValue(item) ?? '').join(', ');\n }\n if (typeof value === 'object' && 'label' in value) {\n return String((value as Record<string, unknown>)['label'] ?? '');\n }\n return String(value);\n }\n\n getFieldColumnClass(field: UiCardTabField): string {\n if (!this.isValidColumnSpan(field.col)) return '';\n const span = Math.min(12, Math.trunc(Number(field.col)));\n const classes: Record<number, string> = {\n 1: 'sm:col-span-1',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-3',\n 4: 'sm:col-span-4',\n 5: 'sm:col-span-5',\n 6: 'sm:col-span-6',\n 7: 'sm:col-span-7',\n 8: 'sm:col-span-8',\n 9: 'sm:col-span-9',\n 10: 'sm:col-span-10',\n 11: 'sm:col-span-11',\n 12: 'sm:col-span-12',\n };\n return classes[span] || '';\n }\n\n private isValidColumnSpan(value: number | undefined): boolean {\n const span = Number(value);\n return Number.isFinite(span) && span > 0;\n }\n\n private formatFieldValue(field: UiCardTabField): string {\n const value = field.value;\n if (value == null) return '-';\n if (typeof value === 'boolean') return value ? 'Так' : 'Ні';\n const raw = String(value).trim();\n if (!raw) return '-';\n\n if (field.type === 'date' || field.type === 'datetime') {\n return this.formatDate(raw, field.type === 'datetime');\n }\n if (field.type === 'enum') {\n return this.formatEnum(raw, field.enumMap);\n }\n\n return raw;\n }\n\n private getImageSrc(field: UiCardTabField): string | null {\n if (field.type !== 'image') return null;\n\n const value = field.value;\n if (value == null) return null;\n\n const raw = String(value).trim();\n if (!raw) return null;\n return `/api/files/${encodeURIComponent(raw)}`;\n }\n\n private formatEnum(raw: string, enumMap?: Record<string, string>): string {\n if (enumMap?.[raw]) {\n return enumMap[raw];\n }\n if (raw === 'true') return 'Так';\n if (raw === 'false') return 'Ні';\n return raw;\n }\n\n private formatDate(value: string, withTime: boolean): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n\n return new Intl.DateTimeFormat('uk-UA', withTime\n ? { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }\n : { day: '2-digit', month: '2-digit', year: 'numeric' }).format(date);\n }\n}\n","<div class=\"grid gap-4\" [class.grid-cols-1]=\"!hasExplicitColumns()\" [class.sm:grid-cols-3]=\"!hasExplicitColumns()\" [class.sm:grid-cols-12]=\"hasExplicitColumns()\">\n @for (field of displayFields(); track $index) {\n <div class=\"rounded-2xl border border-slate-100 bg-slate-200 p-4\" [ngClass]=\"getFieldColumnClass(field)\" [class.flex]=\"field.type === 'image'\" [class.flex-col]=\"field.type === 'image'\" [class.min-h-64]=\"field.type === 'image'\">\n <p class=\"text-xs uppercase tracking-[0.18em] text-slate-500\">{{ field.label }}</p>\n @if (field.type === 'image') {\n @if (field.imageSrc) {\n <button type=\"button\" class=\"mt-2 block flex-1 cursor-zoom-in overflow-hidden rounded-xl border border-slate-200 bg-white\" [attr.aria-label]=\"'Переглянути ' + field.label\" (click)=\"openViewer(field.imageSrc)\">\n <img [src]=\"field.imageSrc\" [alt]=\"field.label\" class=\"h-full w-full object-cover\" />\n </button>\n } @else {\n <p class=\"mt-2 text-base font-semibold text-slate-900\">-</p>\n }\n } @else {\n <p class=\"mt-2 text-base font-semibold text-slate-900\">{{ field.displayValue ?? '-' }}</p>\n }\n </div>\n }\n</div>\n\n@if (selectedImageSrc(); as imageSrc) {\n <app-images-viewer [urls]=\"[imageSrc]\" (closed)=\"closeViewer()\" />\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal } from '@angular/core';\nimport { UiCardTabConfig } from '../../card.models';\nimport { ImagesViewerComponent } from './images-viewer/images-viewer.component';\n\n@Component({\n selector: 'app-images',\n standalone: true,\n imports: [CommonModule, ImagesViewerComponent],\n templateUrl: './images.component.html',\n})\nexport class ImagesComponent {\n readonly config = input<UiCardTabConfig | null>(null);\n readonly data = input<Record<string, unknown> | null>(null);\n\n readonly isViewerOpen = signal(false);\n readonly viewerStartIndex = signal(0);\n\n readonly resolvedImageIds = computed(() => {\n const props = this.config()?.props || {};\n const key = String(props['images'] || 'images').trim();\n return this.normalizeIds(key ? this.data()?.[key] : null);\n });\n\n readonly resolvedImageUrls = computed(() => {\n return this.resolvedImageIds().map((id) => this.resolveImageUrl(id));\n });\n\n readonly resolvedImagePreviewUrls = computed(() => this.resolvedImageIds().map((id) => this.resolvePreviewUrl(id)));\n\n readonly resolvedImageMaxHeight = computed(() => {\n const value = Number(this.config()?.props?.['maxHeight']);\n return Number.isFinite(value) && value > 0 ? value : 400;\n });\n\n openViewer(index: number): void {\n this.viewerStartIndex.set(Math.max(0, index));\n if (this.resolvedImageUrls().length) this.isViewerOpen.set(true);\n }\n\n closeViewer(): void {\n this.isViewerOpen.set(false);\n }\n\n private resolveImageUrl(imageId: string): string {\n return `/api/files/${encodeURIComponent(imageId)}`;\n }\n\n private resolvePreviewUrl(imageId: string): string {\n return `/api/files/${encodeURIComponent(imageId)}/preview?scale=25`;\n }\n\n private normalizeIds(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return Array.from(new Set(\n value\n .map((item) => String(item || '').trim())\n .filter(Boolean)\n ));\n }\n}\n","@if (resolvedImageUrls().length === 0) {\n <p class=\"text-sm text-slate-500\">Фото відсутні</p>\n} @else {\n <div\n class=\"grid gap-3\"\n [ngClass]=\"resolvedImageUrls().length === 1 ? 'grid-cols-1' : 'sm:grid-cols-2 lg:grid-cols-4'\"\n >\n @for (image of resolvedImagePreviewUrls(); track image; let i = $index) {\n <button\n type=\"button\"\n class=\"group block overflow-hidden rounded-2xl border border-slate-200 bg-slate-50 text-left\"\n [attr.aria-label]=\"'Переглянути фото ' + (i + 1)\"\n (click)=\"openViewer(i)\"\n >\n <img\n [src]=\"image\"\n [alt]=\"'Фото ' + (i + 1)\"\n loading=\"lazy\"\n decoding=\"async\"\n class=\"w-full object-cover transition duration-200 group-hover:scale-[1.02]\"\n [style.max-height.px]=\"resolvedImageMaxHeight()\"\n [ngClass]=\"resolvedImageUrls().length === 1 ? 'h-auto' : 'h-48'\"\n />\n </button>\n }\n </div>\n\n @if (isViewerOpen()) {\n <app-images-viewer\n [urls]=\"resolvedImageUrls()\"\n [initialIndex]=\"viewerStartIndex()\"\n (closed)=\"closeViewer()\"\n ></app-images-viewer>\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { Component, Input, OnChanges, SimpleChanges, computed, inject, signal } from '@angular/core';\nimport { EventBus } from '@maro-tech/core';\nimport { map } from 'rxjs';\nimport {\n CARD_ACTION_REQUESTED,\n ENTITY_UPDATED,\n CardActionRequestedEvent,\n EntityUpdatedEvent,\n} from '../../card-events';\nimport { UiEntityCardAction } from '../../card-host.token';\nimport { UiCardTabConfig } from '../../card.models';\nimport { UiTableColumnConfig, UiTableFilter, UiTableResponse, UiTableRowAction, UiTableComponent } from '@maro-tech/table';\n\ntype TableView = {\n columns?: Array<Record<string, any>>;\n rows?: any[];\n actions?: { header?: { custom?: UiEntityCardAction[] }; row?: { custom?: UiEntityCardAction[]; edit?: boolean; delete?: boolean } };\n viewActions?: { edit?: boolean; delete?: boolean };\n pagination?: { page?: number; size?: number; total?: number; totalElements?: number; sizes?: number[] };\n};\n\ntype EditableColumnConfig = {\n key: string;\n bindKey?: string;\n editor?: 'text' | 'number' | 'select';\n data?: string;\n options?: Array<{ label: string; value: string | null; disabled?: boolean }>;\n api?: string;\n method?: UiEntityCardAction['method'];\n payload?: Record<string, unknown>;\n condition?: string;\n dataParams?: Record<string, string | number | boolean | null | undefined>;\n placeholder?: string;\n};\n\n@Component({\n selector: 'app-card-table',\n standalone: true,\n imports: [CommonModule, UiTableComponent],\n templateUrl: './table.component.html',\n})\nexport class TableComponent implements OnChanges {\n @Input({ required: true }) config!: UiCardTabConfig;\n @Input() data: Record<string, unknown> | null = null;\n\n private readonly http = inject(HttpClient);\n private readonly eventBus = inject(EventBus);\n private readonly columnsSignal = signal<UiTableColumnConfig[]>([]);\n private readonly rowsSignal = signal<Record<string, unknown>[]>([]);\n private readonly paginationSignal = signal({ page: 0, pageSize: 10, total: 0 });\n readonly pageSizeOptionsSignal = signal([10, 20, 30]);\n private readonly headerActionsSignal = signal<UiEntityCardAction[]>([]);\n private readonly loadingSignal = signal(false);\n private readonly errorSignal = signal('');\n\n readonly columns = this.columnsSignal.asReadonly();\n readonly rows = this.rowsSignal.asReadonly();\n readonly headerActions = this.headerActionsSignal.asReadonly();\n readonly isLoading = this.loadingSignal.asReadonly();\n readonly error = this.errorSignal.asReadonly();\n readonly tableData = computed<UiTableResponse<Record<string, unknown>>>(() => ({\n items: this.rowsSignal(),\n pagination: this.paginationSignal(),\n }));\n\n private page = 0;\n private pageSize = 10;\n private sortField = '';\n private sortDirection = '';\n private sourceColumns: Array<Record<string, any>> = [];\n\n constructor() {\n this.eventBus.on<EntityUpdatedEvent>(ENTITY_UPDATED).subscribe((event) => {\n if (!event.entity || event.entity === this.tableName()) this.load();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['config'] && !changes['data']) return;\n this.page = 0;\n this.pageSize = this.numberProp('pageSize', 10);\n this.sortField = '';\n this.sortDirection = '';\n this.load();\n }\n\n get disablePaging(): boolean {\n return this.config?.props?.['disablePaging'] === true || this.config?.props?.['disablePaging'] === 'true';\n }\n\n onPageChange(event: UiTableFilter): void {\n this.page = Math.max(0, Number(event['pageIndex'] ?? this.page) || 0);\n this.pageSize = Math.max(1, Number(event['pageSize'] ?? this.pageSize) || this.pageSize);\n this.sortField = String(event['active'] || '').trim();\n const direction = String(event['direction'] || '').toLowerCase();\n this.sortDirection = direction === 'asc' || direction === 'desc' ? direction : '';\n this.load();\n }\n\n onAction(event: { action: UiTableRowAction; row: Record<string, unknown> }): void {\n this.emitAction(event.action as UiEntityCardAction, event.row);\n }\n\n onCellChange(event: { column: UiTableColumnConfig; row: Record<string, unknown>; value: unknown }): void {\n const config = this.editableColumns().find((item) => item.key === event.column.key);\n if (!config?.api) return;\n\n this.emitAction({\n id: `edit:${config.key}`,\n label: 'Зберегти',\n type: 'api',\n api: config.api,\n method: config.method || 'PATCH',\n payload: {\n ...event.row,\n ...(config.payload || {}),\n id: event.row['id'],\n [config.bindKey || config.key]: event.value,\n },\n }, event.row);\n }\n\n onHeaderAction(action: UiEntityCardAction): void {\n this.emitAction(action, this.data || {});\n }\n\n private emitAction(action: UiEntityCardAction, row: Record<string, unknown>): void {\n const resolved: UiEntityCardAction = {\n ...action,\n id: String(action.id || '').trim() || undefined,\n label: String(action.label || action.id || 'Дія'),\n type: String(action.type || 'api'),\n api: action.api ? this.resolve(action.api, row) : action.api,\n payload: action.payload ? this.resolveObject(action.payload, row) : action.payload,\n context: {\n entity: this.tableName(),\n recordId: String(row['id'] || '').trim() || undefined,\n data: row,\n },\n };\n this.eventBus.emit<CardActionRequestedEvent>(CARD_ACTION_REQUESTED, {\n action: resolved,\n context: resolved.context!,\n });\n }\n\n private load(): void {\n const table = this.tableName();\n if (!table) return;\n this.loadingSignal.set(true);\n this.errorSignal.set('');\n this.http.get<TableView>(this.tableEndpoint(table)).pipe(\n map((response) => normalizeTableResponse(response)),\n ).subscribe({\n next: (view: TableView) => {\n const sourceColumns = view.columns || [];\n this.sourceColumns = sourceColumns;\n this.setColumns();\n this.headerActionsSignal.set(view.actions?.header?.custom || []);\n this.rowsSignal.set(this.rowsFrom(view, sourceColumns));\n if (view.pagination?.sizes?.length) this.pageSizeOptionsSignal.set(view.pagination.sizes);\n this.page = view.pagination?.page ?? this.page;\n this.pageSize = view.pagination?.size ?? this.pageSize;\n this.paginationSignal.set({\n page: this.page,\n pageSize: this.pageSize,\n total: view.pagination?.totalElements ?? view.pagination?.total ?? this.rowsSignal().length,\n });\n this.loadingSignal.set(false);\n },\n error: (error) => {\n this.rowsSignal.set([]);\n this.columnsSignal.set([]);\n this.headerActionsSignal.set([]);\n this.errorSignal.set(error?.error?.message || 'Не вдалося завантажити таблицю');\n this.loadingSignal.set(false);\n },\n });\n }\n\n private setColumns(): void {\n const editable = this.editableColumns();\n this.columnsSignal.set(this.sourceColumns.filter((column) => !column['hidden']).map((column) => {\n const key = String(column['id'] || '');\n const config = editable.find((item) => item.key === key);\n return {\n key,\n labelKey: String(column['label'] || key),\n type: column['type'],\n width: column['width'],\n sortable: true,\n link: column['link'],\n editable: !!config,\n editableCondition: String(this.config?.props?.['editableCondition'] || config?.['condition'] || ''),\n editor: config?.editor,\n bindKey: config?.bindKey || key,\n options: config?.options || [],\n data: config?.data,\n dataParams: config?.dataParams,\n placeholder: config?.placeholder,\n } as UiTableColumnConfig;\n }));\n }\n\n\n private rowsFrom(view: TableView, columns: Array<Record<string, any>>): Record<string, unknown>[] {\n const configured = view.actions?.row?.custom || [];\n return (view.rows || []).map((raw) => {\n const row = Array.isArray(raw)\n ? columns.reduce<Record<string, unknown>>((result, column, index) => {\n result[String(column['id'])] = raw[index] ?? '';\n return result;\n }, { id: String(raw[0] || '') })\n : { ...(raw || {}) };\n row['id'] = String(row['id'] || '');\n if (!Array.isArray(row['actions'])) {\n const actions = [...configured];\n const actionIds = new Set(actions.map((action) => String(action.id || '').trim()).filter(Boolean));\n if (view.viewActions?.edit !== false && view.actions?.row?.edit !== false && this.editEnabled() && !actionIds.has('edit')) {\n actions.push({ id: 'edit', label: 'Редагувати', type: 'form', formId: this.tableName() });\n }\n if (view.viewActions?.delete !== false && view.actions?.row?.delete !== false && !actionIds.has('delete')) {\n actions.push({ id: 'delete', label: 'Видалити', type: 'submit', api: `/api/crud/${this.tableName()}/${row['id']}`, method: 'DELETE' });\n }\n if (actions.length) row['actions'] = actions;\n }\n return row;\n });\n }\n\n private tableName(): string {\n return String(this.config?.props?.['table'] || this.config?.props?.['entity'] || '').trim();\n }\n\n private editableColumns(): EditableColumnConfig[] {\n const value = this.config?.props?.['editableColumns'];\n return Array.isArray(value)\n ? value.filter((item): item is EditableColumnConfig => !!item && typeof item === 'object' && !!String((item as any).key || '').trim())\n : [];\n }\n\n private tableEndpoint(table: string): string {\n const params = new URLSearchParams({\n page: String(this.page),\n size: String(this.pageSize),\n sortField: this.sortField,\n sortDirection: this.sortDirection,\n filters: JSON.stringify(this.config?.props?.['initialFilters'] || this.config?.props?.['filter'] || {}),\n });\n return `/api/crud/${encodeURIComponent(table)}?${params.toString()}`;\n }\n\n private editEnabled(): boolean {\n return this.config?.props?.['edit'] !== false && this.config?.props?.['edit'] !== 'false';\n }\n\n private numberProp(key: string, fallback: number): number {\n const value = Number(this.config?.props?.[key]);\n return Number.isFinite(value) && value > 0 ? Math.trunc(value) : fallback;\n }\n\n private resolveObject(value: Record<string, unknown>, row: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, this.resolveValue(item, row)]));\n }\n\n private resolve(value: string, row: Record<string, unknown>): string {\n return String(this.resolveValue(value, row));\n }\n\n private resolveValue(value: unknown, row: Record<string, unknown>): unknown {\n if (typeof value === 'string') {\n return value.replace(/\\{\\{([a-zA-Z0-9_.-]+)\\}\\}/g, (_match, path) => {\n const result = String(path).split('.').reduce<unknown>((current, key) =>\n current && typeof current === 'object' ? (current as Record<string, unknown>)[key] : undefined, row);\n return result == null ? '' : String(result);\n });\n }\n if (Array.isArray(value)) return value.map((item) => this.resolveValue(item, row));\n if (value && typeof value === 'object') return this.resolveObject(value as Record<string, unknown>, row);\n return value;\n }\n}\n\nfunction normalizeTableResponse(response: unknown): TableView {\n const raw = (response || {}) as Record<string, any>;\n const source = (raw['config'] || raw) as TableView;\n return {\n ...source,\n rows: raw['rows'] ?? raw['items'] ?? source.rows ?? [],\n pagination: {\n page: raw['page'] ?? source.pagination?.page,\n size: raw['size'] ?? source.pagination?.size,\n total: raw['total'] ?? source.pagination?.total,\n totalElements: raw['total'] ?? source.pagination?.totalElements,\n sizes: source.pagination?.sizes,\n },\n };\n}\n","<section class=\"space-y-4\">\n @if (headerActions().length) {\n <div class=\"flex justify-end gap-2\">\n @for (action of headerActions(); track action.id) {\n <button type=\"button\" class=\"rounded-lg border border-slate-200 px-3 py-1.5 text-sm\" (click)=\"onHeaderAction(action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n\n <app-ui-table\n [data]=\"tableData()\"\n [columns]=\"columns()\"\n [pageSizeOptions]=\"pageSizeOptionsSignal()\"\n [isLoading]=\"isLoading()\"\n [disablePaging]=\"disablePaging\"\n (pageChange)=\"onPageChange($event)\"\n (actionClick)=\"onAction($event)\"\n (cellChange)=\"onCellChange($event)\"\n ></app-ui-table>\n</section>\n","import { InjectionToken, Type } from '@angular/core';\nimport { UiCardTabConfig } from './card.models';\n\nexport interface UiCardTabRegistration {\n key: string;\n component: Type<unknown>;\n resolveInputs?: (tab: UiCardTabConfig, data?: Record<string, unknown> | null) => Record<string, unknown>;\n}\n\nexport const UI_CARD_TAB_REGISTRY = new InjectionToken<UiCardTabRegistration[]>('UI_CARD_TAB_REGISTRY');\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, forwardRef, inject, input, signal, Type } from '@angular/core';\n\nimport { CardComponent } from '../../card.component';\nimport { CardSectionHeaderComponent } from '../../components/card-section-header.component';\nimport { CardHtmlTabComponent } from '../../tabs/html/html-tab.component';\nimport { DetailsGridComponent } from '../../tabs/details-grid/details-grid.component';\nimport { ImagesComponent } from '../../tabs/images/images.component';\nimport { TableComponent } from '../../tabs/table/table.component';\nimport type { UiEntityCardAction } from '../../card-host.token';\nimport { UiCardTabConfig, UiCardLayout } from '../../card.models';\nimport { UI_CARD_TAB_REGISTRY, UiCardTabRegistration } from '../../card-tab-registry.token';\n\ntype NestedCardConfig = {\n tabs: UiCardTabConfig[];\n layout: UiCardLayout;\n};\n\n@Component({\n selector: 'app-ui-card-panels-layout',\n standalone: true,\n imports: [CommonModule, forwardRef(() => CardComponent), CardSectionHeaderComponent, CardHtmlTabComponent, DetailsGridComponent, ImagesComponent, TableComponent],\n templateUrl: './ui-card-panels-layout.component.html',\n})\nexport class UiCardPanelsLayoutComponent {\n private readonly registry: UiCardTabRegistration[] = inject(UI_CARD_TAB_REGISTRY, { optional: true }) || [];\n\n readonly tabs = input<UiCardTabConfig[]>([]);\n readonly data = input<Record<string, unknown> | null>(null);\n readonly embedded = input(false);\n\n readonly firstTab = computed(() => this.tabs()[0] || null);\n\n getActions(tab: UiCardTabConfig): UiEntityCardAction[] {\n const value = tab.actions;\n return Array.isArray(value) ? value : [];\n }\n\n getVisibleActions(tab: UiCardTabConfig): UiEntityCardAction[] {\n return this.getActions(tab).filter((action) => !action.hidden);\n }\n\n shouldShowPanelHeader(tab: UiCardTabConfig): boolean {\n return !this.embedded() && !tab.html && tab.component !== 'html' && tab.header !== false;\n }\n\n getColSpanClass(tab: UiCardTabConfig): string {\n if (tab.col == null) return 'md:col-span-12';\n\n const raw = Number(tab.col);\n const span = !Number.isFinite(raw) || raw <= 0 ? 12 : Math.min(12, Math.trunc(raw));\n const classes: Record<number, string> = {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 5: 'md:col-span-5',\n 6: 'md:col-span-6',\n 7: 'md:col-span-7',\n 8: 'md:col-span-8',\n 9: 'md:col-span-9',\n 10: 'md:col-span-10',\n 11: 'md:col-span-11',\n 12: 'md:col-span-12',\n };\n return classes[span] || 'md:col-span-12';\n }\n\n getNestedCardConfig(tab: UiCardTabConfig): NestedCardConfig | null {\n if (Array.isArray(tab.tabs) && tab.tabs.length) {\n return { tabs: tab.tabs, layout: tab.layout || 'panels' };\n }\n return null;\n }\n\n getNestedPanels(tab: UiCardTabConfig): UiCardTabConfig[] | null {\n return Array.isArray(tab.panels) && tab.panels.length ? tab.panels : null;\n }\n\n getRegisteredComponent(tab: UiCardTabConfig): Type<unknown> | null {\n const key = tab.component;\n if (!key || key === 'images' || key === 'detailsGrid' || key === 'html') return null;\n const found = this.registry.find((item) => item.key === key);\n return found?.component || null;\n }\n\n getRegisteredInputs(tab: UiCardTabConfig): Record<string, unknown> {\n const key = tab.component;\n if (!key) return { tab };\n const found: UiCardTabRegistration | undefined = this.registry.find((item) => item.key === key);\n if (!found?.resolveInputs) return { tab };\n return found.resolveInputs(tab, this.data());\n }\n}\n","@if (tabs().length) {\n <div class=\"grid grid-cols-1 gap-4 md:grid-cols-12\">\n @for (tab of tabs(); track tab.id) {\n <section\n [class.rounded-3xl]=\"!embedded()\"\n [class.border]=\"!embedded()\"\n [class.border-slate-200]=\"!embedded()\"\n [class.bg-white]=\"!embedded()\"\n [class.p-6]=\"!embedded()\"\n [class.min-w-0]=\"embedded()\"\n [ngClass]=\"getColSpanClass(tab)\"\n [attr.data-card-panel-id]=\"tab.id\"\n >\n @if (shouldShowPanelHeader(tab)) {\n <app-card-section-header\n [data]=\"data()\"\n [title]=\"tab.title\"\n [actions]=\"getVisibleActions(tab)\"\n ></app-card-section-header>\n }\n\n @if (getNestedCardConfig(tab); as nestedCard) {\n <app-card [tabs]=\"nestedCard.tabs\" [data]=\"data()\" [layout]=\"nestedCard.layout\"></app-card>\n } @else if (getNestedPanels(tab); as nestedPanels) {\n <app-card [tabs]=\"nestedPanels\" [data]=\"data()\" layout=\"panels\" [embedded]=\"true\"></app-card>\n } @else if (tab.component === 'detailsGrid') {\n <app-details-grid [config]=\"tab\" [data]=\"data()\"></app-details-grid>\n } @else if (tab.component === 'table') {\n <app-card-table [config]=\"tab\" [data]=\"data()\"></app-card-table>\n } @else if (tab.component === 'images') {\n <app-images [config]=\"tab\" [data]=\"data()\"></app-images>\n } @else if (tab.component === 'html') {\n <app-card-html-tab [html]=\"tab.html || ''\"></app-card-html-tab>\n } @else if (getRegisteredComponent(tab); as customComponent) {\n <ng-container *ngComponentOutlet=\"customComponent; inputs: getRegisteredInputs(tab)\"></ng-container>\n }\n </section>\n }\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, DestroyRef, forwardRef, inject, input, OnInit, signal, Type } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { CardComponent } from '../../card.component';\nimport { CardSectionHeaderComponent } from '../../components/card-section-header.component';\nimport { CardHtmlTabComponent } from '../../tabs/html/html-tab.component';\nimport { DetailsGridComponent } from '../../tabs/details-grid/details-grid.component';\nimport { ImagesComponent } from '../../tabs/images/images.component';\nimport { TableComponent } from '../../tabs/table/table.component';\nimport type { UiEntityCardAction } from '../../card-host.token';\nimport { UiCardTabConfig } from '../../card.models';\nimport { UI_CARD_TAB_REGISTRY, UiCardTabRegistration } from '../../card-tab-registry.token';\n\n@Component({\n selector: 'app-ui-card-tabs-layout',\n standalone: true,\n imports: [CommonModule, forwardRef(() => CardComponent), CardSectionHeaderComponent, CardHtmlTabComponent, ImagesComponent, DetailsGridComponent, TableComponent],\n templateUrl: './ui-card-tabs-layout.component.html',\n})\nexport class UiCardTabsLayoutComponent implements OnInit {\n private readonly registry: UiCardTabRegistration[] = inject(UI_CARD_TAB_REGISTRY, { optional: true }) || [];\n private readonly destroyRef = inject(DestroyRef);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n readonly tabs = input<UiCardTabConfig[]>([]);\n readonly data = input<Record<string, unknown> | null>(null);\n readonly activeTabId = signal<string>('');\n\n ngOnInit(): void {\n this.route.queryParamMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((params) => {\n const tabId = params.get('tab');\n if (tabId) this.activeTabId.set(tabId);\n });\n }\n\n readonly activeTab = computed(() => {\n const items = this.tabs() || [];\n if (!items.length) return null;\n const currentId = this.activeTabId();\n return items.find((item) => item.id === currentId) || items[0];\n });\n\n setActiveTab(id: string): void {\n this.activeTabId.set(id);\n void this.router.navigate([], {\n relativeTo: this.route,\n queryParams: { tab: id },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n }\n\n getActions(tab: UiCardTabConfig): UiEntityCardAction[] {\n const value = tab.actions;\n return Array.isArray(value) ? value : [];\n }\n\n getVisibleActions(tab: UiCardTabConfig): UiEntityCardAction[] {\n return this.getActions(tab).filter((action) => !action.hidden);\n }\n\n getColSpan(tab: UiCardTabConfig): number {\n if (tab.col == null) return 12;\n\n const raw = Number(tab.col);\n if (!Number.isFinite(raw) || raw <= 0) return 12;\n return Math.min(12, Math.trunc(raw));\n }\n\n getRegisteredComponent(tab: UiCardTabConfig): Type<unknown> | null {\n const key = tab.component;\n if (!key || key === 'images' || key === 'detailsGrid' || key === 'html') return null;\n const found = this.registry.find((item) => item.key === key);\n return found?.component || null;\n }\n\n getRegisteredInputs(tab: UiCardTabConfig): Record<string, unknown> {\n const key = tab.component;\n if (!key) return { tab };\n const found: UiCardTabRegistration | undefined = this.registry.find((item) => item.key === key);\n if (!found?.resolveInputs) return { tab };\n return found.resolveInputs(tab, this.data());\n }\n}\n","@if (tabs().length) {\n <section class=\"space-y-4\">\n <nav class=\"flex flex-wrap gap-2\" aria-label=\"Card tabs\">\n @for (tab of tabs(); track tab.id) {\n <button\n type=\"button\"\n class=\"rounded-xl border px-4 py-2 text-sm font-medium transition\"\n [class.border-slate-900]=\"activeTab()?.id === tab.id\"\n [class.bg-slate-900]=\"activeTab()?.id === tab.id\"\n [class.text-white]=\"activeTab()?.id === tab.id\"\n [class.border-slate-200]=\"activeTab()?.id !== tab.id\"\n [class.bg-white]=\"activeTab()?.id !== tab.id\"\n [class.text-slate-700]=\"activeTab()?.id !== tab.id\"\n (click)=\"setActiveTab(tab.id)\"\n >\n {{ tab.title }}\n </button>\n }\n </nav>\n\n @if (activeTab(); as tab) {\n <section\n [attr.data-card-tab-id]=\"tab.id\"\n >\n @if (getVisibleActions(tab).length) {\n <app-card-section-header\n variant=\"tabs\"\n [data]=\"data()\"\n [actions]=\"getVisibleActions(tab)\"\n ></app-card-section-header>\n }\n\n @if (tab.tabs?.length) {\n <app-card [tabs]=\"tab.tabs || []\" [data]=\"data()\" [layout]=\"tab.layout || 'panels'\"></app-card>\n } @else if (tab.component === 'images') {\n <app-images\n [config]=\"tab\"\n [data]=\"data()\"\n ></app-images>\n } @else if (tab.component === 'detailsGrid') {\n <app-details-grid [config]=\"tab\" [data]=\"data()\"></app-details-grid>\n } @else if (tab.component === 'table') {\n <app-card-table [config]=\"tab\" [data]=\"data()\"></app-card-table>\n } @else if (tab.component === 'html') {\n <app-card-html-tab [html]=\"tab.html || ''\"></app-card-html-tab>\n } @else if (getRegisteredComponent(tab); as customComponent) {\n <ng-container *ngComponentOutlet=\"customComponent; inputs: getRegisteredInputs(tab)\"></ng-container>\n }\n </section>\n }\n </section>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, forwardRef, input } from '@angular/core';\nimport { UiCardPanelsLayoutComponent } from './layouts/panels/ui-card-panels-layout.component';\nimport { UiCardTabsLayoutComponent } from './layouts/tabs/ui-card-tabs-layout.component';\nimport { UiCardLayoutInput, UiCardTabConfig } from './card.models';\n\n@Component({\n selector: 'app-card',\n standalone: true,\n imports: [CommonModule, forwardRef(() => UiCardTabsLayoutComponent), forwardRef(() => UiCardPanelsLayoutComponent)],\n templateUrl: './card.component.html',\n})\nexport class CardComponent {\n readonly tabs = input<UiCardTabConfig[]>([]);\n readonly data = input<Record<string, unknown> | null>(null);\n readonly layout = input<UiCardLayoutInput>('panels');\n readonly embedded = input(false);\n\n}\n","@if (layout() === 'panels') {\n <app-ui-card-panels-layout\n [tabs]=\"tabs()\"\n [data]=\"data()\"\n [embedded]=\"embedded()\"\n ></app-ui-card-panels-layout>\n} @else {\n <app-ui-card-tabs-layout\n [tabs]=\"tabs()\"\n [data]=\"data()\"\n ></app-ui-card-tabs-layout>\n}\n","import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport type { UiCardLayoutInput } from './card.models';\n\nexport type ApiPluginMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\nexport interface ApiPluginConfig {\n api: string;\n method?: ApiPluginMethod;\n payload?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface CardActionContext {\n entity: string;\n recordId?: string;\n data?: Record<string, unknown> | null;\n}\n\nexport interface UiEntityCardAction {\n id?: string;\n label: string;\n type: string;\n icon?: string;\n hidden?: boolean;\n html?: string;\n component?: string;\n formId?: string;\n size?: 'sm' | 'md' | 'lg';\n api?: string;\n template?: string;\n method?: ApiPluginMethod;\n title?: string;\n text?: string;\n submit?: boolean | string;\n payload?: Record<string, unknown>;\n redirectEntity?: string;\n condition?: string;\n context?: CardActionContext;\n}\n\nexport interface UiEntityCardTab {\n id: string;\n title: string;\n col?: number;\n layout?: UiCardLayoutInput;\n component?: string;\n html?: string;\n tabs?: UiEntityCardTab[];\n panels?: UiEntityCardTab[];\n actions?: UiEntityCardAction[];\n props?: Record<string, unknown> & {\n images?: string;\n recordId?: string;\n recordIdKey?: string;\n fields?: Array<Record<string, unknown>>;\n warehouseId?: number | string;\n [key: string]: unknown;\n };\n}\n\nexport interface UiEntityCardResponse {\n meta?: Record<string, unknown>;\n title: string;\n layout?: UiCardLayoutInput;\n actions?: UiEntityCardAction[];\n viewActions?: {\n read: boolean;\n create: boolean;\n edit: boolean;\n delete: boolean;\n hasFormTemplate: boolean;\n };\n tabs?: UiEntityCardTab[];\n data?: Record<string, unknown>;\n}\n\nexport interface UiEntityCardHost {\n getCardView(entity: string, id: string): Observable<UiEntityCardResponse>;\n getFormView(entity: string, id: string): Observable<Record<string, unknown>>;\n callApi(config: ApiPluginConfig): Observable<unknown>;\n deleteCard(entity: string, id: string): Observable<void>;\n notify(message: string, variant: 'success' | 'error' | 'warning', durationMs?: number): void;\n goBack(entity: string, queryParams?: Record<string, unknown>, returnUrl?: string): void;\n goToEdit(entity: string, id: string): void;\n}\n\nexport const UI_ENTITY_CARD_HOST = new InjectionToken<UiEntityCardHost>('UI_ENTITY_CARD_HOST');\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { InjectionToken, Injectable, inject } from '@angular/core';\nimport { Observable, shareReplay } from 'rxjs';\n\nexport const UI_CARD_API_BASE_URL = new InjectionToken<string>('UI_CARD_API_BASE_URL', { factory: () => '' });\n\nconst apiUrl = (baseUrl: string, path: string): string => `${String(baseUrl || '').replace(/\\/$/, '')}${path}`;\n\nexport interface CardDictionarySuggestItem { key: string; label: string; imageId?: string | null; }\n\n@Injectable({ providedIn: 'root' })\nexport class CardDictionaryService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n getSuggestByName(name: string): Observable<CardDictionarySuggestItem[]> {\n return this.http.get<CardDictionarySuggestItem[]>(apiUrl(this.baseUrl, `/api/suggest/${encodeURIComponent(name)}`));\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CardCurrentUserService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n private readonly user$ = this.http.get<{ role?: string }>(apiUrl(this.baseUrl, '/api/users/me'), { withCredentials: true }).pipe(shareReplay(1));\n getCurrentUser(): Observable<{ role?: string }> { return this.user$; }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CardImageService {\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n getPhotoLink(id: string): string | undefined {\n return id ? apiUrl(this.baseUrl, `/api/files/${encodeURIComponent(id)}/preview?scale=25`) : undefined;\n }\n}\n\nexport const cardApiResourceUrl = (baseUrl: string, path: string): string => apiUrl(baseUrl, path);\nexport const cardApiParams = (params: Record<string, string | number | undefined>): HttpParams =>\n Object.entries(params).reduce((result, [key, value]) => value == null ? result : result.set(key, String(value)), new HttpParams());\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { UI_CARD_API_BASE_URL, cardApiParams, cardApiResourceUrl } from '../../card-api';\n\nexport interface UiEntityDocumentFile {\n id: string;\n entity: string;\n entityId: string;\n fileId: string;\n name: string | null;\n type: string;\n size: number | string;\n documentTypeId?: string | null;\n documentTypeLabel?: string | null;\n text?: string | null;\n recognitionStatus?: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | null;\n createdAt?: string;\n updatedAt?: string;\n downloadUrl: string;\n}\n\nexport interface UiEntityDocumentRecognitionStatus {\n id: string;\n text?: string | null;\n recognitionStatus?: UiEntityDocumentFile['recognitionStatus'];\n updatedAt?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class UiEntityDocumentsService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n\n list(entity: string, entityId: string): Observable<UiEntityDocumentFile[]> {\n const params = cardApiParams({ entity, entityId });\n\n return this.http.get<UiEntityDocumentFile[]>(cardApiResourceUrl(this.baseUrl, '/api/entity-files'), { params });\n }\n\n recognitionStatus(id: string): Observable<UiEntityDocumentRecognitionStatus> {\n return this.http.get<UiEntityDocumentRecognitionStatus>(\n cardApiResourceUrl(this.baseUrl, `/api/entity-files/${encodeURIComponent(id)}/recognition-status`),\n );\n }\n\n upload(file: File): Observable<{ id: string }> {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('fileName', file.name);\n return this.http.post<{ id: string }>(cardApiResourceUrl(this.baseUrl, '/api/files'), formData);\n }\n\n attach(payload: { entity: string; entityId: string; fileId: string; documentTypeId?: string | null }): Observable<UiEntityDocumentFile> {\n return this.http.post<UiEntityDocumentFile>(cardApiResourceUrl(this.baseUrl, '/api/entity-files'), payload);\n }\n\n recognize(id: string): Observable<UiEntityDocumentFile> {\n return this.http.post<UiEntityDocumentFile>(cardApiResourceUrl(this.baseUrl, `/api/entity-files/${encodeURIComponent(id)}/recognize`), {});\n }\n\n rename(id: string, name: string): Observable<UiEntityDocumentFile> {\n return this.http.patch<UiEntityDocumentFile>(cardApiResourceUrl(this.baseUrl, `/api/entity-files/${encodeURIComponent(id)}`), { name });\n }\n\n remove(id: string): Observable<void> {\n return this.http.delete<void>(cardApiResourceUrl(this.baseUrl, `/api/entity-files/${encodeURIComponent(id)}`));\n }\n\n resolveDownloadUrl(fileId: string): string {\n return cardApiResourceUrl(this.baseUrl, `/api/files/${encodeURIComponent(fileId)}`);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, ViewChild, effect, inject, input, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { forkJoin, switchMap } from 'rxjs';\nimport { LucideAngularModule } from 'lucide-angular';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiModalComponent } from '@maro-tech/core';\nimport { UiToastService } from '@maro-tech/core';\nimport { InputSelectComponent } from '@maro-tech/form';\nimport { UiEntityDocumentsService } from '../documents.service';\n\n@Component({\n selector: 'app-documents-upload-modal',\n standalone: true,\n imports: [CommonModule, FormsModule, LucideAngularModule, UiButtonComponent, UiModalComponent, InputSelectComponent],\n templateUrl: './documents-upload-modal.component.html',\n})\nexport class DocumentsUploadModalComponent {\n readonly isOpen = input(false);\n readonly entity = input<string>('');\n readonly id = input<string>('');\n readonly closed = output<void>();\n readonly saved = output<void>();\n\n readonly documentTypeId = signal<string | null>(null);\n readonly fileNames = signal<string[]>([]);\n readonly isUploading = signal(false);\n\n @ViewChild('uploadFileInput') private uploadFileInput?: ElementRef<HTMLInputElement>;\n\n private readonly documentsService = inject(UiEntityDocumentsService);\n private readonly toast = inject(UiToastService);\n private uploadFiles: File[] = [];\n\n private readonly isOpenEffect = effect(() => {\n if (!this.isOpen()) {\n this.resetState();\n }\n });\n\n close(): void {\n this.closed.emit();\n }\n\n onFilesSelected(event: Event): void {\n const input = event.target as HTMLInputElement | null;\n const files = Array.from(input?.files ?? []);\n this.uploadFiles = files;\n this.fileNames.set(files.map((file) => file.name));\n }\n\n onDocumentTypeChange(value: string | string[] | null): void {\n this.documentTypeId.set(Array.isArray(value) ? value[0] ?? null : value);\n }\n\n submitUpload(): void {\n const entity = String(this.entity() || '').trim();\n const id = String(this.id() || '').trim();\n if (!entity || !id) {\n this.toast.show('Немає entity або id запису', 'warning', 2400);\n return;\n }\n\n if (!this.uploadFiles.length) {\n this.toast.show('Оберіть файл для завантаження', 'warning', 2400);\n return;\n }\n\n this.isUploading.set(true);\n forkJoin(\n this.uploadFiles.map((file) =>\n this.documentsService.upload(file).pipe(\n switchMap((result) =>\n this.documentsService.attach({\n entity,\n entityId: id,\n fileId: result.id,\n documentTypeId: this.documentTypeId(),\n })\n )\n )\n )\n ).subscribe({\n next: () => {\n this.toast.show(this.uploadFiles.length > 1 ? `Додано документів: ${this.uploadFiles.length}` : 'Документ додано', 'success', 2200);\n this.isUploading.set(false);\n this.saved.emit();\n this.closed.emit();\n },\n error: (error) => {\n this.toast.show(error?.error?.message || 'Не вдалося додати документи', 'error', 3200);\n this.isUploading.set(false);\n },\n });\n }\n\n private resetState(): void {\n this.documentTypeId.set(null);\n this.fileNames.set([]);\n this.isUploading.set(false);\n this.uploadFiles = [];\n if (this.uploadFileInput) {\n this.uploadFileInput.nativeElement.value = '';\n }\n }\n}\n","<core-modal\n title=\"Додати документ\"\n [isOpen]=\"isOpen()\"\n (closed)=\"close()\"\n>\n <div class=\"space-y-4\">\n <input-select\n [data]=\"'doc_type'\"\n name=\"uploadDocumentTypeId\"\n label=\"Тип документа\"\n hint=\"Необов'язково\"\n [ngModel]=\"documentTypeId()\"\n (ngModelChange)=\"onDocumentTypeChange($event)\"\n placeholder=\"Тип документа\"\n [fullWidth]=\"true\"\n [searchable]=\"true\"\n ></input-select>\n\n <div class=\"space-y-2\">\n <label class=\"block text-sm font-medium text-slate-700\" for=\"document-files\">Файли</label>\n <input\n #uploadFileInput\n id=\"document-files\"\n type=\"file\"\n class=\"block w-full rounded-xl border border-slate-200 bg-white px-3 py-2.5 text-sm text-slate-900 outline-none transition file:mr-3 file:rounded-lg file:border-0 file:bg-slate-900 file:px-3 file:py-2 file:text-sm file:font-medium file:text-white focus:border-slate-400 focus:ring-2 focus:ring-slate-200\"\n multiple\n (change)=\"onFilesSelected($event)\"\n />\n @if (fileNames().length) {\n <div class=\"rounded-xl border border-slate-200 bg-slate-50 px-3 py-2 text-sm text-slate-600\">\n @for (fileName of fileNames(); track fileName) {\n <div class=\"truncate\">{{ fileName }}</div>\n }\n </div>\n } @else {\n <p class=\"text-xs text-slate-500\">Можна обрати один або декілька файлів.</p>\n }\n </div>\n </div>\n\n <div slot=\"footer\" class=\"flex justify-end gap-2\">\n <ui-button variant=\"ghost\" [disabled]=\"isUploading()\" (click)=\"close()\">Скасувати</ui-button>\n <ui-button variant=\"primary\" [disabled]=\"isUploading()\" (click)=\"submitUpload()\">\n {{ isUploading() ? 'Завантаження...' : 'Зберегти' }}\n </ui-button>\n </div>\n</core-modal>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, output } from '@angular/core';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiModalComponent } from '@maro-tech/core';\nimport { UiEntityDocumentFile } from '../documents.service';\n\n@Component({\n selector: 'app-documents-text-modal',\n standalone: true,\n imports: [CommonModule, UiButtonComponent, UiModalComponent],\n templateUrl: './documents-text-modal.component.html',\n})\nexport class DocumentsTextModalComponent {\n readonly isOpen = input(false);\n readonly document = input<UiEntityDocumentFile | null>(null);\n readonly closed = output<void>();\n readonly recognizeRequested = output<void>();\n\n close(): void {\n this.closed.emit();\n }\n\n requestRecognize(): void {\n this.recognizeRequested.emit();\n }\n\n isImage(): boolean {\n return String(this.document()?.type || '').toLowerCase().startsWith('image/');\n }\n\n hasDocumentHtml(): boolean {\n return !!String(this.document()?.text || '').trim();\n }\n\n getDocumentHtml(): string {\n const text = String(this.document()?.text || '').trim();\n if (!text) {\n return '';\n }\n if (this.looksLikeHtml(text)) {\n return text;\n }\n\n return this.escapeHtml(text).replace(/\\r?\\n/g, '<br>');\n }\n\n private looksLikeHtml(value: string): boolean {\n return /<\\/?[a-z][\\s\\S]*>/i.test(value);\n }\n\n private escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n}\n","<core-modal\n title=\"Розпізнані дані\"\n size=\"lg\"\n [isOpen]=\"isOpen()\"\n (closed)=\"close()\"\n>\n <div class=\"space-y-3\">\n @if (hasDocumentHtml()) {\n <div\n class=\"max-h-[32rem] overflow-auto rounded-xl border border-slate-200 bg-slate-50 px-4 py-4 text-sm text-slate-900\"\n [innerHTML]=\"getDocumentHtml()\"\n ></div>\n } @else {\n <div class=\"rounded-xl border border-dashed border-slate-200 bg-slate-50 px-4 py-6 text-sm text-slate-500\">\n Дані ще не розпізнані. Натисни “Розпізнати дані”.\n </div>\n }\n </div>\n\n <div slot=\"footer\" class=\"flex justify-end gap-2\">\n @if (isImage()) {\n <ui-button variant=\"secondary\" (click)=\"requestRecognize()\">Розпізнати ще раз</ui-button>\n }\n <ui-button variant=\"primary\" (click)=\"close()\">Закрити</ui-button>\n </div>\n</core-modal>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, output } from '@angular/core';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiModalComponent } from '@maro-tech/core';\nimport { UiEntityDocumentFile } from '../documents.service';\n\n@Component({\n selector: 'app-documents-image-preview-modal',\n standalone: true,\n imports: [CommonModule, UiButtonComponent, UiModalComponent],\n templateUrl: './documents-image-preview-modal.component.html',\n})\nexport class DocumentsImagePreviewModalComponent {\n readonly isOpen = input(false);\n readonly document = input<UiEntityDocumentFile | null>(null);\n readonly closed = output<void>();\n\n close(): void {\n this.closed.emit();\n }\n\n getPreviewUrl(url: string): string {\n const match = String(url || '').match(/^(.*\\/api\\/files\\/[^/?#]+)(?:\\?.*)?$/i);\n return match ? `${match[1]}/preview?scale=25` : url;\n }\n}\n","<core-modal\n [title]=\"document()?.name || 'Перегляд документа'\"\n size=\"lg\"\n [isOpen]=\"isOpen()\"\n (closed)=\"close()\"\n>\n @if (document()) {\n <div class=\"overflow-hidden rounded-2xl bg-slate-100\">\n <img\n [src]=\"getPreviewUrl(document()!.downloadUrl)\"\n [alt]=\"document()!.name || 'Документ'\"\n decoding=\"async\"\n class=\"max-h-[75vh] w-full object-contain\"\n >\n </div>\n }\n\n <div slot=\"footer\" class=\"flex justify-end gap-2\">\n <ui-button variant=\"primary\" (click)=\"close()\">Закрити</ui-button>\n </div>\n</core-modal>\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, effect, inject, input, signal } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { forkJoin, of, Subscription, timer } from 'rxjs';\nimport { catchError, exhaustMap, finalize, map, takeUntil, takeWhile } from 'rxjs/operators';\nimport { Eye, FileText, LucideAngularModule, Plus, Sparkles, Trash } from 'lucide-angular';\nimport { CardCurrentUserService, CardDictionaryService } from '../../card-api';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiToastService } from '@maro-tech/core';\nimport { UiConfirmService } from '@maro-tech/core';\nimport { UiEntityDocumentsService, UiEntityDocumentFile, UiEntityDocumentRecognitionStatus } from './documents.service';\nimport { DocumentsUploadModalComponent } from './upload-modal/documents-upload-modal.component';\nimport { UiSelectOption } from '@maro-tech/form';\nimport { DocumentsTextModalComponent } from './text-modal/documents-text-modal.component';\nimport { DocumentsImagePreviewModalComponent } from './image-preview-modal/documents-image-preview-modal.component';\n\nconst DOCUMENT_TYPE_DICTIONARY = 'doc_type';\nconst RECOGNITION_POLLING_TIMEOUT_MS = 5 * 60 * 1000;\n\n@Component({\n selector: 'app-documents',\n standalone: true,\n imports: [\n CommonModule,\n LucideAngularModule,\n UiButtonComponent,\n DocumentsUploadModalComponent,\n DocumentsTextModalComponent,\n DocumentsImagePreviewModalComponent,\n ],\n templateUrl: './documents.component.html',\n})\nexport class DocumentsComponent {\n readonly entity = input<string>('');\n readonly id = input<string>('');\n readonly documentTypeDictionary = DOCUMENT_TYPE_DICTIONARY;\n\n readonly documents = signal<UiEntityDocumentFile[]>([]);\n readonly documentTypeOptions = signal<UiSelectOption[]>([]);\n readonly isUploadOpen = signal(false);\n readonly isLoading = signal(false);\n readonly recognizingDocumentId = signal<string | null>(null);\n readonly isTextOpen = signal(false);\n readonly isImagePreviewOpen = signal(false);\n readonly textTarget = signal<UiEntityDocumentFile | null>(null);\n readonly imagePreviewTarget = signal<UiEntityDocumentFile | null>(null);\n readonly deletingDocumentId = signal<string | null>(null);\n readonly eyeIcon = Eye;\n readonly fileIcon = FileText;\n readonly plusIcon = Plus;\n readonly sparkleIcon = Sparkles;\n readonly deleteIcon = Trash;\n readonly isAdmin = toSignal(\n inject(CardCurrentUserService).getCurrentUser().pipe(\n map((user) => String(user.role || '').trim().toUpperCase() === 'ADMIN'),\n ),\n { initialValue: false },\n );\n\n private readonly documentsService = inject(UiEntityDocumentsService);\n private readonly dictionaryService = inject(CardDictionaryService);\n private readonly toast = inject(UiToastService);\n private readonly confirmService = inject(UiConfirmService);\n private readonly destroyRef = inject(DestroyRef);\n private loadedDocumentTypeDictionary = '';\n private recognitionPolling?: Subscription;\n private readonly reloadEffect = effect(() => {\n this.entity();\n this.id();\n this.loadDocuments();\n });\n private readonly documentTypeDictionaryEffect = effect(() => {\n const dictionaryName = this.documentTypeDictionary.trim();\n if (!dictionaryName) {\n this.loadedDocumentTypeDictionary = '';\n this.documentTypeOptions.set([]);\n return;\n }\n\n if (dictionaryName === this.loadedDocumentTypeDictionary) {\n return;\n }\n\n this.loadedDocumentTypeDictionary = dictionaryName;\n this.dictionaryService.getSuggestByName(dictionaryName).subscribe({\n next: (items) => {\n this.documentTypeOptions.set(\n (items || [])\n .map((item) => ({\n value: String(item.key || ''),\n label: String(item.label || item.key || ''),\n }))\n .filter((item) => !!item.value),\n );\n },\n error: () => {\n this.documentTypeOptions.set([]);\n },\n });\n });\n\n openUploadModal(): void {\n this.isUploadOpen.set(true);\n }\n\n closeUploadModal(): void {\n this.isUploadOpen.set(false);\n }\n\n openTextModal(document: UiEntityDocumentFile): void {\n this.textTarget.set(document);\n this.isTextOpen.set(true);\n }\n\n closeTextModal(): void {\n this.isTextOpen.set(false);\n this.textTarget.set(null);\n }\n\n openImagePreview(document: UiEntityDocumentFile): void {\n if (!this.isImage(document)) {\n return;\n }\n this.imagePreviewTarget.set(document);\n this.isImagePreviewOpen.set(true);\n }\n\n closeImagePreview(): void {\n this.isImagePreviewOpen.set(false);\n this.imagePreviewTarget.set(null);\n }\n\n recognizeText(document: UiEntityDocumentFile): void {\n if (!this.isImage(document)) {\n return;\n }\n if (document.recognitionStatus === 'COMPLETED') {\n return;\n }\n if (this.isDocumentRecognizing(document)) {\n return;\n }\n\n this.recognizingDocumentId.set(document.id);\n this.documentsService.recognize(document.id).subscribe({\n next: (updated) => {\n this.recognizingDocumentId.set(null);\n this.upsertDocument(updated);\n this.updateRecognitionPolling();\n this.toast.show('Розпізнавання запущено', 'success', 2200);\n if (this.textTarget()?.id === updated.id) {\n this.textTarget.set(updated);\n }\n },\n error: (error) => {\n this.recognizingDocumentId.set(null);\n this.toast.show(error?.error?.message || 'Не вдалося розпізнати дані', 'error', 3200);\n },\n });\n }\n\n removeDocument(document: UiEntityDocumentFile): void {\n if (!this.isAdmin() || this.deletingDocumentId()) {\n return;\n }\n\n this.confirmService.open({\n title: 'Видалити документ',\n text: `Видалити документ «${document.name || 'Без назви'}»? Дію не можна буде скасувати.`,\n submit: 'Видалити',\n danger: true,\n }).subscribe((confirmed) => {\n if (!confirmed) return;\n\n this.deletingDocumentId.set(document.id);\n this.documentsService.remove(document.id).subscribe({\n next: () => {\n this.documents.update((documents) => documents.filter((item) => item.id !== document.id));\n if (this.textTarget()?.id === document.id) this.closeTextModal();\n if (this.imagePreviewTarget()?.id === document.id) this.closeImagePreview();\n this.deletingDocumentId.set(null);\n this.updateRecognitionPolling();\n this.toast.show('Документ видалено', 'success', 2200);\n },\n error: (error) => {\n this.deletingDocumentId.set(null);\n this.toast.show(error?.error?.message || 'Не вдалося видалити документ', 'error', 3200);\n },\n });\n });\n }\n\n isDocumentRecognizing(document: UiEntityDocumentFile | null): boolean {\n return !!document?.id && this.recognizingDocumentId() === document.id;\n }\n\n trackDocument(_: number, document: UiEntityDocumentFile): string {\n return document.id;\n }\n\n getImagePreviewUrl(document: UiEntityDocumentFile): string {\n const match = String(document.downloadUrl || '').match(/^(.*\\/api\\/files\\/[^/?#]+)(?:\\?.*)?$/i);\n return match ? `${match[1]}/preview?scale=25` : document.downloadUrl;\n }\n\n private upsertDocument(updated: Pick<UiEntityDocumentFile, 'id'> & Partial<UiEntityDocumentFile>): void {\n this.documents.update((current) => {\n const next = current.slice();\n const index = next.findIndex((item) => item.id === updated.id);\n if (index >= 0) {\n next[index] = { ...next[index], ...updated };\n }\n return next;\n });\n }\n\n private loadDocuments(): void {\n const entity = this.resolveEntity();\n const id = this.resolveId();\n if (!entity || !id) {\n this.documents.set([]);\n return;\n }\n\n this.isLoading.set(true);\n this.documentsService.list(entity, id).subscribe({\n next: (rows) => {\n this.documents.set(rows || []);\n this.isLoading.set(false);\n this.updateRecognitionPolling();\n },\n error: () => {\n this.documents.set([]);\n this.isLoading.set(false);\n },\n });\n }\n\n formatSize(size?: number | string | null): string {\n const normalizedSize = Number(size);\n if (!Number.isFinite(normalizedSize)) return '-';\n size = normalizedSize;\n const bytes = Number(size || 0);\n if (!Number.isFinite(bytes) || bytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n let value = bytes;\n let index = 0;\n while (value >= 1024 && index < units.length - 1) {\n value /= 1024;\n index += 1;\n }\n return `${value >= 10 || index === 0 ? Math.round(value) : value.toFixed(1)} ${units[index]}`;\n }\n\n private resolveEntity(): string {\n return String(this.entity() || '').trim();\n }\n\n private resolveId(): string {\n return String(this.id() || '').trim();\n }\n\n isImage(document: UiEntityDocumentFile): boolean {\n return String(document.type || '').startsWith('image/');\n }\n\n isPdf(document: UiEntityDocumentFile): boolean {\n const type = String(document.type || '').toLowerCase();\n const name = String(document.name || '').toLowerCase();\n return type === 'application/pdf' || name.endsWith('.pdf');\n }\n\n getFileBadge(document: UiEntityDocumentFile): string {\n if (this.isPdf(document)) return 'PDF';\n if (this.isImage(document)) return 'IMG';\n const name = String(document.name || '').trim();\n if (name.includes('.')) {\n return name.split('.').pop()!.slice(0, 5).toUpperCase();\n }\n return 'FILE';\n }\n\n getDocumentTypeLabel(document: UiEntityDocumentFile): string {\n const label = String(document.documentTypeLabel || '').trim();\n if (label) return label;\n\n const documentTypeId = String(document.documentTypeId || '').trim();\n if (!documentTypeId) return '';\n\n return this.documentTypeOptions().find((option) => option.value === documentTypeId)?.label ?? documentTypeId;\n }\n\n reloadDocuments(): void {\n this.loadDocuments();\n }\n\n isRecognitionPending(document: UiEntityDocumentFile): boolean {\n return this.isImage(document) && (document.recognitionStatus === 'PENDING' || document.recognitionStatus === 'PROCESSING');\n }\n\n isRecognitionCompleted(document: UiEntityDocumentFile): boolean {\n return this.isImage(document) && document.recognitionStatus === 'COMPLETED';\n }\n\n getRecognitionStatusLabel(document: UiEntityDocumentFile): string {\n if (document.recognitionStatus === 'FAILED') return 'Не вдалося розпізнати';\n if (this.isRecognitionPending(document)) {\n return document.recognitionStatus === 'PROCESSING' ? 'Розпізнається у фоні' : 'Очікує розпізнавання';\n }\n return document.recognitionStatus === 'COMPLETED' ? 'Розпізнано' : '';\n }\n\n private updateRecognitionPolling(): void {\n if (!this.documents().some((document) => this.isRecognitionPending(document))) {\n this.recognitionPolling?.unsubscribe();\n this.recognitionPolling = undefined;\n return;\n }\n if (this.recognitionPolling) return;\n\n this.recognitionPolling = timer(2500, 4000)\n .pipe(\n exhaustMap(() => {\n const pendingDocuments = this.documents().filter((document) => this.isRecognitionPending(document));\n if (!pendingDocuments.length) return of([] as UiEntityDocumentRecognitionStatus[]);\n\n return forkJoin(\n pendingDocuments.map((document) =>\n this.documentsService.recognitionStatus(document.id).pipe(\n catchError(() => of(null)),\n ),\n ),\n ).pipe(\n map((statuses) => statuses.filter((status): status is UiEntityDocumentRecognitionStatus => !!status)),\n );\n }),\n map((statuses) => {\n statuses.forEach((status) => this.upsertDocument(status));\n return statuses;\n }),\n takeWhile(() => this.documents().some((document) => this.isRecognitionPending(document)), true),\n takeUntilDestroyed(this.destroyRef),\n takeUntil(timer(RECOGNITION_POLLING_TIMEOUT_MS)),\n finalize(() => {\n this.recognitionPolling = undefined;\n }),\n )\n .subscribe();\n }\n}\n","<div class=\"space-y-4\">\n <div>\n @if (isLoading()) {\n <div class=\"rounded-2xl border border-dashed border-slate-200 bg-slate-50 px-4 py-8 text-center text-sm text-slate-500\">\n Завантаження документів...\n </div>\n } @else if (documents().length === 0) {\n <div class=\"rounded-2xl border border-dashed border-slate-200 bg-slate-50 px-4 py-8 text-center text-sm text-slate-500\">\n Документи відсутні\n </div>\n } @else {\n <div class=\"grid gap-3\">\n @for (document of documents(); track trackDocument($index, document)) {\n <article class=\"flex flex-col gap-4 rounded-2xl border border-slate-200 bg-white p-4 shadow-sm sm:flex-row sm:items-center sm:justify-between\">\n @if (isImage(document)) {\n <button\n type=\"button\"\n class=\"block shrink-0 overflow-hidden rounded-2xl border border-slate-200 bg-slate-50 transition hover:border-slate-300 hover:bg-slate-100 h-28 w-40\"\n (click)=\"openImagePreview(document)\"\n >\n <img [src]=\"getImagePreviewUrl(document)\" [alt]=\"document.name || 'Документ'\" loading=\"lazy\" decoding=\"async\" class=\"h-full w-full object-cover\">\n </button>\n } @else {\n <a\n class=\"block shrink-0 overflow-hidden rounded-2xl border border-slate-200 bg-slate-50 transition hover:border-slate-300 hover:bg-slate-100\"\n [href]=\"document.downloadUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [class.h-28]=\"isPdf(document)\"\n [class.w-40]=\"isPdf(document)\"\n [class.h-20]=\"!isPdf(document)\"\n [class.w-24]=\"!isPdf(document)\"\n >\n @if (isPdf(document)) {\n <div class=\"flex h-full w-full flex-col items-center justify-center gap-2 px-3 py-4 text-slate-700\">\n <div class=\"flex h-11 w-11 items-center justify-center rounded-2xl bg-white text-slate-900 shadow-sm\">\n <lucide-icon [img]=\"fileIcon\"></lucide-icon>\n </div>\n <span class=\"text-xs font-semibold uppercase tracking-[0.18em] text-slate-600\">PDF</span>\n </div>\n } @else {\n <div class=\"flex h-full w-full flex-col items-center justify-center gap-2 px-3 py-4 text-slate-700\">\n <div class=\"flex h-11 w-11 items-center justify-center rounded-2xl bg-white text-slate-900 shadow-sm\">\n <lucide-icon [img]=\"fileIcon\"></lucide-icon>\n </div>\n <span class=\"text-[10px] font-semibold uppercase tracking-[0.18em] text-slate-500\">\n {{ getFileBadge(document) }}\n </span>\n </div>\n }\n </a>\n }\n\n <div class=\"min-w-0 flex-1\">\n <div class=\"flex flex-col gap-2 lg:flex-row lg:items-start lg:justify-between\">\n <div class=\"min-w-0\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <h4 class=\"truncate text-sm font-semibold text-slate-900\">\n {{ document.name || 'Без назви' }}\n </h4>\n @if (getDocumentTypeLabel(document)) {\n <span class=\"inline-flex shrink-0 items-center rounded-full border border-sky-200 bg-sky-50 px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-sky-700\">\n {{ getDocumentTypeLabel(document) }}\n </span>\n }\n </div>\n <p class=\"mt-1 text-xs text-slate-500\">\n {{ formatSize(document.size) }} · {{ document.type }}\n </p>\n </div>\n\n <div class=\"flex flex-wrap items-center gap-2\">\n <ui-button variant=\"ghost\" size=\"sm\" (click)=\"openTextModal(document)\">\n <lucide-icon [img]=\"eyeIcon\"></lucide-icon>\n Перегляд\n </ui-button>\n @if (isImage(document)) {\n <ui-button variant=\"ghost\" size=\"sm\" [disabled]=\"isDocumentRecognizing(document) || isRecognitionPending(document) || isRecognitionCompleted(document)\" (click)=\"recognizeText(document)\">\n <lucide-icon [img]=\"sparkleIcon\"></lucide-icon>\n {{ isDocumentRecognizing(document) ? 'Розпізнавання...' : 'Розпізнати дані' }}\n </ui-button>\n }\n @if (isAdmin()) {\n <ui-button variant=\"ghost\" size=\"sm\" [disabled]=\"deletingDocumentId() === document.id\" (click)=\"removeDocument(document)\">\n <lucide-icon [img]=\"deleteIcon\"></lucide-icon>\n {{ deletingDocumentId() === document.id ? 'Видалення...' : 'Видалити' }}\n </ui-button>\n }\n </div>\n </div>\n\n <div class=\"mt-3 flex flex-wrap items-center justify-between gap-2\">\n <a\n class=\"inline-flex items-center rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm font-medium text-slate-700 transition hover:border-slate-300 hover:bg-slate-50\"\n [href]=\"document.downloadUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Завантажити\n </a>\n @if (isImage(document) && getRecognitionStatusLabel(document)) {\n <span\n class=\"inline-flex items-center rounded-full border px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.12em]\"\n [class.border-amber-200]=\"isRecognitionPending(document)\"\n [class.bg-amber-50]=\"isRecognitionPending(document)\"\n [class.text-amber-700]=\"isRecognitionPending(document)\"\n [class.border-rose-200]=\"document.recognitionStatus === 'FAILED'\"\n [class.bg-rose-50]=\"document.recognitionStatus === 'FAILED'\"\n [class.text-rose-700]=\"document.recognitionStatus === 'FAILED'\"\n [class.border-emerald-200]=\"document.recognitionStatus === 'COMPLETED'\"\n [class.bg-emerald-50]=\"document.recognitionStatus === 'COMPLETED'\"\n [class.text-emerald-700]=\"document.recognitionStatus === 'COMPLETED'\"\n >\n {{ getRecognitionStatusLabel(document) }}\n </span>\n }\n </div>\n </div>\n </article>\n }\n </div>\n }\n </div>\n\n <div class=\"flex flex-col gap-3 rounded-2xl border border-dashed border-slate-200 bg-slate-50 px-4 py-4\">\n <div>\n <h4 class=\"text-sm font-semibold text-slate-900\">Завантаження документів у файлове сховище</h4>\n <p class=\"mt-1 text-xs text-slate-500\">Додайте нові файли до картки безпосередньо тут.</p>\n </div>\n\n <div class=\"flex w-full flex-col gap-2 sm:w-auto\">\n <ui-button variant=\"secondary\" size=\"sm\" (click)=\"openUploadModal()\">\n <lucide-icon [img]=\"plusIcon\"></lucide-icon>\n Завантажити документ\n </ui-button>\n </div>\n </div>\n</div>\n\n<app-documents-text-modal\n [isOpen]=\"isTextOpen()\"\n [document]=\"textTarget()\"\n (closed)=\"closeTextModal()\"\n (recognizeRequested)=\"textTarget() && recognizeText(textTarget()!)\"\n></app-documents-text-modal>\n\n<app-documents-upload-modal\n [isOpen]=\"isUploadOpen()\"\n [entity]=\"entity()\"\n [id]=\"id()\"\n (closed)=\"closeUploadModal()\"\n (saved)=\"reloadDocuments()\"\n></app-documents-upload-modal>\n\n<app-documents-image-preview-modal\n [isOpen]=\"isImagePreviewOpen()\"\n [document]=\"imagePreviewTarget()\"\n (closed)=\"closeImagePreview()\"\n></app-documents-image-preview-modal>\n","import { CommonModule } from '@angular/common';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Component, DestroyRef, effect, inject, input, signal, untracked } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EventBus } from '@maro-tech/core';\nimport { ENTITY_UPDATED, EntityUpdatedEvent } from '../../card-events';\nimport { CardImageService, UI_CARD_API_BASE_URL, cardApiResourceUrl } from '../../card-api';\nimport { ImagesViewerComponent } from '../images/images-viewer/images-viewer.component';\n\ninterface AuditFieldChange {\n label: string;\n type?: string;\n from: { value: unknown; display: string; url?: string };\n to: { value: unknown; display: string; url?: string };\n}\n\ninterface AuditChange {\n action: string;\n entityId: string;\n entityType: string;\n changedFields: Record<string, AuditFieldChange>;\n}\n\ninterface AuditOperation {\n id: string;\n actorName?: string | null;\n description: string;\n actionCode: string;\n createdAt: string;\n changes: AuditChange[];\n}\n\n@Component({\n selector: 'app-history-tab',\n standalone: true,\n imports: [CommonModule, ImagesViewerComponent, RouterLink],\n templateUrl: './history-tab.component.html',\n})\nexport class HistoryTabComponent {\n readonly entity = input<string>('');\n readonly primaryEntity = input<string>('');\n readonly id = input<string>('');\n readonly entityLabels = input<Record<string, string>>({});\n\n readonly operations = signal<AuditOperation[]>([]);\n readonly isLoading = signal(false);\n readonly hasError = signal(false);\n readonly expandedOperationIds = signal<Set<string>>(new Set());\n readonly viewerUrls = signal<string[]>([]);\n readonly isViewerOpen = signal(false);\n\n private readonly http = inject(HttpClient);\n private readonly imageService = inject(CardImageService);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n private readonly eventBus = inject(EventBus);\n private readonly destroyRef = inject(DestroyRef);\n private readonly refreshSequence = signal(0);\n private lastRequestKey = '';\n\n constructor() {\n this.eventBus.on<EntityUpdatedEvent>(ENTITY_UPDATED)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event.entity && event.entity !== this.entity()) return;\n if (event.recordId && event.recordId !== this.id()) return;\n this.refreshSequence.update((value) => value + 1);\n });\n\n // Document events contain the useful information in the related entity\n // change. Keep those details visible without requiring an extra click.\n effect(() => {\n const documentOperationIds = new Set(\n this.operations()\n .filter((operation) => operation.actionCode.startsWith('documents.'))\n .map((operation) => operation.id),\n );\n if (!documentOperationIds.size) return;\n const next = new Set(untracked(() => this.expandedOperationIds()));\n documentOperationIds.forEach((id) => next.add(id));\n this.expandedOperationIds.set(next);\n });\n }\n\n private readonly loadEffect = effect(() => {\n const entity = this.entity().trim();\n const id = this.id().trim();\n const refreshSequence = this.refreshSequence();\n const requestKey = `${entity}:${id}:${refreshSequence}`;\n if (requestKey === this.lastRequestKey) return;\n this.lastRequestKey = requestKey;\n\n if (!entity || !id) {\n this.operations.set([]);\n return;\n }\n\n this.isLoading.set(true);\n this.hasError.set(false);\n const cacheBuster = Date.now();\n this.http\n .get<AuditOperation[]>(cardApiResourceUrl(this.baseUrl, `/api/crud/${encodeURIComponent(entity)}/${encodeURIComponent(id)}/history?_ts=${cacheBuster}`), {\n headers: new HttpHeaders({\n 'Cache-Control': 'no-cache, no-store, max-age=0',\n Pragma: 'no-cache',\n }),\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (operations) => {\n this.operations.set(operations || []);\n this.isLoading.set(false);\n },\n error: () => {\n this.operations.set([]);\n this.hasError.set(true);\n this.isLoading.set(false);\n },\n });\n });\n\n toggleOperation(id: string): void {\n const next = new Set(this.expandedOperationIds());\n if (next.has(id)) next.delete(id);\n else next.add(id);\n this.expandedOperationIds.set(next);\n }\n\n isExpanded(id: string): boolean {\n return this.expandedOperationIds().has(id);\n }\n\n getEntityLabel(entityType: string): string {\n const labels: Record<string, string> = {\n entity_files: 'Документ',\n files: 'Файл',\n };\n return this.entityLabels()[entityType] || labels[entityType] || entityType;\n }\n\n getActionLabel(action: string): string {\n const labels: Record<string, string> = {\n created: 'Створено',\n updated: 'Змінено',\n deleted: 'Видалено',\n };\n return labels[action] || action;\n }\n\n isImageField(field: AuditFieldChange): boolean {\n return field.type === 'image';\n }\n\n isHtmlField(field: AuditFieldChange): boolean {\n return field.type === 'html';\n }\n\n isFileField(field: AuditFieldChange): boolean {\n return field.type === 'file';\n }\n\n getImageUrls(value: unknown): string[] {\n const values = Array.isArray(value) ? value : [value];\n return values\n .map((item) => String(item ?? '').trim())\n .filter(Boolean)\n .map((id) => this.imageService.getPhotoLink(id) || '')\n .filter(Boolean);\n }\n\n openImageViewer(urls: string[]): void {\n if (!urls.length) return;\n this.viewerUrls.set(urls);\n this.isViewerOpen.set(true);\n }\n\n closeImageViewer(): void {\n this.isViewerOpen.set(false);\n }\n\n getAffectedSummary(operation: AuditOperation): string {\n const counts = new Map<string, number>();\n for (const change of this.getRelatedChanges(operation)) {\n counts.set(change.entityType, (counts.get(change.entityType) || 0) + 1);\n }\n return [...counts.entries()]\n .map(([type, count]) => `${this.getEntityLabel(type)}: ${count}`)\n .join(' · ');\n }\n\n getPrimaryChanges(operation: AuditOperation): AuditChange[] {\n const primaryTypes = new Set([this.entity(), this.primaryEntity()].filter(Boolean));\n return (operation.changes || []).filter((change) => primaryTypes.has(change.entityType));\n }\n\n getRelatedChanges(operation: AuditOperation): AuditChange[] {\n const primaryChanges = this.getPrimaryChanges(operation);\n const primaryTypes = new Set([this.entity(), this.primaryEntity()].filter(Boolean));\n return primaryChanges.length\n ? (operation.changes || []).filter((change) => !primaryTypes.has(change.entityType))\n : operation.changes || [];\n }\n\n}\n","<section class=\"space-y-4\">\n @if (isLoading()) {\n <div class=\"rounded-2xl border border-slate-200 bg-white p-6 text-sm text-slate-500\">\n Завантаження історії…\n </div>\n } @else if (hasError()) {\n <div class=\"rounded-2xl border border-red-200 bg-red-50 p-6 text-sm text-red-700\">\n Не вдалося завантажити історію змін.\n </div>\n } @else if (!operations().length) {\n <div class=\"rounded-2xl border border-slate-200 bg-white p-6 text-sm text-slate-500\">\n Історія змін поки порожня.\n </div>\n } @else {\n <div class=\"space-y-3\">\n @for (operation of operations(); track operation.id) {\n <article class=\"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm\">\n <div class=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h3 class=\"text-sm font-semibold text-slate-900\">{{ operation.description }}</h3>\n @if (operation.actorName) {\n <p class=\"mt-1 text-sm text-slate-500\">{{ operation.actorName }}</p>\n }\n </div>\n <time class=\"text-xs text-slate-400\" [dateTime]=\"operation.createdAt\">\n {{ operation.createdAt | date: 'dd.MM.yyyy HH:mm' }}\n </time>\n </div>\n\n @if (getPrimaryChanges(operation).length) {\n <div class=\"mt-4 space-y-2 border-t border-slate-100 pt-4\">\n @for (change of getPrimaryChanges(operation); track change.entityId + change.entityType) {\n @for (field of (change.changedFields | keyvalue); track field.key) {\n <div class=\"flex flex-wrap items-center gap-2 text-sm\">\n <span class=\"font-medium text-slate-700\">{{ field.value.label }}</span>\n @if (isImageField(field.value)) {\n @if (getImageUrls(field.value.from.value).length) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (url of getImageUrls(field.value.from.value); track url; let imageIndex = $index) {\n <button type=\"button\" class=\"h-14 w-14 overflow-hidden rounded-lg border border-slate-200 bg-slate-100\" (click)=\"openImageViewer(getImageUrls(field.value.from.value))\" [attr.aria-label]=\"'Відкрити старе фото ' + (imageIndex + 1)\">\n <img [src]=\"url\" [alt]=\"'Старе фото ' + (imageIndex + 1)\" class=\"h-full w-full object-cover\" />\n </button>\n }\n </div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isFileField(field.value)) {\n @if (field.value.from.url) {\n <a class=\"font-medium text-sky-700 underline\" [href]=\"field.value.from.url\" target=\"_blank\" rel=\"noopener noreferrer\">Завантажити файл</a>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else if (isHtmlField(field.value)) {\n @if (field.value.from.display !== 'Не задано') {\n <div class=\"prose prose-sm max-w-none text-slate-500\" [innerHTML]=\"field.value.from.display\"></div>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else {\n @if (field.value.from.url) {\n <a class=\"font-medium text-sky-700 underline\" [routerLink]=\"field.value.from.url\">{{ field.value.from.display }}</a>\n } @else {\n <span class=\"font-medium text-slate-900\">{{ field.value.from.display }}</span>\n }\n }\n <span class=\"text-slate-400\">→</span>\n @if (isImageField(field.value)) {\n @if (getImageUrls(field.value.to.value).length) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (url of getImageUrls(field.value.to.value); track url; let imageIndex = $index) {\n <button type=\"button\" class=\"h-14 w-14 overflow-hidden rounded-lg border border-slate-200 bg-slate-100\" (click)=\"openImageViewer(getImageUrls(field.value.to.value))\" [attr.aria-label]=\"'Відкрити нове фото ' + (imageIndex + 1)\">\n <img [src]=\"url\" [alt]=\"'Нове фото ' + (imageIndex + 1)\" class=\"h-full w-full object-cover\" />\n </button>\n }\n </div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isFileField(field.value)) {\n @if (field.value.to.url) {\n <a class=\"font-medium text-sky-700 underline\" [href]=\"field.value.to.url\" target=\"_blank\" rel=\"noopener noreferrer\">Завантажити файл</a>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isHtmlField(field.value)) {\n @if (field.value.to.display !== 'Не задано') {\n <div class=\"prose prose-sm max-w-none text-slate-900\" [innerHTML]=\"field.value.to.display\"></div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else {\n @if (field.value.to.url) {\n <a class=\"font-medium text-sky-700 underline\" [routerLink]=\"field.value.to.url\">{{ field.value.to.display }}</a>\n } @else {\n <span class=\"font-medium text-slate-900\">{{ field.value.to.display }}</span>\n }\n }\n </div>\n }\n }\n </div>\n }\n\n @if (getRelatedChanges(operation).length) {\n <div class=\"mt-4 border-t border-slate-100 pt-4\">\n <button\n type=\"button\"\n class=\"flex w-full items-center justify-between gap-3 text-left text-sm text-slate-600\"\n [attr.aria-expanded]=\"isExpanded(operation.id)\"\n (click)=\"toggleOperation(operation.id)\"\n >\n <span>\n Деталі змін:\n <span class=\"font-medium text-slate-900\">{{ getAffectedSummary(operation) }}</span>\n </span>\n <span class=\"text-lg leading-none text-slate-400\">{{ isExpanded(operation.id) ? '−' : '+' }}</span>\n </button>\n\n @if (isExpanded(operation.id)) {\n <div class=\"mt-4 space-y-4\">\n @for (change of getRelatedChanges(operation); track change.entityId + change.entityType) {\n <div class=\"rounded-xl bg-slate-50 p-3\">\n <p class=\"mb-2 text-xs font-semibold uppercase tracking-[0.16em] text-slate-500\">\n {{ getEntityLabel(change.entityType) }} · {{ getActionLabel(change.action) }}\n </p>\n @for (field of (change.changedFields | keyvalue); track field.key) {\n <div class=\"flex flex-wrap items-center gap-2 text-sm\">\n <span class=\"font-medium text-slate-700\">{{ field.value.label }}</span>\n @if (isImageField(field.value)) {\n @if (getImageUrls(field.value.from.value).length) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (url of getImageUrls(field.value.from.value); track url; let imageIndex = $index) {\n <button type=\"button\" class=\"h-14 w-14 overflow-hidden rounded-lg border border-slate-200 bg-white\" (click)=\"openImageViewer(getImageUrls(field.value.from.value))\" [attr.aria-label]=\"'Відкрити старе фото ' + (imageIndex + 1)\">\n <img [src]=\"url\" [alt]=\"'Старе фото ' + (imageIndex + 1)\" class=\"h-full w-full object-cover\" />\n </button>\n }\n </div>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else if (isFileField(field.value)) {\n @if (field.value.from.url) {\n <a class=\"text-sky-700 underline\" [href]=\"field.value.from.url\" target=\"_blank\" rel=\"noopener noreferrer\">Завантажити файл</a>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else if (isHtmlField(field.value)) {\n @if (field.value.from.display !== 'Не задано') {\n <div class=\"prose prose-sm max-w-none text-slate-500\" [innerHTML]=\"field.value.from.display\"></div>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else {\n @if (field.value.from.url) {\n <a class=\"text-sky-700 underline\" [routerLink]=\"field.value.from.url\">{{ field.value.from.display }}</a>\n } @else {\n <span class=\"text-slate-400\">{{ field.value.from.display }}</span>\n }\n }\n <span class=\"text-slate-400\">→</span>\n @if (isImageField(field.value)) {\n @if (getImageUrls(field.value.to.value).length) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (url of getImageUrls(field.value.to.value); track url; let imageIndex = $index) {\n <button type=\"button\" class=\"h-14 w-14 overflow-hidden rounded-lg border border-slate-200 bg-white\" (click)=\"openImageViewer(getImageUrls(field.value.to.value))\" [attr.aria-label]=\"'Відкрити нове фото ' + (imageIndex + 1)\">\n <img [src]=\"url\" [alt]=\"'Нове фото ' + (imageIndex + 1)\" class=\"h-full w-full object-cover\" />\n </button>\n }\n </div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isFileField(field.value)) {\n @if (field.value.to.url) {\n <a class=\"font-medium text-sky-700 underline\" [href]=\"field.value.to.url\" target=\"_blank\" rel=\"noopener noreferrer\">Завантажити файл</a>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isHtmlField(field.value)) {\n @if (field.value.to.display !== 'Не задано') {\n <div class=\"prose prose-sm max-w-none text-slate-900\" [innerHTML]=\"field.value.to.display\"></div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else {\n @if (field.value.to.url) {\n <a class=\"font-medium text-sky-700 underline\" [routerLink]=\"field.value.to.url\">{{ field.value.to.display }}</a>\n } @else {\n <span class=\"font-medium text-slate-900\">{{ field.value.to.display }}</span>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </article>\n }\n </div>\n }\n</section>\n\n@if (isViewerOpen()) {\n <app-images-viewer [urls]=\"viewerUrls()\" (closed)=\"closeImageViewer()\" />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"maro-tech-card.mjs","sources":["../../../src/lib/card-config.ts","../../../src/lib/card-events.ts","../../../src/lib/components/card-section-header.component.ts","../../../src/lib/tabs/html/html-tab.component.ts","../../../src/lib/tabs/html/html-tab.component.html","../../../src/lib/tabs/images/images-viewer/images-viewer.component.ts","../../../src/lib/tabs/images/images-viewer/images-viewer.component.html","../../../src/lib/tabs/details-grid/details-grid.component.ts","../../../src/lib/tabs/details-grid/details-grid.component.html","../../../src/lib/tabs/images/images.component.ts","../../../src/lib/tabs/images/images.component.html","../../../src/lib/tabs/table/table.component.ts","../../../src/lib/tabs/table/table.component.html","../../../src/lib/card-tab-registry.token.ts","../../../src/lib/layouts/panels/ui-card-panels-layout.component.ts","../../../src/lib/layouts/panels/ui-card-panels-layout.component.html","../../../src/lib/layouts/tabs/ui-card-tabs-layout.component.ts","../../../src/lib/layouts/tabs/ui-card-tabs-layout.component.html","../../../src/lib/card.component.ts","../../../src/lib/card.component.html","../../../src/lib/card-host.token.ts","../../../src/lib/card-api.ts","../../../src/lib/tabs/documents/documents.service.ts","../../../src/lib/tabs/documents/upload-modal/documents-upload-modal.component.ts","../../../src/lib/tabs/documents/upload-modal/documents-upload-modal.component.html","../../../src/lib/tabs/documents/text-modal/documents-text-modal.component.ts","../../../src/lib/tabs/documents/text-modal/documents-text-modal.component.html","../../../src/lib/tabs/documents/image-preview-modal/documents-image-preview-modal.component.ts","../../../src/lib/tabs/documents/image-preview-modal/documents-image-preview-modal.component.html","../../../src/lib/tabs/documents/documents.component.ts","../../../src/lib/tabs/documents/documents.component.html","../../../src/lib/tabs/history/history-tab.component.ts","../../../src/lib/tabs/history/history-tab.component.html","../../../src/maro-tech-card.ts"],"sourcesContent":["import type { UiEntityCardAction } from './card-host.token';\nimport type { UiCardLayoutInput, UiCardTabField } from './card.models';\n\nexport type CardData = Record<string, unknown>;\n\nexport type CardField = UiCardTabField;\nexport type CardAction = UiEntityCardAction;\n\nexport interface CardSection {\n id: string;\n title?: string;\n header?: boolean;\n col?: number;\n layout?: UiCardLayoutInput;\n component?: string;\n html?: string;\n props?: Record<string, unknown>;\n actions?: CardAction[];\n tabs?: CardSection[];\n panels?: CardSection[];\n}\n\nexport type CardTab = CardSection;\n\nexport interface CardConfig {\n title: string;\n layout?: UiCardLayoutInput;\n actions?: CardAction[];\n tabs: CardSection[];\n data?: CardData | null;\n}\n\nexport interface CardPanelInput {\n config: CardSection;\n data: CardData | null;\n}\n\nexport function normalizeCardConfig<T extends CardConfig>(config: T): T {\n return {\n ...config,\n tabs: normalizeSections(config.tabs),\n actions: normalizeActions(config.actions),\n } as T;\n}\n\nexport function resolveCardConfig<T extends CardConfig>(config: T, data: CardData | null): T {\n return {\n ...config,\n data,\n actions: resolveActions(config.actions, data),\n tabs: resolveSections(config.tabs, data),\n } as T;\n}\n\nfunction normalizeSections(sections: CardSection[] | undefined): CardSection[] {\n return (sections || []).map((section) => ({\n ...section,\n component: section.component || (section.html ? 'html' : undefined),\n actions: normalizeActions(section.actions),\n tabs: section.tabs?.length ? normalizeSections(section.tabs) : section.tabs,\n panels: section.panels?.length ? normalizeSections(section.panels) : section.panels,\n }));\n}\n\nfunction normalizeActions<T extends CardAction>(actions: T[] | undefined): T[] {\n return (actions || []).filter(Boolean) as T[];\n}\n\nfunction resolveSections(sections: CardSection[] | undefined, data: CardData | null): CardSection[] {\n return (sections || []).map((section) => ({\n ...section,\n props: resolveValue(section.props, data) as Record<string, unknown> | undefined,\n actions: resolveActions(section.actions, data),\n tabs: section.tabs?.length ? resolveSections(section.tabs, data) : section.tabs,\n panels: section.panels?.length ? resolveSections(section.panels, data) : section.panels,\n }));\n}\n\nfunction resolveActions(actions: CardAction[] | undefined, data: CardData | null): CardAction[] {\n return resolveValue(actions, data) as CardAction[];\n}\n\nfunction resolveValue(value: unknown, data: CardData | null): unknown {\n if (typeof value === 'string') {\n const match = value.match(/^\\{\\{([a-zA-Z0-9_.-]+)\\}\\}$/);\n return match ? getByPath(data, match[1]) : value;\n }\n if (Array.isArray(value)) return value.map((item) => resolveValue(item, data));\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .map(([key, item]) => [key, resolveValue(item, data)])\n );\n }\n return value;\n}\n\nfunction getByPath(source: CardData | null, path: string): unknown {\n return path.split('.').reduce<unknown>((current, segment) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[segment];\n }, source);\n}\n","import type { CardActionContext, UiEntityCardAction } from './card-host.token';\n\nexport type { CardActionContext } from './card-host.token';\n\nexport const CARD_ACTION_REQUESTED = 'card.action.requested';\nexport const CARD_ACTION_STARTED = 'card.action.started';\nexport const CARD_ACTION_COMPLETED = 'card.action.completed';\nexport const CARD_ACTION_FINISHED = 'card.action.finished';\nexport const ENTITY_UPDATED = 'entity.updated';\n\nexport interface CardActionRequestedEvent {\n action: UiEntityCardAction;\n context: CardActionContext;\n}\n\nexport interface CardActionLifecycleEvent {\n actionId: string;\n context: CardActionContext;\n}\n\nexport interface EntityUpdatedEvent {\n entity?: string;\n recordId?: string;\n source?: string;\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, inject, input, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EventBus, UiButtonComponent } from '@maro-tech/core';\nimport type { UiEntityCardAction } from '../card-host.token';\nimport {\n CARD_ACTION_FINISHED,\n CARD_ACTION_REQUESTED,\n CardActionLifecycleEvent,\n CardActionRequestedEvent,\n} from '../card-events';\n\n@Component({\n selector: 'app-card-section-header',\n standalone: true,\n imports: [CommonModule, UiButtonComponent],\n template: `\n @if (variant() === 'tabs') {\n <header class=\"mb-4 flex justify-end\">\n <div class=\"flex flex-wrap gap-2 md:justify-end\">\n @for (action of actions(); track trackAction($index, action); let i = $index) {\n <ui-button\n [variant]=\"i === 0 ? 'primary' : 'ghost'\"\n [icon]=\"action.icon || ''\"\n size=\"sm\"\n [disabled]=\"isActionPending(action)\"\n (click)=\"onActionClick(action)\"\n >\n {{ isActionPending(action) ? 'Зачекайте...' : action.label }}\n </ui-button>\n }\n </div>\n </header>\n } @else {\n <header class=\"mb-4 flex flex-col gap-3 border-b border-slate-100 pb-3 md:flex-row md:items-center md:justify-between\">\n @if (title()) {\n <h3 class=\"text-lg font-semibold text-slate-900\">{{ title() }}</h3>\n } @else {\n <span></span>\n }\n\n @if (actions().length) {\n <div class=\"flex flex-wrap gap-2 md:justify-end\">\n @for (action of actions(); track trackAction($index, action); let i = $index) {\n <ui-button\n [variant]=\"i === 0 ? 'primary' : 'ghost'\"\n [icon]=\"action.icon || ''\"\n size=\"sm\"\n [disabled]=\"isActionPending(action)\"\n (click)=\"onActionClick(action)\"\n >\n {{ isActionPending(action) ? 'Зачекайте...' : action.label }}\n </ui-button>\n }\n </div>\n }\n </header>\n }\n `,\n})\nexport class CardSectionHeaderComponent {\n readonly variant = input<'tabs' | 'panels'>('panels');\n readonly title = input<string>('');\n readonly actions = input<UiEntityCardAction[]>([]);\n readonly data = input<Record<string, unknown> | null>(null);\n\n private readonly eventBus = inject(EventBus);\n private readonly destroyRef = inject(DestroyRef);\n private readonly pendingActionIdSignal = signal('');\n\n constructor() {\n this.eventBus.on<CardActionLifecycleEvent>(CARD_ACTION_FINISHED)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (this.matchesContext(event.context)) {\n this.pendingActionIdSignal.set('');\n }\n });\n }\n\n trackAction(_: number, action: UiEntityCardAction): string {\n return action.id || `${action.label}:${action.type}:${action.api || ''}:${action.formId || ''}`;\n }\n\n isActionPending(action: UiEntityCardAction): boolean {\n const pendingId = String(this.pendingActionIdSignal() || '').trim();\n const actionId = String(action.id || '').trim();\n return !!pendingId && !!actionId && pendingId === actionId;\n }\n\n onActionClick(action: UiEntityCardAction): void {\n const context = action.context || { entity: '', data: this.data() };\n this.pendingActionIdSignal.set(String(action.id || '').trim());\n this.eventBus.emit<CardActionRequestedEvent>(CARD_ACTION_REQUESTED, { action, context });\n }\n\n private matchesContext(context: { entity: string; recordId?: string }): boolean {\n return this.actions().some((action) => action.context?.entity === context.entity\n && (!context.recordId || action.context?.recordId === context.recordId));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { EventBus } from '@maro-tech/core';\nimport type { UiEntityCardAction } from '../../card-host.token';\nimport { CARD_ACTION_REQUESTED, CardActionRequestedEvent } from '../../card-events';\n\n@Component({\n selector: 'app-card-html-tab',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './html-tab.component.html',\n})\nexport class CardHtmlTabComponent {\n readonly html = input('');\n\n private readonly eventBus = inject(EventBus);\n private readonly sanitizer = inject(DomSanitizer);\n\n readonly safeHtml = computed<SafeHtml>(() => this.sanitizer.bypassSecurityTrustHtml(this.html()));\n\n onClick(event: MouseEvent): void {\n this.dispatchFromEvent(event);\n }\n\n onKeydown(event: Event): void {\n this.dispatchFromEvent(event as KeyboardEvent);\n }\n\n private dispatchFromEvent(event: MouseEvent | KeyboardEvent): void {\n const target = event.target as HTMLElement | null;\n const actionElement = target?.closest?.('[data-card-action]') as HTMLElement | null;\n if (!actionElement) return;\n\n const action = this.resolveAction(actionElement);\n if (!action) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.eventBus.emit<CardActionRequestedEvent>(CARD_ACTION_REQUESTED, {\n action,\n context: action.context || { entity: '', data: null },\n });\n }\n\n private resolveAction(actionElement: HTMLElement | null): UiEntityCardAction | null {\n const raw = actionElement?.getAttribute('data-card-action');\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return null;\n\n const action = parsed as Record<string, unknown>;\n const id = String(action['id'] || '').trim();\n const type = String(action['type'] || '').trim();\n if (!id || !type) return null;\n\n return {\n ...action,\n id,\n type,\n label: String(action['label'] || actionElement?.textContent || id).trim(),\n context: action['context'] as UiEntityCardAction['context'] || { entity: '', data: null },\n } as UiEntityCardAction;\n } catch {\n return null;\n }\n }\n\n}\n","<section\n (click)=\"onClick($event)\"\n (keydown.enter)=\"onKeydown($event)\"\n (keydown.space)=\"onKeydown($event)\"\n>\n <div [innerHTML]=\"safeHtml()\"></div>\n</section>\n","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, HostListener, effect, input, output, signal, viewChildren } from '@angular/core';\nimport { Download, LucideAngularModule } from 'lucide-angular';\n\n@Component({\n selector: 'app-images-viewer',\n standalone: true,\n imports: [CommonModule, LucideAngularModule],\n templateUrl: './images-viewer.component.html',\n})\nexport class ImagesViewerComponent {\n readonly downloadIcon = Download;\n readonly urls = input<string[]>([]);\n readonly initialIndex = input(0);\n readonly currentIndex = signal(0);\n readonly isOriginalVisible = signal(false);\n readonly thumbnailButtons = viewChildren<ElementRef<HTMLButtonElement>>('thumbnailButton');\n\n readonly closed = output<void>();\n\n private touchStartX = 0;\n private touchStartY = 0;\n private lastImagesKey = '';\n\n constructor() {\n effect(() => {\n const urls = this.urls();\n const imagesKey = `${this.initialIndex()}|${urls.join('|')}`;\n if (imagesKey === this.lastImagesKey) return;\n this.lastImagesKey = imagesKey;\n\n if (!urls.length) {\n this.currentIndex.set(0);\n this.isOriginalVisible.set(false);\n return;\n }\n\n const maxIndex = urls.length - 1;\n const startIndex = Math.max(0, Math.min(this.initialIndex(), maxIndex));\n this.currentIndex.set(startIndex);\n this.isOriginalVisible.set(false);\n });\n\n effect(() => {\n const thumbnail = this.thumbnailButtons()[this.currentIndex()];\n thumbnail?.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' });\n });\n }\n\n @HostListener('document:keydown.escape')\n onEscape(): void {\n this.closed.emit();\n }\n\n @HostListener('document:keydown.arrowleft')\n onArrowLeft(): void {\n this.showPreviousImage();\n }\n\n @HostListener('document:keydown.arrowright')\n onArrowRight(): void {\n this.showNextImage();\n }\n\n closeViewer(): void {\n this.closed.emit();\n }\n\n onTouchStart(event: TouchEvent): void {\n const touch = event.changedTouches[0];\n if (!touch) return;\n\n this.touchStartX = touch.clientX;\n this.touchStartY = touch.clientY;\n }\n\n onTouchEnd(event: TouchEvent): void {\n const touch = event.changedTouches[0];\n if (!touch) return;\n\n const deltaX = touch.clientX - this.touchStartX;\n const deltaY = touch.clientY - this.touchStartY;\n if (Math.abs(deltaX) < 50 || Math.abs(deltaX) <= Math.abs(deltaY)) return;\n\n if (deltaX < 0) {\n this.showNextImage();\n } else {\n this.showPreviousImage();\n }\n }\n\n showPreviousImage(): void {\n const total = this.urls().length;\n if (total <= 1) return;\n this.currentIndex.set((this.currentIndex() - 1 + total) % total);\n this.blurActiveElement();\n }\n\n showNextImage(): void {\n const total = this.urls().length;\n if (total <= 1) return;\n this.currentIndex.set((this.currentIndex() + 1) % total);\n this.blurActiveElement();\n }\n\n toggleOriginal(): void {\n this.isOriginalVisible.update((visible) => !visible);\n }\n\n selectImage(index: number, event: MouseEvent): void {\n this.currentIndex.set(index);\n (event.currentTarget as HTMLElement | null)?.blur();\n }\n\n private blurActiveElement(): void {\n if (typeof document === 'undefined') return;\n (document.activeElement as HTMLElement | null)?.blur();\n }\n\n get currentUrl(): string {\n return this.urls()[this.currentIndex()] || '';\n }\n\n get currentImageUrl(): string {\n return this.isOriginalVisible() ? this.currentUrl : this.getThumbnailUrl(this.currentUrl);\n }\n\n isPreloadIndex(index: number): boolean {\n const total = this.urls().length;\n if (total <= 2) return true;\n\n const distance = Math.abs(index - this.currentIndex());\n return distance <= 1 || distance >= total - 1;\n }\n\n getImageUrl(url: string, index: number): string {\n return index === this.currentIndex() || this.isOriginalVisible() ? url : this.getThumbnailUrl(url);\n }\n\n get imageViewerTransform(): string {\n return `translate3d(-${this.currentIndex() * 100}%, 0, 0)`;\n }\n\n get imageViewerTransitionStyle(): string {\n return 'transform 320ms cubic-bezier(0.22, 1, 0.36, 1)';\n }\n\n getThumbnailUrl(url: string): string {\n const match = String(url || '').match(/^(.*\\/api\\/files\\/[^/?#]+)(?:\\?.*)?$/i);\n return match ? `${match[1]}/preview?scale=25` : url;\n }\n}\n","<div class=\"fixed inset-0 z-[2300] flex items-center justify-center bg-black/80 p-3 md:p-4\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Перегляд фото\">\n <button type=\"button\" class=\"absolute inset-0\" aria-label=\"Закрити перегляд\" (click)=\"closeViewer()\"></button>\n <div class=\"relative z-[1] flex h-full w-full max-w-[1500px] flex-col items-center justify-center gap-4\" (click)=\"$event.stopPropagation()\">\n <button\n type=\"button\"\n class=\"absolute right-2 top-2 z-20 inline-flex h-11 w-11 items-center justify-center rounded-full bg-white/90 text-slate-900 shadow-[0_12px_28px_rgba(15,23,42,0.22)] transition hover:bg-white md:right-3 md:top-3\"\n aria-label=\"Закрити\"\n (click)=\"closeViewer()\">\n ✕\n </button>\n\n <div\n class=\"relative flex min-h-0 w-full flex-1 items-center justify-center overflow-hidden rounded-[18px] touch-pan-y\"\n (touchstart)=\"onTouchStart($event)\"\n (touchend)=\"onTouchEnd($event)\">\n <div class=\"h-full w-full overflow-hidden rounded-[18px]\">\n <div\n class=\"flex h-full w-full\"\n style=\"will-change: transform; backface-visibility: hidden;\"\n [style.transition]=\"imageViewerTransitionStyle\"\n [style.transform]=\"imageViewerTransform\">\n @for (url of urls(); track $index; let idx = $index) {\n <div class=\"flex h-full w-full min-w-full shrink-0 items-center justify-center overflow-hidden\">\n @if (isPreloadIndex(idx)) {\n <img\n [src]=\"getImageUrl(url, idx)\"\n [attr.alt]=\"'Фото ' + (idx + 1)\"\n [attr.loading]=\"idx === currentIndex() ? 'eager' : 'lazy'\"\n decoding=\"async\"\n class=\"block max-h-[74vh] max-w-[96vw] object-contain md:max-h-[78vh]\">\n }\n </div>\n }\n </div>\n </div>\n\n @if (urls().length > 1) {\n <button type=\"button\" class=\"absolute left-0 top-0 z-10 flex h-full w-1/4 min-w-12 items-center justify-start pl-2 md:pl-3\" aria-label=\"Попереднє фото\" (click)=\"showPreviousImage()\">\n <span class=\"inline-flex h-11 w-11 items-center justify-center rounded-full bg-white/90 text-slate-900 shadow-[0_12px_28px_rgba(15,23,42,0.22)] transition hover:bg-white\">‹</span>\n </button>\n <button type=\"button\" class=\"absolute right-0 top-0 z-10 flex h-full w-1/4 min-w-12 items-center justify-end pr-2 md:pr-3\" aria-label=\"Наступне фото\" (click)=\"showNextImage()\">\n <span class=\"inline-flex h-11 w-11 items-center justify-center rounded-full bg-white/90 text-slate-900 shadow-[0_12px_28px_rgba(15,23,42,0.22)] transition hover:bg-white\">›</span>\n </button>\n }\n\n @if (currentUrl) {\n <div class=\"absolute bottom-3 right-3 z-20 inline-flex max-w-[calc(100%-1.5rem)] items-center gap-1.5 rounded-2xl bg-black/55 p-1.5 text-white shadow-[0_12px_28px_rgba(15,23,42,0.24)] backdrop-blur-md md:bottom-4 md:right-4\">\n <button\n type=\"button\"\n class=\"inline-flex h-9 items-center gap-2 rounded-xl px-2.5 text-xs font-semibold transition hover:bg-white/10\"\n [class.bg-emerald-500\\/20]=\"isOriginalVisible()\"\n [class.text-emerald-100]=\"isOriginalVisible()\"\n [attr.aria-pressed]=\"isOriginalVisible()\"\n aria-label=\"Перемкнути між прев’ю та оригіналом\"\n (click)=\"toggleOriginal()\">\n <span>Оригінал</span>\n <span\n class=\"relative inline-flex h-5 w-9 items-center rounded-full border p-0.5 transition-colors\"\n [class.bg-emerald-500]=\"isOriginalVisible()\"\n [class.bg-white\\/15]=\"!isOriginalVisible()\"\n [class.border-emerald-200]=\"isOriginalVisible()\"\n [class.border-white\\/45]=\"!isOriginalVisible()\"\n [class.ring-2]=\"isOriginalVisible()\"\n [class.ring-emerald-300\\/70]=\"isOriginalVisible()\">\n <span\n class=\"h-4 w-4 rounded-full bg-white shadow-sm transition-transform duration-200\"\n [class.translate-x-4]=\"isOriginalVisible()\">\n </span>\n </span>\n </button>\n <a\n class=\"inline-flex h-9 w-9 items-center justify-center rounded-xl transition hover:bg-white/10\"\n [href]=\"currentUrl\"\n download\n aria-label=\"Скачати оригінал фото\">\n <lucide-icon [img]=\"downloadIcon\" [size]=\"19\" [strokeWidth]=\"2.25\"></lucide-icon>\n </a>\n </div>\n }\n </div>\n\n @if (urls().length > 1) {\n <div class=\"flex w-full flex-col items-center gap-3 pb-1 md:pb-2\">\n <div class=\"flex w-full max-w-[92vw] flex-nowrap justify-start gap-2 overflow-x-auto overflow-y-hidden overscroll-x-contain px-2 py-3 md:max-w-[80vw]\">\n @for (url of urls(); track url; let idx = $index) {\n <button\n #thumbnailButton\n type=\"button\"\n class=\"h-14 w-14 shrink-0 overflow-hidden rounded-xl border-2 border-transparent bg-white p-1 transition-transform duration-200\"\n [class.border-slate-900]=\"idx === currentIndex()\"\n [class.mx-2]=\"idx === currentIndex()\"\n [style.transform]=\"idx === currentIndex() ? 'scale(1.4)' : 'scale(1)'\"\n [class.origin-center]=\"idx === currentIndex()\"\n [class.relative]=\"idx === currentIndex()\"\n [class.z-10]=\"idx === currentIndex()\"\n [attr.aria-current]=\"idx === currentIndex() ? 'true' : null\"\n [attr.aria-label]=\"'Фото ' + (idx + 1)\"\n (click)=\"selectImage(idx, $event)\">\n <img class=\"block aspect-square w-full rounded-lg object-contain\" [src]=\"getThumbnailUrl(url)\" [attr.alt]=\"'Мініатюра ' + (idx + 1)\" loading=\"lazy\" decoding=\"async\">\n </button>\n }\n </div>\n <div class=\"rounded-full bg-white/95 px-3 py-1.5 text-xs font-semibold text-slate-900 shadow-[0_12px_28px_rgba(15,23,42,0.2)]\">\n {{ currentIndex() + 1 }} / {{ urls().length }}\n </div>\n </div>\n }\n </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal } from '@angular/core';\n\nimport { UiCardTabConfig, UiCardTabField } from '../../card.models';\nimport { ImagesViewerComponent } from '../images/images-viewer/images-viewer.component';\n\ninterface UiDetailsGridDisplayField extends UiCardTabField {\n displayValue: string;\n imageSrc?: string | null;\n}\n\n@Component({\n selector: 'app-details-grid',\n standalone: true,\n imports: [CommonModule, ImagesViewerComponent],\n templateUrl: './details-grid.component.html',\n})\nexport class DetailsGridComponent {\n readonly config = input<UiCardTabConfig | null>(null);\n readonly data = input<Record<string, unknown> | null>(null);\n readonly hasExplicitColumns = computed(() => this.resolveFields().some((field) => this.isValidColumnSpan(field.col)));\n readonly displayFields = computed<UiDetailsGridDisplayField[]>(() =>\n this.resolveFields().map((field) => ({\n ...field,\n displayValue: this.formatFieldValue(field),\n imageSrc: this.getImageSrc(field),\n }))\n );\n readonly selectedImageSrc = signal<string | null>(null);\n\n openViewer(imageSrc: string): void {\n this.selectedImageSrc.set(imageSrc);\n }\n\n closeViewer(): void {\n this.selectedImageSrc.set(null);\n }\n\n private resolveFields(): UiCardTabField[] {\n const value = this.config()?.props?.['fields'];\n if (!Array.isArray(value)) return [];\n\n const data = this.data() || {};\n return (value as Partial<UiCardTabField>[]).map((field) => ({\n ...field,\n type: field.type || 'text',\n value: field.value ?? (field.id\n ? this.toFieldValue(data[`${field.id}_data`] ?? data[field.id])\n : undefined),\n })) as UiCardTabField[];\n }\n\n private toFieldValue(value: unknown): UiCardTabField['value'] {\n if (value == null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return value as UiCardTabField['value'];\n }\n if (Array.isArray(value)) {\n return value.map((item) => this.toFieldValue(item) ?? '').join(', ');\n }\n if (typeof value === 'object' && 'label' in value) {\n return String((value as Record<string, unknown>)['label'] ?? '');\n }\n return String(value);\n }\n\n getFieldColumnClass(field: UiCardTabField): string {\n if (!this.isValidColumnSpan(field.col)) return '';\n const span = Math.min(12, Math.trunc(Number(field.col)));\n const classes: Record<number, string> = {\n 1: 'sm:col-span-1',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-3',\n 4: 'sm:col-span-4',\n 5: 'sm:col-span-5',\n 6: 'sm:col-span-6',\n 7: 'sm:col-span-7',\n 8: 'sm:col-span-8',\n 9: 'sm:col-span-9',\n 10: 'sm:col-span-10',\n 11: 'sm:col-span-11',\n 12: 'sm:col-span-12',\n };\n return classes[span] || '';\n }\n\n private isValidColumnSpan(value: number | undefined): boolean {\n const span = Number(value);\n return Number.isFinite(span) && span > 0;\n }\n\n private formatFieldValue(field: UiCardTabField): string {\n const value = field.value;\n if (value == null) return '-';\n if (typeof value === 'boolean') return value ? 'Так' : 'Ні';\n const raw = String(value).trim();\n if (!raw) return '-';\n\n if (field.type === 'date' || field.type === 'datetime') {\n return this.formatDate(raw, field.type === 'datetime');\n }\n if (field.type === 'enum') {\n return this.formatEnum(raw, field.enumMap);\n }\n\n return raw;\n }\n\n private getImageSrc(field: UiCardTabField): string | null {\n if (field.type !== 'image') return null;\n\n const value = field.value;\n if (value == null) return null;\n\n const raw = String(value).trim();\n if (!raw) return null;\n return `/api/files/${encodeURIComponent(raw)}`;\n }\n\n private formatEnum(raw: string, enumMap?: Record<string, string>): string {\n if (enumMap?.[raw]) {\n return enumMap[raw];\n }\n if (raw === 'true') return 'Так';\n if (raw === 'false') return 'Ні';\n return raw;\n }\n\n private formatDate(value: string, withTime: boolean): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n\n return new Intl.DateTimeFormat('uk-UA', withTime\n ? { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }\n : { day: '2-digit', month: '2-digit', year: 'numeric' }).format(date);\n }\n}\n","<div class=\"grid gap-4\" [class.grid-cols-1]=\"!hasExplicitColumns()\" [class.sm:grid-cols-3]=\"!hasExplicitColumns()\" [class.sm:grid-cols-12]=\"hasExplicitColumns()\">\n @for (field of displayFields(); track $index) {\n <div class=\"rounded-2xl border border-slate-100 bg-slate-200 p-4\" [ngClass]=\"getFieldColumnClass(field)\" [class.flex]=\"field.type === 'image'\" [class.flex-col]=\"field.type === 'image'\" [class.min-h-64]=\"field.type === 'image'\">\n <p class=\"text-xs uppercase tracking-[0.18em] text-slate-500\">{{ field.label }}</p>\n @if (field.type === 'image') {\n @if (field.imageSrc) {\n <button type=\"button\" class=\"mt-2 block flex-1 cursor-zoom-in overflow-hidden rounded-xl border border-slate-200 bg-white\" [attr.aria-label]=\"'Переглянути ' + field.label\" (click)=\"openViewer(field.imageSrc)\">\n <img [src]=\"field.imageSrc\" [alt]=\"field.label\" class=\"h-full w-full object-cover\" />\n </button>\n } @else {\n <p class=\"mt-2 text-base font-semibold text-slate-900\">-</p>\n }\n } @else {\n <p class=\"mt-2 text-base font-semibold text-slate-900\">{{ field.displayValue ?? '-' }}</p>\n }\n </div>\n }\n</div>\n\n@if (selectedImageSrc(); as imageSrc) {\n <app-images-viewer [urls]=\"[imageSrc]\" (closed)=\"closeViewer()\" />\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, signal } from '@angular/core';\nimport { UiCardTabConfig } from '../../card.models';\nimport { ImagesViewerComponent } from './images-viewer/images-viewer.component';\n\n@Component({\n selector: 'app-images',\n standalone: true,\n imports: [CommonModule, ImagesViewerComponent],\n templateUrl: './images.component.html',\n})\nexport class ImagesComponent {\n readonly config = input<UiCardTabConfig | null>(null);\n readonly data = input<Record<string, unknown> | null>(null);\n\n readonly isViewerOpen = signal(false);\n readonly viewerStartIndex = signal(0);\n\n readonly resolvedImageIds = computed(() => {\n const props = this.config()?.props || {};\n const key = String(props['images'] || 'images').trim();\n return this.normalizeIds(key ? this.data()?.[key] : null);\n });\n\n readonly resolvedImageUrls = computed(() => {\n return this.resolvedImageIds().map((id) => this.resolveImageUrl(id));\n });\n\n readonly resolvedImagePreviewUrls = computed(() => this.resolvedImageIds().map((id) => this.resolvePreviewUrl(id)));\n\n readonly resolvedImageMaxHeight = computed(() => {\n const value = Number(this.config()?.props?.['maxHeight']);\n return Number.isFinite(value) && value > 0 ? value : 400;\n });\n\n openViewer(index: number): void {\n this.viewerStartIndex.set(Math.max(0, index));\n if (this.resolvedImageUrls().length) this.isViewerOpen.set(true);\n }\n\n closeViewer(): void {\n this.isViewerOpen.set(false);\n }\n\n private resolveImageUrl(imageId: string): string {\n return `/api/files/${encodeURIComponent(imageId)}`;\n }\n\n private resolvePreviewUrl(imageId: string): string {\n return `/api/files/${encodeURIComponent(imageId)}/preview?scale=25`;\n }\n\n private normalizeIds(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return Array.from(new Set(\n value\n .map((item) => String(item || '').trim())\n .filter(Boolean)\n ));\n }\n}\n","@if (resolvedImageUrls().length === 0) {\n <p class=\"text-sm text-slate-500\">Фото відсутні</p>\n} @else {\n <div\n class=\"grid gap-3\"\n [ngClass]=\"resolvedImageUrls().length === 1 ? 'grid-cols-1' : 'grid-cols-1 lg:grid-cols-2'\"\n >\n @let previewUrls = resolvedImagePreviewUrls();\n <button\n type=\"button\"\n class=\"group relative block min-h-0 overflow-hidden rounded-2xl border border-slate-200 bg-slate-50 text-left lg:min-h-[28rem]\"\n [attr.aria-label]=\"'Переглянути фото 1'\"\n (click)=\"openViewer(0)\"\n >\n <img\n [src]=\"previewUrls[0]\"\n [alt]=\"'Фото 1'\"\n loading=\"lazy\"\n decoding=\"async\"\n class=\"h-56 w-full object-cover transition duration-200 group-hover:scale-[1.02] lg:h-full\"\n />\n </button>\n\n @if (previewUrls.length > 1) {\n <div class=\"grid grid-cols-2 grid-rows-2 gap-3 lg:h-full lg:min-h-0\">\n @for (image of previewUrls.slice(1, 5); track image; let i = $index) {\n <button\n type=\"button\"\n class=\"group relative block h-full min-h-0 overflow-hidden rounded-2xl border border-slate-200 bg-slate-50 text-left\"\n [attr.aria-label]=\"'Переглянути фото ' + (i + 2)\"\n (click)=\"openViewer(i + 1)\"\n >\n <img\n [src]=\"image\"\n [alt]=\"'Фото ' + (i + 2)\"\n loading=\"lazy\"\n decoding=\"async\"\n class=\"h-28 w-full object-cover transition duration-200 group-hover:scale-[1.02] lg:h-full\"\n />\n @if (i === 3 && resolvedImageUrls().length > 5) {\n <span class=\"absolute inset-0 flex items-center justify-center bg-slate-950/55 text-2xl font-semibold text-white transition group-hover:bg-slate-950/65\">\n +{{ resolvedImageUrls().length - 5 }}\n </span>\n }\n </button>\n }\n </div>\n }\n </div>\n\n @if (isViewerOpen()) {\n <app-images-viewer\n [urls]=\"resolvedImageUrls()\"\n [initialIndex]=\"viewerStartIndex()\"\n (closed)=\"closeViewer()\"\n ></app-images-viewer>\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { Component, Input, OnChanges, SimpleChanges, computed, inject, signal } from '@angular/core';\nimport { EventBus } from '@maro-tech/core';\nimport { map } from 'rxjs';\nimport {\n CARD_ACTION_REQUESTED,\n ENTITY_UPDATED,\n CardActionRequestedEvent,\n EntityUpdatedEvent,\n} from '../../card-events';\nimport { UiEntityCardAction } from '../../card-host.token';\nimport { UiCardTabConfig } from '../../card.models';\nimport { UiTableColumnConfig, UiTableFilter, UiTableResponse, UiTableRowAction, UiTableComponent } from '@maro-tech/table';\n\ntype TableView = {\n columns?: Array<Record<string, any>>;\n rows?: any[];\n actions?: { header?: { custom?: UiEntityCardAction[] }; row?: { custom?: UiEntityCardAction[]; edit?: boolean; delete?: boolean } };\n viewActions?: { edit?: boolean; delete?: boolean };\n pagination?: { page?: number; size?: number; total?: number; totalElements?: number; sizes?: number[] };\n};\n\ntype EditableColumnConfig = {\n key: string;\n bindKey?: string;\n editor?: 'text' | 'number' | 'select';\n data?: string;\n options?: Array<{ label: string; value: string | null; disabled?: boolean }>;\n api?: string;\n method?: UiEntityCardAction['method'];\n payload?: Record<string, unknown>;\n condition?: string;\n dataParams?: Record<string, string | number | boolean | null | undefined>;\n placeholder?: string;\n};\n\n@Component({\n selector: 'app-card-table',\n standalone: true,\n imports: [CommonModule, UiTableComponent],\n templateUrl: './table.component.html',\n})\nexport class TableComponent implements OnChanges {\n @Input({ required: true }) config!: UiCardTabConfig;\n @Input() data: Record<string, unknown> | null = null;\n\n private readonly http = inject(HttpClient);\n private readonly eventBus = inject(EventBus);\n private readonly columnsSignal = signal<UiTableColumnConfig[]>([]);\n private readonly rowsSignal = signal<Record<string, unknown>[]>([]);\n private readonly paginationSignal = signal({ page: 0, pageSize: 10, total: 0 });\n readonly pageSizeOptionsSignal = signal([10, 20, 30]);\n private readonly headerActionsSignal = signal<UiEntityCardAction[]>([]);\n private readonly loadingSignal = signal(false);\n private readonly errorSignal = signal('');\n\n readonly columns = this.columnsSignal.asReadonly();\n readonly rows = this.rowsSignal.asReadonly();\n readonly headerActions = this.headerActionsSignal.asReadonly();\n readonly isLoading = this.loadingSignal.asReadonly();\n readonly error = this.errorSignal.asReadonly();\n readonly tableData = computed<UiTableResponse<Record<string, unknown>>>(() => ({\n items: this.rowsSignal(),\n pagination: this.paginationSignal(),\n }));\n\n private page = 0;\n private pageSize = 10;\n private sortField = '';\n private sortDirection = '';\n private sourceColumns: Array<Record<string, any>> = [];\n\n constructor() {\n this.eventBus.on<EntityUpdatedEvent>(ENTITY_UPDATED).subscribe((event) => {\n if (!event.entity || event.entity === this.tableName()) this.load();\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['config'] && !changes['data']) return;\n this.page = 0;\n this.pageSize = this.numberProp('pageSize', 10);\n this.sortField = '';\n this.sortDirection = '';\n this.load();\n }\n\n get disablePaging(): boolean {\n return this.config?.props?.['disablePaging'] === true || this.config?.props?.['disablePaging'] === 'true';\n }\n\n onPageChange(event: UiTableFilter): void {\n this.page = Math.max(0, Number(event['pageIndex'] ?? this.page) || 0);\n this.pageSize = Math.max(1, Number(event['pageSize'] ?? this.pageSize) || this.pageSize);\n this.sortField = String(event['active'] || '').trim();\n const direction = String(event['direction'] || '').toLowerCase();\n this.sortDirection = direction === 'asc' || direction === 'desc' ? direction : '';\n this.load();\n }\n\n onAction(event: { action: UiTableRowAction; row: Record<string, unknown> }): void {\n this.emitAction(event.action as UiEntityCardAction, event.row);\n }\n\n onCellChange(event: { column: UiTableColumnConfig; row: Record<string, unknown>; value: unknown }): void {\n const config = this.editableColumns().find((item) => item.key === event.column.key);\n if (!config?.api) return;\n\n this.emitAction({\n id: `edit:${config.key}`,\n label: 'Зберегти',\n type: 'api',\n api: config.api,\n method: config.method || 'PATCH',\n payload: {\n ...event.row,\n ...(config.payload || {}),\n id: event.row['id'],\n [config.bindKey || config.key]: event.value,\n },\n }, event.row);\n }\n\n onHeaderAction(action: UiEntityCardAction): void {\n this.emitAction(action, this.data || {});\n }\n\n private emitAction(action: UiEntityCardAction, row: Record<string, unknown>): void {\n const resolved: UiEntityCardAction = {\n ...action,\n id: String(action.id || '').trim() || undefined,\n label: String(action.label || action.id || 'Дія'),\n type: String(action.type || 'api'),\n api: action.api ? this.resolve(action.api, row) : action.api,\n payload: action.payload ? this.resolveObject(action.payload, row) : action.payload,\n context: {\n entity: this.tableName(),\n recordId: String(row['id'] || '').trim() || undefined,\n data: row,\n },\n };\n this.eventBus.emit<CardActionRequestedEvent>(CARD_ACTION_REQUESTED, {\n action: resolved,\n context: resolved.context!,\n });\n }\n\n private load(): void {\n const table = this.tableName();\n if (!table) return;\n this.loadingSignal.set(true);\n this.errorSignal.set('');\n this.http.get<TableView>(this.tableEndpoint(table)).pipe(\n map((response) => normalizeTableResponse(response)),\n ).subscribe({\n next: (view: TableView) => {\n const sourceColumns = view.columns || [];\n this.sourceColumns = sourceColumns;\n this.setColumns();\n this.headerActionsSignal.set(view.actions?.header?.custom || []);\n this.rowsSignal.set(this.rowsFrom(view, sourceColumns));\n if (view.pagination?.sizes?.length) this.pageSizeOptionsSignal.set(view.pagination.sizes);\n this.page = view.pagination?.page ?? this.page;\n this.pageSize = view.pagination?.size ?? this.pageSize;\n this.paginationSignal.set({\n page: this.page,\n pageSize: this.pageSize,\n total: view.pagination?.totalElements ?? view.pagination?.total ?? this.rowsSignal().length,\n });\n this.loadingSignal.set(false);\n },\n error: (error) => {\n this.rowsSignal.set([]);\n this.columnsSignal.set([]);\n this.headerActionsSignal.set([]);\n this.errorSignal.set(error?.error?.message || 'Не вдалося завантажити таблицю');\n this.loadingSignal.set(false);\n },\n });\n }\n\n private setColumns(): void {\n const editable = this.editableColumns();\n this.columnsSignal.set(this.sourceColumns.filter((column) => !column['hidden']).map((column) => {\n const key = String(column['id'] || '');\n const config = editable.find((item) => item.key === key);\n return {\n key,\n labelKey: String(column['label'] || key),\n type: column['type'],\n width: column['width'],\n sortable: true,\n link: column['link'],\n editable: !!config,\n editableCondition: String(this.config?.props?.['editableCondition'] || config?.['condition'] || ''),\n editor: config?.editor,\n bindKey: config?.bindKey || key,\n options: config?.options || [],\n data: config?.data,\n dataParams: config?.dataParams,\n placeholder: config?.placeholder,\n } as UiTableColumnConfig;\n }));\n }\n\n\n private rowsFrom(view: TableView, columns: Array<Record<string, any>>): Record<string, unknown>[] {\n const configured = view.actions?.row?.custom || [];\n return (view.rows || []).map((raw) => {\n const row = Array.isArray(raw)\n ? columns.reduce<Record<string, unknown>>((result, column, index) => {\n result[String(column['id'])] = raw[index] ?? '';\n return result;\n }, { id: String(raw[0] || '') })\n : { ...(raw || {}) };\n row['id'] = String(row['id'] || '');\n if (!Array.isArray(row['actions'])) {\n const actions = [...configured];\n const actionIds = new Set(actions.map((action) => String(action.id || '').trim()).filter(Boolean));\n if (view.viewActions?.edit !== false && view.actions?.row?.edit !== false && this.editEnabled() && !actionIds.has('edit')) {\n actions.push({ id: 'edit', label: 'Редагувати', type: 'form', formId: this.tableName() });\n }\n if (view.viewActions?.delete !== false && view.actions?.row?.delete !== false && !actionIds.has('delete')) {\n actions.push({ id: 'delete', label: 'Видалити', type: 'submit', api: `/api/crud/${this.tableName()}/${row['id']}`, method: 'DELETE' });\n }\n if (actions.length) row['actions'] = actions;\n }\n return row;\n });\n }\n\n private tableName(): string {\n return String(this.config?.props?.['table'] || this.config?.props?.['entity'] || '').trim();\n }\n\n private editableColumns(): EditableColumnConfig[] {\n const value = this.config?.props?.['editableColumns'];\n return Array.isArray(value)\n ? value.filter((item): item is EditableColumnConfig => !!item && typeof item === 'object' && !!String((item as any).key || '').trim())\n : [];\n }\n\n private tableEndpoint(table: string): string {\n const params = new URLSearchParams({\n page: String(this.page),\n size: String(this.pageSize),\n sortField: this.sortField,\n sortDirection: this.sortDirection,\n filters: JSON.stringify(this.config?.props?.['initialFilters'] || this.config?.props?.['filter'] || {}),\n });\n return `/api/crud/${encodeURIComponent(table)}?${params.toString()}`;\n }\n\n private editEnabled(): boolean {\n return this.config?.props?.['edit'] !== false && this.config?.props?.['edit'] !== 'false';\n }\n\n private numberProp(key: string, fallback: number): number {\n const value = Number(this.config?.props?.[key]);\n return Number.isFinite(value) && value > 0 ? Math.trunc(value) : fallback;\n }\n\n private resolveObject(value: Record<string, unknown>, row: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, this.resolveValue(item, row)]));\n }\n\n private resolve(value: string, row: Record<string, unknown>): string {\n return String(this.resolveValue(value, row));\n }\n\n private resolveValue(value: unknown, row: Record<string, unknown>): unknown {\n if (typeof value === 'string') {\n return value.replace(/\\{\\{([a-zA-Z0-9_.-]+)\\}\\}/g, (_match, path) => {\n const result = String(path).split('.').reduce<unknown>((current, key) =>\n current && typeof current === 'object' ? (current as Record<string, unknown>)[key] : undefined, row);\n return result == null ? '' : String(result);\n });\n }\n if (Array.isArray(value)) return value.map((item) => this.resolveValue(item, row));\n if (value && typeof value === 'object') return this.resolveObject(value as Record<string, unknown>, row);\n return value;\n }\n}\n\nfunction normalizeTableResponse(response: unknown): TableView {\n const raw = (response || {}) as Record<string, any>;\n const source = (raw['config'] || raw) as TableView;\n return {\n ...source,\n rows: raw['rows'] ?? raw['items'] ?? source.rows ?? [],\n pagination: {\n page: raw['page'] ?? source.pagination?.page,\n size: raw['size'] ?? source.pagination?.size,\n total: raw['total'] ?? source.pagination?.total,\n totalElements: raw['total'] ?? source.pagination?.totalElements,\n sizes: source.pagination?.sizes,\n },\n };\n}\n","<section class=\"space-y-4\">\n @if (headerActions().length) {\n <div class=\"flex justify-end gap-2\">\n @for (action of headerActions(); track action.id) {\n <button type=\"button\" class=\"rounded-lg border border-slate-200 px-3 py-1.5 text-sm\" (click)=\"onHeaderAction(action)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n\n <app-ui-table\n [data]=\"tableData()\"\n [columns]=\"columns()\"\n [pageSizeOptions]=\"pageSizeOptionsSignal()\"\n [isLoading]=\"isLoading()\"\n [disablePaging]=\"disablePaging\"\n (pageChange)=\"onPageChange($event)\"\n (actionClick)=\"onAction($event)\"\n (cellChange)=\"onCellChange($event)\"\n ></app-ui-table>\n</section>\n","import { InjectionToken, Type } from '@angular/core';\nimport { UiCardTabConfig } from './card.models';\n\nexport interface UiCardTabRegistration {\n key: string;\n component: Type<unknown>;\n resolveInputs?: (tab: UiCardTabConfig, data?: Record<string, unknown> | null) => Record<string, unknown>;\n}\n\nexport const UI_CARD_TAB_REGISTRY = new InjectionToken<UiCardTabRegistration[]>('UI_CARD_TAB_REGISTRY');\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, forwardRef, inject, input, signal, Type } from '@angular/core';\n\nimport { CardComponent } from '../../card.component';\nimport { CardSectionHeaderComponent } from '../../components/card-section-header.component';\nimport { CardHtmlTabComponent } from '../../tabs/html/html-tab.component';\nimport { DetailsGridComponent } from '../../tabs/details-grid/details-grid.component';\nimport { ImagesComponent } from '../../tabs/images/images.component';\nimport { TableComponent } from '../../tabs/table/table.component';\nimport type { UiEntityCardAction } from '../../card-host.token';\nimport { UiCardTabConfig, UiCardLayout } from '../../card.models';\nimport { UI_CARD_TAB_REGISTRY, UiCardTabRegistration } from '../../card-tab-registry.token';\n\ntype NestedCardConfig = {\n tabs: UiCardTabConfig[];\n layout: UiCardLayout;\n};\n\n@Component({\n selector: 'app-ui-card-panels-layout',\n standalone: true,\n imports: [CommonModule, forwardRef(() => CardComponent), CardSectionHeaderComponent, CardHtmlTabComponent, DetailsGridComponent, ImagesComponent, TableComponent],\n templateUrl: './ui-card-panels-layout.component.html',\n})\nexport class UiCardPanelsLayoutComponent {\n private readonly registry: UiCardTabRegistration[] = inject(UI_CARD_TAB_REGISTRY, { optional: true }) || [];\n\n readonly tabs = input<UiCardTabConfig[]>([]);\n readonly data = input<Record<string, unknown> | null>(null);\n readonly embedded = input(false);\n\n readonly firstTab = computed(() => this.tabs()[0] || null);\n\n getActions(tab: UiCardTabConfig): UiEntityCardAction[] {\n const value = tab.actions;\n return Array.isArray(value) ? value : [];\n }\n\n getVisibleActions(tab: UiCardTabConfig): UiEntityCardAction[] {\n return this.getActions(tab).filter((action) => !action.hidden);\n }\n\n shouldShowPanelHeader(tab: UiCardTabConfig): boolean {\n return !this.embedded() && !tab.html && tab.component !== 'html' && tab.header !== false;\n }\n\n getColSpanClass(tab: UiCardTabConfig): string {\n if (tab.col == null) return 'md:col-span-12';\n\n const raw = Number(tab.col);\n const span = !Number.isFinite(raw) || raw <= 0 ? 12 : Math.min(12, Math.trunc(raw));\n const classes: Record<number, string> = {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 5: 'md:col-span-5',\n 6: 'md:col-span-6',\n 7: 'md:col-span-7',\n 8: 'md:col-span-8',\n 9: 'md:col-span-9',\n 10: 'md:col-span-10',\n 11: 'md:col-span-11',\n 12: 'md:col-span-12',\n };\n return classes[span] || 'md:col-span-12';\n }\n\n getNestedCardConfig(tab: UiCardTabConfig): NestedCardConfig | null {\n if (Array.isArray(tab.tabs) && tab.tabs.length) {\n return { tabs: tab.tabs, layout: tab.layout || 'panels' };\n }\n return null;\n }\n\n getNestedPanels(tab: UiCardTabConfig): UiCardTabConfig[] | null {\n return Array.isArray(tab.panels) && tab.panels.length ? tab.panels : null;\n }\n\n getRegisteredComponent(tab: UiCardTabConfig): Type<unknown> | null {\n const key = tab.component;\n if (!key || key === 'images' || key === 'detailsGrid' || key === 'html') return null;\n const found = this.registry.find((item) => item.key === key);\n return found?.component || null;\n }\n\n getRegisteredInputs(tab: UiCardTabConfig): Record<string, unknown> {\n const key = tab.component;\n if (!key) return { tab };\n const found: UiCardTabRegistration | undefined = this.registry.find((item) => item.key === key);\n if (!found?.resolveInputs) return { tab };\n return found.resolveInputs(tab, this.data());\n }\n}\n","@if (tabs().length) {\n <div class=\"grid grid-cols-1 gap-4 md:grid-cols-12\">\n @for (tab of tabs(); track tab.id) {\n <section\n [class.rounded-3xl]=\"!embedded()\"\n [class.border]=\"!embedded()\"\n [class.border-slate-200]=\"!embedded()\"\n [class.bg-white]=\"!embedded()\"\n [class.p-6]=\"!embedded()\"\n [class.min-w-0]=\"embedded()\"\n [ngClass]=\"getColSpanClass(tab)\"\n [attr.data-card-panel-id]=\"tab.id\"\n >\n @if (shouldShowPanelHeader(tab)) {\n <app-card-section-header\n [data]=\"data()\"\n [title]=\"tab.title\"\n [actions]=\"getVisibleActions(tab)\"\n ></app-card-section-header>\n }\n\n @if (getNestedCardConfig(tab); as nestedCard) {\n <app-card [tabs]=\"nestedCard.tabs\" [data]=\"data()\" [layout]=\"nestedCard.layout\"></app-card>\n } @else if (getNestedPanels(tab); as nestedPanels) {\n <app-card [tabs]=\"nestedPanels\" [data]=\"data()\" layout=\"panels\" [embedded]=\"true\"></app-card>\n } @else if (tab.component === 'detailsGrid') {\n <app-details-grid [config]=\"tab\" [data]=\"data()\"></app-details-grid>\n } @else if (tab.component === 'table') {\n <app-card-table [config]=\"tab\" [data]=\"data()\"></app-card-table>\n } @else if (tab.component === 'images') {\n <app-images [config]=\"tab\" [data]=\"data()\"></app-images>\n } @else if (tab.component === 'html') {\n <app-card-html-tab [html]=\"tab.html || ''\"></app-card-html-tab>\n } @else if (getRegisteredComponent(tab); as customComponent) {\n <ng-container *ngComponentOutlet=\"customComponent; inputs: getRegisteredInputs(tab)\"></ng-container>\n }\n </section>\n }\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, DestroyRef, forwardRef, inject, input, OnInit, signal, Type } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { CardComponent } from '../../card.component';\nimport { CardSectionHeaderComponent } from '../../components/card-section-header.component';\nimport { CardHtmlTabComponent } from '../../tabs/html/html-tab.component';\nimport { DetailsGridComponent } from '../../tabs/details-grid/details-grid.component';\nimport { ImagesComponent } from '../../tabs/images/images.component';\nimport { TableComponent } from '../../tabs/table/table.component';\nimport type { UiEntityCardAction } from '../../card-host.token';\nimport { UiCardTabConfig } from '../../card.models';\nimport { UI_CARD_TAB_REGISTRY, UiCardTabRegistration } from '../../card-tab-registry.token';\n\n@Component({\n selector: 'app-ui-card-tabs-layout',\n standalone: true,\n imports: [CommonModule, forwardRef(() => CardComponent), CardSectionHeaderComponent, CardHtmlTabComponent, ImagesComponent, DetailsGridComponent, TableComponent],\n templateUrl: './ui-card-tabs-layout.component.html',\n})\nexport class UiCardTabsLayoutComponent implements OnInit {\n private readonly registry: UiCardTabRegistration[] = inject(UI_CARD_TAB_REGISTRY, { optional: true }) || [];\n private readonly destroyRef = inject(DestroyRef);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n readonly tabs = input<UiCardTabConfig[]>([]);\n readonly data = input<Record<string, unknown> | null>(null);\n readonly activeTabId = signal<string>('');\n\n ngOnInit(): void {\n this.route.queryParamMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((params) => {\n const tabId = params.get('tab');\n if (tabId) this.activeTabId.set(tabId);\n });\n }\n\n readonly activeTab = computed(() => {\n const items = this.tabs() || [];\n if (!items.length) return null;\n const currentId = this.activeTabId();\n return items.find((item) => item.id === currentId) || items[0];\n });\n\n setActiveTab(id: string): void {\n this.activeTabId.set(id);\n void this.router.navigate([], {\n relativeTo: this.route,\n queryParams: { tab: id },\n queryParamsHandling: 'merge',\n replaceUrl: true,\n });\n }\n\n getActions(tab: UiCardTabConfig): UiEntityCardAction[] {\n const value = tab.actions;\n return Array.isArray(value) ? value : [];\n }\n\n getVisibleActions(tab: UiCardTabConfig): UiEntityCardAction[] {\n return this.getActions(tab).filter((action) => !action.hidden);\n }\n\n getColSpan(tab: UiCardTabConfig): number {\n if (tab.col == null) return 12;\n\n const raw = Number(tab.col);\n if (!Number.isFinite(raw) || raw <= 0) return 12;\n return Math.min(12, Math.trunc(raw));\n }\n\n getRegisteredComponent(tab: UiCardTabConfig): Type<unknown> | null {\n const key = tab.component;\n if (!key || key === 'images' || key === 'detailsGrid' || key === 'html') return null;\n const found = this.registry.find((item) => item.key === key);\n return found?.component || null;\n }\n\n getRegisteredInputs(tab: UiCardTabConfig): Record<string, unknown> {\n const key = tab.component;\n if (!key) return { tab };\n const found: UiCardTabRegistration | undefined = this.registry.find((item) => item.key === key);\n if (!found?.resolveInputs) return { tab };\n return found.resolveInputs(tab, this.data());\n }\n}\n","@if (tabs().length) {\n <section class=\"space-y-4\">\n <nav class=\"flex flex-wrap gap-2\" aria-label=\"Card tabs\">\n @for (tab of tabs(); track tab.id) {\n <button\n type=\"button\"\n class=\"rounded-xl border px-4 py-2 text-sm font-medium transition\"\n [class.border-slate-900]=\"activeTab()?.id === tab.id\"\n [class.bg-slate-900]=\"activeTab()?.id === tab.id\"\n [class.text-white]=\"activeTab()?.id === tab.id\"\n [class.border-slate-200]=\"activeTab()?.id !== tab.id\"\n [class.bg-white]=\"activeTab()?.id !== tab.id\"\n [class.text-slate-700]=\"activeTab()?.id !== tab.id\"\n (click)=\"setActiveTab(tab.id)\"\n >\n {{ tab.title }}\n </button>\n }\n </nav>\n\n @if (activeTab(); as tab) {\n <section\n [attr.data-card-tab-id]=\"tab.id\"\n >\n @if (getVisibleActions(tab).length) {\n <app-card-section-header\n variant=\"tabs\"\n [data]=\"data()\"\n [actions]=\"getVisibleActions(tab)\"\n ></app-card-section-header>\n }\n\n @if (tab.tabs?.length) {\n <app-card [tabs]=\"tab.tabs || []\" [data]=\"data()\" [layout]=\"tab.layout || 'panels'\"></app-card>\n } @else if (tab.component === 'images') {\n <app-images\n [config]=\"tab\"\n [data]=\"data()\"\n ></app-images>\n } @else if (tab.component === 'detailsGrid') {\n <app-details-grid [config]=\"tab\" [data]=\"data()\"></app-details-grid>\n } @else if (tab.component === 'table') {\n <app-card-table [config]=\"tab\" [data]=\"data()\"></app-card-table>\n } @else if (tab.component === 'html') {\n <app-card-html-tab [html]=\"tab.html || ''\"></app-card-html-tab>\n } @else if (getRegisteredComponent(tab); as customComponent) {\n <ng-container *ngComponentOutlet=\"customComponent; inputs: getRegisteredInputs(tab)\"></ng-container>\n }\n </section>\n }\n </section>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, forwardRef, input } from '@angular/core';\nimport { UiCardPanelsLayoutComponent } from './layouts/panels/ui-card-panels-layout.component';\nimport { UiCardTabsLayoutComponent } from './layouts/tabs/ui-card-tabs-layout.component';\nimport { UiCardLayoutInput, UiCardTabConfig } from './card.models';\n\n@Component({\n selector: 'app-card',\n standalone: true,\n imports: [CommonModule, forwardRef(() => UiCardTabsLayoutComponent), forwardRef(() => UiCardPanelsLayoutComponent)],\n templateUrl: './card.component.html',\n})\nexport class CardComponent {\n readonly tabs = input<UiCardTabConfig[]>([]);\n readonly data = input<Record<string, unknown> | null>(null);\n readonly layout = input<UiCardLayoutInput>('panels');\n readonly embedded = input(false);\n\n}\n","@if (layout() === 'panels') {\n <app-ui-card-panels-layout\n [tabs]=\"tabs()\"\n [data]=\"data()\"\n [embedded]=\"embedded()\"\n ></app-ui-card-panels-layout>\n} @else {\n <app-ui-card-tabs-layout\n [tabs]=\"tabs()\"\n [data]=\"data()\"\n ></app-ui-card-tabs-layout>\n}\n","import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport type { UiCardLayoutInput } from './card.models';\n\nexport type ApiPluginMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\nexport interface ApiPluginConfig {\n api: string;\n method?: ApiPluginMethod;\n payload?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nexport interface CardActionContext {\n entity: string;\n recordId?: string;\n data?: Record<string, unknown> | null;\n}\n\nexport interface UiEntityCardAction {\n id?: string;\n label: string;\n type: string;\n icon?: string;\n hidden?: boolean;\n html?: string;\n component?: string;\n formId?: string;\n size?: 'sm' | 'md' | 'lg';\n api?: string;\n template?: string;\n method?: ApiPluginMethod;\n title?: string;\n text?: string;\n submit?: boolean | string;\n payload?: Record<string, unknown>;\n redirectEntity?: string;\n condition?: string;\n context?: CardActionContext;\n}\n\nexport interface UiEntityCardTab {\n id: string;\n title: string;\n col?: number;\n layout?: UiCardLayoutInput;\n component?: string;\n html?: string;\n tabs?: UiEntityCardTab[];\n panels?: UiEntityCardTab[];\n actions?: UiEntityCardAction[];\n props?: Record<string, unknown> & {\n images?: string;\n recordId?: string;\n recordIdKey?: string;\n fields?: Array<Record<string, unknown>>;\n warehouseId?: number | string;\n [key: string]: unknown;\n };\n}\n\nexport interface UiEntityCardResponse {\n meta?: Record<string, unknown>;\n title: string;\n layout?: UiCardLayoutInput;\n actions?: UiEntityCardAction[];\n viewActions?: {\n read: boolean;\n create: boolean;\n edit: boolean;\n delete: boolean;\n hasFormTemplate: boolean;\n };\n tabs?: UiEntityCardTab[];\n data?: Record<string, unknown>;\n}\n\nexport interface UiEntityCardHost {\n getCardView(entity: string, id: string): Observable<UiEntityCardResponse>;\n getFormView(entity: string, id: string): Observable<Record<string, unknown>>;\n callApi(config: ApiPluginConfig): Observable<unknown>;\n deleteCard(entity: string, id: string): Observable<void>;\n notify(message: string, variant: 'success' | 'error' | 'warning', durationMs?: number): void;\n goBack(entity: string, queryParams?: Record<string, unknown>, returnUrl?: string): void;\n goToEdit(entity: string, id: string): void;\n}\n\nexport const UI_ENTITY_CARD_HOST = new InjectionToken<UiEntityCardHost>('UI_ENTITY_CARD_HOST');\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { InjectionToken, Injectable, inject } from '@angular/core';\nimport { Observable, shareReplay } from 'rxjs';\n\nexport const UI_CARD_API_BASE_URL = new InjectionToken<string>('UI_CARD_API_BASE_URL', { factory: () => '' });\n\nconst apiUrl = (baseUrl: string, path: string): string => `${String(baseUrl || '').replace(/\\/$/, '')}${path}`;\n\nexport interface CardDictionarySuggestItem { key: string; label: string; imageId?: string | null; }\n\n@Injectable({ providedIn: 'root' })\nexport class CardDictionaryService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n getSuggestByName(name: string): Observable<CardDictionarySuggestItem[]> {\n return this.http.get<CardDictionarySuggestItem[]>(apiUrl(this.baseUrl, `/api/suggest/${encodeURIComponent(name)}`));\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CardCurrentUserService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n private readonly user$ = this.http.get<{ role?: string }>(apiUrl(this.baseUrl, '/api/users/me'), { withCredentials: true }).pipe(shareReplay(1));\n getCurrentUser(): Observable<{ role?: string }> { return this.user$; }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CardImageService {\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n getPhotoLink(id: string): string | undefined {\n return id ? apiUrl(this.baseUrl, `/api/files/${encodeURIComponent(id)}/preview?scale=25`) : undefined;\n }\n}\n\nexport const cardApiResourceUrl = (baseUrl: string, path: string): string => apiUrl(baseUrl, path);\nexport const cardApiParams = (params: Record<string, string | number | undefined>): HttpParams =>\n Object.entries(params).reduce((result, [key, value]) => value == null ? result : result.set(key, String(value)), new HttpParams());\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { UI_CARD_API_BASE_URL, cardApiParams, cardApiResourceUrl } from '../../card-api';\n\nexport interface UiEntityDocumentFile {\n id: string;\n entity: string;\n entityId: string;\n fileId: string;\n name: string | null;\n type: string;\n size: number | string;\n documentTypeId?: string | null;\n documentTypeLabel?: string | null;\n text?: string | null;\n recognitionStatus?: 'PENDING' | 'PROCESSING' | 'COMPLETED' | 'FAILED' | null;\n createdAt?: string;\n updatedAt?: string;\n downloadUrl: string;\n}\n\nexport interface UiEntityDocumentRecognitionStatus {\n id: string;\n text?: string | null;\n recognitionStatus?: UiEntityDocumentFile['recognitionStatus'];\n updatedAt?: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class UiEntityDocumentsService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n\n list(entity: string, entityId: string): Observable<UiEntityDocumentFile[]> {\n const params = cardApiParams({ entity, entityId });\n\n return this.http.get<UiEntityDocumentFile[]>(cardApiResourceUrl(this.baseUrl, '/api/entity-files'), { params });\n }\n\n recognitionStatus(id: string): Observable<UiEntityDocumentRecognitionStatus> {\n return this.http.get<UiEntityDocumentRecognitionStatus>(\n cardApiResourceUrl(this.baseUrl, `/api/entity-files/${encodeURIComponent(id)}/recognition-status`),\n );\n }\n\n upload(file: File): Observable<{ id: string }> {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('fileName', file.name);\n return this.http.post<{ id: string }>(cardApiResourceUrl(this.baseUrl, '/api/files'), formData);\n }\n\n attach(payload: { entity: string; entityId: string; fileId: string; documentTypeId?: string | null }): Observable<UiEntityDocumentFile> {\n return this.http.post<UiEntityDocumentFile>(cardApiResourceUrl(this.baseUrl, '/api/entity-files'), payload);\n }\n\n recognize(id: string): Observable<UiEntityDocumentFile> {\n return this.http.post<UiEntityDocumentFile>(cardApiResourceUrl(this.baseUrl, `/api/entity-files/${encodeURIComponent(id)}/recognize`), {});\n }\n\n rename(id: string, name: string): Observable<UiEntityDocumentFile> {\n return this.http.patch<UiEntityDocumentFile>(cardApiResourceUrl(this.baseUrl, `/api/entity-files/${encodeURIComponent(id)}`), { name });\n }\n\n remove(id: string): Observable<void> {\n return this.http.delete<void>(cardApiResourceUrl(this.baseUrl, `/api/entity-files/${encodeURIComponent(id)}`));\n }\n\n resolveDownloadUrl(fileId: string): string {\n return cardApiResourceUrl(this.baseUrl, `/api/files/${encodeURIComponent(fileId)}`);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, ElementRef, ViewChild, effect, inject, input, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { forkJoin, switchMap } from 'rxjs';\nimport { LucideAngularModule } from 'lucide-angular';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiModalComponent } from '@maro-tech/core';\nimport { UiToastService } from '@maro-tech/core';\nimport { InputSelectComponent } from '@maro-tech/form';\nimport { UiEntityDocumentsService } from '../documents.service';\n\n@Component({\n selector: 'app-documents-upload-modal',\n standalone: true,\n imports: [CommonModule, FormsModule, LucideAngularModule, UiButtonComponent, UiModalComponent, InputSelectComponent],\n templateUrl: './documents-upload-modal.component.html',\n})\nexport class DocumentsUploadModalComponent {\n readonly isOpen = input(false);\n readonly entity = input<string>('');\n readonly id = input<string>('');\n readonly closed = output<void>();\n readonly saved = output<void>();\n\n readonly documentTypeId = signal<string | null>(null);\n readonly fileNames = signal<string[]>([]);\n readonly isUploading = signal(false);\n\n @ViewChild('uploadFileInput') private uploadFileInput?: ElementRef<HTMLInputElement>;\n\n private readonly documentsService = inject(UiEntityDocumentsService);\n private readonly toast = inject(UiToastService);\n private uploadFiles: File[] = [];\n\n private readonly isOpenEffect = effect(() => {\n if (!this.isOpen()) {\n this.resetState();\n }\n });\n\n close(): void {\n this.closed.emit();\n }\n\n onFilesSelected(event: Event): void {\n const input = event.target as HTMLInputElement | null;\n const files = Array.from(input?.files ?? []);\n this.uploadFiles = files;\n this.fileNames.set(files.map((file) => file.name));\n }\n\n onDocumentTypeChange(value: string | string[] | null): void {\n this.documentTypeId.set(Array.isArray(value) ? value[0] ?? null : value);\n }\n\n submitUpload(): void {\n const entity = String(this.entity() || '').trim();\n const id = String(this.id() || '').trim();\n if (!entity || !id) {\n this.toast.show('Немає entity або id запису', 'warning', 2400);\n return;\n }\n\n if (!this.uploadFiles.length) {\n this.toast.show('Оберіть файл для завантаження', 'warning', 2400);\n return;\n }\n\n this.isUploading.set(true);\n forkJoin(\n this.uploadFiles.map((file) =>\n this.documentsService.upload(file).pipe(\n switchMap((result) =>\n this.documentsService.attach({\n entity,\n entityId: id,\n fileId: result.id,\n documentTypeId: this.documentTypeId(),\n })\n )\n )\n )\n ).subscribe({\n next: () => {\n this.toast.show(this.uploadFiles.length > 1 ? `Додано документів: ${this.uploadFiles.length}` : 'Документ додано', 'success', 2200);\n this.isUploading.set(false);\n this.saved.emit();\n this.closed.emit();\n },\n error: (error) => {\n this.toast.show(error?.error?.message || 'Не вдалося додати документи', 'error', 3200);\n this.isUploading.set(false);\n },\n });\n }\n\n private resetState(): void {\n this.documentTypeId.set(null);\n this.fileNames.set([]);\n this.isUploading.set(false);\n this.uploadFiles = [];\n if (this.uploadFileInput) {\n this.uploadFileInput.nativeElement.value = '';\n }\n }\n}\n","<core-modal\n title=\"Додати документ\"\n [isOpen]=\"isOpen()\"\n (closed)=\"close()\"\n>\n <div class=\"space-y-4\">\n <input-select\n [data]=\"'doc_type'\"\n name=\"uploadDocumentTypeId\"\n label=\"Тип документа\"\n hint=\"Необов'язково\"\n [ngModel]=\"documentTypeId()\"\n (ngModelChange)=\"onDocumentTypeChange($event)\"\n placeholder=\"Тип документа\"\n [fullWidth]=\"true\"\n [searchable]=\"true\"\n ></input-select>\n\n <div class=\"space-y-2\">\n <label class=\"block text-sm font-medium text-slate-700\" for=\"document-files\">Файли</label>\n <input\n #uploadFileInput\n id=\"document-files\"\n type=\"file\"\n class=\"block w-full rounded-xl border border-slate-200 bg-white px-3 py-2.5 text-sm text-slate-900 outline-none transition file:mr-3 file:rounded-lg file:border-0 file:bg-slate-900 file:px-3 file:py-2 file:text-sm file:font-medium file:text-white focus:border-slate-400 focus:ring-2 focus:ring-slate-200\"\n multiple\n (change)=\"onFilesSelected($event)\"\n />\n @if (fileNames().length) {\n <div class=\"rounded-xl border border-slate-200 bg-slate-50 px-3 py-2 text-sm text-slate-600\">\n @for (fileName of fileNames(); track fileName) {\n <div class=\"truncate\">{{ fileName }}</div>\n }\n </div>\n } @else {\n <p class=\"text-xs text-slate-500\">Можна обрати один або декілька файлів.</p>\n }\n </div>\n </div>\n\n <div slot=\"footer\" class=\"flex justify-end gap-2\">\n <ui-button variant=\"ghost\" [disabled]=\"isUploading()\" (click)=\"close()\">Скасувати</ui-button>\n <ui-button variant=\"primary\" [disabled]=\"isUploading()\" (click)=\"submitUpload()\">\n {{ isUploading() ? 'Завантаження...' : 'Зберегти' }}\n </ui-button>\n </div>\n</core-modal>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, output } from '@angular/core';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiModalComponent } from '@maro-tech/core';\nimport { UiEntityDocumentFile } from '../documents.service';\n\n@Component({\n selector: 'app-documents-text-modal',\n standalone: true,\n imports: [CommonModule, UiButtonComponent, UiModalComponent],\n templateUrl: './documents-text-modal.component.html',\n})\nexport class DocumentsTextModalComponent {\n readonly isOpen = input(false);\n readonly document = input<UiEntityDocumentFile | null>(null);\n readonly closed = output<void>();\n readonly recognizeRequested = output<void>();\n\n close(): void {\n this.closed.emit();\n }\n\n requestRecognize(): void {\n this.recognizeRequested.emit();\n }\n\n isImage(): boolean {\n return String(this.document()?.type || '').toLowerCase().startsWith('image/');\n }\n\n hasDocumentHtml(): boolean {\n return !!String(this.document()?.text || '').trim();\n }\n\n getDocumentHtml(): string {\n const text = String(this.document()?.text || '').trim();\n if (!text) {\n return '';\n }\n if (this.looksLikeHtml(text)) {\n return text;\n }\n\n return this.escapeHtml(text).replace(/\\r?\\n/g, '<br>');\n }\n\n private looksLikeHtml(value: string): boolean {\n return /<\\/?[a-z][\\s\\S]*>/i.test(value);\n }\n\n private escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n}\n","<core-modal\n title=\"Розпізнані дані\"\n size=\"lg\"\n [isOpen]=\"isOpen()\"\n (closed)=\"close()\"\n>\n <div class=\"space-y-3\">\n @if (hasDocumentHtml()) {\n <div\n class=\"max-h-[32rem] overflow-auto rounded-xl border border-slate-200 bg-slate-50 px-4 py-4 text-sm text-slate-900\"\n [innerHTML]=\"getDocumentHtml()\"\n ></div>\n } @else {\n <div class=\"rounded-xl border border-dashed border-slate-200 bg-slate-50 px-4 py-6 text-sm text-slate-500\">\n Дані ще не розпізнані. Натисни “Розпізнати дані”.\n </div>\n }\n </div>\n\n <div slot=\"footer\" class=\"flex justify-end gap-2\">\n @if (isImage()) {\n <ui-button variant=\"secondary\" (click)=\"requestRecognize()\">Розпізнати ще раз</ui-button>\n }\n <ui-button variant=\"primary\" (click)=\"close()\">Закрити</ui-button>\n </div>\n</core-modal>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, output } from '@angular/core';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiModalComponent } from '@maro-tech/core';\nimport { UiEntityDocumentFile } from '../documents.service';\n\n@Component({\n selector: 'app-documents-image-preview-modal',\n standalone: true,\n imports: [CommonModule, UiButtonComponent, UiModalComponent],\n templateUrl: './documents-image-preview-modal.component.html',\n})\nexport class DocumentsImagePreviewModalComponent {\n readonly isOpen = input(false);\n readonly document = input<UiEntityDocumentFile | null>(null);\n readonly closed = output<void>();\n\n close(): void {\n this.closed.emit();\n }\n\n getPreviewUrl(url: string): string {\n const match = String(url || '').match(/^(.*\\/api\\/files\\/[^/?#]+)(?:\\?.*)?$/i);\n return match ? `${match[1]}/preview?scale=25` : url;\n }\n}\n","<core-modal\n [title]=\"document()?.name || 'Перегляд документа'\"\n size=\"lg\"\n [isOpen]=\"isOpen()\"\n (closed)=\"close()\"\n>\n @if (document()) {\n <div class=\"overflow-hidden rounded-2xl bg-slate-100\">\n <img\n [src]=\"getPreviewUrl(document()!.downloadUrl)\"\n [alt]=\"document()!.name || 'Документ'\"\n decoding=\"async\"\n class=\"max-h-[75vh] w-full object-contain\"\n >\n </div>\n }\n\n <div slot=\"footer\" class=\"flex justify-end gap-2\">\n <ui-button variant=\"primary\" (click)=\"close()\">Закрити</ui-button>\n </div>\n</core-modal>\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, effect, inject, input, signal } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { forkJoin, of, Subscription, timer } from 'rxjs';\nimport { catchError, exhaustMap, finalize, map, takeUntil, takeWhile } from 'rxjs/operators';\nimport { Eye, FileText, LucideAngularModule, Plus, Sparkles, Trash } from 'lucide-angular';\nimport { CardCurrentUserService, CardDictionaryService } from '../../card-api';\nimport { UiButtonComponent } from '@maro-tech/core';\nimport { UiToastService } from '@maro-tech/core';\nimport { UiConfirmService } from '@maro-tech/core';\nimport { UiEntityDocumentsService, UiEntityDocumentFile, UiEntityDocumentRecognitionStatus } from './documents.service';\nimport { DocumentsUploadModalComponent } from './upload-modal/documents-upload-modal.component';\nimport { UiSelectOption } from '@maro-tech/form';\nimport { DocumentsTextModalComponent } from './text-modal/documents-text-modal.component';\nimport { DocumentsImagePreviewModalComponent } from './image-preview-modal/documents-image-preview-modal.component';\n\nconst DOCUMENT_TYPE_DICTIONARY = 'doc_type';\nconst RECOGNITION_POLLING_TIMEOUT_MS = 5 * 60 * 1000;\n\n@Component({\n selector: 'app-documents',\n standalone: true,\n imports: [\n CommonModule,\n LucideAngularModule,\n UiButtonComponent,\n DocumentsUploadModalComponent,\n DocumentsTextModalComponent,\n DocumentsImagePreviewModalComponent,\n ],\n templateUrl: './documents.component.html',\n})\nexport class DocumentsComponent {\n readonly entity = input<string>('');\n readonly id = input<string>('');\n readonly documentTypeDictionary = DOCUMENT_TYPE_DICTIONARY;\n\n readonly documents = signal<UiEntityDocumentFile[]>([]);\n readonly documentTypeOptions = signal<UiSelectOption[]>([]);\n readonly isUploadOpen = signal(false);\n readonly isLoading = signal(false);\n readonly recognizingDocumentId = signal<string | null>(null);\n readonly isTextOpen = signal(false);\n readonly isImagePreviewOpen = signal(false);\n readonly textTarget = signal<UiEntityDocumentFile | null>(null);\n readonly imagePreviewTarget = signal<UiEntityDocumentFile | null>(null);\n readonly deletingDocumentId = signal<string | null>(null);\n readonly eyeIcon = Eye;\n readonly fileIcon = FileText;\n readonly plusIcon = Plus;\n readonly sparkleIcon = Sparkles;\n readonly deleteIcon = Trash;\n readonly isAdmin = toSignal(\n inject(CardCurrentUserService).getCurrentUser().pipe(\n map((user) => String(user.role || '').trim().toUpperCase() === 'ADMIN'),\n ),\n { initialValue: false },\n );\n\n private readonly documentsService = inject(UiEntityDocumentsService);\n private readonly dictionaryService = inject(CardDictionaryService);\n private readonly toast = inject(UiToastService);\n private readonly confirmService = inject(UiConfirmService);\n private readonly destroyRef = inject(DestroyRef);\n private loadedDocumentTypeDictionary = '';\n private recognitionPolling?: Subscription;\n private readonly reloadEffect = effect(() => {\n this.entity();\n this.id();\n this.loadDocuments();\n });\n private readonly documentTypeDictionaryEffect = effect(() => {\n const dictionaryName = this.documentTypeDictionary.trim();\n if (!dictionaryName) {\n this.loadedDocumentTypeDictionary = '';\n this.documentTypeOptions.set([]);\n return;\n }\n\n if (dictionaryName === this.loadedDocumentTypeDictionary) {\n return;\n }\n\n this.loadedDocumentTypeDictionary = dictionaryName;\n this.dictionaryService.getSuggestByName(dictionaryName).subscribe({\n next: (items) => {\n this.documentTypeOptions.set(\n (items || [])\n .map((item) => ({\n value: String(item.key || ''),\n label: String(item.label || item.key || ''),\n }))\n .filter((item) => !!item.value),\n );\n },\n error: () => {\n this.documentTypeOptions.set([]);\n },\n });\n });\n\n openUploadModal(): void {\n this.isUploadOpen.set(true);\n }\n\n closeUploadModal(): void {\n this.isUploadOpen.set(false);\n }\n\n openTextModal(document: UiEntityDocumentFile): void {\n this.textTarget.set(document);\n this.isTextOpen.set(true);\n }\n\n closeTextModal(): void {\n this.isTextOpen.set(false);\n this.textTarget.set(null);\n }\n\n openImagePreview(document: UiEntityDocumentFile): void {\n if (!this.isImage(document)) {\n return;\n }\n this.imagePreviewTarget.set(document);\n this.isImagePreviewOpen.set(true);\n }\n\n closeImagePreview(): void {\n this.isImagePreviewOpen.set(false);\n this.imagePreviewTarget.set(null);\n }\n\n recognizeText(document: UiEntityDocumentFile): void {\n if (!this.isImage(document)) {\n return;\n }\n if (document.recognitionStatus === 'COMPLETED') {\n return;\n }\n if (this.isDocumentRecognizing(document)) {\n return;\n }\n\n this.recognizingDocumentId.set(document.id);\n this.documentsService.recognize(document.id).subscribe({\n next: (updated) => {\n this.recognizingDocumentId.set(null);\n this.upsertDocument(updated);\n this.updateRecognitionPolling();\n this.toast.show('Розпізнавання запущено', 'success', 2200);\n if (this.textTarget()?.id === updated.id) {\n this.textTarget.set(updated);\n }\n },\n error: (error) => {\n this.recognizingDocumentId.set(null);\n this.toast.show(error?.error?.message || 'Не вдалося розпізнати дані', 'error', 3200);\n },\n });\n }\n\n removeDocument(document: UiEntityDocumentFile): void {\n if (!this.isAdmin() || this.deletingDocumentId()) {\n return;\n }\n\n this.confirmService.open({\n title: 'Видалити документ',\n text: `Видалити документ «${document.name || 'Без назви'}»? Дію не можна буде скасувати.`,\n submit: 'Видалити',\n danger: true,\n }).subscribe((confirmed) => {\n if (!confirmed) return;\n\n this.deletingDocumentId.set(document.id);\n this.documentsService.remove(document.id).subscribe({\n next: () => {\n this.documents.update((documents) => documents.filter((item) => item.id !== document.id));\n if (this.textTarget()?.id === document.id) this.closeTextModal();\n if (this.imagePreviewTarget()?.id === document.id) this.closeImagePreview();\n this.deletingDocumentId.set(null);\n this.updateRecognitionPolling();\n this.toast.show('Документ видалено', 'success', 2200);\n },\n error: (error) => {\n this.deletingDocumentId.set(null);\n this.toast.show(error?.error?.message || 'Не вдалося видалити документ', 'error', 3200);\n },\n });\n });\n }\n\n isDocumentRecognizing(document: UiEntityDocumentFile | null): boolean {\n return !!document?.id && this.recognizingDocumentId() === document.id;\n }\n\n trackDocument(_: number, document: UiEntityDocumentFile): string {\n return document.id;\n }\n\n getImagePreviewUrl(document: UiEntityDocumentFile): string {\n const match = String(document.downloadUrl || '').match(/^(.*\\/api\\/files\\/[^/?#]+)(?:\\?.*)?$/i);\n return match ? `${match[1]}/preview?scale=25` : document.downloadUrl;\n }\n\n private upsertDocument(updated: Pick<UiEntityDocumentFile, 'id'> & Partial<UiEntityDocumentFile>): void {\n this.documents.update((current) => {\n const next = current.slice();\n const index = next.findIndex((item) => item.id === updated.id);\n if (index >= 0) {\n next[index] = { ...next[index], ...updated };\n }\n return next;\n });\n }\n\n private loadDocuments(): void {\n const entity = this.resolveEntity();\n const id = this.resolveId();\n if (!entity || !id) {\n this.documents.set([]);\n return;\n }\n\n this.isLoading.set(true);\n this.documentsService.list(entity, id).subscribe({\n next: (rows) => {\n this.documents.set(rows || []);\n this.isLoading.set(false);\n this.updateRecognitionPolling();\n },\n error: () => {\n this.documents.set([]);\n this.isLoading.set(false);\n },\n });\n }\n\n formatSize(size?: number | string | null): string {\n const normalizedSize = Number(size);\n if (!Number.isFinite(normalizedSize)) return '-';\n size = normalizedSize;\n const bytes = Number(size || 0);\n if (!Number.isFinite(bytes) || bytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n let value = bytes;\n let index = 0;\n while (value >= 1024 && index < units.length - 1) {\n value /= 1024;\n index += 1;\n }\n return `${value >= 10 || index === 0 ? Math.round(value) : value.toFixed(1)} ${units[index]}`;\n }\n\n private resolveEntity(): string {\n return String(this.entity() || '').trim();\n }\n\n private resolveId(): string {\n return String(this.id() || '').trim();\n }\n\n isImage(document: UiEntityDocumentFile): boolean {\n return String(document.type || '').startsWith('image/');\n }\n\n isPdf(document: UiEntityDocumentFile): boolean {\n const type = String(document.type || '').toLowerCase();\n const name = String(document.name || '').toLowerCase();\n return type === 'application/pdf' || name.endsWith('.pdf');\n }\n\n getFileBadge(document: UiEntityDocumentFile): string {\n if (this.isPdf(document)) return 'PDF';\n if (this.isImage(document)) return 'IMG';\n const name = String(document.name || '').trim();\n if (name.includes('.')) {\n return name.split('.').pop()!.slice(0, 5).toUpperCase();\n }\n return 'FILE';\n }\n\n getDocumentTypeLabel(document: UiEntityDocumentFile): string {\n const label = String(document.documentTypeLabel || '').trim();\n if (label) return label;\n\n const documentTypeId = String(document.documentTypeId || '').trim();\n if (!documentTypeId) return '';\n\n return this.documentTypeOptions().find((option) => option.value === documentTypeId)?.label ?? documentTypeId;\n }\n\n reloadDocuments(): void {\n this.loadDocuments();\n }\n\n isRecognitionPending(document: UiEntityDocumentFile): boolean {\n return this.isImage(document) && (document.recognitionStatus === 'PENDING' || document.recognitionStatus === 'PROCESSING');\n }\n\n isRecognitionCompleted(document: UiEntityDocumentFile): boolean {\n return this.isImage(document) && document.recognitionStatus === 'COMPLETED';\n }\n\n getRecognitionStatusLabel(document: UiEntityDocumentFile): string {\n if (document.recognitionStatus === 'FAILED') return 'Не вдалося розпізнати';\n if (this.isRecognitionPending(document)) {\n return document.recognitionStatus === 'PROCESSING' ? 'Розпізнається у фоні' : 'Очікує розпізнавання';\n }\n return document.recognitionStatus === 'COMPLETED' ? 'Розпізнано' : '';\n }\n\n private updateRecognitionPolling(): void {\n if (!this.documents().some((document) => this.isRecognitionPending(document))) {\n this.recognitionPolling?.unsubscribe();\n this.recognitionPolling = undefined;\n return;\n }\n if (this.recognitionPolling) return;\n\n this.recognitionPolling = timer(2500, 4000)\n .pipe(\n exhaustMap(() => {\n const pendingDocuments = this.documents().filter((document) => this.isRecognitionPending(document));\n if (!pendingDocuments.length) return of([] as UiEntityDocumentRecognitionStatus[]);\n\n return forkJoin(\n pendingDocuments.map((document) =>\n this.documentsService.recognitionStatus(document.id).pipe(\n catchError(() => of(null)),\n ),\n ),\n ).pipe(\n map((statuses) => statuses.filter((status): status is UiEntityDocumentRecognitionStatus => !!status)),\n );\n }),\n map((statuses) => {\n statuses.forEach((status) => this.upsertDocument(status));\n return statuses;\n }),\n takeWhile(() => this.documents().some((document) => this.isRecognitionPending(document)), true),\n takeUntilDestroyed(this.destroyRef),\n takeUntil(timer(RECOGNITION_POLLING_TIMEOUT_MS)),\n finalize(() => {\n this.recognitionPolling = undefined;\n }),\n )\n .subscribe();\n }\n}\n","<div class=\"space-y-4\">\n <div>\n @if (isLoading()) {\n <div class=\"rounded-2xl border border-dashed border-slate-200 bg-slate-50 px-4 py-8 text-center text-sm text-slate-500\">\n Завантаження документів...\n </div>\n } @else if (documents().length === 0) {\n <div class=\"rounded-2xl border border-dashed border-slate-200 bg-slate-50 px-4 py-8 text-center text-sm text-slate-500\">\n Документи відсутні\n </div>\n } @else {\n <div class=\"grid gap-3\">\n @for (document of documents(); track trackDocument($index, document)) {\n <article class=\"flex flex-col gap-4 rounded-2xl border border-slate-200 bg-white p-4 shadow-sm sm:flex-row sm:items-center sm:justify-between\">\n @if (isImage(document)) {\n <button\n type=\"button\"\n class=\"block shrink-0 overflow-hidden rounded-2xl border border-slate-200 bg-slate-50 transition hover:border-slate-300 hover:bg-slate-100 h-28 w-40\"\n (click)=\"openImagePreview(document)\"\n >\n <img [src]=\"getImagePreviewUrl(document)\" [alt]=\"document.name || 'Документ'\" loading=\"lazy\" decoding=\"async\" class=\"h-full w-full object-cover\">\n </button>\n } @else {\n <a\n class=\"block shrink-0 overflow-hidden rounded-2xl border border-slate-200 bg-slate-50 transition hover:border-slate-300 hover:bg-slate-100\"\n [href]=\"document.downloadUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [class.h-28]=\"isPdf(document)\"\n [class.w-40]=\"isPdf(document)\"\n [class.h-20]=\"!isPdf(document)\"\n [class.w-24]=\"!isPdf(document)\"\n >\n @if (isPdf(document)) {\n <div class=\"flex h-full w-full flex-col items-center justify-center gap-2 px-3 py-4 text-slate-700\">\n <div class=\"flex h-11 w-11 items-center justify-center rounded-2xl bg-white text-slate-900 shadow-sm\">\n <lucide-icon [img]=\"fileIcon\"></lucide-icon>\n </div>\n <span class=\"text-xs font-semibold uppercase tracking-[0.18em] text-slate-600\">PDF</span>\n </div>\n } @else {\n <div class=\"flex h-full w-full flex-col items-center justify-center gap-2 px-3 py-4 text-slate-700\">\n <div class=\"flex h-11 w-11 items-center justify-center rounded-2xl bg-white text-slate-900 shadow-sm\">\n <lucide-icon [img]=\"fileIcon\"></lucide-icon>\n </div>\n <span class=\"text-[10px] font-semibold uppercase tracking-[0.18em] text-slate-500\">\n {{ getFileBadge(document) }}\n </span>\n </div>\n }\n </a>\n }\n\n <div class=\"min-w-0 flex-1\">\n <div class=\"flex flex-col gap-2 lg:flex-row lg:items-start lg:justify-between\">\n <div class=\"min-w-0\">\n <div class=\"flex flex-wrap items-center gap-2\">\n <h4 class=\"truncate text-sm font-semibold text-slate-900\">\n {{ document.name || 'Без назви' }}\n </h4>\n @if (getDocumentTypeLabel(document)) {\n <span class=\"inline-flex shrink-0 items-center rounded-full border border-sky-200 bg-sky-50 px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.18em] text-sky-700\">\n {{ getDocumentTypeLabel(document) }}\n </span>\n }\n </div>\n <p class=\"mt-1 text-xs text-slate-500\">\n {{ formatSize(document.size) }} · {{ document.type }}\n </p>\n </div>\n\n <div class=\"flex flex-wrap items-center gap-2\">\n <ui-button variant=\"ghost\" size=\"sm\" (click)=\"openTextModal(document)\">\n <lucide-icon [img]=\"eyeIcon\"></lucide-icon>\n Перегляд\n </ui-button>\n @if (isImage(document)) {\n <ui-button variant=\"ghost\" size=\"sm\" [disabled]=\"isDocumentRecognizing(document) || isRecognitionPending(document) || isRecognitionCompleted(document)\" (click)=\"recognizeText(document)\">\n <lucide-icon [img]=\"sparkleIcon\"></lucide-icon>\n {{ isDocumentRecognizing(document) ? 'Розпізнавання...' : 'Розпізнати дані' }}\n </ui-button>\n }\n @if (isAdmin()) {\n <ui-button variant=\"ghost\" size=\"sm\" [disabled]=\"deletingDocumentId() === document.id\" (click)=\"removeDocument(document)\">\n <lucide-icon [img]=\"deleteIcon\"></lucide-icon>\n {{ deletingDocumentId() === document.id ? 'Видалення...' : 'Видалити' }}\n </ui-button>\n }\n </div>\n </div>\n\n <div class=\"mt-3 flex flex-wrap items-center justify-between gap-2\">\n <a\n class=\"inline-flex items-center rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm font-medium text-slate-700 transition hover:border-slate-300 hover:bg-slate-50\"\n [href]=\"document.downloadUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Завантажити\n </a>\n @if (isImage(document) && getRecognitionStatusLabel(document)) {\n <span\n class=\"inline-flex items-center rounded-full border px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.12em]\"\n [class.border-amber-200]=\"isRecognitionPending(document)\"\n [class.bg-amber-50]=\"isRecognitionPending(document)\"\n [class.text-amber-700]=\"isRecognitionPending(document)\"\n [class.border-rose-200]=\"document.recognitionStatus === 'FAILED'\"\n [class.bg-rose-50]=\"document.recognitionStatus === 'FAILED'\"\n [class.text-rose-700]=\"document.recognitionStatus === 'FAILED'\"\n [class.border-emerald-200]=\"document.recognitionStatus === 'COMPLETED'\"\n [class.bg-emerald-50]=\"document.recognitionStatus === 'COMPLETED'\"\n [class.text-emerald-700]=\"document.recognitionStatus === 'COMPLETED'\"\n >\n {{ getRecognitionStatusLabel(document) }}\n </span>\n }\n </div>\n </div>\n </article>\n }\n </div>\n }\n </div>\n\n <div class=\"flex flex-col gap-3 rounded-2xl border border-dashed border-slate-200 bg-slate-50 px-4 py-4\">\n <div>\n <h4 class=\"text-sm font-semibold text-slate-900\">Завантаження документів у файлове сховище</h4>\n <p class=\"mt-1 text-xs text-slate-500\">Додайте нові файли до картки безпосередньо тут.</p>\n </div>\n\n <div class=\"flex w-full flex-col gap-2 sm:w-auto\">\n <ui-button variant=\"secondary\" size=\"sm\" (click)=\"openUploadModal()\">\n <lucide-icon [img]=\"plusIcon\"></lucide-icon>\n Завантажити документ\n </ui-button>\n </div>\n </div>\n</div>\n\n<app-documents-text-modal\n [isOpen]=\"isTextOpen()\"\n [document]=\"textTarget()\"\n (closed)=\"closeTextModal()\"\n (recognizeRequested)=\"textTarget() && recognizeText(textTarget()!)\"\n></app-documents-text-modal>\n\n<app-documents-upload-modal\n [isOpen]=\"isUploadOpen()\"\n [entity]=\"entity()\"\n [id]=\"id()\"\n (closed)=\"closeUploadModal()\"\n (saved)=\"reloadDocuments()\"\n></app-documents-upload-modal>\n\n<app-documents-image-preview-modal\n [isOpen]=\"isImagePreviewOpen()\"\n [document]=\"imagePreviewTarget()\"\n (closed)=\"closeImagePreview()\"\n></app-documents-image-preview-modal>\n","import { CommonModule } from '@angular/common';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Component, DestroyRef, effect, inject, input, signal, untracked } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EventBus } from '@maro-tech/core';\nimport { ENTITY_UPDATED, EntityUpdatedEvent } from '../../card-events';\nimport { CardImageService, UI_CARD_API_BASE_URL, cardApiResourceUrl } from '../../card-api';\nimport { ImagesViewerComponent } from '../images/images-viewer/images-viewer.component';\n\ninterface AuditFieldChange {\n label: string;\n type?: string;\n from: { value: unknown; display: string; url?: string };\n to: { value: unknown; display: string; url?: string };\n}\n\ninterface AuditChange {\n action: string;\n entityId: string;\n entityType: string;\n changedFields: Record<string, AuditFieldChange>;\n}\n\ninterface AuditOperation {\n id: string;\n actorName?: string | null;\n description: string;\n actionCode: string;\n createdAt: string;\n changes: AuditChange[];\n}\n\n@Component({\n selector: 'app-history-tab',\n standalone: true,\n imports: [CommonModule, ImagesViewerComponent, RouterLink],\n templateUrl: './history-tab.component.html',\n})\nexport class HistoryTabComponent {\n readonly entity = input<string>('');\n readonly primaryEntity = input<string>('');\n readonly id = input<string>('');\n readonly entityLabels = input<Record<string, string>>({});\n\n readonly operations = signal<AuditOperation[]>([]);\n readonly isLoading = signal(false);\n readonly hasError = signal(false);\n readonly expandedOperationIds = signal<Set<string>>(new Set());\n readonly viewerUrls = signal<string[]>([]);\n readonly isViewerOpen = signal(false);\n\n private readonly http = inject(HttpClient);\n private readonly imageService = inject(CardImageService);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n private readonly eventBus = inject(EventBus);\n private readonly destroyRef = inject(DestroyRef);\n private readonly refreshSequence = signal(0);\n private lastRequestKey = '';\n\n constructor() {\n this.eventBus.on<EntityUpdatedEvent>(ENTITY_UPDATED)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event.entity && event.entity !== this.entity()) return;\n if (event.recordId && event.recordId !== this.id()) return;\n this.refreshSequence.update((value) => value + 1);\n });\n\n // Document events contain the useful information in the related entity\n // change. Keep those details visible without requiring an extra click.\n effect(() => {\n const documentOperationIds = new Set(\n this.operations()\n .filter((operation) => operation.actionCode.startsWith('documents.'))\n .map((operation) => operation.id),\n );\n if (!documentOperationIds.size) return;\n const next = new Set(untracked(() => this.expandedOperationIds()));\n documentOperationIds.forEach((id) => next.add(id));\n this.expandedOperationIds.set(next);\n });\n }\n\n private readonly loadEffect = effect(() => {\n const entity = this.entity().trim();\n const id = this.id().trim();\n const refreshSequence = this.refreshSequence();\n const requestKey = `${entity}:${id}:${refreshSequence}`;\n if (requestKey === this.lastRequestKey) return;\n this.lastRequestKey = requestKey;\n\n if (!entity || !id) {\n this.operations.set([]);\n return;\n }\n\n this.isLoading.set(true);\n this.hasError.set(false);\n const cacheBuster = Date.now();\n this.http\n .get<AuditOperation[]>(cardApiResourceUrl(this.baseUrl, `/api/crud/${encodeURIComponent(entity)}/${encodeURIComponent(id)}/history?_ts=${cacheBuster}`), {\n headers: new HttpHeaders({\n 'Cache-Control': 'no-cache, no-store, max-age=0',\n Pragma: 'no-cache',\n }),\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (operations) => {\n this.operations.set(operations || []);\n this.isLoading.set(false);\n },\n error: () => {\n this.operations.set([]);\n this.hasError.set(true);\n this.isLoading.set(false);\n },\n });\n });\n\n toggleOperation(id: string): void {\n const next = new Set(this.expandedOperationIds());\n if (next.has(id)) next.delete(id);\n else next.add(id);\n this.expandedOperationIds.set(next);\n }\n\n isExpanded(id: string): boolean {\n return this.expandedOperationIds().has(id);\n }\n\n getEntityLabel(entityType: string): string {\n const labels: Record<string, string> = {\n entity_files: 'Документ',\n files: 'Файл',\n };\n return this.entityLabels()[entityType] || labels[entityType] || entityType;\n }\n\n getActionLabel(action: string): string {\n const labels: Record<string, string> = {\n created: 'Створено',\n updated: 'Змінено',\n deleted: 'Видалено',\n };\n return labels[action] || action;\n }\n\n isImageField(field: AuditFieldChange): boolean {\n return field.type === 'image';\n }\n\n isHtmlField(field: AuditFieldChange): boolean {\n return field.type === 'html';\n }\n\n isFileField(field: AuditFieldChange): boolean {\n return field.type === 'file';\n }\n\n getImageUrls(value: unknown): string[] {\n const values = Array.isArray(value) ? value : [value];\n return values\n .map((item) => String(item ?? '').trim())\n .filter(Boolean)\n .map((id) => this.imageService.getPhotoLink(id) || '')\n .filter(Boolean);\n }\n\n openImageViewer(urls: string[]): void {\n if (!urls.length) return;\n this.viewerUrls.set(urls);\n this.isViewerOpen.set(true);\n }\n\n closeImageViewer(): void {\n this.isViewerOpen.set(false);\n }\n\n getAffectedSummary(operation: AuditOperation): string {\n const counts = new Map<string, number>();\n for (const change of this.getRelatedChanges(operation)) {\n counts.set(change.entityType, (counts.get(change.entityType) || 0) + 1);\n }\n return [...counts.entries()]\n .map(([type, count]) => `${this.getEntityLabel(type)}: ${count}`)\n .join(' · ');\n }\n\n getPrimaryChanges(operation: AuditOperation): AuditChange[] {\n const primaryTypes = new Set([this.entity(), this.primaryEntity()].filter(Boolean));\n return (operation.changes || []).filter((change) => primaryTypes.has(change.entityType));\n }\n\n getRelatedChanges(operation: AuditOperation): AuditChange[] {\n const primaryChanges = this.getPrimaryChanges(operation);\n const primaryTypes = new Set([this.entity(), this.primaryEntity()].filter(Boolean));\n return primaryChanges.length\n ? (operation.changes || []).filter((change) => !primaryTypes.has(change.entityType))\n : operation.changes || [];\n }\n\n}\n","<section class=\"space-y-4\">\n @if (isLoading()) {\n <div class=\"rounded-2xl border border-slate-200 bg-white p-6 text-sm text-slate-500\">\n Завантаження історії…\n </div>\n } @else if (hasError()) {\n <div class=\"rounded-2xl border border-red-200 bg-red-50 p-6 text-sm text-red-700\">\n Не вдалося завантажити історію змін.\n </div>\n } @else if (!operations().length) {\n <div class=\"rounded-2xl border border-slate-200 bg-white p-6 text-sm text-slate-500\">\n Історія змін поки порожня.\n </div>\n } @else {\n <div class=\"space-y-3\">\n @for (operation of operations(); track operation.id) {\n <article class=\"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm\">\n <div class=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h3 class=\"text-sm font-semibold text-slate-900\">{{ operation.description }}</h3>\n @if (operation.actorName) {\n <p class=\"mt-1 text-sm text-slate-500\">{{ operation.actorName }}</p>\n }\n </div>\n <time class=\"text-xs text-slate-400\" [dateTime]=\"operation.createdAt\">\n {{ operation.createdAt | date: 'dd.MM.yyyy HH:mm' }}\n </time>\n </div>\n\n @if (getPrimaryChanges(operation).length) {\n <div class=\"mt-4 space-y-2 border-t border-slate-100 pt-4\">\n @for (change of getPrimaryChanges(operation); track change.entityId + change.entityType) {\n @for (field of (change.changedFields | keyvalue); track field.key) {\n <div class=\"flex flex-wrap items-center gap-2 text-sm\">\n <span class=\"font-medium text-slate-700\">{{ field.value.label }}</span>\n @if (isImageField(field.value)) {\n @if (getImageUrls(field.value.from.value).length) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (url of getImageUrls(field.value.from.value); track url; let imageIndex = $index) {\n <button type=\"button\" class=\"h-14 w-14 overflow-hidden rounded-lg border border-slate-200 bg-slate-100\" (click)=\"openImageViewer(getImageUrls(field.value.from.value))\" [attr.aria-label]=\"'Відкрити старе фото ' + (imageIndex + 1)\">\n <img [src]=\"url\" [alt]=\"'Старе фото ' + (imageIndex + 1)\" class=\"h-full w-full object-cover\" />\n </button>\n }\n </div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isFileField(field.value)) {\n @if (field.value.from.url) {\n <a class=\"font-medium text-sky-700 underline\" [href]=\"field.value.from.url\" target=\"_blank\" rel=\"noopener noreferrer\">Завантажити файл</a>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else if (isHtmlField(field.value)) {\n @if (field.value.from.display !== 'Не задано') {\n <div class=\"prose prose-sm max-w-none text-slate-500\" [innerHTML]=\"field.value.from.display\"></div>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else {\n @if (field.value.from.url) {\n <a class=\"font-medium text-sky-700 underline\" [routerLink]=\"field.value.from.url\">{{ field.value.from.display }}</a>\n } @else {\n <span class=\"font-medium text-slate-900\">{{ field.value.from.display }}</span>\n }\n }\n <span class=\"text-slate-400\">→</span>\n @if (isImageField(field.value)) {\n @if (getImageUrls(field.value.to.value).length) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (url of getImageUrls(field.value.to.value); track url; let imageIndex = $index) {\n <button type=\"button\" class=\"h-14 w-14 overflow-hidden rounded-lg border border-slate-200 bg-slate-100\" (click)=\"openImageViewer(getImageUrls(field.value.to.value))\" [attr.aria-label]=\"'Відкрити нове фото ' + (imageIndex + 1)\">\n <img [src]=\"url\" [alt]=\"'Нове фото ' + (imageIndex + 1)\" class=\"h-full w-full object-cover\" />\n </button>\n }\n </div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isFileField(field.value)) {\n @if (field.value.to.url) {\n <a class=\"font-medium text-sky-700 underline\" [href]=\"field.value.to.url\" target=\"_blank\" rel=\"noopener noreferrer\">Завантажити файл</a>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isHtmlField(field.value)) {\n @if (field.value.to.display !== 'Не задано') {\n <div class=\"prose prose-sm max-w-none text-slate-900\" [innerHTML]=\"field.value.to.display\"></div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else {\n @if (field.value.to.url) {\n <a class=\"font-medium text-sky-700 underline\" [routerLink]=\"field.value.to.url\">{{ field.value.to.display }}</a>\n } @else {\n <span class=\"font-medium text-slate-900\">{{ field.value.to.display }}</span>\n }\n }\n </div>\n }\n }\n </div>\n }\n\n @if (getRelatedChanges(operation).length) {\n <div class=\"mt-4 border-t border-slate-100 pt-4\">\n <button\n type=\"button\"\n class=\"flex w-full items-center justify-between gap-3 text-left text-sm text-slate-600\"\n [attr.aria-expanded]=\"isExpanded(operation.id)\"\n (click)=\"toggleOperation(operation.id)\"\n >\n <span>\n Деталі змін:\n <span class=\"font-medium text-slate-900\">{{ getAffectedSummary(operation) }}</span>\n </span>\n <span class=\"text-lg leading-none text-slate-400\">{{ isExpanded(operation.id) ? '−' : '+' }}</span>\n </button>\n\n @if (isExpanded(operation.id)) {\n <div class=\"mt-4 space-y-4\">\n @for (change of getRelatedChanges(operation); track change.entityId + change.entityType) {\n <div class=\"rounded-xl bg-slate-50 p-3\">\n <p class=\"mb-2 text-xs font-semibold uppercase tracking-[0.16em] text-slate-500\">\n {{ getEntityLabel(change.entityType) }} · {{ getActionLabel(change.action) }}\n </p>\n @for (field of (change.changedFields | keyvalue); track field.key) {\n <div class=\"flex flex-wrap items-center gap-2 text-sm\">\n <span class=\"font-medium text-slate-700\">{{ field.value.label }}</span>\n @if (isImageField(field.value)) {\n @if (getImageUrls(field.value.from.value).length) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (url of getImageUrls(field.value.from.value); track url; let imageIndex = $index) {\n <button type=\"button\" class=\"h-14 w-14 overflow-hidden rounded-lg border border-slate-200 bg-white\" (click)=\"openImageViewer(getImageUrls(field.value.from.value))\" [attr.aria-label]=\"'Відкрити старе фото ' + (imageIndex + 1)\">\n <img [src]=\"url\" [alt]=\"'Старе фото ' + (imageIndex + 1)\" class=\"h-full w-full object-cover\" />\n </button>\n }\n </div>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else if (isFileField(field.value)) {\n @if (field.value.from.url) {\n <a class=\"text-sky-700 underline\" [href]=\"field.value.from.url\" target=\"_blank\" rel=\"noopener noreferrer\">Завантажити файл</a>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else if (isHtmlField(field.value)) {\n @if (field.value.from.display !== 'Не задано') {\n <div class=\"prose prose-sm max-w-none text-slate-500\" [innerHTML]=\"field.value.from.display\"></div>\n } @else {\n <span class=\"text-slate-400\">Не задано</span>\n }\n } @else {\n @if (field.value.from.url) {\n <a class=\"text-sky-700 underline\" [routerLink]=\"field.value.from.url\">{{ field.value.from.display }}</a>\n } @else {\n <span class=\"text-slate-400\">{{ field.value.from.display }}</span>\n }\n }\n <span class=\"text-slate-400\">→</span>\n @if (isImageField(field.value)) {\n @if (getImageUrls(field.value.to.value).length) {\n <div class=\"flex flex-wrap items-center gap-2\">\n @for (url of getImageUrls(field.value.to.value); track url; let imageIndex = $index) {\n <button type=\"button\" class=\"h-14 w-14 overflow-hidden rounded-lg border border-slate-200 bg-white\" (click)=\"openImageViewer(getImageUrls(field.value.to.value))\" [attr.aria-label]=\"'Відкрити нове фото ' + (imageIndex + 1)\">\n <img [src]=\"url\" [alt]=\"'Нове фото ' + (imageIndex + 1)\" class=\"h-full w-full object-cover\" />\n </button>\n }\n </div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isFileField(field.value)) {\n @if (field.value.to.url) {\n <a class=\"font-medium text-sky-700 underline\" [href]=\"field.value.to.url\" target=\"_blank\" rel=\"noopener noreferrer\">Завантажити файл</a>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else if (isHtmlField(field.value)) {\n @if (field.value.to.display !== 'Не задано') {\n <div class=\"prose prose-sm max-w-none text-slate-900\" [innerHTML]=\"field.value.to.display\"></div>\n } @else {\n <span class=\"font-medium text-slate-900\">Не задано</span>\n }\n } @else {\n @if (field.value.to.url) {\n <a class=\"font-medium text-sky-700 underline\" [routerLink]=\"field.value.to.url\">{{ field.value.to.display }}</a>\n } @else {\n <span class=\"font-medium text-slate-900\">{{ field.value.to.display }}</span>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </article>\n }\n </div>\n }\n</section>\n\n@if (isViewerOpen()) {\n <app-images-viewer [urls]=\"viewerUrls()\" (closed)=\"closeImageViewer()\" />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","map"],"mappings":"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"}
|