@ngneers/controls 0.0.1-pre5 → 0.0.1-pre7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngneers-controls-accordion.mjs +33 -33
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
- package/fesm2022/ngneers-controls-api-ng.mjs +22 -19
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-api-resize.mjs +706 -0
- package/fesm2022/ngneers-controls-api-resize.mjs.map +1 -0
- package/fesm2022/ngneers-controls-avatar.mjs +13 -13
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-base.mjs +89 -64
- package/fesm2022/ngneers-controls-base.mjs.map +1 -1
- package/fesm2022/ngneers-controls-breadcrumb.mjs +19 -19
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button-group.mjs +8 -8
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button.mjs +15 -10
- package/fesm2022/ngneers-controls-button.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs → ngneers-controls-calendar-time-CKAqRgOP.mjs} +9 -9
- package/fesm2022/{ngneers-controls-calendar-time-BEeJIqIX.mjs.map → ngneers-controls-calendar-time-CKAqRgOP.mjs.map} +1 -1
- package/fesm2022/ngneers-controls-calendar.mjs +56 -56
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-checkbox.mjs +9 -9
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
- package/fesm2022/ngneers-controls-chip.mjs +7 -7
- package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-default-icons.mjs +61 -0
- package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -0
- package/fesm2022/ngneers-controls-defer.mjs +10 -10
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-dialog.mjs +38 -40
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +45 -39
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
- package/fesm2022/ngneers-controls-drawer.mjs +29 -29
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-edit-inplace.mjs +16 -16
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-filter.mjs +192 -44
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-i18n-de-CdTPeBiR.mjs → ngneers-controls-i18n-de-CF0xTWEX.mjs} +9 -5
- package/fesm2022/ngneers-controls-i18n-de-CF0xTWEX.mjs.map +1 -0
- package/fesm2022/{ngneers-controls-i18n-en-Cfp2pOLY.mjs → ngneers-controls-i18n-en-8B7xAjH2.mjs} +9 -5
- package/fesm2022/ngneers-controls-i18n-en-8B7xAjH2.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n.mjs +5 -5
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
- package/fesm2022/ngneers-controls-icon.mjs +111 -47
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-inplace.mjs +18 -18
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-field.mjs +16 -16
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-mask.mjs +8 -8
- package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input.mjs +6 -6
- package/fesm2022/ngneers-controls-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-item-view.mjs +33 -33
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
- package/fesm2022/ngneers-controls-list-box.mjs +31 -31
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-menu.mjs +33 -33
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
- package/fesm2022/ngneers-controls-message.mjs +4 -4
- package/fesm2022/ngneers-controls-message.mjs.map +1 -1
- package/fesm2022/ngneers-controls-paginator.mjs +13 -13
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
- package/fesm2022/ngneers-controls-popover.mjs +21 -16
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
- package/fesm2022/ngneers-controls-progress.mjs +16 -16
- package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
- package/fesm2022/ngneers-controls-scroll-shadow.mjs +54 -0
- package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroller.mjs +74 -39
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +7 -7
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select.mjs +48 -47
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +11 -11
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
- package/fesm2022/ngneers-controls-spinner.mjs +7 -7
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
- package/fesm2022/ngneers-controls-splitter.mjs +141 -328
- package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-switch.mjs +3 -3
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
- package/fesm2022/ngneers-controls-table.mjs +1456 -82
- package/fesm2022/ngneers-controls-table.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tabs.mjs +41 -40
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tag.mjs +4 -4
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toast.mjs +19 -19
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toggle-button.mjs +10 -10
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tooltip.mjs +74 -38
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils-ng.mjs +9 -9
- package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils.mjs +1 -1
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/package.json +34 -12
- package/types/ngneers-controls-accordion.d.ts +6 -4
- package/types/ngneers-controls-api-ng.d.ts +7 -2
- package/types/ngneers-controls-api-resize.d.ts +318 -0
- package/types/ngneers-controls-api.d.ts +2 -2
- package/types/ngneers-controls-base.d.ts +8 -0
- package/types/ngneers-controls-breadcrumb.d.ts +6 -4
- package/types/ngneers-controls-button.d.ts +13 -8
- package/types/ngneers-controls-calendar.d.ts +5 -1
- package/types/ngneers-controls-checkbox.d.ts +6 -4
- package/types/ngneers-controls-chip.d.ts +3 -1
- package/types/ngneers-controls-default-icons.d.ts +5 -0
- package/types/ngneers-controls-directives.d.ts +7 -1
- package/types/ngneers-controls-drawer.d.ts +7 -1
- package/types/ngneers-controls-edit-inplace.d.ts +4 -0
- package/types/ngneers-controls-filter.d.ts +52 -3
- package/types/ngneers-controls-i18n.d.ts +4 -0
- package/types/ngneers-controls-icon.d.ts +23 -40
- package/types/ngneers-controls-input-field.d.ts +7 -1
- package/types/ngneers-controls-item-view.d.ts +4 -2
- package/types/ngneers-controls-list-box.d.ts +5 -1
- package/types/ngneers-controls-menu.d.ts +4 -2
- package/types/ngneers-controls-message.d.ts +3 -1
- package/types/ngneers-controls-paginator.d.ts +4 -0
- package/types/ngneers-controls-popover.d.ts +2 -1
- package/types/ngneers-controls-scroll-shadow.d.ts +16 -0
- package/types/ngneers-controls-scroller.d.ts +12 -2
- package/types/ngneers-controls-select.d.ts +11 -12
- package/types/ngneers-controls-spinner.d.ts +1 -1
- package/types/ngneers-controls-splitter.d.ts +29 -59
- package/types/ngneers-controls-table.d.ts +380 -24
- package/types/ngneers-controls-tabs.d.ts +4 -2
- package/types/ngneers-controls-tag.d.ts +3 -1
- package/types/ngneers-controls-toast.d.ts +5 -3
- package/types/ngneers-controls-toggle-button.d.ts +5 -3
- package/types/ngneers-controls-tooltip.d.ts +7 -1
- package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +0 -1
- package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-item-view.mjs","sources":["../../src/item-view/item-view-layout.ts","../../src/item-view/item-view-templates.ts","../../src/item-view/item-view.ts","../../src/item-view/item-view.html","../../src/item-view/ngneers-controls-item-view.ts"],"sourcesContent":["import { NgnError } from '@ngneers/controls/utils';\r\n\r\nimport type { OverflowStrategy } from './types';\r\n\r\nexport type ItemOverflowLocation = 'start' | 'end' | 'center';\r\n\r\nexport type OverflowOrderEntry = {\r\n index: number;\r\n location: ItemOverflowLocation;\r\n};\r\n\r\nexport type OverflowOrder = readonly OverflowOrderEntry[];\r\n\r\nexport type ItemViewLayoutInput = {\r\n count: number;\r\n strategy: OverflowStrategy;\r\n freezeCount: number;\r\n strategyIndex: number;\r\n containerWidth: number;\r\n itemWidths: readonly number[];\r\n overflowItemWidth: number;\r\n gap: number;\r\n};\r\n\r\nexport type ItemViewLayoutResult = {\r\n checkOrder: OverflowOrder;\r\n renderedItemOrders: OverflowOrder;\r\n remainingItemOrders: OverflowOrder;\r\n overflowIndicatorCount: number;\r\n overflowIndicatorIndices: readonly (number | null)[];\r\n};\r\n\r\n/**\r\n * Returns the *priority order* in which items are considered for keeping visible.\r\n * The algorithm is greedy: it walks this list until items no longer fit.\r\n * Each entry also carries a `location` which describes which overflow indicator would own the item.\r\n */\r\nexport function getItemOverflowCheckOrder(params: {\r\n count: number;\r\n strategy: OverflowStrategy;\r\n freezeCount: number;\r\n strategyIndex: number;\r\n}): OverflowOrder {\r\n const count = Math.max(0, Math.floor(params.count));\r\n if (count === 0) {\r\n return [];\r\n }\r\n\r\n const freezeCount = Math.min(Math.max(0, Math.floor(params.freezeCount)), count);\r\n\r\n switch (params.strategy) {\r\n case 'end': {\r\n const arr = [...Array.from({ length: count - freezeCount }, (_, i) => i)];\r\n arr.splice(1, 0, ...Array.from({ length: freezeCount }, (_, i) => count - freezeCount + i));\r\n return arr.map(index => ({ index, location: 'end' }));\r\n }\r\n case 'start': {\r\n const arr = [...Array.from({ length: count - freezeCount }, (_, i) => count - i - 1)];\r\n arr.splice(1, 0, ...Array.from({ length: freezeCount }, (_, i) => i));\r\n return arr.map(index => ({ index, location: 'start' }));\r\n }\r\n case 'center': {\r\n // \"Center\" overflows symmetrically: keep alternating left/right items first.\r\n const order: OverflowOrderEntry[] = [];\r\n let leftIndex = 0;\r\n let rightIndex = count - 1;\r\n\r\n for (let i = 0; i < count; i++) {\r\n if (i % 2 === 0) {\r\n order.push({ index: leftIndex++, location: 'center' } as const);\r\n } else {\r\n order.push({ index: rightIndex--, location: 'center' } as const);\r\n }\r\n }\r\n return order;\r\n }\r\n case 'aroundIndex': {\r\n // \"AroundIndex\" keeps the chosen item visible, then expands outward on both sides.\r\n // FreezeCount applies to both ends; we must ensure the chosen index stays in-bounds.\r\n const minIndex = Math.min(freezeCount, count - 1);\r\n const maxIndex = Math.max(minIndex, count - freezeCount - 1);\r\n const index = Math.min(Math.max(minIndex, Math.floor(params.strategyIndex)), maxIndex);\r\n\r\n const targetMiddleCount = Math.max(0, count - freezeCount * 2);\r\n const order: { index: number; location: 'start' | 'end' }[] =\r\n targetMiddleCount > 0 ? [{ index, location: 'start' }] : [];\r\n\r\n let offset = 1;\r\n while (order.length < targetMiddleCount) {\r\n if (index - offset >= freezeCount) {\r\n order.push({ index: index - offset, location: 'start' });\r\n }\r\n if (order.length >= targetMiddleCount) {\r\n break;\r\n }\r\n if (index + offset < count - freezeCount) {\r\n order.push({\r\n index: index + offset,\r\n location: 'end',\r\n });\r\n }\r\n offset++;\r\n }\r\n\r\n // Insert frozen items near the front of the list so they are kept visible.\r\n // Keep the insertion ordering consistent with the component implementation.\r\n order.splice(\r\n 1,\r\n 0,\r\n ...Array.from({ length: freezeCount }, (_, i) => ({ index: i, location: 'start' }) as const)\r\n );\r\n order.splice(\r\n 1,\r\n 0,\r\n ...Array.from(\r\n { length: freezeCount },\r\n (_, i) =>\r\n ({\r\n index: count - freezeCount + i,\r\n location: 'end',\r\n }) as const\r\n )\r\n );\r\n\r\n return order;\r\n }\r\n }\r\n}\r\n\r\nexport function calculateItemViewLayout(params: ItemViewLayoutInput): ItemViewLayoutResult {\r\n const count = Math.max(0, Math.floor(params.count));\r\n const containerWidth = Math.max(0, params.containerWidth);\r\n const overflowItemWidth = Math.max(0, params.overflowItemWidth);\r\n const gap = Math.max(0, params.gap);\r\n const maxOverflowIndicatorCount = params.strategy === 'aroundIndex' ? 2 : 1;\r\n\r\n const overflowCheckOrder = getItemOverflowCheckOrder({\r\n count,\r\n strategy: params.strategy,\r\n freezeCount: params.freezeCount,\r\n strategyIndex: params.strategyIndex,\r\n });\r\n\r\n const getVisibleItemCount = (reservedWidth: number): number => {\r\n let visibleItemCount = 0;\r\n let totalWidth = Math.max(0, reservedWidth);\r\n\r\n for (let i = 0; i < overflowCheckOrder.length; i++) {\r\n const index = overflowCheckOrder[i]?.index;\r\n if (index === undefined) {\r\n throw new NgnError(\r\n 'calculateItemViewLayout',\r\n 'Invalid overflow check order: index is undefined'\r\n );\r\n }\r\n const itemWidth = params.itemWidths[index] ?? 0;\r\n const itemGap = i > 0 ? gap : 0;\r\n const newWidth = totalWidth + itemWidth + itemGap;\r\n\r\n if (newWidth <= containerWidth) {\r\n totalWidth = newWidth;\r\n visibleItemCount++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return visibleItemCount;\r\n };\r\n\r\n let overflowIndicatorCount = 0;\r\n let previousOverflowIndicatorCount = -1;\r\n let remainingItemOrders: OverflowOrder = overflowCheckOrder;\r\n let renderedItemOrders: OverflowOrderEntry[] = [];\r\n let overflowIndicatorLocations = new Set<ItemOverflowLocation>();\r\n\r\n // Fixed-point iteration:\r\n // 1) We blindly assume that we don't need any overflow indicators for the first pass.\r\n // 2) We see how many items fit with that assumption.\r\n // 3) The remaining items define which overflow locations exist (start/end/center).\r\n // 4) That determines the *actual* number of indicators.\r\n // Repeat until the indicator count stabilizes.\r\n while (overflowIndicatorCount !== previousOverflowIndicatorCount) {\r\n previousOverflowIndicatorCount = overflowIndicatorCount;\r\n\r\n const initialVisibleItemCount = getVisibleItemCount(\r\n overflowIndicatorCount * (overflowItemWidth + gap)\r\n );\r\n\r\n remainingItemOrders = overflowCheckOrder\r\n .slice(initialVisibleItemCount)\r\n .toSorted((a, b) => a.index - b.index);\r\n\r\n overflowIndicatorLocations = new Set(remainingItemOrders.map(i => i.location));\r\n overflowIndicatorCount = overflowIndicatorLocations.size;\r\n const finalVisibleItemCount = getVisibleItemCount(\r\n overflowIndicatorCount * (overflowItemWidth + gap)\r\n );\r\n renderedItemOrders = overflowCheckOrder.slice(0, finalVisibleItemCount);\r\n }\r\n\r\n (['start', 'end'] as const).forEach(location => {\r\n // Optimization: if all overflowed items for a side would fit inside the overflow indicator width,\r\n // we can render them inline and drop that overflow indicator entirely.\r\n // This is only applicable for start/end & the aroundIndex strategy. Center has no \"adjacent\" insertion point.\r\n if (overflowIndicatorLocations.has(location)) {\r\n const itemsWithIndices = remainingItemOrders\r\n .map((x, i) => [i + renderedItemOrders.length, x] as const)\r\n .filter(x => x[1].location === location);\r\n const itemSizes = itemsWithIndices.map(i => params.itemWidths[i[1].index] ?? 0);\r\n const itemsTotalSize = itemSizes.reduce((a, b) => a + b, 0);\r\n if (itemsTotalSize <= overflowItemWidth) {\r\n overflowIndicatorLocations.delete(location);\r\n renderedItemOrders = [...renderedItemOrders, ...itemsWithIndices.map(i => i[1])];\r\n overflowIndicatorCount--;\r\n }\r\n }\r\n });\r\n\r\n // Keep result consistent after the optimization pass.\r\n const renderedIndices = new Set(renderedItemOrders.map(x => x.index));\r\n remainingItemOrders = overflowCheckOrder\r\n .filter(x => !renderedIndices.has(x.index))\r\n .toSorted((a, b) => a.index - b.index);\r\n\r\n // Calculate the insertion indices for the overflow indicators.\r\n const overflowIndicatorIndices = (() => {\r\n if (overflowIndicatorCount === 0) {\r\n return [null];\r\n } else if (maxOverflowIndicatorCount === 1 && overflowIndicatorCount === 1) {\r\n return [remainingItemOrders[0]?.index ?? null];\r\n } else if (maxOverflowIndicatorCount === 2) {\r\n const res: number[] = [];\r\n const firstEndIndex = remainingItemOrders.find(x => x.location === 'end')?.index;\r\n const lastEndIndex = remainingItemOrders.findLast(x => x.location === 'end')?.index;\r\n const firstStartIndex = remainingItemOrders.find(x => x.location === 'start')?.index;\r\n const lastStartIndex = remainingItemOrders.findLast(x => x.location === 'start')?.index;\r\n if (overflowIndicatorLocations.has('start')) {\r\n const startIndex = firstStartIndex ?? firstEndIndex ?? 0;\r\n res.push(startIndex + Math.min(Math.max(0, Math.floor(params.freezeCount)), count));\r\n }\r\n if (overflowIndicatorLocations.has('end')) {\r\n const endIndex = lastEndIndex ? lastEndIndex + 1 : (lastStartIndex ?? 0);\r\n res.push(endIndex);\r\n }\r\n return res;\r\n }\r\n return [];\r\n })();\r\n\r\n return {\r\n checkOrder: overflowCheckOrder,\r\n renderedItemOrders,\r\n remainingItemOrders,\r\n overflowIndicatorCount,\r\n overflowIndicatorIndices,\r\n };\r\n}\r\n","import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n@Directive()\r\nexport abstract class ItemViewTemplates<T> extends NgnBase<'itemView'> {\r\n /**\r\n * The template to be used for rendering each item in the item view.\r\n * Can also be set using the `item` content child.\r\n */\r\n public readonly templateItem = input<TemplateRef<\r\n typeof this.templateTypes.$implicit.item\r\n > | null>(null);\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n protected readonly itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem());\r\n\r\n // Separator template\r\n private readonly _defaultSeparatorTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.separator>\r\n >('defaultSeparatorTemplate');\r\n private readonly _userSeparatorTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.separator>>('separator');\r\n /**\r\n * Set a custom template for the separators of the breadcrumb.\r\n * Can also be set using an `<ng-template>` element with `#separator` template reference variable.\r\n */\r\n public readonly templateSeparator = input<TemplateRef<\r\n typeof this.templateTypes.separator\r\n > | null>(null);\r\n protected readonly separatorTemplate = computed(\r\n () =>\r\n this._userSeparatorTemplate() ?? this.templateSeparator() ?? this._defaultSeparatorTemplate()\r\n );\r\n\r\n // Overflow item template\r\n private readonly _defaultOverflowItemTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.overflow>\r\n >('defaultOverflowItemTemplate');\r\n private readonly _userOverflowItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.overflow>>('overflow');\r\n /**\r\n * Set a custom template for the overflow item.\r\n * Can also be set using an `<ng-template>` element with `#overflow` template reference variable.\r\n */\r\n public readonly templateOverflow = input<TemplateRef<typeof this.templateTypes.overflow> | null>(\r\n null\r\n );\r\n protected readonly overflowTemplate = computed(\r\n () =>\r\n this._userOverflowItemTemplate() ??\r\n this.templateOverflow() ??\r\n this._defaultOverflowItemTemplate()\r\n );\r\n\r\n /**\r\n * Template types for the item-view.\r\n * Can be used with the {@link NgnTemplate} directive for type safe ng-templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: T;\r\n index: number;\r\n last: boolean;\r\n first: boolean;\r\n };\r\n separator: {\r\n $implicit: {\r\n icon?: IconType;\r\n character?: string;\r\n };\r\n };\r\n overflow: {\r\n $implicit: {\r\n totalCount: number;\r\n overflowCount: number;\r\n overflowItems: T[];\r\n };\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n type AfterViewInit,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n viewChildren,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport {\r\n elementSizeSignal,\r\n elementsSizesSignal,\r\n NgnTemplate,\r\n Platform,\r\n} from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { areArraysDeepEqual, throwExp } from '@ngneers/controls/utils';\r\nimport { itemViewControlTemplate } from '@ngneers/controls-themes/templates/item-view';\r\n\r\nimport {\r\n calculateItemViewLayout,\r\n getItemOverflowCheckOrder,\r\n type ItemOverflowLocation,\r\n type OverflowOrder,\r\n} from './item-view-layout';\r\nimport { ItemViewTemplates } from './item-view-templates';\r\n\r\nimport type { OverflowStrategy } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\ntype RenderItem<T> =\r\n | {\r\n id: string | number;\r\n kind: 'visibleItem';\r\n item: T;\r\n }\r\n | {\r\n id: string | number;\r\n kind: 'overflowItem';\r\n location: ItemOverflowLocation;\r\n item: T;\r\n }\r\n | {\r\n id: string;\r\n kind: 'overflowIndicator';\r\n visible: boolean;\r\n items: T[];\r\n hasSeparator: boolean;\r\n };\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-item-view',\r\n templateUrl: './item-view.html',\r\n imports: [NgnPt, NgTemplateOutlet, NgnTemplate, NgnIcon],\r\n providers: [provideSelf(NgnItemView)],\r\n host: {\r\n '[attr.role]': '\"list\"',\r\n '[style.maxWidth.px]': 'maxWidth()',\r\n },\r\n})\r\nexport class NgnItemView<T extends object, IdField extends keyof T>\r\n extends ItemViewTemplates<T>\r\n implements AfterViewInit\r\n{\r\n protected readonly theme = this.injectThemeTemplate(itemViewControlTemplate, 'root');\r\n /**\r\n * The key of the id property in the item object. This is used to track items in the template.\r\n */\r\n public readonly idField = input.required<IdField>();\r\n /**\r\n * The items to be displayed in the item view.\r\n * This is a required input and should be an array of items of type {@link T}.\r\n */\r\n public readonly items = input.required<readonly T[]>();\r\n /**\r\n * A separator string (character) to be displayed between items. Set `true` for `,` or provide a custom string.\r\n */\r\n public readonly separator = input<true | string>();\r\n /**\r\n * A separator icon to be displayed between items.\r\n */\r\n public readonly iconItemSeparator = input<IconType>();\r\n /**\r\n * Strategy to use when there are more items than can be displayed in the available space.\r\n * The value determines where the items should start to overflow.\r\n * @default 'end'\r\n */\r\n public readonly overflowStrategy = input<OverflowStrategy>('end');\r\n /**\r\n * The amount of items to keep visible after or before overflowing, depending on the {@link overflowStrategy}.\r\n * @default 0\r\n */\r\n public readonly overflowStrategyFreezeCount = input<number>(0);\r\n /**\r\n * Index of the item to be used as the overflow indicator when using the 'aroundIndex' overflow strategy.\r\n * This input is only relevant when the {@link overflowStrategy} is set to 'aroundIndex'.\r\n * @default 0\r\n */\r\n public readonly overflowStrategyIndex = input<number>(0);\r\n /**\r\n * Set this to `true` for greatly improving performance when all items have the same width.\r\n * Especially true for large lists of items.\r\n *\r\n * ⚠️ This reduces the accessibility of the control as screen\r\n * readers will not be able to determine the number of hidden items and keyboard users cannot directly\r\n * navigate to them. Use this only for potentially very large lists (with items of identical width) where users will not\r\n * need to access overflowed items directly.\r\n * @default false\r\n */\r\n public readonly sameWidthItems = input<boolean>(false);\r\n\r\n private readonly _themeGap = signal(0);\r\n private readonly _isBrowser = inject(Platform).isBrowser;\r\n\r\n protected readonly separatorChar = computed(() => {\r\n const sep = this.separator();\r\n return typeof sep === 'boolean' ? (sep ? ', ' : '') : sep;\r\n });\r\n\r\n private readonly _enableSizeMeasuring = computed(() => !this.sameWidthItems());\r\n private readonly _renderedItemRefs = viewChildren<ElementRef<HTMLElement>>('itemRef');\r\n private readonly _firstItemRef = viewChild<ElementRef<HTMLElement>>('itemRef');\r\n private readonly _firstItemWidth = elementSizeSignal(this._firstItemRef);\r\n private readonly _renderedItemSizes = elementsSizesSignal(\r\n this._renderedItemRefs,\r\n this._enableSizeMeasuring\r\n );\r\n private readonly _renderedItemWidths = computed(\r\n () =>\r\n this.sameWidthItems()\r\n ? this.items().map(() => this._firstItemWidth().width || Number.MAX_SAFE_INTEGER)\r\n : this._renderedItemSizes().map(size => size.width),\r\n { equal: areArraysDeepEqual }\r\n );\r\n private readonly _containerSize = elementSizeSignal(this.element.nativeElement);\r\n private readonly _overflowItemRef = viewChild<ElementRef<HTMLElement>>('overflowItem');\r\n private readonly _overflowItemSize = elementSizeSignal(this._overflowItemRef);\r\n\r\n protected readonly itemOverflowCheckOrder = computed<OverflowOrder>(() => {\r\n const count = this.items().length;\r\n const freezeCount = Math.min(this.overflowStrategyFreezeCount(), count);\r\n return getItemOverflowCheckOrder({\r\n count,\r\n strategy: this.overflowStrategy(),\r\n freezeCount,\r\n strategyIndex: this.overflowStrategyIndex(),\r\n });\r\n });\r\n\r\n protected readonly renderedItems = computed<RenderItem<T>[]>(() => {\r\n const containerWidth = this._containerSize().width;\r\n const renderedItemWidths = this._renderedItemWidths();\r\n const overflowCheckOrder = this.itemOverflowCheckOrder();\r\n\r\n const count = this.items().length;\r\n const freezeCount = Math.min(this.overflowStrategyFreezeCount(), count);\r\n const layout = calculateItemViewLayout({\r\n count,\r\n strategy: this.overflowStrategy(),\r\n freezeCount,\r\n strategyIndex: this.overflowStrategyIndex(),\r\n containerWidth,\r\n itemWidths: renderedItemWidths,\r\n overflowItemWidth: this._overflowItemSize().width,\r\n gap: this._themeGap(),\r\n });\r\n\r\n const renderedItemOrders = layout.renderedItemOrders;\r\n // Precompute quick lookups for the hot paths below.\r\n // - `renderedIndexSet` allows O(1) visibility checks.\r\n // - `locationByIndex` avoids repeatedly scanning the overflow order to find an item's location.\r\n const renderedIndexSet = new Set<number>(renderedItemOrders.map(x => x.index));\r\n const locationByIndex: Array<ItemOverflowLocation | undefined> = new Array(count);\r\n for (const entry of overflowCheckOrder) {\r\n locationByIndex[entry.index] = entry.location;\r\n }\r\n\r\n // First pass: build the full list with items marked as visible vs overflowed.\r\n // We'll insert overflow indicators afterwards at the computed insertion indices.\r\n let res: RenderItem<T>[] = this.items().map((item, index) => {\r\n if (renderedIndexSet.has(index)) {\r\n return <RenderItem<T>>{\r\n id: item[this.idField()] as string | number,\r\n kind: 'visibleItem',\r\n item,\r\n };\r\n } else {\r\n return <RenderItem<T>>{\r\n id: item[this.idField()] as string | number,\r\n kind: 'overflowItem',\r\n location: locationByIndex[index] ?? 'end',\r\n item,\r\n };\r\n }\r\n });\r\n\r\n const getFallbackOverflowIndicatorIndex = () => {\r\n // When the layout says \"no indicator\" for the only slot (null), we still need a stable\r\n // insertion index so the DOM structure stays consistent for measurement.\r\n if (overflowCheckOrder.length === 0) {\r\n return 0;\r\n }\r\n const lastItem = overflowCheckOrder[overflowCheckOrder.length - 1];\r\n return (lastItem ?? throwExp('NgnItemView', 'Unexpected empty entry in overflowCheckOrder'))\r\n .index;\r\n };\r\n\r\n // Insert overflow indicators at the calculated indices\r\n // Note: inserting into `res` shifts subsequent indices; track that shift explicitly with `insertOffset`.\r\n let insertOffset = 0;\r\n\r\n // Collect overflowed items, both as a single list and grouped by location.\r\n const overflowedItemsAll: T[] = [];\r\n const overflowedItemsByLocation: Record<ItemOverflowLocation, T[]> = {\r\n start: [],\r\n end: [],\r\n center: [],\r\n };\r\n const allItems = this.items();\r\n for (let i = 0; i < count; i++) {\r\n if (renderedIndexSet.has(i)) {\r\n continue;\r\n }\r\n const item = allItems[i];\r\n if (item === undefined) {\r\n continue;\r\n }\r\n overflowedItemsAll.push(item);\r\n const location = locationByIndex[i] ?? 'end';\r\n overflowedItemsByLocation[location].push(item);\r\n }\r\n\r\n layout.overflowIndicatorIndices.forEach((indicatorIndex, iterationIndex) => {\r\n const insertIndex = indicatorIndex ?? getFallbackOverflowIndicatorIndex() + insertOffset;\r\n\r\n // If two overflow indicators are rendered (aroundIndex), we must split overflow items by location\r\n // so each indicator shows its own count/list.\r\n const overflowIndicatorLocation =\r\n layout.overflowIndicatorCount === 1 ? null : iterationIndex === 0 ? 'start' : 'end';\r\n const items = overflowIndicatorLocation\r\n ? overflowedItemsByLocation[overflowIndicatorLocation]\r\n : overflowedItemsAll;\r\n\r\n res.splice(insertIndex, 0, <RenderItem<T>>{\r\n id: `overflow-indicator-${indicatorIndex}`,\r\n kind: 'overflowIndicator',\r\n visible: indicatorIndex !== null,\r\n items,\r\n hasSeparator: renderedItemOrders.some(x => x.index + insertOffset > insertIndex),\r\n });\r\n insertOffset++;\r\n });\r\n\r\n // In fixed width mode, remove all hidden items except for the first one (used for measurement)\r\n if (this.sameWidthItems()) {\r\n res = res.filter((item, index) => item.kind !== 'overflowItem' || index === 0);\r\n }\r\n\r\n return res;\r\n });\r\n\r\n protected readonly maxWidth = computed<number>(() => {\r\n return Math.ceil(\r\n this._renderedItemWidths().reduce((sum, w) => sum + w, 0) +\r\n this._themeGap() * Math.max(0, this.items().length - 1)\r\n );\r\n });\r\n\r\n public ngAfterViewInit(): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n requestAnimationFrame(() => {\r\n const gapString = getComputedStyle(this.element.nativeElement).getPropertyValue('column-gap');\r\n const gap = parseFloat(gapString) || 0;\r\n this._themeGap.set(gap);\r\n });\r\n }\r\n}\r\n","@for (item of renderedItems(); track item.id; let i = $index) {\r\n @if (item.kind === 'visibleItem' || item.kind === 'overflowItem') {\r\n <span\r\n role=\"listitem\"\r\n #itemRef\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: true,\r\n 'item-overflowing': item.kind === 'overflowItem',\r\n }\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n itemTemplate();\r\n context: { $implicit: item.item, index: i, last: $last, first: $first }\r\n \"\r\n />\r\n @if (!$last) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n separatorTemplate();\r\n context: { $implicit: { character: separatorChar(), icon: iconItemSeparator() } }\r\n \"\r\n />\r\n }\r\n </span>\r\n } @else if (item.kind === 'overflowIndicator') {\r\n <div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{ 'more-items': true, 'more-items-hidden': !item.visible }\"\r\n aria-hidden=\"true\"\r\n #overflowItem\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n overflowTemplate();\r\n context: {\r\n $implicit: {\r\n totalCount: items().length,\r\n overflowCount: item.items.length,\r\n overflowItems: item.items,\r\n },\r\n }\r\n \"\r\n />\r\n @if (!$last) {\r\n <span\r\n [style.visibility]=\"item.hasSeparator ? 'visible' : 'hidden'\"\r\n style=\"display: contents\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n separatorTemplate();\r\n context: { $implicit: { character: separatorChar(), icon: iconItemSeparator() } }\r\n \"\r\n />\r\n </span>\r\n }\r\n </div>\r\n }\r\n}\r\n\r\n<ng-template #defaultSeparatorTemplate [ngnTemplate]=\"templateTypes.separator\" let-separator>\r\n @if (separator.character) {\r\n <span>{{ separator.character }}</span>\r\n } @else if (separator.icon) {\r\n <ngn-icon [icon]=\"separator.icon\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultOverflowItemTemplate [ngnTemplate]=\"templateTypes.overflow\" let-overflow>\r\n <span [ptInt]=\"this\" [ptClass]=\"'more-items-default'\">+{{ overflow.overflowCount }}</span>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-item-view.mjs","sources":["../../src/item-view/item-view-layout.ts","../../src/item-view/item-view-templates.ts","../../src/item-view/item-view.ts","../../src/item-view/item-view.html","../../src/item-view/ngneers-controls-item-view.ts"],"sourcesContent":["import { NgnError } from '@ngneers/controls/utils';\r\n\r\nimport type { OverflowStrategy } from './types';\r\n\r\nexport type ItemOverflowLocation = 'start' | 'end' | 'center';\r\n\r\nexport type OverflowOrderEntry = {\r\n index: number;\r\n location: ItemOverflowLocation;\r\n};\r\n\r\nexport type OverflowOrder = readonly OverflowOrderEntry[];\r\n\r\nexport type ItemViewLayoutInput = {\r\n count: number;\r\n strategy: OverflowStrategy;\r\n freezeCount: number;\r\n strategyIndex: number;\r\n containerWidth: number;\r\n itemWidths: readonly number[];\r\n overflowItemWidth: number;\r\n gap: number;\r\n};\r\n\r\nexport type ItemViewLayoutResult = {\r\n checkOrder: OverflowOrder;\r\n renderedItemOrders: OverflowOrder;\r\n remainingItemOrders: OverflowOrder;\r\n overflowIndicatorCount: number;\r\n overflowIndicatorIndices: readonly (number | null)[];\r\n};\r\n\r\n/**\r\n * Returns the *priority order* in which items are considered for keeping visible.\r\n * The algorithm is greedy: it walks this list until items no longer fit.\r\n * Each entry also carries a `location` which describes which overflow indicator would own the item.\r\n */\r\nexport function getItemOverflowCheckOrder(params: {\r\n count: number;\r\n strategy: OverflowStrategy;\r\n freezeCount: number;\r\n strategyIndex: number;\r\n}): OverflowOrder {\r\n const count = Math.max(0, Math.floor(params.count));\r\n if (count === 0) {\r\n return [];\r\n }\r\n\r\n const freezeCount = Math.min(Math.max(0, Math.floor(params.freezeCount)), count);\r\n\r\n switch (params.strategy) {\r\n case 'end': {\r\n const arr = [...Array.from({ length: count - freezeCount }, (_, i) => i)];\r\n arr.splice(1, 0, ...Array.from({ length: freezeCount }, (_, i) => count - freezeCount + i));\r\n return arr.map(index => ({ index, location: 'end' }));\r\n }\r\n case 'start': {\r\n const arr = [...Array.from({ length: count - freezeCount }, (_, i) => count - i - 1)];\r\n arr.splice(1, 0, ...Array.from({ length: freezeCount }, (_, i) => i));\r\n return arr.map(index => ({ index, location: 'start' }));\r\n }\r\n case 'center': {\r\n // \"Center\" overflows symmetrically: keep alternating left/right items first.\r\n const order: OverflowOrderEntry[] = [];\r\n let leftIndex = 0;\r\n let rightIndex = count - 1;\r\n\r\n for (let i = 0; i < count; i++) {\r\n if (i % 2 === 0) {\r\n order.push({ index: leftIndex++, location: 'center' } as const);\r\n } else {\r\n order.push({ index: rightIndex--, location: 'center' } as const);\r\n }\r\n }\r\n return order;\r\n }\r\n case 'aroundIndex': {\r\n // \"AroundIndex\" keeps the chosen item visible, then expands outward on both sides.\r\n // FreezeCount applies to both ends; we must ensure the chosen index stays in-bounds.\r\n const minIndex = Math.min(freezeCount, count - 1);\r\n const maxIndex = Math.max(minIndex, count - freezeCount - 1);\r\n const index = Math.min(Math.max(minIndex, Math.floor(params.strategyIndex)), maxIndex);\r\n\r\n const targetMiddleCount = Math.max(0, count - freezeCount * 2);\r\n const order: { index: number; location: 'start' | 'end' }[] =\r\n targetMiddleCount > 0 ? [{ index, location: 'start' }] : [];\r\n\r\n let offset = 1;\r\n while (order.length < targetMiddleCount) {\r\n if (index - offset >= freezeCount) {\r\n order.push({ index: index - offset, location: 'start' });\r\n }\r\n if (order.length >= targetMiddleCount) {\r\n break;\r\n }\r\n if (index + offset < count - freezeCount) {\r\n order.push({\r\n index: index + offset,\r\n location: 'end',\r\n });\r\n }\r\n offset++;\r\n }\r\n\r\n // Insert frozen items near the front of the list so they are kept visible.\r\n // Keep the insertion ordering consistent with the component implementation.\r\n order.splice(\r\n 1,\r\n 0,\r\n ...Array.from({ length: freezeCount }, (_, i) => ({ index: i, location: 'start' }) as const)\r\n );\r\n order.splice(\r\n 1,\r\n 0,\r\n ...Array.from(\r\n { length: freezeCount },\r\n (_, i) =>\r\n ({\r\n index: count - freezeCount + i,\r\n location: 'end',\r\n }) as const\r\n )\r\n );\r\n\r\n return order;\r\n }\r\n }\r\n}\r\n\r\nexport function calculateItemViewLayout(params: ItemViewLayoutInput): ItemViewLayoutResult {\r\n const count = Math.max(0, Math.floor(params.count));\r\n const containerWidth = Math.max(0, params.containerWidth);\r\n const overflowItemWidth = Math.max(0, params.overflowItemWidth);\r\n const gap = Math.max(0, params.gap);\r\n const maxOverflowIndicatorCount = params.strategy === 'aroundIndex' ? 2 : 1;\r\n\r\n const overflowCheckOrder = getItemOverflowCheckOrder({\r\n count,\r\n strategy: params.strategy,\r\n freezeCount: params.freezeCount,\r\n strategyIndex: params.strategyIndex,\r\n });\r\n\r\n const getVisibleItemCount = (reservedWidth: number): number => {\r\n let visibleItemCount = 0;\r\n let totalWidth = Math.max(0, reservedWidth);\r\n\r\n for (let i = 0; i < overflowCheckOrder.length; i++) {\r\n const index = overflowCheckOrder[i]?.index;\r\n if (index === undefined) {\r\n throw new NgnError(\r\n 'calculateItemViewLayout',\r\n 'Invalid overflow check order: index is undefined'\r\n );\r\n }\r\n const itemWidth = params.itemWidths[index] ?? 0;\r\n const itemGap = i > 0 ? gap : 0;\r\n const newWidth = totalWidth + itemWidth + itemGap;\r\n\r\n if (newWidth <= containerWidth) {\r\n totalWidth = newWidth;\r\n visibleItemCount++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return visibleItemCount;\r\n };\r\n\r\n let overflowIndicatorCount = 0;\r\n let previousOverflowIndicatorCount = -1;\r\n let remainingItemOrders: OverflowOrder = overflowCheckOrder;\r\n let renderedItemOrders: OverflowOrderEntry[] = [];\r\n let overflowIndicatorLocations = new Set<ItemOverflowLocation>();\r\n\r\n // Fixed-point iteration:\r\n // 1) We blindly assume that we don't need any overflow indicators for the first pass.\r\n // 2) We see how many items fit with that assumption.\r\n // 3) The remaining items define which overflow locations exist (start/end/center).\r\n // 4) That determines the *actual* number of indicators.\r\n // Repeat until the indicator count stabilizes.\r\n while (overflowIndicatorCount !== previousOverflowIndicatorCount) {\r\n previousOverflowIndicatorCount = overflowIndicatorCount;\r\n\r\n const initialVisibleItemCount = getVisibleItemCount(\r\n overflowIndicatorCount * (overflowItemWidth + gap)\r\n );\r\n\r\n remainingItemOrders = overflowCheckOrder\r\n .slice(initialVisibleItemCount)\r\n .toSorted((a, b) => a.index - b.index);\r\n\r\n overflowIndicatorLocations = new Set(remainingItemOrders.map(i => i.location));\r\n overflowIndicatorCount = overflowIndicatorLocations.size;\r\n const finalVisibleItemCount = getVisibleItemCount(\r\n overflowIndicatorCount * (overflowItemWidth + gap)\r\n );\r\n renderedItemOrders = overflowCheckOrder.slice(0, finalVisibleItemCount);\r\n }\r\n\r\n (['start', 'end'] as const).forEach(location => {\r\n // Optimization: if all overflowed items for a side would fit inside the overflow indicator width,\r\n // we can render them inline and drop that overflow indicator entirely.\r\n // This is only applicable for start/end & the aroundIndex strategy. Center has no \"adjacent\" insertion point.\r\n if (overflowIndicatorLocations.has(location)) {\r\n const itemsWithIndices = remainingItemOrders\r\n .map((x, i) => [i + renderedItemOrders.length, x] as const)\r\n .filter(x => x[1].location === location);\r\n const itemSizes = itemsWithIndices.map(i => params.itemWidths[i[1].index] ?? 0);\r\n const itemsTotalSize = itemSizes.reduce((a, b) => a + b, 0);\r\n if (itemsTotalSize <= overflowItemWidth) {\r\n overflowIndicatorLocations.delete(location);\r\n renderedItemOrders = [...renderedItemOrders, ...itemsWithIndices.map(i => i[1])];\r\n overflowIndicatorCount--;\r\n }\r\n }\r\n });\r\n\r\n // Keep result consistent after the optimization pass.\r\n const renderedIndices = new Set(renderedItemOrders.map(x => x.index));\r\n remainingItemOrders = overflowCheckOrder\r\n .filter(x => !renderedIndices.has(x.index))\r\n .toSorted((a, b) => a.index - b.index);\r\n\r\n // Calculate the insertion indices for the overflow indicators.\r\n const overflowIndicatorIndices = (() => {\r\n if (overflowIndicatorCount === 0) {\r\n return [null];\r\n } else if (maxOverflowIndicatorCount === 1 && overflowIndicatorCount === 1) {\r\n return [remainingItemOrders[0]?.index ?? null];\r\n } else if (maxOverflowIndicatorCount === 2) {\r\n const res: number[] = [];\r\n const firstEndIndex = remainingItemOrders.find(x => x.location === 'end')?.index;\r\n const lastEndIndex = remainingItemOrders.findLast(x => x.location === 'end')?.index;\r\n const firstStartIndex = remainingItemOrders.find(x => x.location === 'start')?.index;\r\n const lastStartIndex = remainingItemOrders.findLast(x => x.location === 'start')?.index;\r\n if (overflowIndicatorLocations.has('start')) {\r\n const startIndex = firstStartIndex ?? firstEndIndex ?? 0;\r\n res.push(startIndex + Math.min(Math.max(0, Math.floor(params.freezeCount)), count));\r\n }\r\n if (overflowIndicatorLocations.has('end')) {\r\n const endIndex = lastEndIndex ? lastEndIndex + 1 : (lastStartIndex ?? 0);\r\n res.push(endIndex);\r\n }\r\n return res;\r\n }\r\n return [];\r\n })();\r\n\r\n return {\r\n checkOrder: overflowCheckOrder,\r\n renderedItemOrders,\r\n remainingItemOrders,\r\n overflowIndicatorCount,\r\n overflowIndicatorIndices,\r\n };\r\n}\r\n","import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\n@Directive()\r\nexport abstract class ItemViewTemplates<T> extends NgnBase<'itemView'> {\r\n /**\r\n * The template to be used for rendering each item in the item view.\r\n * Can also be set using the `item` content child.\r\n */\r\n public readonly templateItem = input<TemplateRef<\r\n typeof this.templateTypes.$implicit.item\r\n > | null>(null);\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n protected readonly itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem());\r\n\r\n // Separator template\r\n private readonly _defaultSeparatorTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.separator>\r\n >('defaultSeparatorTemplate');\r\n private readonly _userSeparatorTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.separator>>('separator');\r\n /**\r\n * Set a custom template for the separators of the breadcrumb.\r\n * Can also be set using an `<ng-template>` element with `#separator` template reference variable.\r\n */\r\n public readonly templateSeparator = input<TemplateRef<\r\n typeof this.templateTypes.separator\r\n > | null>(null);\r\n protected readonly separatorTemplate = computed(\r\n () =>\r\n this._userSeparatorTemplate() ?? this.templateSeparator() ?? this._defaultSeparatorTemplate()\r\n );\r\n\r\n // Overflow item template\r\n private readonly _defaultOverflowItemTemplate = viewChild.required<\r\n TemplateRef<typeof this.templateTypes.overflow>\r\n >('defaultOverflowItemTemplate');\r\n private readonly _userOverflowItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.overflow>>('overflow');\r\n /**\r\n * Set a custom template for the overflow item.\r\n * Can also be set using an `<ng-template>` element with `#overflow` template reference variable.\r\n */\r\n public readonly templateOverflow = input<TemplateRef<typeof this.templateTypes.overflow> | null>(\r\n null\r\n );\r\n protected readonly overflowTemplate = computed(\r\n () =>\r\n this._userOverflowItemTemplate() ??\r\n this.templateOverflow() ??\r\n this._defaultOverflowItemTemplate()\r\n );\r\n\r\n /**\r\n * Template types for the item-view.\r\n * Can be used with the {@link NgnTemplate} directive for type safe ng-templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: T;\r\n index: number;\r\n last: boolean;\r\n first: boolean;\r\n };\r\n separator: {\r\n $implicit: {\r\n icon?: IconType;\r\n character?: string;\r\n };\r\n };\r\n overflow: {\r\n $implicit: {\r\n totalCount: number;\r\n overflowCount: number;\r\n overflowItems: T[];\r\n };\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n type AfterViewInit,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n signal,\r\n viewChild,\r\n viewChildren,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport {\r\n elementSizeSignal,\r\n elementsSizesSignal,\r\n NgnTemplate,\r\n Platform,\r\n} from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnIcon } from '@ngneers/controls/icon';\r\nimport { areArraysDeepEqual, throwExp } from '@ngneers/controls/utils';\r\nimport { itemViewControlTemplate } from '@ngneers/controls-themes/templates/item-view';\r\n\r\nimport {\r\n calculateItemViewLayout,\r\n getItemOverflowCheckOrder,\r\n type ItemOverflowLocation,\r\n type OverflowOrder,\r\n} from './item-view-layout';\r\nimport { ItemViewTemplates } from './item-view-templates';\r\n\r\nimport type { OverflowStrategy } from './types';\r\nimport type { IconType } from '@ngneers/controls-custom-types';\r\n\r\ntype RenderItem<T> =\r\n | {\r\n id: string | number;\r\n kind: 'visibleItem';\r\n item: T;\r\n }\r\n | {\r\n id: string | number;\r\n kind: 'overflowItem';\r\n location: ItemOverflowLocation;\r\n item: T;\r\n }\r\n | {\r\n id: string;\r\n kind: 'overflowIndicator';\r\n visible: boolean;\r\n items: T[];\r\n hasSeparator: boolean;\r\n };\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-item-view',\r\n templateUrl: './item-view.html',\r\n imports: [NgnPt, NgTemplateOutlet, NgnTemplate, NgnIcon],\r\n providers: [provideSelf(NgnItemView)],\r\n host: {\r\n '[attr.role]': '\"list\"',\r\n '[style.maxWidth.px]': 'maxWidth()',\r\n },\r\n})\r\nexport class NgnItemView<T extends object, IdField extends keyof T>\r\n extends ItemViewTemplates<T>\r\n implements AfterViewInit\r\n{\r\n protected readonly theme = this.injectThemeTemplate(itemViewControlTemplate, 'root');\r\n /**\r\n * The key of the id property in the item object. This is used to track items in the template.\r\n */\r\n public readonly idField = input.required<IdField>();\r\n /**\r\n * The items to be displayed in the item view.\r\n * This is a required input and should be an array of items of type {@link T}.\r\n */\r\n public readonly items = input.required<readonly T[]>();\r\n /**\r\n * A separator string (character) to be displayed between items. Set `true` for `,` or provide a custom string.\r\n */\r\n public readonly separator = input<true | string>();\r\n /**\r\n * A separator icon to be displayed between items.\r\n */\r\n public readonly iconItemSeparator = input<IconType>();\r\n /**\r\n * Strategy to use when there are more items than can be displayed in the available space.\r\n * The value determines where the items should start to overflow.\r\n * @default 'end'\r\n */\r\n public readonly overflowStrategy = input<OverflowStrategy>('end');\r\n /**\r\n * The amount of items to keep visible after or before overflowing, depending on the {@link overflowStrategy}.\r\n * @default 0\r\n */\r\n public readonly overflowStrategyFreezeCount = input<number>(0);\r\n /**\r\n * Index of the item to be used as the overflow indicator when using the 'aroundIndex' overflow strategy.\r\n * This input is only relevant when the {@link overflowStrategy} is set to 'aroundIndex'.\r\n * @default 0\r\n */\r\n public readonly overflowStrategyIndex = input<number>(0);\r\n /**\r\n * Set this to `true` for greatly improving performance when all items have the same width.\r\n * Especially true for large lists of items.\r\n *\r\n * ⚠️ This reduces the accessibility of the control as screen\r\n * readers will not be able to determine the number of hidden items and keyboard users cannot directly\r\n * navigate to them. Use this only for potentially very large lists (with items of identical width) where users will not\r\n * need to access overflowed items directly.\r\n * @default false\r\n */\r\n public readonly sameWidthItems = input<boolean>(false);\r\n\r\n private readonly _themeGap = signal(0);\r\n private readonly _isBrowser = inject(Platform).isBrowser;\r\n\r\n protected readonly separatorChar = computed(() => {\r\n const sep = this.separator();\r\n return typeof sep === 'boolean' ? (sep ? ', ' : '') : sep;\r\n });\r\n\r\n private readonly _enableSizeMeasuring = computed(() => !this.sameWidthItems());\r\n private readonly _renderedItemRefs = viewChildren<ElementRef<HTMLElement>>('itemRef');\r\n private readonly _firstItemRef = viewChild<ElementRef<HTMLElement>>('itemRef');\r\n private readonly _firstItemWidth = elementSizeSignal(this._firstItemRef);\r\n private readonly _renderedItemSizes = elementsSizesSignal(\r\n this._renderedItemRefs,\r\n this._enableSizeMeasuring\r\n );\r\n private readonly _renderedItemWidths = computed(\r\n () =>\r\n this.sameWidthItems()\r\n ? this.items().map(() => this._firstItemWidth().width || Number.MAX_SAFE_INTEGER)\r\n : this._renderedItemSizes().map(size => size.width),\r\n { equal: areArraysDeepEqual }\r\n );\r\n private readonly _containerSize = elementSizeSignal(this.element.nativeElement);\r\n private readonly _overflowItemRef = viewChild<ElementRef<HTMLElement>>('overflowItem');\r\n private readonly _overflowItemSize = elementSizeSignal(this._overflowItemRef);\r\n\r\n protected readonly itemOverflowCheckOrder = computed<OverflowOrder>(() => {\r\n const count = this.items().length;\r\n const freezeCount = Math.min(this.overflowStrategyFreezeCount(), count);\r\n return getItemOverflowCheckOrder({\r\n count,\r\n strategy: this.overflowStrategy(),\r\n freezeCount,\r\n strategyIndex: this.overflowStrategyIndex(),\r\n });\r\n });\r\n\r\n protected readonly renderedItems = computed<RenderItem<T>[]>(() => {\r\n const containerWidth = this._containerSize().width;\r\n const renderedItemWidths = this._renderedItemWidths();\r\n const overflowCheckOrder = this.itemOverflowCheckOrder();\r\n\r\n const count = this.items().length;\r\n const freezeCount = Math.min(this.overflowStrategyFreezeCount(), count);\r\n const layout = calculateItemViewLayout({\r\n count,\r\n strategy: this.overflowStrategy(),\r\n freezeCount,\r\n strategyIndex: this.overflowStrategyIndex(),\r\n containerWidth,\r\n itemWidths: renderedItemWidths,\r\n overflowItemWidth: this._overflowItemSize().width,\r\n gap: this._themeGap(),\r\n });\r\n\r\n const renderedItemOrders = layout.renderedItemOrders;\r\n // Precompute quick lookups for the hot paths below.\r\n // - `renderedIndexSet` allows O(1) visibility checks.\r\n // - `locationByIndex` avoids repeatedly scanning the overflow order to find an item's location.\r\n const renderedIndexSet = new Set<number>(renderedItemOrders.map(x => x.index));\r\n const locationByIndex: Array<ItemOverflowLocation | undefined> = new Array(count);\r\n for (const entry of overflowCheckOrder) {\r\n locationByIndex[entry.index] = entry.location;\r\n }\r\n\r\n // First pass: build the full list with items marked as visible vs overflowed.\r\n // We'll insert overflow indicators afterwards at the computed insertion indices.\r\n let res: RenderItem<T>[] = this.items().map((item, index) => {\r\n if (renderedIndexSet.has(index)) {\r\n return <RenderItem<T>>{\r\n id: item[this.idField()] as string | number,\r\n kind: 'visibleItem',\r\n item,\r\n };\r\n } else {\r\n return <RenderItem<T>>{\r\n id: item[this.idField()] as string | number,\r\n kind: 'overflowItem',\r\n location: locationByIndex[index] ?? 'end',\r\n item,\r\n };\r\n }\r\n });\r\n\r\n const getFallbackOverflowIndicatorIndex = () => {\r\n // When the layout says \"no indicator\" for the only slot (null), we still need a stable\r\n // insertion index so the DOM structure stays consistent for measurement.\r\n if (overflowCheckOrder.length === 0) {\r\n return 0;\r\n }\r\n const lastItem = overflowCheckOrder[overflowCheckOrder.length - 1];\r\n return (lastItem ?? throwExp('NgnItemView', 'Unexpected empty entry in overflowCheckOrder'))\r\n .index;\r\n };\r\n\r\n // Insert overflow indicators at the calculated indices\r\n // Note: inserting into `res` shifts subsequent indices; track that shift explicitly with `insertOffset`.\r\n let insertOffset = 0;\r\n\r\n // Collect overflowed items, both as a single list and grouped by location.\r\n const overflowedItemsAll: T[] = [];\r\n const overflowedItemsByLocation: Record<ItemOverflowLocation, T[]> = {\r\n start: [],\r\n end: [],\r\n center: [],\r\n };\r\n const allItems = this.items();\r\n for (let i = 0; i < count; i++) {\r\n if (renderedIndexSet.has(i)) {\r\n continue;\r\n }\r\n const item = allItems[i];\r\n if (item === undefined) {\r\n continue;\r\n }\r\n overflowedItemsAll.push(item);\r\n const location = locationByIndex[i] ?? 'end';\r\n overflowedItemsByLocation[location].push(item);\r\n }\r\n\r\n layout.overflowIndicatorIndices.forEach((indicatorIndex, iterationIndex) => {\r\n const insertIndex = indicatorIndex ?? getFallbackOverflowIndicatorIndex() + insertOffset;\r\n\r\n // If two overflow indicators are rendered (aroundIndex), we must split overflow items by location\r\n // so each indicator shows its own count/list.\r\n const overflowIndicatorLocation =\r\n layout.overflowIndicatorCount === 1 ? null : iterationIndex === 0 ? 'start' : 'end';\r\n const items = overflowIndicatorLocation\r\n ? overflowedItemsByLocation[overflowIndicatorLocation]\r\n : overflowedItemsAll;\r\n\r\n res.splice(insertIndex, 0, <RenderItem<T>>{\r\n id: `overflow-indicator-${indicatorIndex}`,\r\n kind: 'overflowIndicator',\r\n visible: indicatorIndex !== null,\r\n items,\r\n hasSeparator: renderedItemOrders.some(x => x.index + insertOffset > insertIndex),\r\n });\r\n insertOffset++;\r\n });\r\n\r\n // In fixed width mode, remove all hidden items except for the first one (used for measurement)\r\n if (this.sameWidthItems()) {\r\n res = res.filter((item, index) => item.kind !== 'overflowItem' || index === 0);\r\n }\r\n\r\n return res;\r\n });\r\n\r\n protected readonly maxWidth = computed<number>(() => {\r\n return Math.ceil(\r\n this._renderedItemWidths().reduce((sum, w) => sum + w, 0) +\r\n this._themeGap() * Math.max(0, this.items().length - 1)\r\n );\r\n });\r\n\r\n public ngAfterViewInit(): void {\r\n if (!this._isBrowser) {\r\n return;\r\n }\r\n requestAnimationFrame(() => {\r\n const gapString = getComputedStyle(this.element.nativeElement).getPropertyValue('column-gap');\r\n const gap = parseFloat(gapString) || 0;\r\n this._themeGap.set(gap);\r\n });\r\n }\r\n}\r\n","@for (item of renderedItems(); track item.id; let i = $index) {\r\n @if (item.kind === 'visibleItem' || item.kind === 'overflowItem') {\r\n <span\r\n role=\"listitem\"\r\n #itemRef\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: true,\r\n 'item-overflowing': item.kind === 'overflowItem',\r\n }\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n itemTemplate();\r\n context: { $implicit: item.item, index: i, last: $last, first: $first }\r\n \"\r\n />\r\n @if (!$last) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n separatorTemplate();\r\n context: { $implicit: { character: separatorChar(), icon: iconItemSeparator() } }\r\n \"\r\n />\r\n }\r\n </span>\r\n } @else if (item.kind === 'overflowIndicator') {\r\n <div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{ 'more-items': true, 'more-items-hidden': !item.visible }\"\r\n aria-hidden=\"true\"\r\n #overflowItem\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n overflowTemplate();\r\n context: {\r\n $implicit: {\r\n totalCount: items().length,\r\n overflowCount: item.items.length,\r\n overflowItems: item.items,\r\n },\r\n }\r\n \"\r\n />\r\n @if (!$last) {\r\n <span\r\n [style.visibility]=\"item.hasSeparator ? 'visible' : 'hidden'\"\r\n style=\"display: contents\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n separatorTemplate();\r\n context: { $implicit: { character: separatorChar(), icon: iconItemSeparator() } }\r\n \"\r\n />\r\n </span>\r\n }\r\n </div>\r\n }\r\n}\r\n\r\n<ng-template #defaultSeparatorTemplate [ngnTemplate]=\"templateTypes.separator\" let-separator>\r\n @if (separator.character) {\r\n <span>{{ separator.character }}</span>\r\n } @else if (separator.icon) {\r\n <ngn-icon [icon]=\"separator.icon\" />\r\n }\r\n</ng-template>\r\n\r\n<ng-template #defaultOverflowItemTemplate [ngnTemplate]=\"templateTypes.overflow\" let-overflow>\r\n <span [ptInt]=\"this\" [ptClass]=\"'more-items-default'\">+{{ overflow.overflowCount }}</span>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -15,40 +15,40 @@ import { listBoxControlTemplate } from '@ngneers/controls-themes/templates/list-
|
|
|
15
15
|
class ListBoxTemplates extends ValueControlBase {
|
|
16
16
|
// Item template
|
|
17
17
|
_defaultItemTemplate = viewChild.required('defaultItemTemplate');
|
|
18
|
-
_userItemTemplate = contentChild('item', ...(ngDevMode ? [{ debugName: "_userItemTemplate" }] : []));
|
|
18
|
+
_userItemTemplate = contentChild('item', ...(ngDevMode ? [{ debugName: "_userItemTemplate" }] : /* istanbul ignore next */ []));
|
|
19
19
|
/**
|
|
20
20
|
* Set a custom template for an item of the list box.
|
|
21
21
|
* Can also be set using an `<ng-template>` element with `#item` template reference variable.
|
|
22
22
|
*/
|
|
23
|
-
templateItem = input(null, ...(ngDevMode ? [{ debugName: "templateItem" }] : []));
|
|
24
|
-
itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate(), ...(ngDevMode ? [{ debugName: "itemTemplate" }] : []));
|
|
23
|
+
templateItem = input(null, ...(ngDevMode ? [{ debugName: "templateItem" }] : /* istanbul ignore next */ []));
|
|
24
|
+
itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate(), ...(ngDevMode ? [{ debugName: "itemTemplate" }] : /* istanbul ignore next */ []));
|
|
25
25
|
// Group template
|
|
26
26
|
_defaultGroupTemplate = viewChild.required('defaultGroupTemplate');
|
|
27
|
-
_userGroupTemplate = contentChild('group', ...(ngDevMode ? [{ debugName: "_userGroupTemplate" }] : []));
|
|
27
|
+
_userGroupTemplate = contentChild('group', ...(ngDevMode ? [{ debugName: "_userGroupTemplate" }] : /* istanbul ignore next */ []));
|
|
28
28
|
/**
|
|
29
29
|
* Set a custom template for a group in the list box.
|
|
30
30
|
* Can also be set using an `<ng-template>` element with `#group` template reference variable.
|
|
31
31
|
*/
|
|
32
|
-
templateGroup = input(null, ...(ngDevMode ? [{ debugName: "templateGroup" }] : []));
|
|
33
|
-
groupTemplate = computed(() => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate(), ...(ngDevMode ? [{ debugName: "groupTemplate" }] : []));
|
|
32
|
+
templateGroup = input(null, ...(ngDevMode ? [{ debugName: "templateGroup" }] : /* istanbul ignore next */ []));
|
|
33
|
+
groupTemplate = computed(() => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate(), ...(ngDevMode ? [{ debugName: "groupTemplate" }] : /* istanbul ignore next */ []));
|
|
34
34
|
// Empty template
|
|
35
35
|
_defaultEmptyTemplate = viewChild.required('defaultEmptyTemplate');
|
|
36
|
-
_userEmptyTemplate = contentChild('empty', ...(ngDevMode ? [{ debugName: "_userEmptyTemplate" }] : []));
|
|
36
|
+
_userEmptyTemplate = contentChild('empty', ...(ngDevMode ? [{ debugName: "_userEmptyTemplate" }] : /* istanbul ignore next */ []));
|
|
37
37
|
/**
|
|
38
38
|
* Set a custom template for the empty state in the list box.
|
|
39
39
|
* Can also be set using an `<ng-template>` element with `#empty` template reference variable.
|
|
40
40
|
*/
|
|
41
|
-
templateEmpty = input(null, ...(ngDevMode ? [{ debugName: "templateEmpty" }] : []));
|
|
42
|
-
emptyTemplate = computed(() => this._userEmptyTemplate() ?? this.templateEmpty() ?? this._defaultEmptyTemplate(), ...(ngDevMode ? [{ debugName: "emptyTemplate" }] : []));
|
|
41
|
+
templateEmpty = input(null, ...(ngDevMode ? [{ debugName: "templateEmpty" }] : /* istanbul ignore next */ []));
|
|
42
|
+
emptyTemplate = computed(() => this._userEmptyTemplate() ?? this.templateEmpty() ?? this._defaultEmptyTemplate(), ...(ngDevMode ? [{ debugName: "emptyTemplate" }] : /* istanbul ignore next */ []));
|
|
43
43
|
/**
|
|
44
44
|
* Types for the dialog templates.
|
|
45
45
|
*/
|
|
46
46
|
templateTypes = templateTypesFn();
|
|
47
47
|
templateTypesInternal = templateTypesFn();
|
|
48
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
49
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.
|
|
48
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: ListBoxTemplates, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
49
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.10", type: ListBoxTemplates, isStandalone: true, inputs: { templateItem: { classPropertyName: "templateItem", publicName: "templateItem", isSignal: true, isRequired: false, transformFunction: null }, templateGroup: { classPropertyName: "templateGroup", publicName: "templateGroup", isSignal: true, isRequired: false, transformFunction: null }, templateEmpty: { classPropertyName: "templateEmpty", publicName: "templateEmpty", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "_userItemTemplate", first: true, predicate: ["item"], descendants: true, isSignal: true }, { propertyName: "_userGroupTemplate", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "_userEmptyTemplate", first: true, predicate: ["empty"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_defaultItemTemplate", first: true, predicate: ["defaultItemTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultGroupTemplate", first: true, predicate: ["defaultGroupTemplate"], descendants: true, isSignal: true }, { propertyName: "_defaultEmptyTemplate", first: true, predicate: ["defaultEmptyTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
|
|
50
50
|
}
|
|
51
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: ListBoxTemplates, decorators: [{
|
|
52
52
|
type: Directive
|
|
53
53
|
}], propDecorators: { _defaultItemTemplate: [{ type: i0.ViewChild, args: ['defaultItemTemplate', { isSignal: true }] }], _userItemTemplate: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }], templateItem: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateItem", required: false }] }], _defaultGroupTemplate: [{ type: i0.ViewChild, args: ['defaultGroupTemplate', { isSignal: true }] }], _userGroupTemplate: [{ type: i0.ContentChild, args: ['group', { isSignal: true }] }], templateGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateGroup", required: false }] }], _defaultEmptyTemplate: [{ type: i0.ViewChild, args: ['defaultEmptyTemplate', { isSignal: true }] }], _userEmptyTemplate: [{ type: i0.ContentChild, args: ['empty', { isSignal: true }] }], templateEmpty: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateEmpty", required: false }] }] } });
|
|
54
54
|
|
|
@@ -63,39 +63,39 @@ class NgnListBox extends ListBoxTemplates {
|
|
|
63
63
|
empty: () => !this.displayedItems().length,
|
|
64
64
|
});
|
|
65
65
|
_scroller = viewChild.required(NgnScroller);
|
|
66
|
-
items = input.required(...(ngDevMode ? [{ debugName: "items" }] : []));
|
|
67
|
-
scrollToSelectedItemOnInit = input(false, ...(ngDevMode ? [{ debugName: "scrollToSelectedItemOnInit" }] : []));
|
|
68
|
-
selectable = input(false, { ...(ngDevMode ? { debugName: "selectable" } : {}), transform: booleanAttribute });
|
|
69
|
-
selectOnHover = input(false, { ...(ngDevMode ? { debugName: "selectOnHover" } : {}), transform: booleanAttribute });
|
|
70
|
-
focussable = input(true, { ...(ngDevMode ? { debugName: "focussable" } : {}), transform: booleanAttribute });
|
|
71
|
-
virtual = input(false, { ...(ngDevMode ? { debugName: "virtual" } : {}), transform: booleanAttribute });
|
|
72
|
-
itemHeight = input(...(ngDevMode ? [undefined, { debugName: "itemHeight" }] : []));
|
|
73
|
-
multiple = input(...(ngDevMode ? [undefined, { debugName: "multiple" }] : []));
|
|
66
|
+
items = input.required(...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
|
|
67
|
+
scrollToSelectedItemOnInit = input(false, ...(ngDevMode ? [{ debugName: "scrollToSelectedItemOnInit" }] : /* istanbul ignore next */ []));
|
|
68
|
+
selectable = input(false, { ...(ngDevMode ? { debugName: "selectable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
69
|
+
selectOnHover = input(false, { ...(ngDevMode ? { debugName: "selectOnHover" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
70
|
+
focussable = input(true, { ...(ngDevMode ? { debugName: "focussable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
71
|
+
virtual = input(false, { ...(ngDevMode ? { debugName: "virtual" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
72
|
+
itemHeight = input(...(ngDevMode ? [undefined, { debugName: "itemHeight" }] : /* istanbul ignore next */ []));
|
|
73
|
+
multiple = input(...(ngDevMode ? [undefined, { debugName: "multiple" }] : /* istanbul ignore next */ []));
|
|
74
74
|
/**
|
|
75
75
|
* Whether to use a checkbox to indicate selection state.
|
|
76
76
|
*
|
|
77
77
|
* This option is true per default when `multiple` is `true`.
|
|
78
78
|
* @default multiple()
|
|
79
79
|
*/
|
|
80
|
-
checkbox = input(...(ngDevMode ? [undefined, { debugName: "checkbox" }] : []));
|
|
80
|
+
checkbox = input(...(ngDevMode ? [undefined, { debugName: "checkbox" }] : /* istanbul ignore next */ []));
|
|
81
81
|
/**
|
|
82
82
|
* Accepts a boolean value that determines whether the filter is enabled.
|
|
83
83
|
* Alternatively, you can provide `FilterConfig` to customize the filter behavior.
|
|
84
84
|
* @default `false`
|
|
85
85
|
*/
|
|
86
|
-
filter = input(false, ...(ngDevMode ? [{ debugName: "filter" }] : []));
|
|
86
|
+
filter = input(false, ...(ngDevMode ? [{ debugName: "filter" }] : /* istanbul ignore next */ []));
|
|
87
87
|
/**
|
|
88
88
|
* Manually set the filter text.
|
|
89
89
|
*/
|
|
90
|
-
filterText = input(null, ...(ngDevMode ? [{ debugName: "filterText" }] : []));
|
|
90
|
+
filterText = input(null, ...(ngDevMode ? [{ debugName: "filterText" }] : /* istanbul ignore next */ []));
|
|
91
91
|
itemClicked = output();
|
|
92
92
|
maybeCallback = maybeCallback;
|
|
93
|
-
displayedItems = computed(() => flatItems(this.filteredItems()), ...(ngDevMode ? [{ debugName: "displayedItems" }] : []));
|
|
93
|
+
displayedItems = computed(() => flatItems(this.filteredItems()), ...(ngDevMode ? [{ debugName: "displayedItems" }] : /* istanbul ignore next */ []));
|
|
94
94
|
valueArray = computed(() => {
|
|
95
95
|
const v = this.value();
|
|
96
96
|
return (Array.isArray(v) ? v : v ? [v] : []);
|
|
97
|
-
}, ...(ngDevMode ? [{ debugName: "valueArray" }] : []));
|
|
98
|
-
currentHighlightedValue = signal(null, ...(ngDevMode ? [{ debugName: "currentHighlightedValue" }] : []));
|
|
97
|
+
}, ...(ngDevMode ? [{ debugName: "valueArray" }] : /* istanbul ignore next */ []));
|
|
98
|
+
currentHighlightedValue = signal(null, ...(ngDevMode ? [{ debugName: "currentHighlightedValue" }] : /* istanbul ignore next */ []));
|
|
99
99
|
filteredItems = asyncComputed(async () => {
|
|
100
100
|
const filter = !!this.filter();
|
|
101
101
|
const appliedFilterOptions = this._appliedFilterOptions();
|
|
@@ -117,9 +117,9 @@ class NgnListBox extends ListBoxTemplates {
|
|
|
117
117
|
...providedFilterArgs,
|
|
118
118
|
};
|
|
119
119
|
return options;
|
|
120
|
-
}, ...(ngDevMode ? [{ debugName: "_appliedFilterOptions" }] : []));
|
|
120
|
+
}, ...(ngDevMode ? [{ debugName: "_appliedFilterOptions" }] : /* istanbul ignore next */ []));
|
|
121
121
|
filterIsExecuting = this.filteredItems.isRunning;
|
|
122
|
-
showCheckboxes = computed(() => this.checkbox() ?? this.multiple() ?? false, ...(ngDevMode ? [{ debugName: "showCheckboxes" }] : []));
|
|
122
|
+
showCheckboxes = computed(() => this.checkbox() ?? this.multiple() ?? false, ...(ngDevMode ? [{ debugName: "showCheckboxes" }] : /* istanbul ignore next */ []));
|
|
123
123
|
constructor() {
|
|
124
124
|
super();
|
|
125
125
|
createConditionalSpinner(this.filterIsExecuting);
|
|
@@ -199,10 +199,10 @@ class NgnListBox extends ListBoxTemplates {
|
|
|
199
199
|
this.itemClicked.emit(value);
|
|
200
200
|
this.touched.set(true);
|
|
201
201
|
}
|
|
202
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
203
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
202
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnListBox, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
203
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: NgnListBox, isStandalone: true, selector: "ngn-list-box", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, scrollToSelectedItemOnInit: { classPropertyName: "scrollToSelectedItemOnInit", publicName: "scrollToSelectedItemOnInit", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, selectOnHover: { classPropertyName: "selectOnHover", publicName: "selectOnHover", isSignal: true, isRequired: false, transformFunction: null }, focussable: { classPropertyName: "focussable", publicName: "focussable", isSignal: true, isRequired: false, transformFunction: null }, virtual: { classPropertyName: "virtual", publicName: "virtual", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, checkbox: { classPropertyName: "checkbox", publicName: "checkbox", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, filterText: { classPropertyName: "filterText", publicName: "filterText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClicked: "itemClicked" }, host: { attributes: { "role": "listbox" }, listeners: { "keydown": "onKeyDown($event)", "focusout": "currentHighlightedValue.set(null)" }, properties: { "attr.tabIndex": "focussable() ? 0 : null", "attr.aria-activedescendant": "currentHighlightedValue() ? inputId() + \"_option_\" + currentHighlightedValue() : null", "aria-multiselectable": "!!multiple()", "id": "inputId()" } }, providers: [provideSelf(NgnListBox)], viewQueries: [{ propertyName: "_scroller", first: true, predicate: NgnScroller, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<ngn-scroller\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'scroller'\"\r\n [virtual]=\"virtual()\"\r\n [itemHeight]=\"itemHeight()\"\r\n [items]=\"displayedItems()\"\r\n [templateItem]=\"usedItemTemplate\"\r\n [fieldSticky]=\"'items'\"\r\n #scroller\r\n/>\r\n\r\n@if (!displayedItems().length) {\r\n <ng-container\r\n *ngTemplateOutlet=\"emptyTemplate() || defaultEmptyTemplate; context: {}\"\r\n ></ng-container>\r\n}\r\n\r\n<ng-template #usedItemTemplate [ngnTemplate]=\"scroller.templateTypes.item\" let-itemOrGroup>\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <div\r\n [ngnScrollerItem]=\"itemOrGroup\"\r\n [id]=\"inputId() + '_option_' + itemOrGroup.value\"\r\n [attr.role]=\"'option'\"\r\n [aria-selected]=\"selectable() ? valueArray().includes(itemOrGroup.value) : null\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: !itemOrGroup.items,\r\n group: !!itemOrGroup.items,\r\n 'item-selected': valueArray().includes(itemOrGroup.value),\r\n 'item-highlighted': itemOrGroup.value === currentHighlightedValue(),\r\n }\"\r\n (click)=\"!itemOrGroup.items && selectable() && onSelect(itemOrGroup.value)\"\r\n (mouseenter)=\"\r\n !itemOrGroup.items && selectable() && selectOnHover() && onSelect(itemOrGroup.value)\r\n \"\r\n >\r\n @if (showCheckboxes() && !itemOrGroup.items) {\r\n <ngn-checkbox\r\n [value]=\"valueArray().includes(itemOrGroup.value)\"\r\n aria-hidden=\"true\"\r\n inert=\"true\"\r\n />\r\n }\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n itemOrGroup.items ? groupTemplate() : itemTemplate();\r\n context: { $implicit: itemOrGroup }\r\n \"\r\n ></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <span [attr.data-testid]=\"item?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-item'\">\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"item?.testId\">​</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\r\n <span [attr.data-testid]=\"group?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-group'\">\r\n @let label = group?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"group?.testId\">​</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultEmptyTemplate>\r\n <span [ptInt]=\"this\" [ptClass]=\"'empty'\" [attr.data-testid]=\"'empty'\">{{\r\n 'No items found'\r\n }}</span>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgnScroller, selector: "ngn-scroller, [ngn-scroller]", inputs: ["items", "fieldId", "virtual", "itemHeight", "virtualPadding", "focusable", "fieldSticky"] }, { kind: "directive", type: NgnScrollerItem, selector: "[ngnScrollerItem]", inputs: ["ngnScrollerItem"] }, { kind: "component", type: NgnCheckbox, selector: "ngn-checkbox", inputs: ["iconChecked", "iconUnchecked", "iconIndeterminate", "allowIndeterminate"] }, { kind: "directive", type: NgnTemplate, selector: "ng-template[ngnTemplate]", inputs: ["ngnTemplate"] }, { kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
204
204
|
}
|
|
205
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
205
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnListBox, decorators: [{
|
|
206
206
|
type: Component,
|
|
207
207
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-list-box', imports: [NgTemplateOutlet, NgnScroller, NgnScrollerItem, NgnCheckbox, NgnTemplate, NgnPt], providers: [provideSelf(NgnListBox)], host: {
|
|
208
208
|
'[attr.tabIndex]': 'focussable() ? 0 : null',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-list-box.mjs","sources":["../../src/list-box/list-box-templates.ts","../../src/list-box/list-box.ts","../../src/list-box/list-box.html","../../src/list-box/ngneers-controls-list-box.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { ValueControlBase } from '@ngneers/controls/base';\r\n\r\nimport type { NgnItem, NgnItemsValue } from '@ngneers/controls/api';\r\nimport type { InputGeneric } from '@ngneers/controls/utils';\r\n\r\n/**\r\n * This type determines the value type for the select control.\r\n * * If `multiple` is `true`, the value is an array of items: `T[K][]`.\r\n * * Else it is the item's value type `T[K]`.\r\n */\r\nexport type ValueType<Items extends readonly NgnItem[], Multiple extends boolean> =\r\n InputGeneric<Multiple, false> extends true ? NgnItemsValue<Items>[] : NgnItemsValue<Items>;\r\n\r\n@Directive()\r\nexport abstract class ListBoxTemplates<\r\n Items extends readonly NgnItem[],\r\n Multiple extends boolean,\r\n> extends ValueControlBase<'listBox', ValueType<Items, Multiple> | null> {\r\n // Item template\r\n private readonly _defaultItemTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n /**\r\n * Set a custom template for an item of the list box.\r\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly itemTemplate = computed(\r\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\r\n );\r\n // Group template\r\n private readonly _defaultGroupTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultGroupTemplate');\r\n private readonly _userGroupTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('group');\r\n /**\r\n * Set a custom template for a group in the list box.\r\n * Can also be set using an `<ng-template>` element with `#group` template reference variable.\r\n */\r\n public readonly templateGroup = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly groupTemplate = computed(\r\n () => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate()\r\n );\r\n\r\n // Empty template\r\n private readonly _defaultEmptyTemplate =\r\n viewChild.required<TemplateRef<unknown>>('defaultEmptyTemplate');\r\n private readonly _userEmptyTemplate = contentChild<TemplateRef<unknown>>('empty');\r\n /**\r\n * Set a custom template for the empty state in the list box.\r\n * Can also be set using an `<ng-template>` element with `#empty` template reference variable.\r\n */\r\n public readonly templateEmpty = input<TemplateRef<unknown> | null>(null);\r\n protected readonly emptyTemplate = computed(\r\n () => this._userEmptyTemplate() ?? this.templateEmpty() ?? this._defaultEmptyTemplate()\r\n );\r\n\r\n /**\r\n * Types for the dialog templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: Items[number] | undefined;\r\n };\r\n }>();\r\n\r\n protected readonly templateTypesInternal = templateTypesFn<{\r\n item: {\r\n $implicit: Items[number] | undefined;\r\n index: number;\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterRenderEffect,\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n signal,\r\n untracked,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n inject,\r\n output,\r\n} from '@angular/core';\r\nimport {\r\n type FilterConfig,\r\n type FilterConfigInternal,\r\n filterOptions,\r\n flatItems,\r\n mapToItems,\r\n type NgnItem,\r\n type NgnItemsValue,\r\n} from '@ngneers/controls/api';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnScroller, NgnScrollerItem } from '@ngneers/controls/scroller';\r\nimport { createConditionalSpinner } from '@ngneers/controls/spinner';\r\nimport { maybeCallback } from '@ngneers/controls/utils';\r\nimport { asyncComputed } from '@ngneers/controls/utils-ng';\r\nimport { listBoxControlTemplate } from '@ngneers/controls-themes/templates/list-box';\r\n\r\nimport { ListBoxTemplates, type ValueType } from './list-box-templates';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-list-box',\r\n templateUrl: './list-box.html',\r\n imports: [NgTemplateOutlet, NgnScroller, NgnScrollerItem, NgnCheckbox, NgnTemplate, NgnPt],\r\n providers: [provideSelf(NgnListBox)],\r\n host: {\r\n '[attr.tabIndex]': 'focussable() ? 0 : null',\r\n '(keydown)': 'onKeyDown($event)',\r\n '(focusout)': 'currentHighlightedValue.set(null)',\r\n role: 'listbox',\r\n '[attr.aria-activedescendant]':\r\n 'currentHighlightedValue() ? inputId() + \"_option_\" + currentHighlightedValue() : null',\r\n '[aria-multiselectable]': '!!multiple()',\r\n '[id]': 'inputId()',\r\n },\r\n})\r\nexport class NgnListBox<\r\n Items extends readonly NgnItem[],\r\n Multiple extends boolean = false,\r\n> extends ListBoxTemplates<Items, Multiple> {\r\n protected readonly i18n = inject(I18n).translations;\r\n protected readonly theme = this.injectThemeTemplate(listBoxControlTemplate, {\r\n root: true,\r\n invalid: () => this.invalid(),\r\n empty: () => !this.displayedItems().length,\r\n });\r\n\r\n private readonly _scroller = viewChild.required<NgnScroller<NgnItemsValue<Items>>>(NgnScroller);\r\n\r\n public readonly items = input.required<Items>();\r\n\r\n public readonly scrollToSelectedItemOnInit = input<boolean | ScrollLogicalPosition>(false);\r\n public readonly selectable = input(false, { transform: booleanAttribute });\r\n public readonly selectOnHover = input(false, { transform: booleanAttribute });\r\n public readonly focussable = input(true, { transform: booleanAttribute });\r\n public readonly virtual = input(false, { transform: booleanAttribute });\r\n public readonly itemHeight = input<number>();\r\n public readonly multiple = input<Multiple>();\r\n /**\r\n * Whether to use a checkbox to indicate selection state.\r\n *\r\n * This option is true per default when `multiple` is `true`.\r\n * @default multiple()\r\n */\r\n public readonly checkbox = input<boolean>();\r\n /**\r\n * Accepts a boolean value that determines whether the filter is enabled.\r\n * Alternatively, you can provide `FilterConfig` to customize the filter behavior.\r\n * @default `false`\r\n */\r\n public readonly filter = input<FilterConfig<Items[number]> | boolean>(false);\r\n /**\r\n * Manually set the filter text.\r\n */\r\n public readonly filterText = input<string | null>(null);\r\n\r\n public readonly itemClicked = output<NgnItemsValue<Items>>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n public readonly displayedItems = computed(() => flatItems(this.filteredItems()));\r\n\r\n protected readonly valueArray = computed(() => {\r\n const v = this.value();\r\n return (Array.isArray(v) ? v : v ? [v] : []) as NgnItemsValue<Items>[];\r\n });\r\n protected readonly currentHighlightedValue = signal<NgnItemsValue<Items> | null>(null);\r\n protected readonly filteredItems = asyncComputed(async () => {\r\n const filter = !!this.filter();\r\n const appliedFilterOptions = this._appliedFilterOptions();\r\n const filterText = this.filterText();\r\n\r\n if (!filter || !filterText) {\r\n return this.items();\r\n }\r\n return await filterOptions(this.items(), filterText, appliedFilterOptions);\r\n }, []);\r\n\r\n private readonly _appliedFilterOptions = computed(() => {\r\n const filter = this.filter();\r\n const providedFilterArgs = typeof filter === 'boolean' ? {} : filter;\r\n const options: FilterConfigInternal<NgnItem> = {\r\n filterFieldsCallback: item => item.label,\r\n fieldItems: 'items',\r\n splitWords: true,\r\n caseSensitive: false,\r\n filterFn: 'contains',\r\n ...providedFilterArgs,\r\n };\r\n return options;\r\n });\r\n\r\n protected readonly filterIsExecuting = this.filteredItems.isRunning;\r\n\r\n protected readonly showCheckboxes = computed(() => this.checkbox() ?? this.multiple() ?? false);\r\n\r\n constructor() {\r\n super();\r\n createConditionalSpinner(this.filterIsExecuting);\r\n\r\n effect(() => {\r\n const currentHighlightedValue = this.currentHighlightedValue();\r\n if (!currentHighlightedValue) {\r\n return;\r\n }\r\n const index = flatItems(this.filteredItems()).findIndex(\r\n option => option.value === currentHighlightedValue\r\n );\r\n this._scroller().scrollToIndex(index);\r\n });\r\n\r\n afterRenderEffect(() => {\r\n const pos = this.scrollToSelectedItemOnInit();\r\n const filterDone = this.filteredItems.firstRunCompleted();\r\n if (pos && filterDone) {\r\n const val = untracked(this.value);\r\n const index = flatItems(untracked(this.filteredItems)).findIndex(\r\n option => option.value === val\r\n );\r\n this._scroller().scrollToIndex(index, pos === true ? 'nearest' : pos);\r\n }\r\n });\r\n }\r\n\r\n public onKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n const flattenedItems = mapToItems(this.filteredItems());\r\n this.currentHighlightedValue.update(currentValue => {\r\n const currentHighlightIndex = flattenedItems.findIndex(\r\n option => option.value === currentValue\r\n );\r\n if (flattenedItems.length === 0) {\r\n return null;\r\n }\r\n const currentIndex =\r\n currentHighlightIndex >= 0\r\n ? currentHighlightIndex\r\n : flattenedItems.findIndex(\r\n option => option.value === this.valueArray()[this.valueArray().length - 1]\r\n );\r\n\r\n if (currentIndex === -1) {\r\n return event.key === 'ArrowDown'\r\n ? flattenedItems[0]?.value\r\n : flattenedItems[flattenedItems.length - 1]?.value;\r\n }\r\n\r\n const nextIndex = event.key === 'ArrowDown' ? currentIndex + 1 : currentIndex - 1;\r\n if (nextIndex < 0) {\r\n return flattenedItems[flattenedItems.length - 1]?.value;\r\n }\r\n if (nextIndex >= flattenedItems.length) {\r\n return flattenedItems[0]?.value;\r\n }\r\n return flattenedItems[nextIndex]?.value;\r\n });\r\n } else if (this.selectable() && (event.key === 'Enter' || event.key === ' ')) {\r\n const currentHighlightedValue = this.currentHighlightedValue();\r\n if (currentHighlightedValue !== null) {\r\n event.stopImmediatePropagation();\r\n event.preventDefault();\r\n this.onSelect(currentHighlightedValue);\r\n }\r\n }\r\n }\r\n\r\n public scrollToIndex(index: number) {\r\n this._scroller().scrollToIndex(index);\r\n }\r\n\r\n protected onSelect(value: NgnItemsValue<Items>) {\r\n if (this.multiple()) {\r\n const currentValue = (this.value() as Array<NgnItemsValue<Items>>) ?? [];\r\n if (!currentValue.includes(value)) {\r\n this.value.set([...currentValue, value] as ValueType<Items, Multiple>);\r\n } else {\r\n this.value.set(currentValue.filter(item => item !== value) as ValueType<Items, Multiple>);\r\n }\r\n } else {\r\n if (this.value() !== value) {\r\n this.value.set(value as ValueType<Items, Multiple>);\r\n }\r\n }\r\n this.itemClicked.emit(value);\r\n this.touched.set(true);\r\n }\r\n}\r\n","<ngn-scroller\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'scroller'\"\r\n [virtual]=\"virtual()\"\r\n [itemHeight]=\"itemHeight()\"\r\n [items]=\"displayedItems()\"\r\n [templateItem]=\"usedItemTemplate\"\r\n [fieldSticky]=\"'items'\"\r\n #scroller\r\n/>\r\n\r\n@if (!displayedItems().length) {\r\n <ng-container\r\n *ngTemplateOutlet=\"emptyTemplate() || defaultEmptyTemplate; context: {}\"\r\n ></ng-container>\r\n}\r\n\r\n<ng-template #usedItemTemplate [ngnTemplate]=\"scroller.templateTypes.item\" let-itemOrGroup>\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <div\r\n [ngnScrollerItem]=\"itemOrGroup\"\r\n [id]=\"inputId() + '_option_' + itemOrGroup.value\"\r\n [attr.role]=\"'option'\"\r\n [aria-selected]=\"selectable() ? valueArray().includes(itemOrGroup.value) : null\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: !itemOrGroup.items,\r\n group: !!itemOrGroup.items,\r\n 'item-selected': valueArray().includes(itemOrGroup.value),\r\n 'item-highlighted': itemOrGroup.value === currentHighlightedValue(),\r\n }\"\r\n (click)=\"!itemOrGroup.items && selectable() && onSelect(itemOrGroup.value)\"\r\n (mouseenter)=\"\r\n !itemOrGroup.items && selectable() && selectOnHover() && onSelect(itemOrGroup.value)\r\n \"\r\n >\r\n @if (showCheckboxes() && !itemOrGroup.items) {\r\n <ngn-checkbox\r\n [value]=\"valueArray().includes(itemOrGroup.value)\"\r\n aria-hidden=\"true\"\r\n inert=\"true\"\r\n />\r\n }\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n itemOrGroup.items ? groupTemplate() : itemTemplate();\r\n context: { $implicit: itemOrGroup }\r\n \"\r\n ></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <span [attr.data-testid]=\"item?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-item'\">\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"item?.testId\">​</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\r\n <span [attr.data-testid]=\"group?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-group'\">\r\n @let label = group?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"group?.testId\">​</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultEmptyTemplate>\r\n <span [ptInt]=\"this\" [ptClass]=\"'empty'\" [attr.data-testid]=\"'empty'\">{{\r\n 'No items found'\r\n }}</span>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-list-box.mjs","sources":["../../src/list-box/list-box-templates.ts","../../src/list-box/list-box.ts","../../src/list-box/list-box.html","../../src/list-box/ngneers-controls-list-box.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef, viewChild } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { ValueControlBase } from '@ngneers/controls/base';\r\n\r\nimport type { NgnItem, NgnItemsValue } from '@ngneers/controls/api';\r\nimport type { InputGeneric } from '@ngneers/controls/utils';\r\n\r\n/**\r\n * This type determines the value type for the select control.\r\n * * If `multiple` is `true`, the value is an array of items: `T[K][]`.\r\n * * Else it is the item's value type `T[K]`.\r\n */\r\nexport type ValueType<Items extends readonly NgnItem[], Multiple extends boolean> =\r\n InputGeneric<Multiple, false> extends true ? NgnItemsValue<Items>[] : NgnItemsValue<Items>;\r\n\r\n@Directive()\r\nexport abstract class ListBoxTemplates<\r\n Items extends readonly NgnItem[],\r\n Multiple extends boolean,\r\n> extends ValueControlBase<'listBox', ValueType<Items, Multiple> | null> {\r\n // Item template\r\n private readonly _defaultItemTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultItemTemplate');\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n /**\r\n * Set a custom template for an item of the list box.\r\n * Can also be set using an `<ng-template>` element with `#item` template reference variable.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly itemTemplate = computed(\r\n () => this._userItemTemplate() ?? this.templateItem() ?? this._defaultItemTemplate()\r\n );\r\n // Group template\r\n private readonly _defaultGroupTemplate =\r\n viewChild.required<TemplateRef<typeof this.templateTypes.item>>('defaultGroupTemplate');\r\n private readonly _userGroupTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('group');\r\n /**\r\n * Set a custom template for a group in the list box.\r\n * Can also be set using an `<ng-template>` element with `#group` template reference variable.\r\n */\r\n public readonly templateGroup = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n protected readonly groupTemplate = computed(\r\n () => this._userGroupTemplate() ?? this.templateGroup() ?? this._defaultGroupTemplate()\r\n );\r\n\r\n // Empty template\r\n private readonly _defaultEmptyTemplate =\r\n viewChild.required<TemplateRef<unknown>>('defaultEmptyTemplate');\r\n private readonly _userEmptyTemplate = contentChild<TemplateRef<unknown>>('empty');\r\n /**\r\n * Set a custom template for the empty state in the list box.\r\n * Can also be set using an `<ng-template>` element with `#empty` template reference variable.\r\n */\r\n public readonly templateEmpty = input<TemplateRef<unknown> | null>(null);\r\n protected readonly emptyTemplate = computed(\r\n () => this._userEmptyTemplate() ?? this.templateEmpty() ?? this._defaultEmptyTemplate()\r\n );\r\n\r\n /**\r\n * Types for the dialog templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: Items[number] | undefined;\r\n };\r\n }>();\r\n\r\n protected readonly templateTypesInternal = templateTypesFn<{\r\n item: {\r\n $implicit: Items[number] | undefined;\r\n index: number;\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterRenderEffect,\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n effect,\r\n input,\r\n signal,\r\n untracked,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n inject,\r\n output,\r\n} from '@angular/core';\r\nimport {\r\n type FilterConfig,\r\n type FilterConfigInternal,\r\n filterOptions,\r\n flatItems,\r\n mapToItems,\r\n type NgnItem,\r\n type NgnItemsValue,\r\n} from '@ngneers/controls/api';\r\nimport { NgnTemplate } from '@ngneers/controls/api/ng';\r\nimport { NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { NgnCheckbox } from '@ngneers/controls/checkbox';\r\nimport { I18n } from '@ngneers/controls/i18n';\r\nimport { NgnScroller, NgnScrollerItem } from '@ngneers/controls/scroller';\r\nimport { createConditionalSpinner } from '@ngneers/controls/spinner';\r\nimport { maybeCallback } from '@ngneers/controls/utils';\r\nimport { asyncComputed } from '@ngneers/controls/utils-ng';\r\nimport { listBoxControlTemplate } from '@ngneers/controls-themes/templates/list-box';\r\n\r\nimport { ListBoxTemplates, type ValueType } from './list-box-templates';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-list-box',\r\n templateUrl: './list-box.html',\r\n imports: [NgTemplateOutlet, NgnScroller, NgnScrollerItem, NgnCheckbox, NgnTemplate, NgnPt],\r\n providers: [provideSelf(NgnListBox)],\r\n host: {\r\n '[attr.tabIndex]': 'focussable() ? 0 : null',\r\n '(keydown)': 'onKeyDown($event)',\r\n '(focusout)': 'currentHighlightedValue.set(null)',\r\n role: 'listbox',\r\n '[attr.aria-activedescendant]':\r\n 'currentHighlightedValue() ? inputId() + \"_option_\" + currentHighlightedValue() : null',\r\n '[aria-multiselectable]': '!!multiple()',\r\n '[id]': 'inputId()',\r\n },\r\n})\r\nexport class NgnListBox<\r\n Items extends readonly NgnItem[],\r\n Multiple extends boolean = false,\r\n> extends ListBoxTemplates<Items, Multiple> {\r\n protected readonly i18n = inject(I18n).translations;\r\n protected readonly theme = this.injectThemeTemplate(listBoxControlTemplate, {\r\n root: true,\r\n invalid: () => this.invalid(),\r\n empty: () => !this.displayedItems().length,\r\n });\r\n\r\n private readonly _scroller = viewChild.required<NgnScroller<NgnItemsValue<Items>>>(NgnScroller);\r\n\r\n public readonly items = input.required<Items>();\r\n\r\n public readonly scrollToSelectedItemOnInit = input<boolean | ScrollLogicalPosition>(false);\r\n public readonly selectable = input(false, { transform: booleanAttribute });\r\n public readonly selectOnHover = input(false, { transform: booleanAttribute });\r\n public readonly focussable = input(true, { transform: booleanAttribute });\r\n public readonly virtual = input(false, { transform: booleanAttribute });\r\n public readonly itemHeight = input<number>();\r\n public readonly multiple = input<Multiple>();\r\n /**\r\n * Whether to use a checkbox to indicate selection state.\r\n *\r\n * This option is true per default when `multiple` is `true`.\r\n * @default multiple()\r\n */\r\n public readonly checkbox = input<boolean>();\r\n /**\r\n * Accepts a boolean value that determines whether the filter is enabled.\r\n * Alternatively, you can provide `FilterConfig` to customize the filter behavior.\r\n * @default `false`\r\n */\r\n public readonly filter = input<FilterConfig<Items[number]> | boolean>(false);\r\n /**\r\n * Manually set the filter text.\r\n */\r\n public readonly filterText = input<string | null>(null);\r\n\r\n public readonly itemClicked = output<NgnItemsValue<Items>>();\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n public readonly displayedItems = computed(() => flatItems(this.filteredItems()));\r\n\r\n protected readonly valueArray = computed(() => {\r\n const v = this.value();\r\n return (Array.isArray(v) ? v : v ? [v] : []) as NgnItemsValue<Items>[];\r\n });\r\n protected readonly currentHighlightedValue = signal<NgnItemsValue<Items> | null>(null);\r\n protected readonly filteredItems = asyncComputed(async () => {\r\n const filter = !!this.filter();\r\n const appliedFilterOptions = this._appliedFilterOptions();\r\n const filterText = this.filterText();\r\n\r\n if (!filter || !filterText) {\r\n return this.items();\r\n }\r\n return await filterOptions(this.items(), filterText, appliedFilterOptions);\r\n }, []);\r\n\r\n private readonly _appliedFilterOptions = computed(() => {\r\n const filter = this.filter();\r\n const providedFilterArgs = typeof filter === 'boolean' ? {} : filter;\r\n const options: FilterConfigInternal<NgnItem> = {\r\n filterFieldsCallback: item => item.label,\r\n fieldItems: 'items',\r\n splitWords: true,\r\n caseSensitive: false,\r\n filterFn: 'contains',\r\n ...providedFilterArgs,\r\n };\r\n return options;\r\n });\r\n\r\n protected readonly filterIsExecuting = this.filteredItems.isRunning;\r\n\r\n protected readonly showCheckboxes = computed(() => this.checkbox() ?? this.multiple() ?? false);\r\n\r\n constructor() {\r\n super();\r\n createConditionalSpinner(this.filterIsExecuting);\r\n\r\n effect(() => {\r\n const currentHighlightedValue = this.currentHighlightedValue();\r\n if (!currentHighlightedValue) {\r\n return;\r\n }\r\n const index = flatItems(this.filteredItems()).findIndex(\r\n option => option.value === currentHighlightedValue\r\n );\r\n this._scroller().scrollToIndex(index);\r\n });\r\n\r\n afterRenderEffect(() => {\r\n const pos = this.scrollToSelectedItemOnInit();\r\n const filterDone = this.filteredItems.firstRunCompleted();\r\n if (pos && filterDone) {\r\n const val = untracked(this.value);\r\n const index = flatItems(untracked(this.filteredItems)).findIndex(\r\n option => option.value === val\r\n );\r\n this._scroller().scrollToIndex(index, pos === true ? 'nearest' : pos);\r\n }\r\n });\r\n }\r\n\r\n public onKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n const flattenedItems = mapToItems(this.filteredItems());\r\n this.currentHighlightedValue.update(currentValue => {\r\n const currentHighlightIndex = flattenedItems.findIndex(\r\n option => option.value === currentValue\r\n );\r\n if (flattenedItems.length === 0) {\r\n return null;\r\n }\r\n const currentIndex =\r\n currentHighlightIndex >= 0\r\n ? currentHighlightIndex\r\n : flattenedItems.findIndex(\r\n option => option.value === this.valueArray()[this.valueArray().length - 1]\r\n );\r\n\r\n if (currentIndex === -1) {\r\n return event.key === 'ArrowDown'\r\n ? flattenedItems[0]?.value\r\n : flattenedItems[flattenedItems.length - 1]?.value;\r\n }\r\n\r\n const nextIndex = event.key === 'ArrowDown' ? currentIndex + 1 : currentIndex - 1;\r\n if (nextIndex < 0) {\r\n return flattenedItems[flattenedItems.length - 1]?.value;\r\n }\r\n if (nextIndex >= flattenedItems.length) {\r\n return flattenedItems[0]?.value;\r\n }\r\n return flattenedItems[nextIndex]?.value;\r\n });\r\n } else if (this.selectable() && (event.key === 'Enter' || event.key === ' ')) {\r\n const currentHighlightedValue = this.currentHighlightedValue();\r\n if (currentHighlightedValue !== null) {\r\n event.stopImmediatePropagation();\r\n event.preventDefault();\r\n this.onSelect(currentHighlightedValue);\r\n }\r\n }\r\n }\r\n\r\n public scrollToIndex(index: number) {\r\n this._scroller().scrollToIndex(index);\r\n }\r\n\r\n protected onSelect(value: NgnItemsValue<Items>) {\r\n if (this.multiple()) {\r\n const currentValue = (this.value() as Array<NgnItemsValue<Items>>) ?? [];\r\n if (!currentValue.includes(value)) {\r\n this.value.set([...currentValue, value] as ValueType<Items, Multiple>);\r\n } else {\r\n this.value.set(currentValue.filter(item => item !== value) as ValueType<Items, Multiple>);\r\n }\r\n } else {\r\n if (this.value() !== value) {\r\n this.value.set(value as ValueType<Items, Multiple>);\r\n }\r\n }\r\n this.itemClicked.emit(value);\r\n this.touched.set(true);\r\n }\r\n}\r\n","<ngn-scroller\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'scroller'\"\r\n [virtual]=\"virtual()\"\r\n [itemHeight]=\"itemHeight()\"\r\n [items]=\"displayedItems()\"\r\n [templateItem]=\"usedItemTemplate\"\r\n [fieldSticky]=\"'items'\"\r\n #scroller\r\n/>\r\n\r\n@if (!displayedItems().length) {\r\n <ng-container\r\n *ngTemplateOutlet=\"emptyTemplate() || defaultEmptyTemplate; context: {}\"\r\n ></ng-container>\r\n}\r\n\r\n<ng-template #usedItemTemplate [ngnTemplate]=\"scroller.templateTypes.item\" let-itemOrGroup>\r\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\r\n <div\r\n [ngnScrollerItem]=\"itemOrGroup\"\r\n [id]=\"inputId() + '_option_' + itemOrGroup.value\"\r\n [attr.role]=\"'option'\"\r\n [aria-selected]=\"selectable() ? valueArray().includes(itemOrGroup.value) : null\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n item: !itemOrGroup.items,\r\n group: !!itemOrGroup.items,\r\n 'item-selected': valueArray().includes(itemOrGroup.value),\r\n 'item-highlighted': itemOrGroup.value === currentHighlightedValue(),\r\n }\"\r\n (click)=\"!itemOrGroup.items && selectable() && onSelect(itemOrGroup.value)\"\r\n (mouseenter)=\"\r\n !itemOrGroup.items && selectable() && selectOnHover() && onSelect(itemOrGroup.value)\r\n \"\r\n >\r\n @if (showCheckboxes() && !itemOrGroup.items) {\r\n <ngn-checkbox\r\n [value]=\"valueArray().includes(itemOrGroup.value)\"\r\n aria-hidden=\"true\"\r\n inert=\"true\"\r\n />\r\n }\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n itemOrGroup.items ? groupTemplate() : itemTemplate();\r\n context: { $implicit: itemOrGroup }\r\n \"\r\n ></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultItemTemplate [ngnTemplate]=\"templateTypes.item\" let-item>\r\n <span [attr.data-testid]=\"item?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-item'\">\r\n @let label = item?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"item?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"item?.testId\">​</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultGroupTemplate [ngnTemplate]=\"templateTypes.item\" let-group>\r\n <span [attr.data-testid]=\"group?.testId\" [ptInt]=\"this\" [ptClass]=\"'default-group'\">\r\n @let label = group?.label;\r\n @if (label) {\r\n <span [attr.data-testid]=\"group?.testId\">{{ maybeCallback(label) }}</span>\r\n } @else {\r\n <span [attr.data-testid]=\"group?.testId\">​</span>\r\n }\r\n </span>\r\n</ng-template>\r\n\r\n<ng-template #defaultEmptyTemplate>\r\n <span [ptInt]=\"this\" [ptClass]=\"'empty'\" [attr.data-testid]=\"'empty'\">{{\r\n 'No items found'\r\n }}</span>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|