@yuuvis/client-framework 3.11.1 → 3.13.0

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.
Files changed (24) hide show
  1. package/fesm2022/yuuvis-client-framework-actions.mjs +7 -2
  2. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
  3. package/fesm2022/yuuvis-client-framework-forms.mjs +315 -29
  4. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  5. package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs +4 -3
  6. package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs.map +1 -1
  7. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +2 -2
  8. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
  9. package/fesm2022/yuuvis-client-framework-object-relationship.mjs +1 -1
  10. package/fesm2022/yuuvis-client-framework-object-relationship.mjs.map +1 -1
  11. package/fesm2022/yuuvis-client-framework-object-versions.mjs +1 -1
  12. package/fesm2022/yuuvis-client-framework-object-versions.mjs.map +1 -1
  13. package/fesm2022/yuuvis-client-framework-query-list.mjs +123 -5
  14. package/fesm2022/yuuvis-client-framework-query-list.mjs.map +1 -1
  15. package/fesm2022/yuuvis-client-framework-renderer.mjs +9 -0
  16. package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -1
  17. package/fesm2022/yuuvis-client-framework-tile-list.mjs +18 -7
  18. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  19. package/lib/assets/i18n/de.json +10 -7
  20. package/lib/assets/i18n/en.json +23 -20
  21. package/package.json +5 -5
  22. package/types/yuuvis-client-framework-forms.d.ts +110 -3
  23. package/types/yuuvis-client-framework-query-list.d.ts +44 -1
  24. package/types/yuuvis-client-framework-tile-list.d.ts +12 -2
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework-query-list.mjs","sources":["../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.component.ts","../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.component.html","../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.module.ts","../../../../../libs/yuuvis/client-framework/query-list/src/yuuvis-client-framework-query-list.ts"],"sourcesContent":["import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild\n} from '@angular/core';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { SearchQuery, SearchResult, SearchResultItem, SearchService } from '@yuuvis/client-core';\nimport { ClickDoubleDirective, DragSelectDirective, DragSelectItemDirective } from '@yuuvis/client-framework/common';\nimport { ListComponent, YuvListModule } from '@yuuvis/client-framework/list';\nimport { Pagination } from '@yuuvis/client-framework/pagination';\nimport { DeviceService } from '@yuuvis/material';\n\n/**\n * Query-driven list component that executes a search query and renders the results\n * using a consumer-provided item template.\n *\n * The component is a thin orchestration layer on top of `yuv-list`: it handles the\n * full query lifecycle (executing, paginating, refreshing), exposes a typed result\n * set via the optional `transformer` input, and delegates all keyboard navigation,\n * selection, and accessibility concerns to the inner `ListComponent`.\n *\n * **Key Features:**\n * - Accepts a `SearchQuery` object or a raw CMIS query string\n * - Optional `transformer` function maps raw `SearchResultItem[]` to any custom type `T`\n * - Built-in server-side pagination via Angular Material `mat-paginator`\n * - Multi-selection with mouse drag (`DragSelectDirective`) and keyboard modifiers\n * - \"Drop-in\" items prepended to the result set for optimistic UI updates\n * - Busy state signal for loading indicators\n * - Exposes a slim imperative API (`select`, `clear`, `refresh`, `goToPage`, …)\n * so parents can drive the list programmatically\n *\n * **Content Projection Slots:**\n * - `#yuvQueryListItem` — required; `ng-template` used to render each result item.\n * Receives the (optionally transformed) item as `$implicit`.\n * - `#yuvQueryListEmpty` — optional; `ng-template` shown when the result set is empty.\n *\n * **Basic usage:**\n * ```html\n * <yuv-query-list [query]=\"query\" (itemSelect)=\"onSelect($event)\">\n * <ng-template #yuvQueryListItem let-item>\n * <span>{{ item.title }}</span>\n * </ng-template>\n * </yuv-query-list>\n * ```\n *\n * **With transformer and empty state:**\n * ```html\n * <yuv-query-list [query]=\"query\" [transformer]=\"toViewModel\" (itemSelect)=\"onSelect($event)\">\n * <ng-template #yuvQueryListItem let-item>\n * <yuv-list-tile>\n * <ng-template #titleSlot>{{ item.title }}</ng-template>\n * <ng-template #descriptionSlot>{{ item.modified }}</ng-template>\n * </yuv-list-tile>\n * </ng-template>\n * <ng-template #yuvQueryListEmpty>\n * <p>No results found.</p>\n * </ng-template>\n * </yuv-query-list>\n * ```\n *\n * ```ts\n * toViewModel = (items: SearchResultItem[]) =>\n * items.map(item => ({\n * title: item.fields.get(BaseObjectTypeField.OBJECT_ID),\n * modified: item.fields.get(BaseObjectTypeField.MODIFICATION_DATE)\n * }));\n * ```\n *\n * @typeParam T The shape of each item after the optional `transformer` is applied.\n * Defaults to `any` when no transformer is provided.\n */\n@Component({\n selector: 'yuv-query-list',\n imports: [\n CommonModule,\n YuvListModule,\n ClickDoubleDirective,\n DragSelectDirective,\n DragSelectItemDirective,\n MatPaginatorModule\n ],\n templateUrl: './query-list.component.html',\n styleUrl: './query-list.component.scss',\n host: { '[class.pagination]': '!!pagination()' },\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class QueryListComponent<T = any> {\n //#region Dependencies\n\n #device = inject(DeviceService);\n #searchService = inject(SearchService);\n\n //#endregion\n\n //#region Angular stuff\n\n /**\n * Current pagination state. Set to a `Pagination` object when the last query\n * result contained multiple pages; `undefined` when all results fit on one page\n * or no query has been executed yet.\n *\n * Drives the `[class.pagination]` host binding so the template can conditionally\n * render the `mat-paginator` footer.\n */\n pagination = signal<Pagination | undefined>(undefined);\n\n /**\n * Reference to the inner `ListComponent` instance.\n *\n * Used internally to delegate imperative operations (select, clear, focus, …).\n * Can also be accessed from the parent via a `@ViewChild` on `yuv-query-list` if\n * fine-grained control over the inner list is needed, though the public API methods\n * on this component are preferred.\n */\n list = viewChild.required<ListComponent>('list');\n\n /**\n * Reference to the `#yuvQueryListItem` `ng-template` projected by the consumer.\n *\n * This template is used to render each individual item in the list. The template\n * receives the (optionally transformed) item as the `$implicit` context variable:\n * ```html\n * <ng-template #yuvQueryListItem let-item>{{ item.title }}</ng-template>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n itemTemplate = contentChild<TemplateRef<any>>('yuvQueryListItem');\n\n /**\n * Reference to the optional `#yuvQueryListEmpty` `ng-template` projected by the consumer.\n *\n * When provided, this template is rendered in place of the list whenever the query\n * returns zero items. If omitted, nothing is shown for the empty state.\n * ```html\n * <ng-template #yuvQueryListEmpty>\n * <p>No results found.</p>\n * </ng-template>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n emptyTemplate = contentChild<TemplateRef<any>>('yuvQueryListEmpty');\n\n /**\n * The search query to execute.\n *\n * Accepts either a structured `SearchQuery` object (field filters, sort orders, etc.)\n * or a raw CMIS query string. The query is re-executed reactively every time this\n * input changes. Set to `null` or `undefined` to clear the list without triggering\n * a new request.\n */\n query = input<SearchQuery | string | null>();\n\n /**\n * Property name on the (transformed) item to use as a stable unique identifier.\n *\n * When provided, the template renderer uses this property for `@for` tracking instead\n * of the item's position index, which preserves DOM nodes and component state when the\n * list is refreshed with partially overlapping results.\n *\n * If omitted, the zero-based index is used as the tracking key.\n *\n * @default null\n */\n idProperty = input<string | null>(null);\n\n /**\n * Optional mapping function applied to the raw `SearchResultItem[]` returned by the\n * search service before the results are rendered.\n *\n * Use this to project only the fields your template needs, compute derived properties,\n * or convert dates/enums to display-friendly values. The generic type parameter `T`\n * of the component is inferred from the return type of this function.\n *\n * If omitted, raw `SearchResultItem` objects are passed to the item template as-is.\n *\n * @example\n * ```ts\n * transformer = (items: SearchResultItem[]) =>\n * items.map(item => ({\n * id: item.fields.get(BaseObjectTypeField.OBJECT_ID) as string,\n * title: item.fields.get('cm:name') as string\n * }));\n * ```\n */\n transformer = input<((items: SearchResultItem[]) => T[]) | null>();\n\n /**\n * Guard function that temporarily blocks all selection changes.\n *\n * Forwarded directly to the inner `ListComponent`. As long as the returned predicate\n * evaluates to `true`, any attempt to change the selection — via click, keyboard, or\n * the programmatic API — is silently ignored. Useful when the parent has unsaved\n * changes tied to the current selection and needs to prevent the user from\n * accidentally navigating away.\n *\n * @default () => false (never prevents)\n */\n preventChangeUntil = input<() => boolean>(() => false);\n\n /**\n * Automatically selects an item when the list is first rendered.\n *\n * Forwarded to the inner `ListComponent`. The selection logic runs once after the\n * initial query result is displayed and follows this priority:\n * 1. The first non-disabled item that already carries the `selected` attribute.\n * 2. If no such item exists and `autoSelect` is `true`, the item at index 0.\n *\n * Accepts any truthy string in addition to a real boolean so it can be set as a\n * plain HTML attribute: `<yuv-query-list autoSelect>`.\n *\n * @default false\n */\n autoSelect = input<boolean, BooleanInput>(false, {\n transform: (value: BooleanInput) => coerceBooleanProperty(value)\n });\n\n /**\n * Emits the current selection as an array of zero-based item indices whenever\n * the selection changes — via click, drag, keyboard, or programmatic API calls.\n *\n * An empty array signals that the selection has been cleared.\n */\n itemSelect = output<number[]>();\n\n /**\n * Emits the live selection indices while the user is actively dragging to select.\n *\n * Fires continuously during a drag operation (before the drag is released), allowing\n * the parent to show a live preview of what will be selected. Once the drag ends,\n * `itemSelect` fires with the final committed selection.\n */\n dragSelectChange = output<number[]>();\n\n /**\n * Emits the zero-based index of an item when it is double-clicked.\n *\n * The inner list operates with `selfHandleClick` mode when double-click is active,\n * so single clicks do not immediately trigger `itemSelect`. The parent should listen\n * to both `itemSelect` (for single-click selection) and this event (for double-click\n * actions like opening a detail view).\n */\n itemDoubleClick = output<number>();\n\n /**\n * Emits once per query execution when the search result arrives, providing the total\n * count of matching items and the raw result page.\n *\n * Use this to update external counters, breadcrumbs, or analytics — without having to\n * execute a separate count query. Note that `totalCount` reflects the server-side total,\n * not just the number of items on the current page.\n */\n queryResult = output<{ totalCount: number; items: SearchResultItem[] }>();\n\n /**\n * Number of items to request per page from the search service.\n *\n * Controls the `size` parameter of each search request. When the total result count\n * exceeds this value, pagination controls are shown and the user can navigate between\n * pages via `changePage()` / `goToPage()`.\n *\n * Resolution order (see `effectivePageSize`): explicit `pageSize` input takes precedence,\n * otherwise `(query as SearchQuery).size` is used if set, otherwise\n * `SearchService.DEFAULT_QUERY_SIZE` is used.\n */\n pageSize = input<number | undefined>(undefined);\n\n /**\n * Enables mouse drag-to-select on list items.\n *\n * When `true` and `multiselect` is also `true`, the user can click and drag across\n * items to select a range without holding Shift. Powered by `DragSelectDirective`.\n * Automatically disabled on touch devices regardless of this input value.\n *\n * @default true\n */\n enableDragSelect = input<boolean>(true);\n\n /**\n * Enables multi-selection mode.\n *\n * When `true`, the user can hold **Shift** or **Ctrl** to extend or toggle the\n * selection, and drag-to-select becomes available (if `enableDragSelect` is also\n * `true`). Forwarded to the inner `ListComponent`.\n *\n * @default false\n */\n multiselect = input<boolean>(false);\n\n /**\n * Delegates visual selection and focus state rendering to the parent component.\n *\n * When `false` (default), `yuv-list` applies CSS classes for selected and active\n * states automatically. When `true`, those signals are still updated but the host\n * receives the `self-handle-selection` CSS class, allowing the parent to apply\n * its own visual treatment. Forwarded to the inner `ListComponent`.\n *\n * @default false\n */\n selfHandleSelection = input<boolean>(false);\n\n /**\n * Whether to include permission information in CMIS search results.\n * When `true`, the third parameter of `searchCmis()` is set,\n * causing the backend to return permission data alongside each item.\n *\n * @default false\n */\n includePermissions = input<boolean>(false);\n\n //#endregion\n\n //#region Properties\n\n /**\n * Whether the current device has touch input enabled.\n *\n * Sourced from `DeviceService`. Used in the template to conditionally disable\n * drag-to-select, which is not suitable for touch interactions.\n */\n isTouchDevice = this.#device.isTouchEnabled;\n\n /**\n * Number of drop-in items currently prepended to the result list.\n *\n * Derived from the internal `#dropInItems` signal. Exposed publicly so the template\n * and parent components can easily check whether any temporary items are present\n * (e.g. to show a visual indicator or adjust layout) without accessing internal state.\n */\n dropInSize = computed(() => this.#dropInItems().length);\n\n /**\n * Resolved page size used by both the `mat-paginator` and every server request.\n *\n * Falls back through three sources, in order:\n * 1. The explicit `pageSize` input, when the consumer has provided one.\n * 2. `(query as SearchQuery).size`, when the query is a `SearchQuery` object that\n * already declares its own page size — keeps server response and paginator in\n * sync when the consumer only configures the query.\n * 3. `SearchService.DEFAULT_QUERY_SIZE` as the final default.\n *\n * Used internally to avoid the bug where `mat-paginator` and the server pageination\n * use different page sizes (paginator showing e.g. \"1-25 of 43\" while `getPage()`\n * asks the server for skip=50 — landing on an empty page).\n */\n effectivePageSize = computed<number>(() => {\n const inputSize = this.pageSize();\n if (inputSize !== undefined) return inputSize;\n const query = this.query();\n if (query && typeof query !== 'string' && query.size) return query.size;\n return SearchService.DEFAULT_QUERY_SIZE;\n });\n\n /**\n * The final list of items rendered by the template.\n *\n * Computed from three sources, merged in this order:\n * 1. **Drop-in items** (`#dropInItems`) — temporary items prepended to the list,\n * e.g. newly created objects that should appear before they match the query.\n * 2. **Transformed query results** — raw `SearchResultItem[]` passed through the\n * optional `transformer` function (or cast directly to `T[]` if none is provided).\n * 3. **Optimistic updates** (`#listItemUpdates`) — per-index overrides applied on top\n * of the merged list, allowing individual items to be patched without re-fetching.\n *\n * Re-evaluates automatically whenever any of the three sources change.\n */\n resultItems = computed<T[]>(() => {\n const items = this.#items();\n const updates = this.#listItemUpdates();\n const transformer = this.transformer();\n const transformedResult = transformer ? transformer(items) : (items as unknown as T[]);\n const dropIns = this.#dropInItems();\n\n let merged: T[];\n const idProp = this.idProperty();\n\n if (dropIns.length > 0 && idProp) {\n // Deduplicate: filter out server results that already appear as drop-in items\n const dropInIds = new Set(dropIns.map((item) => (item as Record<string, unknown>)[idProp]));\n const filtered = transformedResult.filter((item) => !dropInIds.has((item as Record<string, unknown>)[idProp]));\n merged = [...dropIns, ...filtered];\n } else {\n merged = [...dropIns, ...transformedResult];\n }\n\n // apply updates to transformed result\n Object.keys(updates).forEach((index) => {\n merged[Number(index)] = updates[Number(index)];\n });\n return merged;\n });\n\n /**\n * Indicates whether a search request is currently in flight.\n *\n * Set to `true` immediately before a query or page request is dispatched to the\n * search service, and back to `false` once the response (or error) arrives.\n * Bind this to a loading indicator or `BusyOverlayDirective` in the parent template:\n * ```html\n * <yuv-query-list #qList ...>...</yuv-query-list>\n * <yuv-busy-overlay [active]=\"qList.busy()\" />\n * ```\n */\n busy = signal<boolean>(false);\n\n #items = signal<SearchResultItem[]>([]);\n\n #dropInItems = signal<T[]>([]);\n\n #listItemUpdates = signal<Record<number, T>>({});\n\n //#endregion\n\n constructor() {\n effect(this.#executeQueryEffect);\n }\n\n //#region UI Methods\n\n /** Resolves the tracking key for a result item in the `@for` loop. */\n trackItem(item: T, index: number): unknown {\n const prop = this.idProperty();\n return prop ? (item as Record<string, unknown>)[prop] : index;\n }\n\n /**\n * Handles a single click on a list item.\n *\n * Forwards the click to the inner `ListComponent` with the correct Shift/Ctrl modifier\n * flags so range- and toggle-selection work correctly. Also transfers DOM focus to the\n * list host so subsequent keyboard navigation works without an additional Tab press.\n *\n * Called from the template via `(click)` on each item wrapper. Not intended for\n * external callers — use `select()` instead.\n *\n * @param idx Zero-based index of the clicked item.\n * @param event The originating mouse event (provides `shiftKey` and `ctrlKey` flags).\n */\n onItemClick(idx: number, event: MouseEvent): void {\n this.list().select(idx, event.shiftKey, event.ctrlKey);\n this.list().focus();\n }\n\n /**\n * Handles a double-click on a list item.\n *\n * Emits the `itemDoubleClick` output with the item's index. The parent can use this\n * to trigger a secondary action (e.g. opening a detail panel or navigating to a route)\n * that is distinct from the primary single-click selection.\n *\n * Called from the template via `ClickDoubleDirective`. Not intended for external callers.\n *\n * @param idx Zero-based index of the double-clicked item.\n * @param event The originating mouse event (unused, kept for directive compatibility).\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onItemDoubleClick(idx: number, event: MouseEvent): void {\n this.itemDoubleClick.emit(idx);\n }\n\n /**\n * Handles intermediate drag-selection changes from `DragSelectDirective`.\n *\n * Fires continuously while the user is dragging across items. Updates the inner list's\n * multi-selection state in real time so items are highlighted as the drag progresses,\n * and also emits `dragSelectChange` so the parent can show a live preview.\n *\n * Called from the template via `(dragSelectChange)` on the drag-select host.\n * Not intended for external callers.\n *\n * @param sel Current array of zero-based indices covered by the drag gesture.\n */\n onDragSelectChange(sel: number[]): void {\n this.list().multiSelect(sel);\n this.dragSelectChange.emit(sel);\n }\n\n /**\n * Handles the final committed drag-selection from `DragSelectDirective`.\n *\n * Called when the user releases the mouse after a drag-to-select gesture. Transfers\n * DOM focus to the list (so keyboard navigation works immediately after) and emits\n * the final selection via `itemSelect`.\n *\n * Called from the template via `(dragSelect)` on the drag-select host.\n * Not intended for external callers.\n *\n * @param sel Final array of zero-based indices selected by the drag gesture.\n */\n onDragSelect(sel: number[]): void {\n this.list().focus();\n this.itemSelect.emit(sel);\n }\n\n //#endregion\n\n //#region Public methods\n\n /**\n * Applies optimistic per-item overrides on top of the current query result.\n *\n * Each entry in the `updates` array patches the item at the given `index` with\n * the provided `value`. The value type must match `T` — i.e. the shape produced\n * by the `transformer` function, or `SearchResultItem` if no transformer is used.\n *\n * Overrides accumulate: calling this method multiple times merges the new entries\n * with any previously applied ones. All overrides are automatically discarded when\n * the user navigates to a different page (see `goToPage()`), since a fresh server\n * response replaces the local data.\n *\n * **Use case:** apply instant visual feedback after a user action (rename, status\n * change, etc.) without waiting for a full query refresh.\n *\n * @param updates Array of `{ index, value }` pairs describing which items to patch.\n */\n updateListItems(updates: { index: number; value: T }[]): void {\n const updatesRecord = updates.reduce(\n (acc, curr) => {\n {\n acc[curr.index] = curr.value;\n return acc;\n }\n },\n {} as Record<number, T>\n );\n this.#listItemUpdates.set({ ...this.#listItemUpdates(), ...updatesRecord });\n }\n\n /**\n * Prepends a set of temporary items to the top of the result list.\n *\n * Drop-in items appear before all query results and are visually distinguished\n * by the template (e.g. a highlighted background). They participate in selection\n * and drag-to-select exactly like regular items.\n *\n * The existing selection indices are automatically shifted by `items.length` so that\n * the currently selected query-result items remain selected after the prepend.\n *\n * **Typical use case:** when the user pastes or creates an object that does not yet\n * appear in the current query (e.g. because the index has not been updated), drop it\n * in temporarily so the user sees it immediately without a full refresh.\n *\n * Drop-in items are cleared automatically when the user navigates to a different page.\n * Call `dropItems([])` to remove them programmatically.\n *\n * @param items Items to prepend. Must be of type `T` (same as query result items).\n * @param scrollTo Whether to smooth-scroll the list back to the top after prepending.\n * Defaults to `true` so the newly dropped items are immediately visible.\n */\n dropItems(items: T[], scrollTo = true): void {\n this.#dropInItems.set(items);\n this.list().shiftSelectionBy(items.length);\n if (scrollTo) {\n this.list().scrollToTop();\n }\n }\n\n /**\n * Surgically removes specific items from the drop-in set by their stable IDs.\n *\n * Filters `#dropInItems` to drop any entry whose `idProperty` value is in `ids`,\n * leaving the remaining drop-ins (and the rest of the result list) untouched.\n * The structural shift is handled by the rendering pipeline — `resultItems`\n * recomputes automatically, and the leading `drop-in` class follows the new\n * (smaller) `dropInSize()`.\n *\n * This method intentionally does **not** mutate the inner list's selection\n * state. The caller (typically `TileListComponent.removeDropItems`) is in a\n * better position to decide whether to clear, shift, or preserve selection,\n * because it tracks selection at a higher level by stable object identity.\n *\n * Requires `idProperty` to be set — without it items cannot be identified\n * and the call is a no-op (returns 0).\n *\n * **Typical use case:** an upstream deletion (e.g. `DmsService.deleteDmsObject`)\n * removed an object that is currently rendered as a drop-in. Without removing\n * it from `#dropInItems`, the deleted tile would remain visible after `refresh()`\n * because the framework treats drop-ins as authoritative and prepends them to\n * every refreshed result set.\n *\n * @param ids Array of ID values (as resolved via `idProperty`) to remove.\n * @returns Number of items that were actually removed from the drop-in set.\n */\n removeDropItems(ids: string[]): number {\n if (ids.length === 0) return 0;\n const idProp = this.idProperty();\n if (!idProp) return 0;\n const removeSet = new Set<string>(ids);\n const before = this.#dropInItems();\n const after = before.filter((item) => !removeSet.has((item as Record<string, unknown>)[idProp] as string));\n const removedCount = before.length - after.length;\n if (removedCount === 0) return 0;\n this.#dropInItems.set(after);\n return removedCount;\n }\n\n /**\n * Programmatically replaces the entire selection with the given indices.\n *\n * Only effective when `multiselect` is `true`. Out-of-range indices are silently\n * discarded. The resulting selection is sorted ascending before being applied.\n *\n * Use this when the parent needs to restore a previously saved multi-selection\n * state, e.g. after navigation or component re-initialization.\n *\n * @param index Array of zero-based item indices to select.\n */\n multiSelect(index: number[]): void {\n this.list().multiSelect(index);\n }\n\n /**\n * Selects the item at the given zero-based index.\n *\n * Delegates to the inner `ListComponent`. The `preventChangeUntil` guard and\n * `disableSelection` state are respected. Clamps the index to the valid range.\n *\n * @param index Zero-based index of the item to select.\n */\n select(index: number): void {\n this.list().select(index);\n }\n\n /**\n * Moves keyboard focus to the item at the given index and selects it.\n *\n * Combines focus management and selection in one call, and transfers DOM focus\n * to the list host. Use this when the parent wants to programmatically drive\n * both the visual focus indicator and the selection simultaneously.\n *\n * @param index Zero-based index of the item to activate.\n */\n setActiveItem(index: number): void {\n this.list().setActiveItem(index);\n }\n\n /**\n * Clears the current selection and resets the active keyboard-focus index.\n *\n * If the selection is already empty, the method is a no-op. The `preventChangeUntil`\n * guard is respected — if the guard returns `true`, the clear is blocked.\n *\n * @param silent When `true`, skips emitting `itemSelect` after clearing. Use this\n * when the parent needs to reset state programmatically without\n * triggering downstream reactions.\n */\n clear(silent = false): void {\n this.list().clear(silent);\n }\n\n /**\n * Re-executes the current query without changing the page or query parameters.\n *\n * If pagination is active, re-fetches the same page the user is currently on.\n * If no pagination is active, re-runs the original query from scratch.\n *\n * Use this to reflect server-side changes (e.g. after a create/delete operation)\n * without navigating away from the current view.\n */\n refresh(): void {\n const query = this.query();\n if (query) {\n if (this.pagination()) {\n this.goToPage(this.pagination()!.page);\n } else this.#executeQuery(query || null);\n }\n }\n\n /**\n * Forces the `transformer` function to be re-applied to the current result set.\n *\n * Normally the transformer runs automatically whenever the underlying `#items`\n * signal changes. Use this method when the transformer itself has external\n * dependencies that changed (e.g. a locale or display-format setting) but the\n * raw search result did not — triggering a re-evaluation by creating a new array\n * reference for `#items` without fetching from the server again.\n */\n runTransformerAgain(): void {\n this.#items.set([...this.#items()]);\n }\n\n /**\n * Handles a page-change event emitted by the `mat-paginator`.\n *\n * Converts the zero-based `pageEvent.pageIndex` to the one-based page number\n * expected by `goToPage()` and delegates the request.\n *\n * Bound to `(page)` on the `mat-paginator` in the template.\n *\n * @param pageEvent The pagination event emitted by `MatPaginatorModule`.\n */\n changePage(pageEvent: PageEvent): void {\n this.#dropInItems.set([]);\n this.goToPage(pageEvent.pageIndex + 1);\n }\n\n /**\n * Fetches and displays the given page of the current query result.\n *\n * Sets `busy` to `true` for the duration of the request. On success, updates\n * the pagination state, clears all optimistic overrides (they are page-scoped),\n * and replaces `#items` with the new page's results.\n *\n * Also used internally by `refresh()` to reload the currently active page.\n *\n * @param page One-based page number to navigate to.\n */\n goToPage(page: number): void {\n const query = this.query();\n if (!query) return;\n this.busy.set(true);\n this.#searchService.getPage(query, page, this.effectivePageSize(), this.includePermissions()).subscribe({\n next: (res: SearchResult) => {\n this.#setupPagination(res);\n this.#listItemUpdates.set({});\n this.#items.set(res.items);\n this.queryResult.emit({ totalCount: res.totalNumItems, items: res.items });\n this.busy.set(false);\n },\n error: (err) => {\n // TODO: how should errors be handles in case hat loading pages fail\n this.busy.set(false);\n console.error(err);\n }\n });\n }\n\n //#endregion\n\n //#region Utilities\n\n /**\n * Executes a search query.\n * @param query The search query to execute.\n * This may be a SearchQuery object or a string. If it's a string, it is supposed to\n * be a CMIS query statement.\n */\n #executeQuery(query: SearchQuery | string | null): void {\n if (query && !this.busy()) {\n this.busy.set(true);\n const size = this.effectivePageSize();\n (typeof query === 'string'\n ? this.#searchService.searchCmis(query, size, this.includePermissions())\n : this.#searchService.search({ ...query, size })\n ).subscribe({\n next: (res: SearchResult) => {\n this.#setupPagination(res);\n this.#listItemUpdates.set({});\n this.#items.set(res.items);\n this.queryResult.emit({ totalCount: res.totalNumItems, items: res.items });\n this.busy.set(false);\n },\n error: (err) => {\n this.busy.set(false);\n console.error(err);\n }\n });\n }\n }\n\n #setupPagination(searchResult: SearchResult): void {\n this.pagination.set(\n searchResult.paging\n ? {\n total: searchResult.totalNumItems,\n pages: searchResult.paging.totalPages,\n page: searchResult.paging.page\n }\n : undefined\n );\n }\n\n //#endregion\n\n //#region Effects\n\n readonly #executeQueryEffect = (): void => {\n // execute the query each time it changes\n const query = this.query();\n if (query)\n untracked(() => {\n this.#executeQuery(query || null);\n });\n };\n\n //#endregion\n}\n","<yuv-list\n #list\n [multiselect]=\"multiselect()\"\n [autoSelect]=\"autoSelect()\"\n [preventChangeUntil]=\"preventChangeUntil()\"\n [selfHandleClick]=\"true\"\n [selfHandleSelection]=\"selfHandleSelection()\"\n [yuvDragSelect]=\"{ disabled: !enableDragSelect() || !multiselect() || isTouchDevice }\"\n (dragSelectChange)=\"onDragSelectChange($event)\"\n (dragSelect)=\"onDragSelect($event)\"\n (itemSelect)=\"itemSelect.emit($event)\"\n>\n @for (resultItem of resultItems(); track trackItem(resultItem, $index)) {\n <div\n yuvListItem\n yuvDragSelectItem\n [class.drop-in]=\"$index < dropInSize()\"\n (click.single)=\"onItemClick($index, $event)\"\n (click.double)=\"onItemDoubleClick($index, $event)\"\n >\n <ng-container *ngTemplateOutlet=\"itemTemplate() || null; context: { $implicit: resultItem, index: $index }\" />\n </div>\n } @empty {\n <ng-container *ngTemplateOutlet=\"emptyTemplate() || null\" />\n }\n</yuv-list>\n@if (pagination(); as pag) {\n <mat-paginator\n class=\"paginator\"\n [length]=\"pag.total\"\n [pageSize]=\"effectivePageSize()\"\n (page)=\"changePage($event)\"\n hidePageSize\n />\n}\n","import { NgModule } from '@angular/core';\nimport { QueryListComponent } from './query-list.component';\n\nconst cmp = [QueryListComponent];\n@NgModule({\n imports: cmp,\n exports: cmp\n})\nexport class YuvQueryListModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-client-framework-query-list.mjs","sources":["../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.component.ts","../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.component.html","../../../../../libs/yuuvis/client-framework/query-list/src/lib/query-list.module.ts","../../../../../libs/yuuvis/client-framework/query-list/src/yuuvis-client-framework-query-list.ts"],"sourcesContent":["import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n effect,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n untracked,\n viewChild\n} from '@angular/core';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { SearchQuery, SearchResult, SearchResultItem, SearchService } from '@yuuvis/client-core';\nimport { ClickDoubleDirective, DragSelectDirective, DragSelectItemDirective } from '@yuuvis/client-framework/common';\nimport { ListComponent, YuvListModule } from '@yuuvis/client-framework/list';\nimport { Pagination } from '@yuuvis/client-framework/pagination';\nimport { DeviceService } from '@yuuvis/material';\n\n/**\n * Query-driven list component that executes a search query and renders the results\n * using a consumer-provided item template.\n *\n * The component is a thin orchestration layer on top of `yuv-list`: it handles the\n * full query lifecycle (executing, paginating, refreshing), exposes a typed result\n * set via the optional `transformer` input, and delegates all keyboard navigation,\n * selection, and accessibility concerns to the inner `ListComponent`.\n *\n * **Key Features:**\n * - Accepts a `SearchQuery` object or a raw CMIS query string\n * - Optional `transformer` function maps raw `SearchResultItem[]` to any custom type `T`\n * - Built-in server-side pagination via Angular Material `mat-paginator`\n * - Multi-selection with mouse drag (`DragSelectDirective`) and keyboard modifiers\n * - \"Drop-in\" items prepended to the result set for optimistic UI updates\n * - Busy state signal for loading indicators\n * - Exposes a slim imperative API (`select`, `clear`, `refresh`, `goToPage`, …)\n * so parents can drive the list programmatically\n *\n * **Content Projection Slots:**\n * - `#yuvQueryListItem` — required; `ng-template` used to render each result item.\n * Receives the (optionally transformed) item as `$implicit`.\n * - `#yuvQueryListEmpty` — optional; `ng-template` shown when the result set is empty.\n *\n * **Basic usage:**\n * ```html\n * <yuv-query-list [query]=\"query\" (itemSelect)=\"onSelect($event)\">\n * <ng-template #yuvQueryListItem let-item>\n * <span>{{ item.title }}</span>\n * </ng-template>\n * </yuv-query-list>\n * ```\n *\n * **With transformer and empty state:**\n * ```html\n * <yuv-query-list [query]=\"query\" [transformer]=\"toViewModel\" (itemSelect)=\"onSelect($event)\">\n * <ng-template #yuvQueryListItem let-item>\n * <yuv-list-tile>\n * <ng-template #titleSlot>{{ item.title }}</ng-template>\n * <ng-template #descriptionSlot>{{ item.modified }}</ng-template>\n * </yuv-list-tile>\n * </ng-template>\n * <ng-template #yuvQueryListEmpty>\n * <p>No results found.</p>\n * </ng-template>\n * </yuv-query-list>\n * ```\n *\n * ```ts\n * toViewModel = (items: SearchResultItem[]) =>\n * items.map(item => ({\n * title: item.fields.get(BaseObjectTypeField.OBJECT_ID),\n * modified: item.fields.get(BaseObjectTypeField.MODIFICATION_DATE)\n * }));\n * ```\n *\n * @typeParam T The shape of each item after the optional `transformer` is applied.\n * Defaults to `any` when no transformer is provided.\n */\n@Component({\n selector: 'yuv-query-list',\n imports: [\n CommonModule,\n YuvListModule,\n ClickDoubleDirective,\n DragSelectDirective,\n DragSelectItemDirective,\n MatPaginatorModule\n ],\n templateUrl: './query-list.component.html',\n styleUrl: './query-list.component.scss',\n host: { '[class.pagination]': '!!pagination()' },\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class QueryListComponent<T = any> {\n //#region Dependencies\n\n #device = inject(DeviceService);\n #searchService = inject(SearchService);\n\n //#endregion\n\n //#region Angular stuff\n\n /**\n * Current pagination state. Set to a `Pagination` object when the last query\n * result contained multiple pages; `undefined` when all results fit on one page\n * or no query has been executed yet.\n *\n * Drives the `[class.pagination]` host binding so the template can conditionally\n * render the `mat-paginator` footer.\n */\n pagination = signal<Pagination | undefined>(undefined);\n\n /**\n * Reference to the inner `ListComponent` instance.\n *\n * Used internally to delegate imperative operations (select, clear, focus, …).\n * Can also be accessed from the parent via a `@ViewChild` on `yuv-query-list` if\n * fine-grained control over the inner list is needed, though the public API methods\n * on this component are preferred.\n */\n list = viewChild.required<ListComponent>('list');\n\n /**\n * Reference to the `#yuvQueryListItem` `ng-template` projected by the consumer.\n *\n * This template is used to render each individual item in the list. The template\n * receives the (optionally transformed) item as the `$implicit` context variable:\n * ```html\n * <ng-template #yuvQueryListItem let-item>{{ item.title }}</ng-template>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n itemTemplate = contentChild<TemplateRef<any>>('yuvQueryListItem');\n\n /**\n * Reference to the optional `#yuvQueryListEmpty` `ng-template` projected by the consumer.\n *\n * When provided, this template is rendered in place of the list whenever the query\n * returns zero items. If omitted, nothing is shown for the empty state.\n * ```html\n * <ng-template #yuvQueryListEmpty>\n * <p>No results found.</p>\n * </ng-template>\n * ```\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n emptyTemplate = contentChild<TemplateRef<any>>('yuvQueryListEmpty');\n\n /**\n * The search query to execute.\n *\n * Accepts either a structured `SearchQuery` object (field filters, sort orders, etc.)\n * or a raw CMIS query string. The query is re-executed reactively every time this\n * input changes. Set to `null` or `undefined` to clear the list without triggering\n * a new request.\n */\n query = input<SearchQuery | string | null>();\n\n /**\n * Property name on the (transformed) item to use as a stable unique identifier.\n *\n * When provided, the template renderer uses this property for `@for` tracking instead\n * of the item's position index, which preserves DOM nodes and component state when the\n * list is refreshed with partially overlapping results.\n *\n * If omitted, the zero-based index is used as the tracking key.\n *\n * @default null\n */\n idProperty = input<string | null>(null);\n\n /**\n * Optional mapping function applied to the raw `SearchResultItem[]` returned by the\n * search service before the results are rendered.\n *\n * Use this to project only the fields your template needs, compute derived properties,\n * or convert dates/enums to display-friendly values. The generic type parameter `T`\n * of the component is inferred from the return type of this function.\n *\n * If omitted, raw `SearchResultItem` objects are passed to the item template as-is.\n *\n * @example\n * ```ts\n * transformer = (items: SearchResultItem[]) =>\n * items.map(item => ({\n * id: item.fields.get(BaseObjectTypeField.OBJECT_ID) as string,\n * title: item.fields.get('cm:name') as string\n * }));\n * ```\n */\n transformer = input<((items: SearchResultItem[]) => T[]) | null>();\n\n /**\n * Guard function that temporarily blocks all selection changes.\n *\n * Forwarded directly to the inner `ListComponent`. As long as the returned predicate\n * evaluates to `true`, any attempt to change the selection — via click, keyboard, or\n * the programmatic API — is silently ignored. Useful when the parent has unsaved\n * changes tied to the current selection and needs to prevent the user from\n * accidentally navigating away.\n *\n * @default () => false (never prevents)\n */\n preventChangeUntil = input<() => boolean>(() => false);\n\n /**\n * Automatically selects an item when the list is first rendered.\n *\n * Forwarded to the inner `ListComponent`. The selection logic runs once after the\n * initial query result is displayed and follows this priority:\n * 1. The first non-disabled item that already carries the `selected` attribute.\n * 2. If no such item exists and `autoSelect` is `true`, the item at index 0.\n *\n * Accepts any truthy string in addition to a real boolean so it can be set as a\n * plain HTML attribute: `<yuv-query-list autoSelect>`.\n *\n * @default false\n */\n autoSelect = input<boolean, BooleanInput>(false, {\n transform: (value: BooleanInput) => coerceBooleanProperty(value)\n });\n\n /**\n * Emits the current selection as an array of zero-based item indices whenever\n * the selection changes — via click, drag, keyboard, or programmatic API calls.\n *\n * An empty array signals that the selection has been cleared.\n */\n itemSelect = output<number[]>();\n\n /**\n * Emits the live selection indices while the user is actively dragging to select.\n *\n * Fires continuously during a drag operation (before the drag is released), allowing\n * the parent to show a live preview of what will be selected. Once the drag ends,\n * `itemSelect` fires with the final committed selection.\n */\n dragSelectChange = output<number[]>();\n\n /**\n * Emits the zero-based index of an item when it is double-clicked.\n *\n * The inner list operates with `selfHandleClick` mode when double-click is active,\n * so single clicks do not immediately trigger `itemSelect`. The parent should listen\n * to both `itemSelect` (for single-click selection) and this event (for double-click\n * actions like opening a detail view).\n */\n itemDoubleClick = output<number>();\n\n /**\n * Emits once per query execution when the search result arrives, providing the total\n * count of matching items and the raw result page.\n *\n * Use this to update external counters, breadcrumbs, or analytics — without having to\n * execute a separate count query. Note that `totalCount` reflects the server-side total,\n * not just the number of items on the current page.\n */\n queryResult = output<{ totalCount: number; items: SearchResultItem[] }>();\n\n /**\n * Number of items to request per page from the search service.\n *\n * Controls the `size` parameter of each search request. When the total result count\n * exceeds this value, pagination controls are shown and the user can navigate between\n * pages via `changePage()` / `goToPage()`.\n *\n * Resolution order (see `effectivePageSize`): explicit `pageSize` input takes precedence,\n * otherwise `(query as SearchQuery).size` is used if set, otherwise\n * `SearchService.DEFAULT_QUERY_SIZE` is used.\n */\n pageSize = input<number | undefined>(undefined);\n\n /**\n * Enables mouse drag-to-select on list items.\n *\n * When `true` and `multiselect` is also `true`, the user can click and drag across\n * items to select a range without holding Shift. Powered by `DragSelectDirective`.\n * Automatically disabled on touch devices regardless of this input value.\n *\n * @default true\n */\n enableDragSelect = input<boolean>(true);\n\n /**\n * Enables multi-selection mode.\n *\n * When `true`, the user can hold **Shift** or **Ctrl** to extend or toggle the\n * selection, and drag-to-select becomes available (if `enableDragSelect` is also\n * `true`). Forwarded to the inner `ListComponent`.\n *\n * @default false\n */\n multiselect = input<boolean>(false);\n\n /**\n * Delegates visual selection and focus state rendering to the parent component.\n *\n * When `false` (default), `yuv-list` applies CSS classes for selected and active\n * states automatically. When `true`, those signals are still updated but the host\n * receives the `self-handle-selection` CSS class, allowing the parent to apply\n * its own visual treatment. Forwarded to the inner `ListComponent`.\n *\n * @default false\n */\n selfHandleSelection = input<boolean>(false);\n\n /**\n * Whether to include permission information in CMIS search results.\n * When `true`, the third parameter of `searchCmis()` is set,\n * causing the backend to return permission data alongside each item.\n *\n * @default false\n */\n includePermissions = input<boolean>(false);\n\n //#endregion\n\n //#region Properties\n\n /**\n * Whether the current device has touch input enabled.\n *\n * Sourced from `DeviceService`. Used in the template to conditionally disable\n * drag-to-select, which is not suitable for touch interactions.\n */\n isTouchDevice = this.#device.isTouchEnabled;\n\n /**\n * Number of drop-in items currently prepended to the result list.\n *\n * Derived from the internal `#dropInItems` signal. Exposed publicly so the template\n * and parent components can easily check whether any temporary items are present\n * (e.g. to show a visual indicator or adjust layout) without accessing internal state.\n */\n dropInSize = computed(() => this.#dropInItems().length);\n\n /**\n * Resolved page size used by both the `mat-paginator` and every server request.\n *\n * Falls back through three sources, in order:\n * 1. The explicit `pageSize` input, when the consumer has provided one.\n * 2. `(query as SearchQuery).size`, when the query is a `SearchQuery` object that\n * already declares its own page size — keeps server response and paginator in\n * sync when the consumer only configures the query.\n * 3. `SearchService.DEFAULT_QUERY_SIZE` as the final default.\n *\n * Used internally to avoid the bug where `mat-paginator` and the server pageination\n * use different page sizes (paginator showing e.g. \"1-25 of 43\" while `getPage()`\n * asks the server for skip=50 — landing on an empty page).\n */\n effectivePageSize = computed<number>(() => {\n const inputSize = this.pageSize();\n if (inputSize !== undefined) return inputSize;\n const query = this.query();\n if (query && typeof query !== 'string' && query.size) return query.size;\n return SearchService.DEFAULT_QUERY_SIZE;\n });\n\n /**\n * The final list of items rendered by the template.\n *\n * Computed from three sources, merged in this order:\n * 1. **Drop-in items** (`#dropInItems`) — temporary items prepended to the list,\n * e.g. newly created objects that should appear before they match the query.\n * 2. **Transformed query results** — raw `SearchResultItem[]` passed through the\n * optional `transformer` function (or cast directly to `T[]` if none is provided).\n * 3. **Optimistic updates** (`#listItemUpdates`) — per-index overrides applied on top\n * of the merged list, allowing individual items to be patched without re-fetching.\n *\n * Re-evaluates automatically whenever any of the three sources change.\n */\n resultItems = computed<T[]>(() => {\n const items = this.#items();\n const updates = this.#listItemUpdates();\n const transformer = this.transformer();\n const transformedResult = transformer ? transformer(items) : (items as unknown as T[]);\n const dropIns = this.#dropInItems();\n\n let merged: T[];\n const idProp = this.idProperty();\n\n if (dropIns.length > 0 && idProp) {\n // Deduplicate: filter out server results that already appear as drop-in items\n const dropInIds = new Set(dropIns.map((item) => (item as Record<string, unknown>)[idProp]));\n const filtered = transformedResult.filter((item) => !dropInIds.has((item as Record<string, unknown>)[idProp]));\n merged = [...dropIns, ...filtered];\n } else {\n merged = [...dropIns, ...transformedResult];\n }\n\n // apply updates to transformed result\n Object.keys(updates).forEach((index) => {\n merged[Number(index)] = updates[Number(index)];\n });\n return merged;\n });\n\n /**\n * Object IDs of the currently selected rows — the id-based source of truth for the\n * visual selection.\n *\n * The inner list tracks selection by positional index, which becomes meaningless the\n * moment a re-query reorders or replaces the rendered rows (the `@for` reuses/recreates\n * the projected item directives, so index-based visual state points at the wrong — or\n * detached — directives). When `idProperty` is set, the inner list is switched into\n * `selfHandleSelection` mode and each row's `[selected]` is bound to this set instead, so\n * Angular re-applies the correct selection by ID on every render — a multi-selection then\n * survives sort, page changes, and refreshes. Kept in sync from every committed selection\n * via `onInnerItemSelect()`.\n */\n selectedIds = signal<Set<string>>(new Set<string>());\n\n /** Whether this component drives the inner list's selection visuals via each row's id-based\n * `[selected]` binding (and thus the inner list should not write them imperatively). Enabled\n * whenever an `idProperty` is configured — the prerequisite for id-based selection. */\n idSelection = computed<boolean>(() => !!this.idProperty());\n\n /**\n * Indicates whether a search request is currently in flight.\n *\n * Set to `true` immediately before a query or page request is dispatched to the\n * search service, and back to `false` once the response (or error) arrives.\n * Bind this to a loading indicator or `BusyOverlayDirective` in the parent template:\n * ```html\n * <yuv-query-list #qList ...>...</yuv-query-list>\n * <yuv-busy-overlay [active]=\"qList.busy()\" />\n * ```\n */\n busy = signal<boolean>(false);\n\n #items = signal<SearchResultItem[]>([]);\n\n #dropInItems = signal<T[]>([]);\n\n #listItemUpdates = signal<Record<number, T>>({});\n\n //#endregion\n\n constructor() {\n effect(this.#executeQueryEffect);\n effect(this.#resyncSelectionEffect);\n }\n\n //#region UI Methods\n\n /** Resolves the tracking key for a result item in the `@for` loop. */\n trackItem(item: T, index: number): unknown {\n const prop = this.idProperty();\n return prop ? (item as Record<string, unknown>)[prop] : index;\n }\n\n /**\n * Whether the given row is part of the current selection, resolved by ID.\n *\n * Bound to each row's `[selected]` in the template so the visual selection is driven by\n * {@link selectedIds} (id-based) rather than the inner list's positional state. This is\n * what makes a multi-selection survive a re-query/reorder.\n */\n isRowSelected(item: T): boolean {\n const id = this.#idOf(item);\n return id !== undefined && this.selectedIds().has(id);\n }\n\n /**\n * Choke point for every committed selection emitted by the inner list.\n *\n * Translates the positional indices into object IDs against the currently rendered\n * `resultItems()` and stores them in {@link selectedIds}, then re-emits the original\n * indices via `itemSelect` so existing consumers are unaffected. Keeping the id set in\n * sync here (rather than in each caller) means clicks, keyboard, drag-select, and\n * programmatic selection all feed the same source of truth. A no-op passthrough when no\n * `idProperty` is configured (the inner list then owns the visual selection as before).\n */\n onInnerItemSelect(indices: number[]): void {\n if (this.idProperty()) {\n const items = this.resultItems();\n const ids = new Set<string>();\n indices.forEach((i) => {\n const id = items[i] === undefined ? undefined : this.#idOf(items[i]);\n if (id !== undefined) ids.add(id);\n });\n this.selectedIds.set(ids);\n }\n this.itemSelect.emit(indices);\n }\n\n /**\n * Handles a single click on a list item.\n *\n * Forwards the click to the inner `ListComponent` with the correct Shift/Ctrl modifier\n * flags so range- and toggle-selection work correctly. Also transfers DOM focus to the\n * list host so subsequent keyboard navigation works without an additional Tab press.\n *\n * Called from the template via `(click)` on each item wrapper. Not intended for\n * external callers — use `select()` instead.\n *\n * @param idx Zero-based index of the clicked item.\n * @param event The originating mouse event (provides `shiftKey` and `ctrlKey` flags).\n */\n onItemClick(idx: number, event: MouseEvent): void {\n this.list().select(idx, event.shiftKey, event.ctrlKey);\n this.list().focus();\n }\n\n /**\n * Handles a double-click on a list item.\n *\n * Emits the `itemDoubleClick` output with the item's index. The parent can use this\n * to trigger a secondary action (e.g. opening a detail panel or navigating to a route)\n * that is distinct from the primary single-click selection.\n *\n * When a modifier key (Ctrl/Shift/Meta) is held, the double-click is instead treated as a\n * selection gesture: while the user is rapidly building a multi-selection, two quick clicks\n * on the same row are easily coalesced by the browser into a `dblclick`. Emitting the\n * double-click action then would navigate away / open a preview and tear down the whole\n * multi-selection. So we toggle selection for that item and suppress the double-click action.\n *\n * Called from the template via `ClickDoubleDirective`. Not intended for external callers.\n *\n * @param idx Zero-based index of the double-clicked item.\n * @param event The originating mouse event; its modifier flags decide open-vs-select.\n */\n onItemDoubleClick(idx: number, event: MouseEvent): void {\n if (event.ctrlKey || event.shiftKey || event.metaKey) {\n this.list().select(idx, event.shiftKey, event.ctrlKey);\n this.list().focus();\n return;\n }\n this.itemDoubleClick.emit(idx);\n }\n\n /**\n * Handles intermediate drag-selection changes from `DragSelectDirective`.\n *\n * Fires continuously while the user is dragging across items. Updates the inner list's\n * multi-selection state in real time so items are highlighted as the drag progresses,\n * and also emits `dragSelectChange` so the parent can show a live preview.\n *\n * Called from the template via `(dragSelectChange)` on the drag-select host.\n * Not intended for external callers.\n *\n * @param sel Current array of zero-based indices covered by the drag gesture.\n */\n onDragSelectChange(sel: number[]): void {\n this.list().multiSelect(sel);\n this.dragSelectChange.emit(sel);\n }\n\n /**\n * Handles the final committed drag-selection from `DragSelectDirective`.\n *\n * Called when the user releases the mouse after a drag-to-select gesture. Transfers\n * DOM focus to the list (so keyboard navigation works immediately after) and emits\n * the final selection via `itemSelect`.\n *\n * Called from the template via `(dragSelect)` on the drag-select host.\n * Not intended for external callers.\n *\n * @param sel Final array of zero-based indices selected by the drag gesture.\n */\n onDragSelect(sel: number[]): void {\n this.list().focus();\n this.onInnerItemSelect(sel);\n }\n\n //#endregion\n\n //#region Public methods\n\n /**\n * Applies optimistic per-item overrides on top of the current query result.\n *\n * Each entry in the `updates` array patches the item at the given `index` with\n * the provided `value`. The value type must match `T` — i.e. the shape produced\n * by the `transformer` function, or `SearchResultItem` if no transformer is used.\n *\n * Overrides accumulate: calling this method multiple times merges the new entries\n * with any previously applied ones. All overrides are automatically discarded when\n * the user navigates to a different page (see `goToPage()`), since a fresh server\n * response replaces the local data.\n *\n * **Use case:** apply instant visual feedback after a user action (rename, status\n * change, etc.) without waiting for a full query refresh.\n *\n * @param updates Array of `{ index, value }` pairs describing which items to patch.\n */\n updateListItems(updates: { index: number; value: T }[]): void {\n const updatesRecord = updates.reduce(\n (acc, curr) => {\n {\n acc[curr.index] = curr.value;\n return acc;\n }\n },\n {} as Record<number, T>\n );\n this.#listItemUpdates.set({ ...this.#listItemUpdates(), ...updatesRecord });\n }\n\n /**\n * Prepends a set of temporary items to the top of the result list.\n *\n * Drop-in items appear before all query results and are visually distinguished\n * by the template (e.g. a highlighted background). They participate in selection\n * and drag-to-select exactly like regular items.\n *\n * The existing selection indices are automatically shifted by `items.length` so that\n * the currently selected query-result items remain selected after the prepend.\n *\n * **Typical use case:** when the user pastes or creates an object that does not yet\n * appear in the current query (e.g. because the index has not been updated), drop it\n * in temporarily so the user sees it immediately without a full refresh.\n *\n * Drop-in items are cleared automatically when the user navigates to a different page.\n * Call `dropItems([])` to remove them programmatically.\n *\n * @param items Items to prepend. Must be of type `T` (same as query result items).\n * @param scrollTo Whether to smooth-scroll the list back to the top after prepending.\n * Defaults to `true` so the newly dropped items are immediately visible.\n */\n dropItems(items: T[], scrollTo = true): void {\n this.#dropInItems.set(items);\n this.list().shiftSelectionBy(items.length);\n if (scrollTo) {\n this.list().scrollToTop();\n }\n }\n\n /**\n * Surgically removes specific items from the drop-in set by their stable IDs.\n *\n * Filters `#dropInItems` to drop any entry whose `idProperty` value is in `ids`,\n * leaving the remaining drop-ins (and the rest of the result list) untouched.\n * The structural shift is handled by the rendering pipeline — `resultItems`\n * recomputes automatically, and the leading `drop-in` class follows the new\n * (smaller) `dropInSize()`.\n *\n * This method intentionally does **not** mutate the inner list's selection\n * state. The caller (typically `TileListComponent.removeDropItems`) is in a\n * better position to decide whether to clear, shift, or preserve selection,\n * because it tracks selection at a higher level by stable object identity.\n *\n * Requires `idProperty` to be set — without it items cannot be identified\n * and the call is a no-op (returns 0).\n *\n * **Typical use case:** an upstream deletion (e.g. `DmsService.deleteDmsObject`)\n * removed an object that is currently rendered as a drop-in. Without removing\n * it from `#dropInItems`, the deleted tile would remain visible after `refresh()`\n * because the framework treats drop-ins as authoritative and prepends them to\n * every refreshed result set.\n *\n * @param ids Array of ID values (as resolved via `idProperty`) to remove.\n * @returns Number of items that were actually removed from the drop-in set.\n */\n removeDropItems(ids: string[]): number {\n if (ids.length === 0) return 0;\n const idProp = this.idProperty();\n if (!idProp) return 0;\n const removeSet = new Set<string>(ids);\n const before = this.#dropInItems();\n const after = before.filter((item) => !removeSet.has((item as Record<string, unknown>)[idProp] as string));\n const removedCount = before.length - after.length;\n if (removedCount === 0) return 0;\n this.#dropInItems.set(after);\n return removedCount;\n }\n\n /**\n * Programmatically replaces the entire selection with the given indices.\n *\n * Only effective when `multiselect` is `true`. Out-of-range indices are silently\n * discarded. The resulting selection is sorted ascending before being applied.\n *\n * Use this when the parent needs to restore a previously saved multi-selection\n * state, e.g. after navigation or component re-initialization.\n *\n * @param index Array of zero-based item indices to select.\n */\n multiSelect(index: number[]): void {\n this.list().multiSelect(index);\n }\n\n /**\n * Selects the item at the given zero-based index.\n *\n * Delegates to the inner `ListComponent`. The `preventChangeUntil` guard and\n * `disableSelection` state are respected. Clamps the index to the valid range.\n *\n * @param index Zero-based index of the item to select.\n */\n select(index: number): void {\n this.list().select(index);\n }\n\n /**\n * Moves keyboard focus to the item at the given index and selects it.\n *\n * Combines focus management and selection in one call, and transfers DOM focus\n * to the list host. Use this when the parent wants to programmatically drive\n * both the visual focus indicator and the selection simultaneously.\n *\n * @param index Zero-based index of the item to activate.\n */\n setActiveItem(index: number): void {\n this.list().setActiveItem(index);\n }\n\n /**\n * Clears the current selection and resets the active keyboard-focus index.\n *\n * If the selection is already empty, the method is a no-op. The `preventChangeUntil`\n * guard is respected — if the guard returns `true`, the clear is blocked.\n *\n * @param silent When `true`, skips emitting `itemSelect` after clearing. Use this\n * when the parent needs to reset state programmatically without\n * triggering downstream reactions.\n */\n clear(silent = false): void {\n this.list().clear(silent);\n }\n\n /**\n * Re-executes the current query without changing the page or query parameters.\n *\n * If pagination is active, re-fetches the same page the user is currently on.\n * If no pagination is active, re-runs the original query from scratch.\n *\n * Use this to reflect server-side changes (e.g. after a create/delete operation)\n * without navigating away from the current view.\n */\n refresh(): void {\n const query = this.query();\n if (query) {\n if (this.pagination()) {\n this.goToPage(this.pagination()!.page);\n } else this.#executeQuery(query || null);\n }\n }\n\n /**\n * Forces the `transformer` function to be re-applied to the current result set.\n *\n * Normally the transformer runs automatically whenever the underlying `#items`\n * signal changes. Use this method when the transformer itself has external\n * dependencies that changed (e.g. a locale or display-format setting) but the\n * raw search result did not — triggering a re-evaluation by creating a new array\n * reference for `#items` without fetching from the server again.\n */\n runTransformerAgain(): void {\n this.#items.set([...this.#items()]);\n }\n\n /**\n * Handles a page-change event emitted by the `mat-paginator`.\n *\n * Converts the zero-based `pageEvent.pageIndex` to the one-based page number\n * expected by `goToPage()` and delegates the request.\n *\n * Bound to `(page)` on the `mat-paginator` in the template.\n *\n * @param pageEvent The pagination event emitted by `MatPaginatorModule`.\n */\n changePage(pageEvent: PageEvent): void {\n this.#dropInItems.set([]);\n this.goToPage(pageEvent.pageIndex + 1);\n }\n\n /**\n * Fetches and displays the given page of the current query result.\n *\n * Sets `busy` to `true` for the duration of the request. On success, updates\n * the pagination state, clears all optimistic overrides (they are page-scoped),\n * and replaces `#items` with the new page's results.\n *\n * Also used internally by `refresh()` to reload the currently active page.\n *\n * @param page One-based page number to navigate to.\n */\n goToPage(page: number): void {\n const query = this.query();\n if (!query) return;\n this.busy.set(true);\n this.#searchService.getPage(query, page, this.effectivePageSize(), this.includePermissions()).subscribe({\n next: (res: SearchResult) => {\n this.#setupPagination(res);\n this.#listItemUpdates.set({});\n this.#items.set(res.items);\n this.queryResult.emit({ totalCount: res.totalNumItems, items: res.items });\n this.busy.set(false);\n },\n error: (err) => {\n // TODO: how should errors be handles in case hat loading pages fail\n this.busy.set(false);\n console.error(err);\n }\n });\n }\n\n //#endregion\n\n //#region Utilities\n\n /** Reads the configured id property off a result item, or `undefined` if not set. */\n #idOf(item: T): string | undefined {\n const prop = this.idProperty();\n if (!prop) return undefined;\n const value = (item as Record<string, unknown>)[prop];\n return value == null ? undefined : String(value);\n }\n\n /**\n * Executes a search query.\n * @param query The search query to execute.\n * This may be a SearchQuery object or a string. If it's a string, it is supposed to\n * be a CMIS query statement.\n */\n #executeQuery(query: SearchQuery | string | null): void {\n if (query && !this.busy()) {\n this.busy.set(true);\n const size = this.effectivePageSize();\n (typeof query === 'string'\n ? this.#searchService.searchCmis(query, size, this.includePermissions())\n : this.#searchService.search({ ...query, size })\n ).subscribe({\n next: (res: SearchResult) => {\n this.#setupPagination(res);\n this.#listItemUpdates.set({});\n this.#items.set(res.items);\n this.queryResult.emit({ totalCount: res.totalNumItems, items: res.items });\n this.busy.set(false);\n },\n error: (err) => {\n this.busy.set(false);\n console.error(err);\n }\n });\n }\n }\n\n #setupPagination(searchResult: SearchResult): void {\n this.pagination.set(\n searchResult.paging\n ? {\n total: searchResult.totalNumItems,\n pages: searchResult.paging.totalPages,\n page: searchResult.paging.page\n }\n : undefined\n );\n }\n\n //#endregion\n\n //#region Effects\n\n readonly #executeQueryEffect = (): void => {\n // execute the query each time it changes\n const query = this.query();\n if (query)\n untracked(() => {\n this.#executeQuery(query || null);\n });\n };\n\n /**\n * Keeps the inner list's positional selection aligned with the id-based {@link selectedIds}\n * after every re-query.\n *\n * The visual selection is driven by ID via each row's `[selected]` binding, but the inner\n * list still computes ctrl/shift range math against positional indices. After a re-query\n * reorders or replaces the rows, those indices are stale, so a subsequent ctrl/shift click\n * would operate on the wrong items. Here we re-map the surviving selected IDs to their new\n * indices and push them back into the inner list so interaction stays correct. `selectedIds`\n * is read untracked so this only runs when `resultItems` actually changes (a real re-query),\n * never on ordinary selection changes.\n */\n readonly #resyncSelectionEffect = (): void => {\n const items = this.resultItems();\n if (!this.idProperty()) return;\n const ids = untracked(() => this.selectedIds());\n if (ids.size === 0) return;\n const indices: number[] = [];\n items.forEach((item, i) => {\n const id = this.#idOf(item);\n if (id !== undefined && ids.has(id)) indices.push(i);\n });\n untracked(() => {\n try {\n this.list().multiSelect(indices);\n } catch {\n // inner list not ready yet — the next resultItems emission will reconcile\n }\n });\n };\n\n //#endregion\n}\n","<yuv-list\n #list\n [multiselect]=\"multiselect()\"\n [autoSelect]=\"autoSelect()\"\n [preventChangeUntil]=\"preventChangeUntil()\"\n [selfHandleClick]=\"true\"\n [selfHandleSelection]=\"selfHandleSelection()\"\n [externalSelectionVisuals]=\"idSelection()\"\n [yuvDragSelect]=\"{ disabled: !enableDragSelect() || !multiselect() || isTouchDevice }\"\n (dragSelectChange)=\"onDragSelectChange($event)\"\n (dragSelect)=\"onDragSelect($event)\"\n (itemSelect)=\"onInnerItemSelect($event)\"\n>\n @for (resultItem of resultItems(); track trackItem(resultItem, $index)) {\n <div\n yuvListItem\n yuvDragSelectItem\n [selected]=\"isRowSelected(resultItem)\"\n [class.drop-in]=\"$index < dropInSize()\"\n (click.single)=\"onItemClick($index, $event)\"\n (click.double)=\"onItemDoubleClick($index, $event)\"\n >\n <ng-container *ngTemplateOutlet=\"itemTemplate() || null; context: { $implicit: resultItem, index: $index }\" />\n </div>\n } @empty {\n <ng-container *ngTemplateOutlet=\"emptyTemplate() || null\" />\n }\n</yuv-list>\n@if (pagination(); as pag) {\n <mat-paginator\n class=\"paginator\"\n [length]=\"pag.total\"\n [pageSize]=\"effectivePageSize()\"\n (page)=\"changePage($event)\"\n hidePageSize\n />\n}\n","import { NgModule } from '@angular/core';\nimport { QueryListComponent } from './query-list.component';\n\nconst cmp = [QueryListComponent];\n@NgModule({\n imports: cmp,\n exports: cmp\n})\nexport class YuvQueryListModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -37,6 +37,7 @@ class DefaultAuditRendererComponent extends AbstractAuditRendererComponent {
37
37
  a100: this.#translate.instant('yuv.audit.label.create.metadata'),
38
38
  a101: this.#translate.instant('yuv.audit.label.create.metadata.withcontent'),
39
39
  a110: this.#translate.instant('yuv.audit.label.create.tag'),
40
+ a143: this.#translate.instant('yuv.audit.label.create.relationship'),
40
41
  a200: this.#translate.instant('yuv.audit.label.delete'),
41
42
  a201: this.#translate.instant('yuv.audit.label.delete.content'),
42
43
  a202: this.#translate.instant('yuv.audit.label.delete.marked'),
@@ -71,6 +72,14 @@ class DefaultAuditRendererComponent extends AbstractAuditRendererComponent {
71
72
  more = `${this.#localization.getLocalizedLabel(params[0]) ?? params[0]}: ${this.#localization.getLocalizedLabel(localizedLabel) ?? localizedLabel}`;
72
73
  }
73
74
  }
75
+ else if (entry.action === 143) {
76
+ // detail: OBJECT_RELATIONSHIP_CREATED: [sourceId, relationshipType, targetId]
77
+ const params = this.#getParams(entry);
78
+ const relationshipType = params[1];
79
+ if (relationshipType) {
80
+ more = this.#localization.getLocalizedLabel(relationshipType) ?? relationshipType;
81
+ }
82
+ }
74
83
  else if (entry.action === 325) {
75
84
  const params = this.#getParams(entry);
76
85
  more = this.#translate.instant('yuv.audit.label.update.restore.more', {
@@ -1 +1 @@
1
- {"version":3,"file":"yuuvis-client-framework-renderer.mjs","sources":["../../../../../libs/yuuvis/client-framework/renderer/src/lib/audit-renderer/abstract-audit.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/audit-renderer/default-audit.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/services/audit-renderer/audit-renderer.service.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/abstract.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/boolean.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/datetime.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/decimal.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/filesize.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/icon-renderer/icon.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/icon-renderer/icon.renderer.component.html","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/integer.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/organization-renderer/organization.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/organization-renderer/organization.renderer.component.html","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/string.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/table-renderer/table.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/table-renderer/table.renderer.component.html","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/unknown.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/services/renderer/renderer.service.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/directives/audit-renderer.directive.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/directives/renderer.directive.ts","../../../../../libs/yuuvis/client-framework/renderer/src/yuuvis-client-framework-renderer.ts"],"sourcesContent":["import { Component, input } from '@angular/core';\nimport { AuditEntry } from '@yuuvis/client-core';\n\n/**\n * Abstract class to be extended by audit-entry renderers. The renderer controls the\n * inner content of an audit timeline entry; the surrounding framing (date column,\n * timeline line, version badge, creator) stays with the host component.\n */\n@Component({\n selector: 'yuv-abstract-audit-renderer',\n template: ''\n})\nexport abstract class AbstractAuditRendererComponent {\n auditEntry = input.required<AuditEntry>();\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { AuditEntry, LocalizationService, TranslateService } from '@yuuvis/client-core';\nimport { AbstractAuditRendererComponent } from './abstract-audit.renderer';\n\ninterface ResolvedAuditLabel {\n label: string;\n more?: string;\n}\n\n@Component({\n selector: 'yuv-default-audit-renderer',\n standalone: true,\n template: `\n @let r = resolved();\n <span class=\"title\">{{ r.label }}</span>\n @if (r.more) {\n <div class=\"more meta\">{{ r.more }}</div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DefaultAuditRendererComponent extends AbstractAuditRendererComponent {\n readonly #translate = inject(TranslateService);\n readonly #localization = inject(LocalizationService);\n\n readonly #auditLabels: Record<string, string> = {\n a100: this.#translate.instant('yuv.audit.label.create.metadata'),\n a101: this.#translate.instant('yuv.audit.label.create.metadata.withcontent'),\n a110: this.#translate.instant('yuv.audit.label.create.tag'),\n\n a200: this.#translate.instant('yuv.audit.label.delete'),\n a201: this.#translate.instant('yuv.audit.label.delete.content'),\n a202: this.#translate.instant('yuv.audit.label.delete.marked'),\n a210: this.#translate.instant('yuv.audit.label.delete.tag'),\n a220: this.#translate.instant('yuv.audit.label.delete.version'),\n\n a300: this.#translate.instant('yuv.audit.label.update.metadata'),\n a301: this.#translate.instant('yuv.audit.label.update.content'),\n a302: this.#translate.instant('yuv.audit.label.update.metadata.withcontent'),\n a303: this.#translate.instant('yuv.audit.label.update.move.content'),\n a310: this.#translate.instant('yuv.audit.label.update.tag'),\n a325: this.#translate.instant('yuv.audit.label.update.restore'),\n a340: this.#translate.instant('yuv.audit.label.update.move'),\n\n a400: this.#translate.instant('yuv.audit.label.get.content'),\n a401: this.#translate.instant('yuv.audit.label.get.metadata'),\n a402: this.#translate.instant('yuv.audit.label.get.rendition.text'),\n a403: this.#translate.instant('yuv.audit.label.get.rendition.pdf'),\n a404: this.#translate.instant('yuv.audit.label.get.rendition.thumbnail'),\n\n a10000: this.#translate.instant('yuv.audit.label.get.custom')\n };\n\n protected resolved = computed<ResolvedAuditLabel>(() => this.#resolve(this.auditEntry()));\n\n #resolve(entry: AuditEntry): ResolvedAuditLabel {\n let label = this.#auditLabels[`a${entry.action}`];\n let more: string | undefined;\n\n if ([110, 210, 310].includes(entry.action)) {\n const params = this.#getParams(entry);\n if (params.length) {\n const localizedLabel = `${params[0]}:${params[1]}`;\n more = `${this.#localization.getLocalizedLabel(params[0]) ?? params[0]}: ${\n this.#localization.getLocalizedLabel(localizedLabel) ?? localizedLabel\n }`;\n }\n } else if (entry.action === 325) {\n const params = this.#getParams(entry);\n more = this.#translate.instant('yuv.audit.label.update.restore.more', {\n version: params[0] || '[?]'\n });\n } else if (entry.action === 10000) {\n label = this.#localization.getLocalizedLabel(`audit:custom:${entry.subaction}`) || `${entry.subaction}`;\n }\n\n return { label, more };\n }\n\n #getParams(entry: AuditEntry): string[] {\n const m = entry.detail.match(/\\[(.*?)\\]/);\n return m?.[1]?.split(',').map((i) => i.trim()) ?? [];\n }\n}\n","import { Injectable, Type, signal } from '@angular/core';\nimport {\n AbstractAuditRendererComponent,\n DefaultAuditRendererComponent\n} from '../../audit-renderer';\n\n/**\n * Service for managing audit-entry renderers. Renderers are components that render the\n * inner content of an audit entry in the timeline view of `ObjectAuditComponent`.\n *\n * Register a renderer for an `action` to override the default rendering of all audit\n * entries with that action, or for an `action` + `subaction` pair to override a specific\n * variant. Lookup prefers the subaction-specific renderer over the action-only renderer;\n * if neither is registered, `DefaultAuditRendererComponent` is used.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AuditRendererService {\n #renderers = signal<Record<string, Type<AbstractAuditRendererComponent>>>({});\n\n /**\n * Register a renderer for a specific audit `action`. Pass `subaction` to scope the\n * renderer to a particular (action, subaction) pair.\n */\n registerAuditRenderer(\n cmp: Type<AbstractAuditRendererComponent>,\n action: number,\n subaction?: number\n ): void {\n this.#renderers.update((curr) => ({ ...curr, [this.#getKey(action, subaction)]: cmp }));\n }\n\n /**\n * Resolve the renderer for an audit entry. Tries `(action, subaction)` first, falls\n * back to `(action)`, then to `DefaultAuditRendererComponent`.\n */\n getAuditRenderer(action: number, subaction?: number): Type<AbstractAuditRendererComponent> {\n const r = this.#renderers();\n if (subaction !== undefined) {\n const scoped = r[this.#getKey(action, subaction)];\n if (scoped) return scoped;\n }\n return r[this.#getKey(action)] || DefaultAuditRendererComponent;\n }\n\n #getKey(action: number, subaction?: number): string {\n const k = [String(action)];\n if (subaction !== undefined) k.push(String(subaction));\n return k.join('-');\n }\n}\n","import { Component, inject, input } from '@angular/core';\nimport { SchemaResponseFieldDefinition, SystemService } from '@yuuvis/client-core';\n\n/**\n * Abstract class to be extended by property renderers\n */\n@Component({\n selector: 'yuv-abstract-renderer',\n template: ''\n})\nexport abstract class AbstractRendererComponent<T = string, U = null> {\n #system = inject(SystemService);\n\n propertyName = input.required<string>();\n value = input.required<T | null>();\n meta = input<Record<string, unknown> | U>();\n\n protected getProperty(): SchemaResponseFieldDefinition | undefined {\n return this.#system.system?.allFields[this.propertyName()];\n }\n}\n","import { Component } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-boolean-renderer',\n imports: [MatIcon],\n template: ` <mat-icon>{{ value() ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>`,\n styles: [\n `\n :host {\n display: flex;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class BooleanRendererComponent extends AbstractRendererComponent {}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\nimport { LocaleDatePipe } from '@yuuvis/client-core';\n\n@Component({\n selector: 'yuv-datetime-renderer',\n imports: [LocaleDatePipe],\n template: '{{(value() || undefined) | localeDate}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class DateTimeRendererComponent extends AbstractRendererComponent<Date> {}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-decimal-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class DecimalRendererComponent extends AbstractRendererComponent<number> {\n // TODO: deal with precision and scale\n}\n","import { Component, computed } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\nimport { FileSizePipe } from '@yuuvis/client-core';\n\n@Component({\n selector: 'yuv-string-renderer',\n imports: [FileSizePipe],\n template: '{{parsedValue() | fileSize}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class FileSizeRendererComponent extends AbstractRendererComponent {\n parsedValue = computed<number>(() => {\n let n = 0;\n const v = this.value();\n if (v)\n try {\n n = parseInt(v);\n } catch (e) {\n console.error(e);\n }\n return n;\n });\n}\n","import { Component, effect, inject } from '@angular/core';\nimport { MatIcon, MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ObjectTypeIconComponent } from '@yuuvis/client-framework/icons';\nimport { AbstractRendererComponent } from '../abstract.renderer';\n\n@Component({\n selector: 'yuv-icon-renderer',\n imports: [ObjectTypeIconComponent, MatIcon],\n templateUrl: `./icon.renderer.component.html`,\n styleUrls: ['./icon.renderer.component.scss']\n})\nexport class IconRendererComponent extends AbstractRendererComponent {\n readonly #iconRegistry = inject(MatIconRegistry);\n\n readonly #sanitizer = inject(DomSanitizer);\n protected readonly customId = crypto.randomUUID();\n\n #registerIconsEffect = effect(async () => {\n const meta = this.meta();\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n this.propertyName() === 'custom' &&\n !meta?.['isFontIcon'] &&\n this.#iconRegistry.addSvgIconLiteral(\n this.customId,\n this.#sanitizer.bypassSecurityTrustHtml(this.value() as string)\n );\n });\n}\n","@let icon = value();\n@if (propertyName() !== 'custom') {\n <yuv-object-type-icon [objectTypeId]=\"icon || ''\"></yuv-object-type-icon>\n} @else if (icon !== null) {\n @let metaData = meta();\n @if (metaData && metaData['isFontIcon']) {\n <mat-icon>{{ icon }}</mat-icon>\n } @else {\n <mat-icon [svgIcon]=\"customId\"></mat-icon>\n }\n}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-integer-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class IntegerRendererComponent extends AbstractRendererComponent<number> {}\n","import { Component, computed, inject } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { AppCacheService, IdmService, YuvUser } from '@yuuvis/client-core';\nimport { catchError, forkJoin, map, of, switchMap } from 'rxjs';\nimport { AbstractRendererComponent } from '../abstract.renderer';\n\n@Component({\n selector: 'yuv-organization-renderer',\n templateUrl: './organization.renderer.component.html',\n styleUrls: ['./organization.renderer.component.scss']\n})\nexport class OrganizationRendererComponent extends AbstractRendererComponent {\n readonly #idmService = inject(IdmService);\n readonly #appCache = inject(AppCacheService);\n\n readonly #STORAGE_USER_KEY = 'yuv.core.users.storage';\n readonly #STORAGE_ROLES_KEY = 'yuv.core.roles.storage';\n\n // Input may be a single id/role-name or an array of them; normalize to string[] so the resolver\n // pipeline always works on a uniform shape.\n resolvedValue = computed<string[]>(() => {\n const value = this.value();\n return value === null ? [] : Array.isArray(value) ? value : [value];\n });\n\n #userRoleResolver = rxResource({\n params: this.resolvedValue,\n stream: ({ params }) => {\n // Nothing to resolve — short-circuit so we don't show the loading indicator or hit the\n // backend for an empty input.\n if (params.length === 0) {\n return of<{ type: string; label: string | undefined }[]>([]);\n }\n // Step 1 — load the role catalog (cached) and use it to partition the input into role\n // names vs. user IDs. Roles are a closed set; anything that doesn't match is treated as\n // a user ID and resolved in step 2.\n // TODO: Move get Roles to App init or somewhere else to avoid multiple calls\n return this.#appCache.getItem<{ name: string; description: string }[]>(this.#STORAGE_ROLES_KEY).pipe(\n switchMap((cachedRoles) =>\n (cachedRoles\n ? of(cachedRoles)\n : this.#idmService.getRoles().pipe(\n // Only persist the role list when the backend actually returned something —\n // caching an empty array would mask later successful fetches.\n switchMap((roles) =>\n roles.length ? this.#appCache.setItem(this.#STORAGE_ROLES_KEY, roles).pipe(map(() => roles)) : of([])\n )\n )\n ).pipe(\n map((roles) =>\n params.reduce(\n (acc: { roles: string[]; users: string[] }, value: string) => {\n const matchingRole = roles.find((role) => role.name === value);\n // Role-name match → roles bucket; everything else is assumed to be a user ID.\n if (matchingRole) {\n acc.roles.push(matchingRole.name);\n } else {\n acc.users.push(value);\n }\n return acc;\n },\n { roles: [], users: [] }\n )\n )\n )\n ),\n // Step 2a — pull the persisted user cache. Defensive filter against null entries that\n // may linger from earlier buggy writes (see commit 2f3ff694f).\n switchMap(({ roles, users }) =>\n this.#appCache\n .getItem<YuvUser[]>(this.#STORAGE_USER_KEY)\n .pipe(\n map((cache) =>\n cache ? { roles, users, cache: cache.filter((entry) => entry !== null) } : { roles, users, cache: null }\n )\n )\n ),\n // Step 2b — resolve users: serve from cache where possible, fetch the rest from IDM.\n switchMap(({ roles, users, cache }) => {\n // Dedup the full stored cache by id up-front. A cache can hold multiple copies of the\n // same user either from the historical write bug, or because several renderer instances\n // (a view routinely mounts 2-3) each ran an unsynchronized getItem→resolve→setItem cycle\n // and interleaved. Collapsing here fixes the render; persisting it below (when it shrank)\n // heals storage permanently for every reader of this key (e.g. ActionsValidationService).\n const dedupedCache: YuvUser[] | null = cache ? this.#dedupById(cache) : null;\n const cacheShrank = !!cache && !!dedupedCache && dedupedCache.length < cache.length;\n\n let missingUsers: string[] = users;\n let filteredUsers: YuvUser[] = [];\n if (dedupedCache) {\n filteredUsers = dedupedCache.filter((entry) => users.includes(entry.id));\n missingUsers = users.filter((uid: string) => !filteredUsers.some((user) => user.id === uid));\n }\n // Pair every request with its uid so we can tell which IDs came back unresolved.\n // catchError keeps a single failing lookup from killing the whole forkJoin.\n const userRequests = missingUsers.map((uid: string) =>\n this.#idmService.getUserById(uid).pipe(\n catchError(() => of(null)),\n map((user) => ({ uid, user }))\n )\n );\n\n if (userRequests.length > 0) {\n return forkJoin(userRequests).pipe(\n switchMap((results) => {\n // Resolved users are real YuvUsers — safe to cache and render.\n // Unresolved IDs render as a synthetic { id, title: id } so the user still\n // sees the raw ID, but they are NOT written to the cache (a 404 today might\n // resolve tomorrow, and caching it would block that).\n const resolved = results.filter((res) => res.user != null).map((res) => res.user as YuvUser);\n const unresolved = results\n .filter((res) => res.user == null)\n .map((res) => ({ id: res.uid, title: res.uid }) as YuvUser);\n // Dedup by id AT WRITE TIME so the stored array stays clean no matter how two\n // instances interleave. `resolved` is appended after the cache, so a freshly\n // resolved real user always wins over any stale same-id entry — a synthetic\n // fallback (which is never in `resolved`/`cache`) can therefore never shadow it.\n const merged = this.#dedupById([...(dedupedCache || []), ...resolved]);\n return this.#appCache.setItem(this.#STORAGE_USER_KEY, merged).pipe(map(() => [...resolved, ...unresolved]));\n }),\n map((users) => ({ roles, users: [...users, ...filteredUsers] }))\n );\n } else if (cacheShrank && dedupedCache) {\n // Every requested user was already cached, but the stored array carried duplicates —\n // write the cleaned version back so the pollution heals instead of re-deduping forever.\n return this.#appCache.setItem(this.#STORAGE_USER_KEY, dedupedCache).pipe(map(() => ({ roles, users: [...filteredUsers] })));\n } else {\n // Every requested user was already in the cache and it was clean — no network needed.\n return of({ roles, users: [...filteredUsers] });\n }\n }),\n // Step 3 — project to the flat render-model the template iterates over. data-type\n // drives the chip styling (user vs role).\n map(({ roles, users }) => {\n const userNodes = users.map((user: YuvUser & { displayName?: string }) => ({\n type: 'user',\n label: user.title || user.displayName\n }));\n const roleNodes = roles.map((role: string) => ({\n type: 'role',\n label: role\n }));\n return [...userNodes, ...roleNodes];\n })\n );\n },\n defaultValue: []\n });\n\n userAndRole = this.#userRoleResolver.value;\n userAndRoleLoading = this.#userRoleResolver.isLoading;\n\n // Collapse a user list to one entry per id, keeping the LAST occurrence — callers order the\n // array so the freshest/real entry comes last and wins. Also drops any falsy entries.\n #dedupById(users: YuvUser[]): YuvUser[] {\n return [...new Map(users.filter((user) => user).map((user) => [user.id, user])).values()];\n }\n}\n","@if (userAndRoleLoading()) {\n <span class=\"loading\"><i>.</i><i>.</i><i>.</i></span>\n} @else {\n @for (node of userAndRole(); track $index) {\n <span class=\"node\" [attr.data-type]=\"node.type\">{{ node.label }}</span>\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-string-renderer',\n template: `{{ value() }}`,\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class StringRendererComponent extends AbstractRendererComponent {}\n","import { DatePipe, DecimalPipe } from '@angular/common';\nimport { Component, computed, inject } from '@angular/core';\nimport { SystemService, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { AbstractRendererComponent } from '../abstract.renderer';\n\n@Component({\n selector: 'yuv-table-renderer',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: `./table.renderer.component.html`,\n styleUrls: ['./table.renderer.component.scss'],\n providers: [DecimalPipe, DatePipe]\n})\nexport class TableRendererComponent extends AbstractRendererComponent<any[]> {\n readonly #system = inject(SystemService);\n readonly translate = inject(TranslateService);\n readonly #decimalPipe = inject(DecimalPipe);\n readonly #datePipe = inject(DatePipe);\n\n protected tableHeaders = computed(() => [\n ...new Set(\n (this.value() || []).flat().map((item) => ({\n id: `header-${crypto.randomUUID()}`,\n key: item.propertyName,\n label: this.#system.getLocalizedLabel(`${item.propertyName}`) || item.propertyName\n }))\n )\n ]);\n\n protected tableData = computed(() => {\n const data = this.value() || [];\n return (data.length > 10 ? data.slice(0, 10) : data).map((row, rowIndex) =>\n row.map((item: any) => ({\n id: `row-${rowIndex}-cell-${crypto.randomUUID()}`,\n ...item,\n value: this.#cellValue(item)\n }))\n );\n });\n\n protected reducedData = computed(() => {\n const data = this.value() || [];\n return data.length > 10;\n });\n\n protected getCellValue(row: any[], key: string): string {\n const item = (row || []).find((i) => i.propertyName === key);\n return item ? item.value : '';\n }\n\n #cellValue(element: { propertyType: string; value: string }): string | null {\n switch (element.propertyType) {\n case 'datetime':\n return this.#datePipe.transform(element.value, 'short', undefined, this.translate.getCurrentLang());\n case 'string':\n return element.value;\n case 'decimal':\n return this.#decimalPipe.transform(element.value, '1.2-4', this.translate.getCurrentLang());\n default:\n return element.value;\n }\n }\n}\n","<div class=\"table-container\">\n <table>\n <thead>\n <tr>\n @for (header of tableHeaders(); track header.id) {\n <th>{{ header.label }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track $index) {\n <tr>\n @for (header of tableHeaders(); track header.id) {\n <td>{{ getCellValue(row, header.key) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (reducedData()) {\n <p>{{ 'yuv.table.renderer.moreEntries' | translate: { count: value()?.length } }}</p>\n }\n</div>\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-unknown-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class UnknownRendererComponent extends AbstractRendererComponent<any> {}\n","import { Injectable, Type, inject, signal } from '@angular/core';\nimport {\n ContentStreamField,\n InternalFieldType,\n RendererType,\n SchemaResponseFieldDefinition,\n SystemService\n} from '@yuuvis/client-core';\nimport {\n AbstractRendererComponent,\n BooleanRendererComponent,\n DateTimeRendererComponent,\n DecimalRendererComponent,\n FileSizeRendererComponent,\n IconRendererComponent,\n IntegerRendererComponent,\n OrganizationRendererComponent,\n StringRendererComponent,\n TableRendererComponent,\n UnknownRendererComponent\n} from '../../property-renderer';\nimport { RendererComponent } from './renderer.interface';\n\n/**\n * Service for managing property type renderers. Renderers are components that will render certain\n * property types.\n *\n * You are able to register your own renderer to overwrite an existing one or provide a custom\n * renderer for your context.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RendererService {\n private system = inject(SystemService);\n\n #renderers = signal<Record<string, Type<RendererComponent>>>({});\n\n constructor() {\n const initialRenderers: Record<string, Type<RendererComponent>> = {\n integer: IntegerRendererComponent,\n decimal: DecimalRendererComponent,\n datetime: DateTimeRendererComponent,\n icon: IconRendererComponent,\n string: StringRendererComponent,\n boolean: BooleanRendererComponent,\n table: TableRendererComponent\n };\n initialRenderers[InternalFieldType.STRING_ORGANIZATION] = OrganizationRendererComponent;\n initialRenderers[InternalFieldType.STRING_ORGANIZATION_SET] = OrganizationRendererComponent;\n initialRenderers[ContentStreamField.LENGTH] = FileSizeRendererComponent;\n this.#renderers.set(initialRenderers);\n }\n\n getRendererByType(type: RendererType): Type<RendererComponent> {\n const r = this.#renderers();\n return r[type] || UnknownRendererComponent;\n }\n\n getRenderer(propertyName: string, typeName?: string): Type<RendererComponent> {\n // try to find a renderer based on property and object type\n let r = this.#renderers()[this._getKey(propertyName, typeName)];\n if (!r) {\n // not special renderer found so we'll try to get one for the internal type\n // of the given property\n const srf: SchemaResponseFieldDefinition | undefined =\n this.system.system && this.system.system.allFields[propertyName];\n\n if (srf) {\n r = this.getRendererByType(\n this.system.getInternalFormElementType(srf.propertyType, srf.classifications, srf.catalog)\n );\n }\n }\n\n return r || UnknownRendererComponent;\n }\n\n /**\n * Register a renderer for a particular property. Providing `typeName` will register that renderer\n * for a certain context (use same inputs when calling `getRenderer()`).\n * @param cmp The component to actually render the property\n * @param propertyName property name (used for registering the renderer for a certain context)\n * @param typeName Optional type name (used for registering the renderer for a certain context)\n */\n registerRenderer(cmp: Type<AbstractRendererComponent>, propertyName: string, typeName?: string) {\n this.#renderers.update((curr) => ({ ...curr, ...{ [this._getKey(propertyName, typeName)]: cmp } }));\n }\n\n /**\n *\n * @param type The type of property this renderer is supposed to be used for\n */\n registerRendererByType(type: RendererType, cmp: Type<RendererComponent>) {\n this.#renderers.update((curr) => ({ ...curr, ...{ [type]: cmp } }));\n }\n\n // Generate the unique key for a renderer\n private _getKey(propertyName: string, typeName?: string): string {\n const k = [propertyName];\n typeName && k.push(typeName);\n return k.join('-');\n }\n}\n","import { ComponentRef, Directive, Type, ViewContainerRef, effect, inject, input } from '@angular/core';\nimport { AuditEntry } from '@yuuvis/client-core';\nimport { AbstractAuditRendererComponent } from '../audit-renderer';\nimport { AuditRendererService } from '../services';\n\n/**\n * Attribute directive that renders an `AuditEntry` using the component registered with\n * `AuditRendererService` for the entry's `action` (and optionally `subaction`). Falls\n * back to `DefaultAuditRendererComponent` when no override is registered.\n */\n@Directive({\n selector: '[yuvAuditRenderer]',\n standalone: true\n})\nexport class AuditRendererDirective {\n #service = inject(AuditRendererService);\n #containerRef = inject(ViewContainerRef);\n\n component!: ComponentRef<AbstractAuditRendererComponent>;\n #current?: AuditEntry;\n\n yuvAuditRenderer = input.required<AuditEntry>();\n\n #renderEffect = effect(() => {\n const entry = this.yuvAuditRenderer();\n if (this.#alreadyRendered(entry)) return;\n\n this.#current = entry;\n this.#containerRef.clear();\n const cmp: Type<AbstractAuditRendererComponent> = this.#service.getAuditRenderer(\n entry.action,\n entry.subaction\n );\n this.component = this.#containerRef.createComponent(cmp);\n this.component.setInput('auditEntry', entry);\n });\n\n #alreadyRendered(entry: AuditEntry): boolean {\n return !!this.#current && JSON.stringify(this.#current) === JSON.stringify(entry);\n }\n}\n","import { ComponentRef, Directive, Type, ViewContainerRef, effect, inject, input } from '@angular/core';\nimport { RendererComponent, RendererDirectiveInput, RendererService } from '../services';\n/**\n * Structural directive for rendering an obect type property\n */\n@Directive({\n selector: '[yuvRenderer]',\n standalone: true\n})\nexport class RendererDirective {\n #rendererService = inject(RendererService);\n #containerRef = inject(ViewContainerRef);\n\n component!: ComponentRef<RendererComponent>;\n #rendererInput?: RendererDirectiveInput;\n yuvRenderer = input<RendererDirectiveInput | undefined>(undefined);\n\n #yuvRendererEffect = effect(() => {\n const i = this.yuvRenderer();\n if (i && !this.#alreadyRendered(i)) {\n this.#rendererInput = i;\n this.#containerRef.clear();\n const cmp: Type<RendererComponent> = i.rendererType\n ? this.#rendererService.getRendererByType(i.rendererType)\n : this.#rendererService.getRenderer(i.propertyName);\n\n this.component = this.#containerRef.createComponent(cmp);\n // pass inputs to the renderer. As they are signals they need an injection context\n this.component.setInput('propertyName', i.propertyName);\n this.component.setInput('value', i.value);\n if (i.meta) this.component.setInput('meta', i.meta);\n } else if (!i) {\n this.#containerRef.clear();\n this.#rendererInput = undefined;\n }\n });\n\n #alreadyRendered(i: RendererDirectiveInput): boolean {\n return !!this.#rendererInput && JSON.stringify(this.#rendererInput) === JSON.stringify(i);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yuuvis-client-framework-renderer.mjs","sources":["../../../../../libs/yuuvis/client-framework/renderer/src/lib/audit-renderer/abstract-audit.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/audit-renderer/default-audit.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/services/audit-renderer/audit-renderer.service.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/abstract.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/boolean.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/datetime.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/decimal.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/filesize.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/icon-renderer/icon.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/icon-renderer/icon.renderer.component.html","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/integer.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/organization-renderer/organization.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/organization-renderer/organization.renderer.component.html","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/string.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/table-renderer/table.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/table-renderer/table.renderer.component.html","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/unknown.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/services/renderer/renderer.service.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/directives/audit-renderer.directive.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/directives/renderer.directive.ts","../../../../../libs/yuuvis/client-framework/renderer/src/yuuvis-client-framework-renderer.ts"],"sourcesContent":["import { Component, input } from '@angular/core';\nimport { AuditEntry } from '@yuuvis/client-core';\n\n/**\n * Abstract class to be extended by audit-entry renderers. The renderer controls the\n * inner content of an audit timeline entry; the surrounding framing (date column,\n * timeline line, version badge, creator) stays with the host component.\n */\n@Component({\n selector: 'yuv-abstract-audit-renderer',\n template: ''\n})\nexport abstract class AbstractAuditRendererComponent {\n auditEntry = input.required<AuditEntry>();\n}\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { AuditEntry, LocalizationService, TranslateService } from '@yuuvis/client-core';\nimport { AbstractAuditRendererComponent } from './abstract-audit.renderer';\n\ninterface ResolvedAuditLabel {\n label: string;\n more?: string;\n}\n\n@Component({\n selector: 'yuv-default-audit-renderer',\n standalone: true,\n template: `\n @let r = resolved();\n <span class=\"title\">{{ r.label }}</span>\n @if (r.more) {\n <div class=\"more meta\">{{ r.more }}</div>\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DefaultAuditRendererComponent extends AbstractAuditRendererComponent {\n readonly #translate = inject(TranslateService);\n readonly #localization = inject(LocalizationService);\n\n readonly #auditLabels: Record<string, string> = {\n a100: this.#translate.instant('yuv.audit.label.create.metadata'),\n a101: this.#translate.instant('yuv.audit.label.create.metadata.withcontent'),\n a110: this.#translate.instant('yuv.audit.label.create.tag'),\n a143: this.#translate.instant('yuv.audit.label.create.relationship'),\n\n a200: this.#translate.instant('yuv.audit.label.delete'),\n a201: this.#translate.instant('yuv.audit.label.delete.content'),\n a202: this.#translate.instant('yuv.audit.label.delete.marked'),\n a210: this.#translate.instant('yuv.audit.label.delete.tag'),\n a220: this.#translate.instant('yuv.audit.label.delete.version'),\n\n a300: this.#translate.instant('yuv.audit.label.update.metadata'),\n a301: this.#translate.instant('yuv.audit.label.update.content'),\n a302: this.#translate.instant('yuv.audit.label.update.metadata.withcontent'),\n a303: this.#translate.instant('yuv.audit.label.update.move.content'),\n a310: this.#translate.instant('yuv.audit.label.update.tag'),\n a325: this.#translate.instant('yuv.audit.label.update.restore'),\n a340: this.#translate.instant('yuv.audit.label.update.move'),\n\n a400: this.#translate.instant('yuv.audit.label.get.content'),\n a401: this.#translate.instant('yuv.audit.label.get.metadata'),\n a402: this.#translate.instant('yuv.audit.label.get.rendition.text'),\n a403: this.#translate.instant('yuv.audit.label.get.rendition.pdf'),\n a404: this.#translate.instant('yuv.audit.label.get.rendition.thumbnail'),\n\n a10000: this.#translate.instant('yuv.audit.label.get.custom')\n };\n\n protected resolved = computed<ResolvedAuditLabel>(() => this.#resolve(this.auditEntry()));\n\n #resolve(entry: AuditEntry): ResolvedAuditLabel {\n let label = this.#auditLabels[`a${entry.action}`];\n let more: string | undefined;\n\n if ([110, 210, 310].includes(entry.action)) {\n const params = this.#getParams(entry);\n if (params.length) {\n const localizedLabel = `${params[0]}:${params[1]}`;\n more = `${this.#localization.getLocalizedLabel(params[0]) ?? params[0]}: ${\n this.#localization.getLocalizedLabel(localizedLabel) ?? localizedLabel\n }`;\n }\n } else if (entry.action === 143) {\n // detail: OBJECT_RELATIONSHIP_CREATED: [sourceId, relationshipType, targetId]\n const params = this.#getParams(entry);\n const relationshipType = params[1];\n if (relationshipType) {\n more = this.#localization.getLocalizedLabel(relationshipType) ?? relationshipType;\n }\n } else if (entry.action === 325) {\n const params = this.#getParams(entry);\n more = this.#translate.instant('yuv.audit.label.update.restore.more', {\n version: params[0] || '[?]'\n });\n } else if (entry.action === 10000) {\n label = this.#localization.getLocalizedLabel(`audit:custom:${entry.subaction}`) || `${entry.subaction}`;\n }\n\n return { label, more };\n }\n\n #getParams(entry: AuditEntry): string[] {\n const m = entry.detail.match(/\\[(.*?)\\]/);\n return m?.[1]?.split(',').map((i) => i.trim()) ?? [];\n }\n}\n","import { Injectable, Type, signal } from '@angular/core';\nimport {\n AbstractAuditRendererComponent,\n DefaultAuditRendererComponent\n} from '../../audit-renderer';\n\n/**\n * Service for managing audit-entry renderers. Renderers are components that render the\n * inner content of an audit entry in the timeline view of `ObjectAuditComponent`.\n *\n * Register a renderer for an `action` to override the default rendering of all audit\n * entries with that action, or for an `action` + `subaction` pair to override a specific\n * variant. Lookup prefers the subaction-specific renderer over the action-only renderer;\n * if neither is registered, `DefaultAuditRendererComponent` is used.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AuditRendererService {\n #renderers = signal<Record<string, Type<AbstractAuditRendererComponent>>>({});\n\n /**\n * Register a renderer for a specific audit `action`. Pass `subaction` to scope the\n * renderer to a particular (action, subaction) pair.\n */\n registerAuditRenderer(\n cmp: Type<AbstractAuditRendererComponent>,\n action: number,\n subaction?: number\n ): void {\n this.#renderers.update((curr) => ({ ...curr, [this.#getKey(action, subaction)]: cmp }));\n }\n\n /**\n * Resolve the renderer for an audit entry. Tries `(action, subaction)` first, falls\n * back to `(action)`, then to `DefaultAuditRendererComponent`.\n */\n getAuditRenderer(action: number, subaction?: number): Type<AbstractAuditRendererComponent> {\n const r = this.#renderers();\n if (subaction !== undefined) {\n const scoped = r[this.#getKey(action, subaction)];\n if (scoped) return scoped;\n }\n return r[this.#getKey(action)] || DefaultAuditRendererComponent;\n }\n\n #getKey(action: number, subaction?: number): string {\n const k = [String(action)];\n if (subaction !== undefined) k.push(String(subaction));\n return k.join('-');\n }\n}\n","import { Component, inject, input } from '@angular/core';\nimport { SchemaResponseFieldDefinition, SystemService } from '@yuuvis/client-core';\n\n/**\n * Abstract class to be extended by property renderers\n */\n@Component({\n selector: 'yuv-abstract-renderer',\n template: ''\n})\nexport abstract class AbstractRendererComponent<T = string, U = null> {\n #system = inject(SystemService);\n\n propertyName = input.required<string>();\n value = input.required<T | null>();\n meta = input<Record<string, unknown> | U>();\n\n protected getProperty(): SchemaResponseFieldDefinition | undefined {\n return this.#system.system?.allFields[this.propertyName()];\n }\n}\n","import { Component } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-boolean-renderer',\n imports: [MatIcon],\n template: ` <mat-icon>{{ value() ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>`,\n styles: [\n `\n :host {\n display: flex;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class BooleanRendererComponent extends AbstractRendererComponent {}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\nimport { LocaleDatePipe } from '@yuuvis/client-core';\n\n@Component({\n selector: 'yuv-datetime-renderer',\n imports: [LocaleDatePipe],\n template: '{{(value() || undefined) | localeDate}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class DateTimeRendererComponent extends AbstractRendererComponent<Date> {}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-decimal-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class DecimalRendererComponent extends AbstractRendererComponent<number> {\n // TODO: deal with precision and scale\n}\n","import { Component, computed } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\nimport { FileSizePipe } from '@yuuvis/client-core';\n\n@Component({\n selector: 'yuv-string-renderer',\n imports: [FileSizePipe],\n template: '{{parsedValue() | fileSize}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class FileSizeRendererComponent extends AbstractRendererComponent {\n parsedValue = computed<number>(() => {\n let n = 0;\n const v = this.value();\n if (v)\n try {\n n = parseInt(v);\n } catch (e) {\n console.error(e);\n }\n return n;\n });\n}\n","import { Component, effect, inject } from '@angular/core';\nimport { MatIcon, MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ObjectTypeIconComponent } from '@yuuvis/client-framework/icons';\nimport { AbstractRendererComponent } from '../abstract.renderer';\n\n@Component({\n selector: 'yuv-icon-renderer',\n imports: [ObjectTypeIconComponent, MatIcon],\n templateUrl: `./icon.renderer.component.html`,\n styleUrls: ['./icon.renderer.component.scss']\n})\nexport class IconRendererComponent extends AbstractRendererComponent {\n readonly #iconRegistry = inject(MatIconRegistry);\n\n readonly #sanitizer = inject(DomSanitizer);\n protected readonly customId = crypto.randomUUID();\n\n #registerIconsEffect = effect(async () => {\n const meta = this.meta();\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n this.propertyName() === 'custom' &&\n !meta?.['isFontIcon'] &&\n this.#iconRegistry.addSvgIconLiteral(\n this.customId,\n this.#sanitizer.bypassSecurityTrustHtml(this.value() as string)\n );\n });\n}\n","@let icon = value();\n@if (propertyName() !== 'custom') {\n <yuv-object-type-icon [objectTypeId]=\"icon || ''\"></yuv-object-type-icon>\n} @else if (icon !== null) {\n @let metaData = meta();\n @if (metaData && metaData['isFontIcon']) {\n <mat-icon>{{ icon }}</mat-icon>\n } @else {\n <mat-icon [svgIcon]=\"customId\"></mat-icon>\n }\n}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-integer-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class IntegerRendererComponent extends AbstractRendererComponent<number> {}\n","import { Component, computed, inject } from '@angular/core';\nimport { rxResource } from '@angular/core/rxjs-interop';\nimport { AppCacheService, IdmService, YuvUser } from '@yuuvis/client-core';\nimport { catchError, forkJoin, map, of, switchMap } from 'rxjs';\nimport { AbstractRendererComponent } from '../abstract.renderer';\n\n@Component({\n selector: 'yuv-organization-renderer',\n templateUrl: './organization.renderer.component.html',\n styleUrls: ['./organization.renderer.component.scss']\n})\nexport class OrganizationRendererComponent extends AbstractRendererComponent {\n readonly #idmService = inject(IdmService);\n readonly #appCache = inject(AppCacheService);\n\n readonly #STORAGE_USER_KEY = 'yuv.core.users.storage';\n readonly #STORAGE_ROLES_KEY = 'yuv.core.roles.storage';\n\n // Input may be a single id/role-name or an array of them; normalize to string[] so the resolver\n // pipeline always works on a uniform shape.\n resolvedValue = computed<string[]>(() => {\n const value = this.value();\n return value === null ? [] : Array.isArray(value) ? value : [value];\n });\n\n #userRoleResolver = rxResource({\n params: this.resolvedValue,\n stream: ({ params }) => {\n // Nothing to resolve — short-circuit so we don't show the loading indicator or hit the\n // backend for an empty input.\n if (params.length === 0) {\n return of<{ type: string; label: string | undefined }[]>([]);\n }\n // Step 1 — load the role catalog (cached) and use it to partition the input into role\n // names vs. user IDs. Roles are a closed set; anything that doesn't match is treated as\n // a user ID and resolved in step 2.\n // TODO: Move get Roles to App init or somewhere else to avoid multiple calls\n return this.#appCache.getItem<{ name: string; description: string }[]>(this.#STORAGE_ROLES_KEY).pipe(\n switchMap((cachedRoles) =>\n (cachedRoles\n ? of(cachedRoles)\n : this.#idmService.getRoles().pipe(\n // Only persist the role list when the backend actually returned something —\n // caching an empty array would mask later successful fetches.\n switchMap((roles) =>\n roles.length ? this.#appCache.setItem(this.#STORAGE_ROLES_KEY, roles).pipe(map(() => roles)) : of([])\n )\n )\n ).pipe(\n map((roles) =>\n params.reduce(\n (acc: { roles: string[]; users: string[] }, value: string) => {\n const matchingRole = roles.find((role) => role.name === value);\n // Role-name match → roles bucket; everything else is assumed to be a user ID.\n if (matchingRole) {\n acc.roles.push(matchingRole.name);\n } else {\n acc.users.push(value);\n }\n return acc;\n },\n { roles: [], users: [] }\n )\n )\n )\n ),\n // Step 2a — pull the persisted user cache. Defensive filter against null entries that\n // may linger from earlier buggy writes (see commit 2f3ff694f).\n switchMap(({ roles, users }) =>\n this.#appCache\n .getItem<YuvUser[]>(this.#STORAGE_USER_KEY)\n .pipe(\n map((cache) =>\n cache ? { roles, users, cache: cache.filter((entry) => entry !== null) } : { roles, users, cache: null }\n )\n )\n ),\n // Step 2b — resolve users: serve from cache where possible, fetch the rest from IDM.\n switchMap(({ roles, users, cache }) => {\n // Dedup the full stored cache by id up-front. A cache can hold multiple copies of the\n // same user either from the historical write bug, or because several renderer instances\n // (a view routinely mounts 2-3) each ran an unsynchronized getItem→resolve→setItem cycle\n // and interleaved. Collapsing here fixes the render; persisting it below (when it shrank)\n // heals storage permanently for every reader of this key (e.g. ActionsValidationService).\n const dedupedCache: YuvUser[] | null = cache ? this.#dedupById(cache) : null;\n const cacheShrank = !!cache && !!dedupedCache && dedupedCache.length < cache.length;\n\n let missingUsers: string[] = users;\n let filteredUsers: YuvUser[] = [];\n if (dedupedCache) {\n filteredUsers = dedupedCache.filter((entry) => users.includes(entry.id));\n missingUsers = users.filter((uid: string) => !filteredUsers.some((user) => user.id === uid));\n }\n // Pair every request with its uid so we can tell which IDs came back unresolved.\n // catchError keeps a single failing lookup from killing the whole forkJoin.\n const userRequests = missingUsers.map((uid: string) =>\n this.#idmService.getUserById(uid).pipe(\n catchError(() => of(null)),\n map((user) => ({ uid, user }))\n )\n );\n\n if (userRequests.length > 0) {\n return forkJoin(userRequests).pipe(\n switchMap((results) => {\n // Resolved users are real YuvUsers — safe to cache and render.\n // Unresolved IDs render as a synthetic { id, title: id } so the user still\n // sees the raw ID, but they are NOT written to the cache (a 404 today might\n // resolve tomorrow, and caching it would block that).\n const resolved = results.filter((res) => res.user != null).map((res) => res.user as YuvUser);\n const unresolved = results\n .filter((res) => res.user == null)\n .map((res) => ({ id: res.uid, title: res.uid }) as YuvUser);\n // Dedup by id AT WRITE TIME so the stored array stays clean no matter how two\n // instances interleave. `resolved` is appended after the cache, so a freshly\n // resolved real user always wins over any stale same-id entry — a synthetic\n // fallback (which is never in `resolved`/`cache`) can therefore never shadow it.\n const merged = this.#dedupById([...(dedupedCache || []), ...resolved]);\n return this.#appCache.setItem(this.#STORAGE_USER_KEY, merged).pipe(map(() => [...resolved, ...unresolved]));\n }),\n map((users) => ({ roles, users: [...users, ...filteredUsers] }))\n );\n } else if (cacheShrank && dedupedCache) {\n // Every requested user was already cached, but the stored array carried duplicates —\n // write the cleaned version back so the pollution heals instead of re-deduping forever.\n return this.#appCache.setItem(this.#STORAGE_USER_KEY, dedupedCache).pipe(map(() => ({ roles, users: [...filteredUsers] })));\n } else {\n // Every requested user was already in the cache and it was clean — no network needed.\n return of({ roles, users: [...filteredUsers] });\n }\n }),\n // Step 3 — project to the flat render-model the template iterates over. data-type\n // drives the chip styling (user vs role).\n map(({ roles, users }) => {\n const userNodes = users.map((user: YuvUser & { displayName?: string }) => ({\n type: 'user',\n label: user.title || user.displayName\n }));\n const roleNodes = roles.map((role: string) => ({\n type: 'role',\n label: role\n }));\n return [...userNodes, ...roleNodes];\n })\n );\n },\n defaultValue: []\n });\n\n userAndRole = this.#userRoleResolver.value;\n userAndRoleLoading = this.#userRoleResolver.isLoading;\n\n // Collapse a user list to one entry per id, keeping the LAST occurrence — callers order the\n // array so the freshest/real entry comes last and wins. Also drops any falsy entries.\n #dedupById(users: YuvUser[]): YuvUser[] {\n return [...new Map(users.filter((user) => user).map((user) => [user.id, user])).values()];\n }\n}\n","@if (userAndRoleLoading()) {\n <span class=\"loading\"><i>.</i><i>.</i><i>.</i></span>\n} @else {\n @for (node of userAndRole(); track $index) {\n <span class=\"node\" [attr.data-type]=\"node.type\">{{ node.label }}</span>\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-string-renderer',\n template: `{{ value() }}`,\n styles: [],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class StringRendererComponent extends AbstractRendererComponent {}\n","import { DatePipe, DecimalPipe } from '@angular/common';\nimport { Component, computed, inject } from '@angular/core';\nimport { SystemService, TranslatePipe, TranslateService } from '@yuuvis/client-core';\nimport { AbstractRendererComponent } from '../abstract.renderer';\n\n@Component({\n selector: 'yuv-table-renderer',\n standalone: true,\n imports: [TranslatePipe],\n templateUrl: `./table.renderer.component.html`,\n styleUrls: ['./table.renderer.component.scss'],\n providers: [DecimalPipe, DatePipe]\n})\nexport class TableRendererComponent extends AbstractRendererComponent<any[]> {\n readonly #system = inject(SystemService);\n readonly translate = inject(TranslateService);\n readonly #decimalPipe = inject(DecimalPipe);\n readonly #datePipe = inject(DatePipe);\n\n protected tableHeaders = computed(() => [\n ...new Set(\n (this.value() || []).flat().map((item) => ({\n id: `header-${crypto.randomUUID()}`,\n key: item.propertyName,\n label: this.#system.getLocalizedLabel(`${item.propertyName}`) || item.propertyName\n }))\n )\n ]);\n\n protected tableData = computed(() => {\n const data = this.value() || [];\n return (data.length > 10 ? data.slice(0, 10) : data).map((row, rowIndex) =>\n row.map((item: any) => ({\n id: `row-${rowIndex}-cell-${crypto.randomUUID()}`,\n ...item,\n value: this.#cellValue(item)\n }))\n );\n });\n\n protected reducedData = computed(() => {\n const data = this.value() || [];\n return data.length > 10;\n });\n\n protected getCellValue(row: any[], key: string): string {\n const item = (row || []).find((i) => i.propertyName === key);\n return item ? item.value : '';\n }\n\n #cellValue(element: { propertyType: string; value: string }): string | null {\n switch (element.propertyType) {\n case 'datetime':\n return this.#datePipe.transform(element.value, 'short', undefined, this.translate.getCurrentLang());\n case 'string':\n return element.value;\n case 'decimal':\n return this.#decimalPipe.transform(element.value, '1.2-4', this.translate.getCurrentLang());\n default:\n return element.value;\n }\n }\n}\n","<div class=\"table-container\">\n <table>\n <thead>\n <tr>\n @for (header of tableHeaders(); track header.id) {\n <th>{{ header.label }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track $index) {\n <tr>\n @for (header of tableHeaders(); track header.id) {\n <td>{{ getCellValue(row, header.key) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (reducedData()) {\n <p>{{ 'yuv.table.renderer.moreEntries' | translate: { count: value()?.length } }}</p>\n }\n</div>\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-unknown-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class UnknownRendererComponent extends AbstractRendererComponent<any> {}\n","import { Injectable, Type, inject, signal } from '@angular/core';\nimport {\n ContentStreamField,\n InternalFieldType,\n RendererType,\n SchemaResponseFieldDefinition,\n SystemService\n} from '@yuuvis/client-core';\nimport {\n AbstractRendererComponent,\n BooleanRendererComponent,\n DateTimeRendererComponent,\n DecimalRendererComponent,\n FileSizeRendererComponent,\n IconRendererComponent,\n IntegerRendererComponent,\n OrganizationRendererComponent,\n StringRendererComponent,\n TableRendererComponent,\n UnknownRendererComponent\n} from '../../property-renderer';\nimport { RendererComponent } from './renderer.interface';\n\n/**\n * Service for managing property type renderers. Renderers are components that will render certain\n * property types.\n *\n * You are able to register your own renderer to overwrite an existing one or provide a custom\n * renderer for your context.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RendererService {\n private system = inject(SystemService);\n\n #renderers = signal<Record<string, Type<RendererComponent>>>({});\n\n constructor() {\n const initialRenderers: Record<string, Type<RendererComponent>> = {\n integer: IntegerRendererComponent,\n decimal: DecimalRendererComponent,\n datetime: DateTimeRendererComponent,\n icon: IconRendererComponent,\n string: StringRendererComponent,\n boolean: BooleanRendererComponent,\n table: TableRendererComponent\n };\n initialRenderers[InternalFieldType.STRING_ORGANIZATION] = OrganizationRendererComponent;\n initialRenderers[InternalFieldType.STRING_ORGANIZATION_SET] = OrganizationRendererComponent;\n initialRenderers[ContentStreamField.LENGTH] = FileSizeRendererComponent;\n this.#renderers.set(initialRenderers);\n }\n\n getRendererByType(type: RendererType): Type<RendererComponent> {\n const r = this.#renderers();\n return r[type] || UnknownRendererComponent;\n }\n\n getRenderer(propertyName: string, typeName?: string): Type<RendererComponent> {\n // try to find a renderer based on property and object type\n let r = this.#renderers()[this._getKey(propertyName, typeName)];\n if (!r) {\n // not special renderer found so we'll try to get one for the internal type\n // of the given property\n const srf: SchemaResponseFieldDefinition | undefined =\n this.system.system && this.system.system.allFields[propertyName];\n\n if (srf) {\n r = this.getRendererByType(\n this.system.getInternalFormElementType(srf.propertyType, srf.classifications, srf.catalog)\n );\n }\n }\n\n return r || UnknownRendererComponent;\n }\n\n /**\n * Register a renderer for a particular property. Providing `typeName` will register that renderer\n * for a certain context (use same inputs when calling `getRenderer()`).\n * @param cmp The component to actually render the property\n * @param propertyName property name (used for registering the renderer for a certain context)\n * @param typeName Optional type name (used for registering the renderer for a certain context)\n */\n registerRenderer(cmp: Type<AbstractRendererComponent>, propertyName: string, typeName?: string) {\n this.#renderers.update((curr) => ({ ...curr, ...{ [this._getKey(propertyName, typeName)]: cmp } }));\n }\n\n /**\n *\n * @param type The type of property this renderer is supposed to be used for\n */\n registerRendererByType(type: RendererType, cmp: Type<RendererComponent>) {\n this.#renderers.update((curr) => ({ ...curr, ...{ [type]: cmp } }));\n }\n\n // Generate the unique key for a renderer\n private _getKey(propertyName: string, typeName?: string): string {\n const k = [propertyName];\n typeName && k.push(typeName);\n return k.join('-');\n }\n}\n","import { ComponentRef, Directive, Type, ViewContainerRef, effect, inject, input } from '@angular/core';\nimport { AuditEntry } from '@yuuvis/client-core';\nimport { AbstractAuditRendererComponent } from '../audit-renderer';\nimport { AuditRendererService } from '../services';\n\n/**\n * Attribute directive that renders an `AuditEntry` using the component registered with\n * `AuditRendererService` for the entry's `action` (and optionally `subaction`). Falls\n * back to `DefaultAuditRendererComponent` when no override is registered.\n */\n@Directive({\n selector: '[yuvAuditRenderer]',\n standalone: true\n})\nexport class AuditRendererDirective {\n #service = inject(AuditRendererService);\n #containerRef = inject(ViewContainerRef);\n\n component!: ComponentRef<AbstractAuditRendererComponent>;\n #current?: AuditEntry;\n\n yuvAuditRenderer = input.required<AuditEntry>();\n\n #renderEffect = effect(() => {\n const entry = this.yuvAuditRenderer();\n if (this.#alreadyRendered(entry)) return;\n\n this.#current = entry;\n this.#containerRef.clear();\n const cmp: Type<AbstractAuditRendererComponent> = this.#service.getAuditRenderer(\n entry.action,\n entry.subaction\n );\n this.component = this.#containerRef.createComponent(cmp);\n this.component.setInput('auditEntry', entry);\n });\n\n #alreadyRendered(entry: AuditEntry): boolean {\n return !!this.#current && JSON.stringify(this.#current) === JSON.stringify(entry);\n }\n}\n","import { ComponentRef, Directive, Type, ViewContainerRef, effect, inject, input } from '@angular/core';\nimport { RendererComponent, RendererDirectiveInput, RendererService } from '../services';\n/**\n * Structural directive for rendering an obect type property\n */\n@Directive({\n selector: '[yuvRenderer]',\n standalone: true\n})\nexport class RendererDirective {\n #rendererService = inject(RendererService);\n #containerRef = inject(ViewContainerRef);\n\n component!: ComponentRef<RendererComponent>;\n #rendererInput?: RendererDirectiveInput;\n yuvRenderer = input<RendererDirectiveInput | undefined>(undefined);\n\n #yuvRendererEffect = effect(() => {\n const i = this.yuvRenderer();\n if (i && !this.#alreadyRendered(i)) {\n this.#rendererInput = i;\n this.#containerRef.clear();\n const cmp: Type<RendererComponent> = i.rendererType\n ? this.#rendererService.getRendererByType(i.rendererType)\n : this.#rendererService.getRenderer(i.propertyName);\n\n this.component = this.#containerRef.createComponent(cmp);\n // pass inputs to the renderer. As they are signals they need an injection context\n this.component.setInput('propertyName', i.propertyName);\n this.component.setInput('value', i.value);\n if (i.meta) this.component.setInput('meta', i.meta);\n } else if (!i) {\n this.#containerRef.clear();\n this.#rendererInput = undefined;\n }\n });\n\n #alreadyRendered(i: RendererDirectiveInput): boolean {\n return !!this.#rendererInput && JSON.stringify(this.#rendererInput) === JSON.stringify(i);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}