@maro-tech/card 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/maro-tech-card.mjs +418 -1147
- package/fesm2022/maro-tech-card.mjs.map +1 -1
- package/package.json +1 -1
- package/types/maro-tech-card.d.ts +85 -157
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maro-tech-card.mjs","sources":["../../../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/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/lib/tabs/table/card-table-services.ts","../../../src/lib/tabs/table/card-table.component.ts","../../../src/lib/tabs/table/card-table.component.html","../../../src/maro-tech-card.ts"],"sourcesContent":["import type { UiEntityCardAction } from './card-host.token';\n\nexport interface CardActionContext {\n entity: string;\n recordId?: string;\n data?: Record<string, unknown> | null;\n}\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 entity = input.required<string>();\n readonly recordId = input<string>('');\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 = {\n entity: this.entity(),\n recordId: this.recordId() || undefined,\n data: this.data(),\n };\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 context.entity === this.entity()\n && (!context.recordId || context.recordId === this.recordId());\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input } from '@angular/core';\nimport { EventBus } from '@maro-tech/core';\nimport { UiCardTabConfig } from '../../card.models';\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 entity = input.required<string>();\n readonly recordId = input<string>('');\n readonly tab = input<UiCardTabConfig | null>(null);\n readonly data = input<Record<string, unknown> | null>(null);\n\n private readonly eventBus = inject(EventBus);\n\n readonly html = computed(() => this.tab()?.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?.('[class*=\"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: {\n entity: this.entity(),\n recordId: this.recordId() || undefined,\n data: this.data(),\n },\n });\n }\n\n private resolveAction(actionElement: HTMLElement | null): UiEntityCardAction | null {\n const tab = this.tab();\n const actions = Array.isArray(tab?.actions) ? tab.actions : [];\n if (!actions.length) return null;\n\n const actionId = Array.from(actionElement?.classList || [])\n .find((className) => className.startsWith('card-action-'))\n ?.slice('card-action-'.length)\n .trim();\n if (!actionId) return null;\n\n return actions.find((item) => String(item.id || '').trim() === actionId) || null;\n }\n}\n","<section\n [attr.data-card-tab-id]=\"tab()?.id || ''\"\n (click)=\"onClick($event)\"\n (keydown.enter)=\"onKeydown($event)\"\n (keydown.space)=\"onKeydown($event)\"\n>\n <div [innerHTML]=\"html()\"></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 tab = input<UiCardTabConfig | 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.tab()?.props?.['fields'];\n return Array.isArray(value) ? (value as UiCardTabField[]) : [];\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 if (/^https?:\\/\\//i.test(raw) || raw.startsWith('/')) {\n return raw;\n }\n\n const base = String(field.imageBaseUrl || '/api/files').trim().replace(/\\/+$/, '');\n return `${base}/${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 tab = 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 tab = this.tab();\n const props = tab?.props || {};\n const explicit = this.normalizeIds(props['imageIds']);\n if (explicit.length) return explicit;\n\n const key = String(props['images'] || 'images').trim();\n const value = key ? this.data()?.[key] : null;\n return this.normalizeIds(value);\n });\n\n readonly resolvedImageUrls = computed(() => {\n const tab = this.tab();\n const props = tab?.props || {};\n const explicit = Array.isArray(props['imageUrls'])\n ? props['imageUrls'].filter((item): item is string => typeof item === 'string')\n : [];\n if (explicit.length) return explicit;\n return this.resolvedImageIds().map((id) => this.resolveImageUrl(id)).filter((item): item is string => !!item);\n });\n\n readonly resolvedImagePreviewUrls = computed(() => this.resolvedImageUrls().map((url) => this.resolvePreviewUrl(url)));\n\n readonly resolvedImageMaxHeight = computed(() => {\n const value = Number(this.tab()?.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(imageIdOrUrl: string): string {\n const value = String(imageIdOrUrl || '').trim();\n if (!value) {\n return '';\n }\n if (value.startsWith('http://') || value.startsWith('https://') || value.startsWith('data:') || value.startsWith('/')) {\n return value;\n }\n\n const base = String(this.tab()?.props?.['imageBaseUrl'] || '/api/files').trim().replace(/\\/+$/, '');\n return `${base}/${encodeURIComponent(value)}`;\n }\n\n private resolvePreviewUrl(url: string): string {\n const match = url.match(/^(.*\\/api\\/files\\/[^/?#]+)(?:\\?.*)?$/i);\n return match ? `${match[1]}/preview?scale=25` : url;\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 { 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 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],\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 entity = input.required<string>();\n readonly recordId = input<string>('');\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 @if (!embedded()) {\n <section class=\"space-y-4\">\n <ng-container *ngTemplateOutlet=\"panelGrid\"></ng-container>\n </section>\n } @else {\n <ng-container *ngTemplateOutlet=\"panelGrid\"></ng-container>\n }\n}\n\n<ng-template #panelGrid>\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 [entity]=\"entity()\"\n [recordId]=\"recordId()\"\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 [entity]=\"entity()\" [recordId]=\"recordId()\" [tabs]=\"nestedCard.tabs\" [data]=\"data()\" [layout]=\"nestedCard.layout\"></app-card>\n } @else if (getNestedPanels(tab); as nestedPanels) {\n <app-card [entity]=\"entity()\" [recordId]=\"recordId()\" [tabs]=\"nestedPanels\" [data]=\"data()\" layout=\"panels\" [embedded]=\"true\"></app-card>\n } @else if (tab.component === 'detailsGrid') {\n <app-details-grid [tab]=\"tab\"></app-details-grid>\n } @else if (tab.component === 'images') {\n <app-images [tab]=\"tab\" [data]=\"data()\"></app-images>\n } @else if (tab.component === 'html') {\n <app-card-html-tab [tab]=\"tab\" [entity]=\"entity()\" [recordId]=\"recordId()\" [data]=\"data()\"></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</ng-template>\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 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],\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 entity = input.required<string>();\n readonly recordId = input<string>('');\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 [entity]=\"entity()\"\n [recordId]=\"recordId()\"\n [data]=\"data()\"\n [actions]=\"getVisibleActions(tab)\"\n ></app-card-section-header>\n }\n\n @if (tab.tabs?.length) {\n <app-card [entity]=\"entity()\" [recordId]=\"recordId()\" [tabs]=\"tab.tabs || []\" [data]=\"data()\" [layout]=\"tab.layout || 'panels'\"></app-card>\n } @else if (tab.component === 'images') {\n <app-images\n [tab]=\"tab\"\n [data]=\"data()\"\n ></app-images>\n } @else if (tab.component === 'detailsGrid') {\n <app-details-grid [tab]=\"tab\"></app-details-grid>\n } @else if (tab.component === 'html') {\n <app-card-html-tab [tab]=\"tab\" [entity]=\"entity()\" [recordId]=\"recordId()\" [data]=\"data()\"></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, 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 entity = input.required<string>();\n readonly recordId = input<string>('');\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 [entity]=\"entity()\"\n [recordId]=\"recordId()\"\n [tabs]=\"tabs()\"\n [data]=\"data()\"\n [embedded]=\"embedded()\"\n ></app-ui-card-panels-layout>\n} @else {\n <app-ui-card-tabs-layout\n [entity]=\"entity()\"\n [recordId]=\"recordId()\"\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 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}\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 imageUrls?: string[];\n imageIds?: string[];\n images?: string;\n recordId?: string;\n recordIdKey?: string;\n imageBaseUrl?: 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","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable, map } from 'rxjs';\nimport JsBarcode from 'jsbarcode';\nimport { UI_CARD_API_BASE_URL, cardApiResourceUrl } from '../../card-api';\n\nexport const ACTION_API = 'ACTION_API';\nexport const ACTION_FORM = 'ACTION_FORM';\nexport const ACTION_PRINT = 'ACTION_PRINT';\nexport type ActionType = string;\nexport const normalizeActionType = (value: string | null | undefined): string | null => {\n const raw = String(value || '').trim().toLowerCase();\n if (raw === 'api' || raw === ACTION_API.toLowerCase()) return ACTION_API;\n if (raw === 'form' || raw === ACTION_FORM.toLowerCase()) return ACTION_FORM;\n if (raw === 'print' || raw === ACTION_PRINT.toLowerCase()) return ACTION_PRINT;\n return raw ? raw.toUpperCase() : null;\n};\n\n@Injectable({ providedIn: 'root' })\nexport class CardTableDataService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n\n getTableView(code: string, options: Record<string, unknown>): Observable<any> {\n let params = new HttpParams();\n for (const [key, value] of Object.entries(options)) {\n if (value !== undefined && value !== null && value !== '') params = params.set(key, typeof value === 'object' ? JSON.stringify(value) : String(value));\n }\n return this.http.get<any>(cardApiResourceUrl(this.baseUrl, `/api/crud/${encodeURIComponent(code)}`), { params }).pipe(\n map((response) => ({\n ...(response.config || response),\n rows: response.rows ?? response.items ?? [],\n pagination: {\n page: response.page,\n size: response.size,\n totalElements: response.total,\n totalPages: response.totalPages,\n },\n }))\n );\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CardTableWarehouseService {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = inject(UI_CARD_API_BASE_URL);\n\n getWarehouses(): Observable<{ items: any[] }> {\n return this.http.get<any[]>(cardApiResourceUrl(this.baseUrl, '/api/warehouses')).pipe(map((items) => ({ items: items || [] })));\n }\n\n getWarehouseItems(id: string | number): Observable<any[]> {\n return this.http.get<any[]>(cardApiResourceUrl(this.baseUrl, `/api/warehouses/${encodeURIComponent(id)}/items`));\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CardTableBarcodeService {\n printBarcode(options: { barcode: string; title: string }): void {\n const barcode = String(options.barcode || '').trim();\n if (!barcode || typeof window === 'undefined') return;\n const printWindow = window.open('', '_blank', 'width=860,height=920');\n if (!printWindow) return;\n const barcodeSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n try {\n JsBarcode(barcodeSvg, barcode, { format: 'CODE128', displayValue: false, margin: 0, width: 2.1, height: 88, lineColor: '#0f172a', background: '#ffffff' });\n } catch {\n printWindow.close();\n return;\n }\n printWindow.document.write(`<!doctype html><html><head><title>${this.escape(options.title)}</title><style>body{font-family:Arial;text-align:center;padding:10mm}.barcode{width:58mm;margin:auto}.barcode svg{width:100%;height:18mm}</style></head><body><h2>${this.escape(options.title)}</h2><div class=\"barcode\">${barcodeSvg.outerHTML}</div></body></html>`);\n printWindow.document.close();\n printWindow.focus();\n printWindow.print();\n }\n\n private escape(value: string): string { return value.replace(/[&<>'\"]/g, (char) => ({ '&': '&', '<': '<', '>': '>', \"'\": ''', '\"': '"' }[char] || char)); }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class CardTablePrintService {\n openPrintWindow(): Window | null { return typeof window === 'undefined' ? null : window.open('', '_blank', 'width=860,height=920'); }\n\n print(config: { html: string; title?: string }): boolean {\n const printWindow = this.openPrintWindow();\n return printWindow ? this.printInWindow(printWindow, config) : false;\n }\n\n printInWindow(printWindow: Window, config: { html: string; title?: string }): boolean {\n printWindow.document.write(`<!doctype html><html><head><title>${config.title || 'Друк'}</title></head><body>${config.html}</body></html>`);\n printWindow.document.close();\n printWindow.focus();\n printWindow.print();\n return true;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, Input, OnChanges, computed, inject, signal } from '@angular/core';\nimport { FormModalComponent } from '@maro-tech/form';\nimport { UI_ENTITY_CARD_HOST, UiEntityCardHost, UiEntityCardAction } from '../../card-host.token';\nimport { UiCardTabConfig } from '../../card.models';\nimport { ENTITY_UPDATED, EntityUpdatedEvent } from '../../card-events';\nimport { UiTableCellChange, UiTableColumnConfig, UiTableFilter, UiTableResponse, UiTableRowAction, UiTableComponent } from '@maro-tech/table';\nimport { EventBus, UiButtonComponent } from '@maro-tech/core';\nimport { UiSelectOption } from '@maro-tech/form';\nimport { CardTableBarcodeService, CardTableDataService, CardTablePrintService, CardTableWarehouseService, ACTION_API, ACTION_FORM, ACTION_PRINT, ActionType, normalizeActionType } from './card-table-services';\n\ntype TableViewColumn = any;\ntype TableViewHeaderAction = any;\ntype TableViewResponse = any;\ntype TableViewRow = any;\n\ntype ConditionToken =\n | { type: 'identifier'; value: string }\n | { type: 'string'; value: string }\n | { type: 'number'; value: number }\n | { type: 'boolean'; value: boolean }\n | { type: 'null'; value: null }\n | { type: 'operator'; value: '==' | '!=' | '===' | '!==' | '&&' | '||' | '!' | '(' | ')' };\n\nconst getConditionPathValue = (source: any, pathRaw: string): any => {\n const path = String(pathRaw || '').trim();\n if (!path) return undefined;\n\n const parts = path.split('.');\n let current = source;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = current[part];\n }\n return current;\n};\n\nconst evaluateCondition = (conditionRaw: string | undefined, context: Record<string, unknown>): boolean => {\n const condition = String(conditionRaw || '').trim();\n if (!condition) return true;\n\n const tokens: ConditionToken[] = [];\n let index = 0;\n\n const pushOperator = (value: ConditionToken['value']): void => {\n tokens.push({ type: 'operator', value } as ConditionToken);\n };\n\n while (index < condition.length) {\n const char = condition[index];\n\n if (/\\s/.test(char)) {\n index += 1;\n continue;\n }\n\n const nextThree = condition.slice(index, index + 3);\n const nextTwo = condition.slice(index, index + 2);\n if (nextThree === '===') {\n pushOperator('===');\n index += 3;\n continue;\n }\n if (nextThree === '!==') {\n pushOperator('!==');\n index += 3;\n continue;\n }\n if (nextTwo === '==') {\n pushOperator('==');\n index += 2;\n continue;\n }\n if (nextTwo === '!=') {\n pushOperator('!=');\n index += 2;\n continue;\n }\n if (nextTwo === '&&') {\n pushOperator('&&');\n index += 2;\n continue;\n }\n if (nextTwo === '||') {\n pushOperator('||');\n index += 2;\n continue;\n }\n if (char === '!' || char === '(' || char === ')') {\n pushOperator(char as ConditionToken['value']);\n index += 1;\n continue;\n }\n if (char === '\"' || char === \"'\") {\n const quote = char;\n index += 1;\n let value = '';\n let escaped = false;\n let closed = false;\n while (index < condition.length) {\n const current = condition[index];\n index += 1;\n if (escaped) {\n value += current;\n escaped = false;\n continue;\n }\n if (current === '\\\\') {\n escaped = true;\n continue;\n }\n if (current === quote) {\n closed = true;\n break;\n }\n value += current;\n }\n if (!closed) return true;\n tokens.push({ type: 'string', value });\n continue;\n }\n if (/[0-9.-]/.test(char)) {\n const match = condition.slice(index).match(/^-?\\d+(?:\\.\\d+)?/);\n if (match) {\n tokens.push({ type: 'number', value: Number(match[0]) });\n index += match[0].length;\n continue;\n }\n }\n if (/[A-Za-z_$]/.test(char)) {\n const match = condition.slice(index).match(/^[A-Za-z_$][A-Za-z0-9_.$-]*/);\n if (match) {\n const raw = match[0];\n const normalized = raw.toLowerCase();\n if (normalized === 'true' || normalized === 'false') {\n tokens.push({ type: 'boolean', value: normalized === 'true' });\n } else if (normalized === 'null') {\n tokens.push({ type: 'null', value: null });\n } else {\n tokens.push({ type: 'identifier', value: raw });\n }\n index += raw.length;\n continue;\n }\n }\n\n return true;\n }\n\n let tokenIndex = 0;\n const peek = (): ConditionToken | undefined => tokens[tokenIndex];\n const consume = (): ConditionToken | undefined => {\n const token = tokens[tokenIndex];\n tokenIndex += 1;\n return token;\n };\n const matchOperator = (...values: Array<ConditionToken['value']>): boolean => {\n const token = peek();\n if (token?.type !== 'operator') return false;\n if (!values.includes(token.value)) return false;\n tokenIndex += 1;\n return true;\n };\n const toBoolean = (value: unknown): boolean => {\n if (typeof value === 'string') return value.trim().length > 0;\n return Boolean(value);\n };\n const getValue = (identifierRaw: string): unknown => {\n const identifier = String(identifierRaw || '').trim();\n if (!identifier) return undefined;\n if (identifier === 'data') return context;\n if (identifier.startsWith('data.')) return getConditionPathValue(context, identifier.slice(5));\n return getConditionPathValue(context, identifier);\n };\n const parseExpression = (): unknown => parseOr();\n const parseOr = (): unknown => {\n let left = parseAnd();\n while (matchOperator('||')) {\n const right = parseAnd();\n left = toBoolean(left) || toBoolean(right);\n }\n return left;\n };\n const parseAnd = (): unknown => {\n let left = parseEquality();\n while (matchOperator('&&')) {\n const right = parseEquality();\n left = toBoolean(left) && toBoolean(right);\n }\n return left;\n };\n const parseEquality = (): unknown => {\n let left = parseUnary();\n while (true) {\n if (matchOperator('==')) {\n left = left == parseUnary();\n continue;\n }\n if (matchOperator('!=')) {\n left = left != parseUnary();\n continue;\n }\n if (matchOperator('===')) {\n left = left === parseUnary();\n continue;\n }\n if (matchOperator('!==')) {\n left = left !== parseUnary();\n continue;\n }\n break;\n }\n return left;\n };\n const parseUnary = (): unknown => {\n if (matchOperator('!')) {\n return !toBoolean(parseUnary());\n }\n return parsePrimary();\n };\n const parsePrimary = (): unknown => {\n const token = consume();\n if (!token) return undefined;\n if (token.type === 'operator' && token.value === '(') {\n const value = parseExpression();\n matchOperator(')');\n return value;\n }\n if (token.type === 'identifier') return getValue(token.value);\n return token.value;\n };\n\n return toBoolean(parseExpression());\n};\n\n@Component({\n selector: 'app-card-table',\n standalone: true,\n imports: [\n CommonModule,\n UiTableComponent,\n UiButtonComponent,\n FormModalComponent,\n ],\n templateUrl: './card-table.component.html',\n})\nexport class CardTableComponent implements OnChanges {\n @Input({ required: true }) tab!: UiCardTabConfig;\n @Input() data: Record<string, unknown> | null = null;\n\n private readonly tableViewsService = inject(CardTableDataService);\n private readonly warehouseService = inject(CardTableWarehouseService);\n private readonly barcodePrintService = inject(CardTableBarcodeService);\n private readonly eventBus = inject(EventBus);\n private readonly host = inject<UiEntityCardHost | null>(UI_ENTITY_CARD_HOST, { optional: true });\n private readonly actionBus = inject(CardTablePrintService);\n\n private readonly tableColumnsSignal = signal<UiTableColumnConfig[]>([]);\n private readonly tableRowsSignal = signal<Record<string, unknown>[]>([]);\n private readonly tablePaginationSignal = signal({ page: 0, pageSize: 10, total: 0 });\n private readonly tableHeaderActionsSignal = signal<TableViewHeaderAction[]>([]);\n private readonly editableColumnOptionsSignal = signal<Record<string, UiSelectOption[]>>({});\n private readonly isTableLoadingSignal = signal(false);\n private readonly isTableActionRunningSignal = signal(false);\n private readonly activeEditableCellSignal = signal<{ rowId: string; columnKey: string } | null>(null);\n private readonly activeFormTargetSignal = signal<{ formId: string; recordId: string; initialValue: Record<string, unknown> } | null>(null);\n readonly activeFormTarget = computed(() => this.activeFormTargetSignal());\n\n readonly tableData = computed<UiTableResponse<Record<string, unknown>>>(() => ({\n items: this.tableRowsSignal(),\n pagination: this.tablePaginationSignal(),\n }));\n\n private pageIndex = 0;\n private pageSize = 10;\n private sortField = '';\n private sortDirection: '' | 'asc' | 'desc' = '';\n private tableViewColumns: TableViewColumn[] = [];\n private editableColumnsLoaded = false;\n private refreshAfterFormCompleted = false;\n\n ngOnChanges(): void {\n this.pageIndex = 0;\n this.pageSize = this.resolvePageSize();\n this.sortField = '';\n this.sortDirection = '';\n this.editableColumnsLoaded = false;\n this.activeEditableCellSignal.set(null);\n this.editableColumnOptionsSignal.set({});\n this.loadTable();\n }\n\n get disablePaging(): boolean {\n const value = this.tab?.props?.['disablePaging'];\n return value === true || value === 'true';\n }\n\n get tableColumns(): UiTableColumnConfig[] {\n return this.tableColumnsSignal();\n }\n\n get tableHeaderActions(): TableViewHeaderAction[] {\n return this.tableHeaderActionsSignal();\n }\n\n get tableActions(): Array<{\n id?: string;\n label: string;\n icon?: string;\n variant?: 'primary' | 'ghost' | 'danger';\n type?: ActionType;\n component?: string;\n formId?: string;\n api?: string;\n method?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';\n title?: string;\n text?: string;\n submit?: boolean | string;\n payload?: Record<string, unknown>;\n size?: 'sm' | 'md' | 'lg';\n }> {\n const blockActions = Array.isArray(this.tab?.actions) ? this.tab.actions : [];\n return [\n ...blockActions.map((action: any, index: number) => {\n const rawAction = action as UiEntityCardAction & { variant?: 'primary' | 'ghost' | 'danger' };\n return {\n ...action,\n variant: rawAction.variant || (index === 0 ? 'primary' : 'ghost'),\n };\n }),\n ...this.tableHeaderActions.map((action) => ({\n ...action,\n variant: 'ghost' as const,\n })),\n ];\n }\n\n get isTableLoading(): boolean {\n return this.isTableLoadingSignal();\n }\n\n get isTableActionRunning(): boolean {\n return this.isTableActionRunningSignal();\n }\n\n get rowClickable(): boolean {\n return this.isEditEnabled();\n }\n\n onTablePageChange(event: UiTableFilter): void {\n this.pageIndex = Math.max(0, Number(event['pageIndex'] ?? this.pageIndex) || 0);\n this.pageSize = Math.max(1, Number(event['pageSize'] ?? this.pageSize) || this.pageSize);\n const active = String(event['active'] ?? '').trim();\n this.sortField = this.tableViewColumns.find((column) => column.id === active)?.id || '';\n const direction = String(event['direction'] ?? '').toLowerCase();\n this.sortDirection = direction === 'asc' || direction === 'desc' ? direction : '';\n this.loadTable();\n }\n\n onTableAction(event: { action: UiTableRowAction; row: Record<string, unknown> }): void {\n if (normalizeActionType(event.action.type) === ACTION_PRINT || event.action.component === 'warehouseBarcodePrint' || event.action.template || event.action.id === 'print-certificate') {\n this.runPrintAction(event.action, event.row);\n return;\n }\n\n if (normalizeActionType(event.action.type) === ACTION_FORM && String(event.action.formId || '').trim()) {\n this.runFormAction(event.action, event.row);\n return;\n }\n\n if (!event.action.api) {\n return;\n }\n\n const payload = this.resolveTemplatePayload(event.action.payload || {}, event.row);\n this.runApiAction({\n api: this.resolveTemplateString(event.action.api, {\n ...event.row,\n ...payload,\n }),\n method: event.action.method || 'POST',\n payload,\n title: event.action.title,\n text: event.action.text,\n submit: event.action.submit,\n danger: event.action.danger,\n successMessage:\n event.action.id === 'issue'\n ? 'Матеріали списано зі складу'\n : event.action.id === 'delete'\n ? 'Позицію видалено'\n : 'Дію виконано',\n errorMessage: 'Не вдалося виконати дію',\n });\n }\n\n onHeaderAction(action: TableViewHeaderAction): void {\n if (!action?.formId) {\n if (action?.api) {\n this.runApiAction({\n api: action.api,\n method: action.method || 'POST',\n payload: this.resolveTemplatePayload(action.payload || {}, this.data || {}),\n title: action.title,\n text: action.text,\n submit: action.submit,\n danger: action.variant === 'danger',\n successMessage: 'Дію виконано',\n errorMessage: 'Не вдалося виконати дію',\n });\n }\n return;\n }\n\n this.runHeaderFormAction(action);\n }\n\n onTableRowClick(row: Record<string, unknown>): void {\n if (!this.isEditEnabled()) {\n return;\n }\n\n this.runRowEditAction(row);\n }\n\n onTableCellChange(event: UiTableCellChange<Record<string, unknown>>): void {\n const editableConfig = this.resolveEditableColumnsConfig().find((column) => column.key === event.column.key);\n if (!editableConfig) {\n return;\n }\n\n const rowId = String(event.row['id'] ?? '').trim();\n if (!rowId) {\n return;\n }\n\n const nextValue = String(event.value ?? '').trim();\n const nextRow = {\n ...event.row,\n [event.column.bindKey || event.column.key]: nextValue,\n };\n\n if (editableConfig.editor === 'select') {\n nextRow[event.column.key] =\n this.resolveEditableColumnOptions(event.column.key).find((option) => String(option.value ?? '').trim() === nextValue)?.label ?? '';\n }\n\n this.tableRowsSignal.update((rows) =>\n rows.map((row) => (String(row['id'] ?? '').trim() === rowId ? nextRow : row))\n );\n\n if (editableConfig.api) {\n this.saveEditableColumnChange(editableConfig, nextRow);\n }\n }\n\n onEditableCellActivate(row: Record<string, unknown>, columnKey: string, event: MouseEvent): void {\n event.stopPropagation();\n const rowId = String(row['id'] ?? '').trim();\n const key = String(columnKey || '').trim();\n if (!rowId || !key) {\n return;\n }\n\n this.activeEditableCellSignal.set({ rowId, columnKey: key });\n }\n\n isEditableCellActive(row: Record<string, unknown>, columnKey: string): boolean {\n const active = this.activeEditableCellSignal();\n return !!active && active.rowId === String(row['id'] ?? '').trim() && active.columnKey === String(columnKey || '').trim();\n }\n\n resolveEditableDisplayValue(row: Record<string, unknown>, column: UiTableColumnConfig): string {\n const rawValue = this.getCellValue(row, column.bindKey || column.key);\n if (rawValue === null || rawValue === undefined || rawValue === '') {\n return '—';\n }\n\n if (column.editor === 'select') {\n const value = String(rawValue).trim();\n const option = this.resolveEditableColumnOptions(column.key).find((item) => String(item.value ?? '').trim() === value);\n return String(option?.label || rawValue).trim() || '—';\n }\n\n return String(rawValue);\n }\n\n private getCellValue(row: Record<string, unknown>, column: string): unknown {\n return row?.[column];\n }\n\n private runPrintAction(action: UiTableRowAction, row: Record<string, unknown>): void {\n const template = String(action.template || (action.id === 'print-certificate' ? 'print-certificate' : '')).trim();\n const recordId = String(row['id'] || '').trim();\n if (template && recordId) {\n const printWindow = this.actionBus.openPrintWindow();\n const entity = encodeURIComponent(this.resolveTableSource());\n const id = encodeURIComponent(recordId);\n const actionId = encodeURIComponent(template);\n this.host?.callApi({\n api: `/api/crud/${entity}/${id}/action/${actionId}`,\n method: 'GET',\n }).subscribe({\n next: (response) => {\n const html = String((response as { data?: { html?: unknown } })?.data?.html || '').trim();\n const title = String((response as { data?: { title?: unknown } })?.data?.title || action.label || 'Друк');\n if (!html) {\n printWindow?.close();\n this.notify('Шаблон друку порожній', 'error');\n return;\n }\n const config = { html, title };\n if (printWindow) this.actionBus.printInWindow(printWindow, config);\n else this.actionBus.print(config);\n },\n error: (error) => {\n printWindow?.close();\n this.notify(error?.error?.message || 'Не вдалося завантажити сертифікат', 'error');\n },\n });\n return;\n }\n\n const payload = this.resolveTemplatePayload(action.payload || {}, row);\n const barcode = String(payload['barcode'] ?? row['barcode'] ?? '').trim();\n if (!barcode) {\n this.notify('У рядку немає штрихкоду', 'warning');\n return;\n }\n\n const title = String(payload['title'] ?? row['name'] ?? this.tab?.title ?? 'Штрихкод').trim() || 'Штрихкод';\n this.barcodePrintService.printBarcode({ barcode, title });\n }\n\n closeFormAction(): void {\n this.activeFormTargetSignal.set(null);\n }\n\n refreshTable(): void {\n this.loadTable();\n }\n\n onFormCompleted(response: unknown): void {\n this.refreshAfterFormCompleted = true;\n this.applyFormResultToRow(response);\n this.editableColumnsLoaded = false;\n this.editableColumnOptionsSignal.set({});\n this.loadEditableColumnOptions(true);\n }\n\n onFormClosed(): void {\n this.activeFormTargetSignal.set(null);\n this.activeEditableCellSignal.set(null);\n if (!this.refreshAfterFormCompleted) return;\n\n this.refreshAfterFormCompleted = false;\n this.loadTable();\n }\n\n private applyFormResultToRow(response: unknown): void {\n const target = this.activeFormTargetSignal();\n if (!target || !response || typeof response !== 'object') return;\n\n const responseData = (response as { data?: unknown }).data;\n if (!responseData || typeof responseData !== 'object') return;\n\n const data = responseData as Record<string, unknown>;\n const warehouse = data['warehouse'];\n const warehouseData = warehouse && typeof warehouse === 'object'\n ? warehouse as Record<string, unknown>\n : null;\n const warehouseId = String(warehouseData?.['id'] ?? data['warehouseId'] ?? '').trim();\n const warehouseItemId = String(data['id'] ?? '').trim();\n if (!warehouseId || !warehouseItemId) return;\n\n this.tableRowsSignal.update((rows) => rows.map((row) => {\n if (String(row['id'] ?? '').trim() !== target.recordId) return row;\n return {\n ...row,\n warehouse_id: warehouseId,\n warehouse_item_id: warehouseItemId,\n warehouse_position: String(warehouseData?.['name'] ?? data['name'] ?? '').trim(),\n };\n }));\n }\n\n private loadTable(): void {\n const table = this.resolveTableSource();\n this.isTableLoadingSignal.set(true);\n this.tableRowsSignal.set([]);\n this.tablePaginationSignal.set({ page: this.pageIndex, pageSize: this.pageSize, total: 0 });\n\n if (!table) {\n this.tableColumnsSignal.set([]);\n this.isTableLoadingSignal.set(false);\n return;\n }\n\n this.tableViewsService.getTableView(table, {\n page: this.pageIndex,\n size: this.pageSize,\n sortField: this.sortField,\n sortDirection: this.sortDirection,\n filters: this.resolveTableFilters(),\n }).subscribe({\n next: (view) => {\n const rows = this.normalizeTableRows(view);\n this.tableViewColumns = view.columns || [];\n this.tableHeaderActionsSignal.set(view.actions?.header?.custom || []);\n this.tableColumnsSignal.set(this.normalizeTableColumns(this.tableViewColumns));\n this.tableRowsSignal.set(rows);\n this.activeEditableCellSignal.set(null);\n this.loadEditableColumnOptions();\n this.pageIndex = view.pagination?.page ?? this.pageIndex;\n this.pageSize = view.pagination?.size ?? this.pageSize;\n this.tablePaginationSignal.set({\n page: this.pageIndex,\n pageSize: this.pageSize,\n total: view.pagination?.totalElements ?? rows.length,\n });\n this.isTableLoadingSignal.set(false);\n },\n error: (error) => {\n this.tableRowsSignal.set([]);\n this.tableHeaderActionsSignal.set([]);\n this.tablePaginationSignal.set({ page: this.pageIndex, pageSize: this.pageSize, total: 0 });\n this.activeEditableCellSignal.set(null);\n this.isTableLoadingSignal.set(false);\n this.notify(error?.error?.message || 'Не вдалося завантажити таблицю', 'error');\n },\n });\n }\n\n private runApiAction(config: {\n api: string;\n method: UiTableRowAction['method'];\n payload: Record<string, unknown>;\n title?: string;\n text?: string;\n submit?: boolean | string;\n danger?: boolean;\n successMessage: string;\n errorMessage: string;\n }): void {\n const api = String(config.api || '').trim();\n if (!api) {\n return;\n }\n\n this.isTableActionRunningSignal.set(true);\n this.host?.callApi({\n api,\n method: config.method || 'POST',\n title: config.title,\n text: config.text,\n submit: typeof config.submit === 'string' ? config.submit : undefined,\n danger: config.danger,\n payload: config.payload,\n }).subscribe({\n next: () => {\n this.notify(config.successMessage, 'success');\n this.isTableActionRunningSignal.set(false);\n this.loadTable();\n this.eventBus.emit<EntityUpdatedEvent>(ENTITY_UPDATED, {\n source: 'card-table.row-action',\n });\n },\n error: (error) => {\n this.isTableActionRunningSignal.set(false);\n this.notify(error?.error?.message || config.errorMessage, 'error');\n },\n });\n }\n\n private runFormAction(action: UiTableRowAction, row: Record<string, unknown>): void {\n const formId = String(action.formId || '').trim();\n const recordId = String(row['id'] || '').trim();\n if (!formId || !recordId) {\n this.notify('Не вдалося відкрити форму редагування', 'warning');\n return;\n }\n\n const actionPayload = this.resolveTemplatePayload(action.payload || {}, row);\n this.activeFormTargetSignal.set({\n formId,\n recordId,\n initialValue: { ...row, ...actionPayload },\n });\n }\n\n private runRowEditAction(row: Record<string, unknown>): void {\n const recordId = String(row['id'] || '').trim();\n const formId = this.resolveTableSource();\n if (!recordId || !formId) {\n return;\n }\n\n this.activeFormTargetSignal.set({\n formId,\n recordId,\n initialValue: { ...row },\n });\n }\n\n private runHeaderFormAction(action: TableViewHeaderAction): void {\n const formId = String(action.formId || '').trim();\n if (!formId) {\n return;\n }\n\n this.activeFormTargetSignal.set({\n formId,\n recordId: '',\n initialValue: this.resolveTemplatePayload(action.payload || {}, this.data || {}),\n });\n }\n\n private normalizeTableColumns(columns: TableViewColumn[]): UiTableColumnConfig[] {\n const editableColumns = this.resolveEditableColumnsConfig();\n return (columns || [])\n .filter((column) => !column.hidden)\n .map((column): UiTableColumnConfig => {\n const editableConfig = editableColumns.find((item) => item.key === column.id);\n if (!editableConfig) {\n return {\n key: column.id,\n labelKey: column.label,\n sortable: true,\n type: column.type,\n width: column.width,\n link: column.link,\n };\n }\n\n return {\n key: column.id,\n labelKey: column.label,\n sortable: true,\n type: column.type,\n width: column.width,\n link: column.link,\n editable: true,\n editableCondition: this.resolveEditableCondition(),\n bindKey: editableConfig.bindKey || column.sourceColumn || column.dataKey || column.id,\n editor: editableConfig.editor,\n options: this.resolveEditableColumnOptions(column.id),\n includeBlankOption: editableConfig.includeBlankOption,\n blankOptionLabel: editableConfig.blankOptionLabel,\n placeholder: editableConfig.placeholder,\n inputType: editableConfig.inputType,\n };\n });\n }\n\n private normalizeTableRows(view: TableViewResponse): Record<string, unknown>[] {\n const columns = view.columns || [];\n const hiddenRowActions = new Set(\n Array.isArray(this.tab?.props?.['hiddenRowActions'])\n ? this.tab.props['hiddenRowActions'].map((id: unknown) => String(id || '').trim()).filter(Boolean)\n : []\n );\n const rowActions = (view.actions?.row?.custom || []).filter((action: any) => !hiddenRowActions.has(action.id));\n const configuredRowActions = view.actions?.row || {};\n const defaultRowActions = {\n edit: view.viewActions?.edit !== false && configuredRowActions.edit !== false,\n editCondition: configuredRowActions.edit && typeof configuredRowActions.edit === 'object'\n ? configuredRowActions.edit.condition\n : undefined,\n delete: view.viewActions?.delete !== false && configuredRowActions.delete !== false,\n deleteCondition: configuredRowActions.delete && typeof configuredRowActions.delete === 'object'\n ? configuredRowActions.delete.condition\n : undefined,\n };\n return (view.rows || []).map((row: any) => this.toTableRowData(row, columns, rowActions, defaultRowActions));\n }\n\n private toTableRowData(\n row: TableViewRow,\n columns: TableViewColumn[],\n rowActions: UiTableRowAction[] = [],\n configuredActions: {\n edit?: boolean;\n editCondition?: string;\n delete?: boolean;\n deleteCondition?: string;\n } = {}\n ): Record<string, unknown> {\n const baseRow: Record<string, unknown> = Array.isArray(row)\n ? columns.reduce<Record<string, unknown>>((acc, column, index) => {\n acc[column.id] = row[index] ?? '';\n return acc;\n }, { id: String(row[0] ?? '') })\n : {\n ...(row as Record<string, unknown>),\n id: String((row as Record<string, unknown>)['id'] ?? ''),\n };\n\n if (this.resolveTableSource() === 'invoice-lines' && String(baseRow['line_id'] || '').trim()) {\n baseRow['id'] = String(baseRow['line_id']).trim();\n }\n\n if (!Array.isArray(baseRow['actions']) && rowActions.length) {\n baseRow['actions'] = rowActions.map((action) => ({ ...action }));\n }\n\n if (!Array.isArray(baseRow['actions'])) {\n const actions: UiTableRowAction[] = [];\n const editAllowed = configuredActions.edit !== false\n && (this.isEditEnabled() || evaluateCondition(configuredActions.editCondition, baseRow));\n if (editAllowed) {\n actions.push({\n id: 'edit',\n label: 'Редагувати',\n type: ACTION_FORM,\n formId: this.resolveTableSource(),\n });\n }\n const deleteAllowed = configuredActions.delete !== false\n && (this.isDeleteEnabled(baseRow) || evaluateCondition(configuredActions.deleteCondition, baseRow));\n if (deleteAllowed) {\n actions.push({\n id: 'delete',\n label: 'Видалити',\n type: ACTION_API,\n api: `/api/${this.resolveTableSource()}/{{id}}`,\n method: 'DELETE',\n danger: true,\n payload: { id: '{{id}}' },\n });\n }\n if (actions.length) baseRow['actions'] = actions;\n }\n\n return baseRow;\n }\n\n private saveEditableColumnChange(\n editableConfig: ReturnType<typeof this.resolveEditableColumnsConfig>[number],\n row: Record<string, unknown>\n ): void {\n const api = String(editableConfig.api || '').trim();\n if (!api) {\n return;\n }\n\n const payload = this.resolveEditableColumnPayload(editableConfig, row);\n if (!payload) {\n return;\n }\n\n this.isTableActionRunningSignal.set(true);\n this.host?.callApi({\n api,\n method: editableConfig.method || 'PATCH',\n payload,\n }).subscribe({\n next: () => {\n this.isTableActionRunningSignal.set(false);\n this.notify(editableConfig.successMessage || 'Збережено', 'success');\n this.loadTable();\n this.eventBus.emit<EntityUpdatedEvent>(ENTITY_UPDATED, {\n source: 'card-table.editable-cell',\n });\n },\n error: (error) => {\n this.isTableActionRunningSignal.set(false);\n this.notify(error?.error?.message || editableConfig.errorMessage || 'Не вдалося зберегти зміни', 'error');\n },\n });\n }\n\n private loadEditableColumnOptions(force = false): void {\n if (this.editableColumnsLoaded && !force) {\n return;\n }\n\n const editableColumns = this.resolveEditableColumnsConfig();\n const columnsNeedingOptions = editableColumns.filter((column) => column.optionsSource === 'warehouses' || column.optionsSource === 'warehouse-items');\n if (!columnsNeedingOptions.length) {\n this.editableColumnsLoaded = true;\n return;\n }\n\n this.editableColumnsLoaded = true;\n this.warehouseService.getWarehouses().subscribe({\n next: (response) => {\n const warehouses = response.items ?? [];\n const warehouseOptions: UiSelectOption[] = warehouses\n .map((warehouse: any) => ({\n value: warehouse.id ? String(warehouse.id) : null,\n label: String(warehouse.name || warehouse.labelName || warehouse.id || 'Склад').trim() || 'Склад',\n }))\n .filter((option: any): option is UiSelectOption => !!option.value);\n\n const loadWarehouseItemOptions = (done: (options: UiSelectOption[]) => void): void => {\n if (!warehouses.length) {\n done([]);\n return;\n }\n\n const options: UiSelectOption[] = [];\n let remaining = warehouses.length;\n\n for (const warehouse of warehouses) {\n const warehouseId = String(warehouse.id || '').trim();\n if (!warehouseId) {\n remaining -= 1;\n continue;\n }\n\n this.warehouseService.getWarehouseItems(warehouseId).subscribe({\n next: (items) => {\n for (const item of items ?? []) {\n options.push({\n value: item.id ? String(item.id) : null,\n label: [\n String(warehouse.labelName || warehouse.name || warehouse.id || '').trim(),\n String(item.name || item.id || '').trim(),\n ]\n .filter(Boolean)\n .join(' / '),\n });\n }\n remaining -= 1;\n if (remaining <= 0) {\n done(options.filter((option) => !!option.value));\n }\n },\n error: () => {\n remaining -= 1;\n if (remaining <= 0) {\n done(options.filter((option) => !!option.value));\n }\n },\n });\n }\n };\n\n const applyOptions = (warehouseItemOptions: UiSelectOption[] = []): void => {\n this.editableColumnOptionsSignal.set(\n columnsNeedingOptions.reduce<Record<string, UiSelectOption[]>>((acc, column) => {\n acc[column.key] = column.optionsSource === 'warehouses' ? warehouseOptions : warehouseItemOptions;\n return acc;\n }, {})\n );\n this.tableColumnsSignal.set(this.normalizeTableColumns(this.tableViewColumns));\n };\n\n if (!columnsNeedingOptions.some((column) => column.optionsSource === 'warehouse-items')) {\n applyOptions();\n return;\n }\n\n loadWarehouseItemOptions(applyOptions);\n },\n error: () => {\n this.editableColumnOptionsSignal.set({});\n this.tableColumnsSignal.set(this.normalizeTableColumns(this.tableViewColumns));\n },\n });\n }\n\n private resolveEditableColumnsConfig(): Array<{\n key: string;\n bindKey?: string;\n editor?: 'text' | 'number' | 'select';\n optionsSource?: string;\n includeBlankOption?: boolean;\n blankOptionLabel?: string;\n placeholder?: string;\n inputType?: 'text' | 'number';\n api?: string;\n method?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE';\n payload?: Record<string, unknown>;\n successMessage?: string;\n errorMessage?: string;\n }> {\n const value = this.tab?.props?.['editableColumns'];\n return Array.isArray(value)\n ? value.filter((item): item is {\n key: string;\n bindKey?: string;\n editor?: 'text' | 'number' | 'select';\n optionsSource?: string;\n includeBlankOption?: boolean;\n blankOptionLabel?: string;\n placeholder?: string;\n inputType?: 'text' | 'number';\n } => !!item && typeof item === 'object' && typeof (item as { key?: unknown }).key === 'string')\n : [];\n }\n\n private resolveEditableColumnPayload(\n editableConfig: ReturnType<typeof this.resolveEditableColumnsConfig>[number],\n row: Record<string, unknown>\n ): Record<string, unknown> | null {\n const baseRow = {\n ...row,\n id: String(row['id'] ?? '').trim(),\n };\n\n const payloadConfig = editableConfig.payload && typeof editableConfig.payload === 'object' ? editableConfig.payload : {};\n const payload = this.resolveTemplatePayload(payloadConfig as Record<string, unknown>, {\n ...this.data,\n ...baseRow,\n });\n\n if (!Object.keys(payload).length) {\n return baseRow;\n }\n\n return {\n ...baseRow,\n ...payload,\n };\n }\n\n private resolveEditableColumnOptions(columnKey: string): UiSelectOption[] {\n return this.editableColumnOptionsSignal()[columnKey] || [];\n }\n\n private isEditEnabled(): boolean {\n const value = this.tab?.props?.['edit'];\n const enabled = value === true || String(value).trim().toLowerCase() === 'true';\n if (!enabled) {\n return false;\n }\n\n return evaluateCondition(String(this.tab?.props?.['editCondition'] || '').trim(), this.data || {});\n }\n\n private isDeleteEnabled(row: Record<string, unknown>): boolean {\n const value = this.tab?.props?.['delete'];\n const enabled = value === true || String(value).trim().toLowerCase() === 'true';\n if (!enabled) return false;\n\n return evaluateCondition(String(this.tab?.props?.['deleteCondition'] || '').trim(), row);\n }\n\n private resolveTableSource(): string {\n return this.resolveTemplateString(String(this.tab?.props?.['table'] || '').trim(), this.data || {});\n }\n\n private resolveTableFilters(): Record<string, unknown> {\n return {\n ...this.resolveFiltersObject(this.tab?.props?.['initialFilters']),\n ...this.resolveFiltersObject(this.tab?.props?.['filter']),\n };\n }\n\n private resolveFiltersObject(filter: unknown): Record<string, unknown> {\n if (!filter || typeof filter !== 'object' || Array.isArray(filter)) {\n return {};\n }\n\n return this.resolveTemplatePayload(filter as Record<string, unknown>, this.data || {});\n }\n\n private resolveTemplatePayload(payload: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n return Object.entries(payload || {}).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const next = this.resolveTemplateValue(value, source);\n if (next !== null && next !== undefined && next !== '') {\n acc[key] = next;\n }\n return acc;\n }, {});\n }\n\n private resolveTemplateString(value: string, source: Record<string, unknown>): string {\n return String(value || '').replace(/\\{\\{([a-zA-Z_][a-zA-Z0-9_.]*)\\}\\}/g, (_match, key) => {\n const next = String(key).split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source);\n return next == null || next === '' ? '' : encodeURIComponent(String(next));\n });\n }\n\n private resolveTemplateValue(value: unknown, source: Record<string, unknown>): unknown {\n if (typeof value !== 'string') {\n return value;\n }\n\n const raw = value.trim();\n const match = raw.match(/^\\{\\{([a-zA-Z_][a-zA-Z0-9_.]*)\\}\\}$/);\n if (match) {\n return String(match[1]).split('.').reduce<unknown>((current, part) => {\n if (current == null || typeof current !== 'object') return undefined;\n return (current as Record<string, unknown>)[part];\n }, source) ?? '';\n }\n\n return value;\n }\n\n private resolvePageSize(): number {\n const value = Number(this.tab?.props?.['pageSize'] ?? 10);\n return Number.isFinite(value) && value > 0 ? Math.floor(value) : 10;\n }\n\n private resolveEditCondition(): string | undefined {\n const condition = String(this.tab?.props?.['editCondition'] || '').trim();\n return condition || undefined;\n }\n\n private resolveEditableCondition(): string | undefined {\n const condition = String(this.tab?.props?.['editableCondition'] || '').trim();\n return condition || this.resolveEditCondition();\n }\n\n private notify(message: string, variant: 'success' | 'error' | 'warning'): void {\n this.host?.notify(message, variant, 2800);\n }\n}\n","<section class=\"space-y-4\">\n @if (tableHeaderActions.length) {\n <div class=\"flex justify-end gap-2\">\n @for (action of tableHeaderActions; track action.id) {\n <ui-button\n [variant]=\"action.variant || 'ghost'\"\n [icon]=\"action.icon || ''\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onHeaderAction(action)\"\n >\n {{ action.label }}\n </ui-button>\n }\n </div>\n }\n\n <app-ui-table\n [data]=\"tableData()\"\n [columns]=\"tableColumns\"\n [isLoading]=\"isTableLoading\"\n [disablePaging]=\"disablePaging\"\n [rowClickable]=\"rowClickable\"\n (pageChange)=\"onTablePageChange($event)\"\n (actionClick)=\"onTableAction($event)\"\n (rowClick)=\"onTableRowClick($event)\"\n (cellChange)=\"onTableCellChange($event)\"\n ></app-ui-table>\n\n @if (activeFormTarget(); as target) {\n <form-modal\n [isOpen]=\"true\"\n [formId]=\"target.formId\"\n [recordId]=\"target.recordId\"\n [initialValue]=\"target.initialValue\"\n (closed)=\"onFormClosed()\"\n (completed)=\"onFormCompleted($event)\"\n ></form-modal>\n }\n</section>\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/standard-table.component.ts","../../../src/lib/tabs/table/standard-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 { forkJoin, 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 };\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 placeholder?: string;\n includeBlankOption?: boolean;\n blankOptionLabel?: string;\n};\n\n@Component({\n selector: 'app-card-table',\n standalone: true,\n imports: [CommonModule, UiTableComponent],\n templateUrl: './standard-table.component.html',\n})\nexport class StandardTableComponent 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 private readonly headerActionsSignal = signal<UiEntityCardAction[]>([]);\n private readonly loadingSignal = signal(false);\n private readonly errorSignal = signal('');\n private readonly editableOptionsSignal = signal<Record<string, Array<{ label: string; value: string | null; disabled?: boolean }>>>({});\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 this.loadEditableOptions();\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 || this.editableOptionsSignal()[key] || [],\n placeholder: config?.placeholder,\n includeBlankOption: config?.includeBlankOption,\n blankOptionLabel: config?.blankOptionLabel,\n } as UiTableColumnConfig;\n }));\n }\n\n private loadEditableOptions(): void {\n const sources = this.editableColumns().filter((column) => column.data && !column.options);\n if (!sources.length) return;\n\n forkJoin(sources.map((column) => this.http.get<any[]>(`/api/suggest/${encodeURIComponent(column.data!)}`))).subscribe({\n next: (responses) => {\n const options = { ...this.editableOptionsSignal() };\n sources.forEach((column, index) => {\n options[column.key] = (responses[index] || []).map((item) => ({\n value: item?.key == null ? null : String(item.key),\n label: String(item?.label || item?.key || '').trim(),\n }));\n });\n this.editableOptionsSignal.set(options);\n this.setColumns();\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 if (view.viewActions?.edit !== false && view.actions?.row?.edit !== false && this.editEnabled()) {\n actions.push({ id: 'edit', label: 'Редагувати', type: 'form', formId: this.tableName() });\n }\n if (view.viewActions?.delete !== false && view.actions?.row?.delete !== false) {\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 },\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 [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 { StandardTableComponent } from '../../tabs/table/standard-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, StandardTableComponent],\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 { StandardTableComponent } from '../../tabs/table/standard-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, StandardTableComponent],\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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"}
|