@arsedizioni/ars-utils 22.6.86 → 22.6.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +3158 -3344
  2. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
  3. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +7616 -4772
  4. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
  5. package/fesm2022/arsedizioni-ars-utils-core.date.mjs +321 -702
  6. package/fesm2022/arsedizioni-ars-utils-core.date.mjs.map +1 -1
  7. package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs +445 -590
  8. package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs.map +1 -1
  9. package/fesm2022/arsedizioni-ars-utils-core.mjs +1735 -2370
  10. package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
  11. package/fesm2022/arsedizioni-ars-utils-core.validators.mjs +1280 -1470
  12. package/fesm2022/arsedizioni-ars-utils-core.validators.mjs.map +1 -1
  13. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +1097 -1528
  14. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
  15. package/fesm2022/arsedizioni-ars-utils-support.common.mjs +198 -294
  16. package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
  17. package/fesm2022/arsedizioni-ars-utils-ui.controls.date.mjs +115 -117
  18. package/fesm2022/arsedizioni-ars-utils-ui.controls.date.mjs.map +1 -1
  19. package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs +1607 -613
  20. package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs.map +1 -1
  21. package/fesm2022/arsedizioni-ars-utils-ui.controls.tree.mjs +840 -367
  22. package/fesm2022/arsedizioni-ars-utils-ui.controls.tree.mjs.map +1 -1
  23. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs +1634 -651
  24. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs.map +1 -1
  25. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs +1255 -792
  26. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs.map +1 -1
  27. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs +1410 -357
  28. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs.map +1 -1
  29. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs +2401 -944
  30. package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs.map +1 -1
  31. package/fesm2022/arsedizioni-ars-utils-ui.files.mjs +1553 -741
  32. package/fesm2022/arsedizioni-ars-utils-ui.files.mjs.map +1 -1
  33. package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs +901 -430
  34. package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs.map +1 -1
  35. package/fesm2022/arsedizioni-ars-utils-ui.help.mjs +737 -530
  36. package/fesm2022/arsedizioni-ars-utils-ui.help.mjs.map +1 -1
  37. package/fesm2022/arsedizioni-ars-utils-ui.mjs +6638 -1755
  38. package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
  39. package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs +1479 -1207
  40. package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs.map +1 -1
  41. package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs +1003 -270
  42. package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs.map +1 -1
  43. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +497 -278
  44. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
  45. package/fesm2022/arsedizioni-ars-utils-ui.paginator.mjs +48 -52
  46. package/fesm2022/arsedizioni-ars-utils-ui.paginator.mjs.map +1 -1
  47. package/fesm2022/arsedizioni-ars-utils-ui.shell.mjs +464 -704
  48. package/fesm2022/arsedizioni-ars-utils-ui.shell.mjs.map +1 -1
  49. package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs +724 -657
  50. package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs.map +1 -1
  51. package/fesm2022/arsedizioni-ars-utils.mjs +3 -19
  52. package/fesm2022/arsedizioni-ars-utils.mjs.map +1 -1
  53. package/package.json +1 -1
  54. package/types/arsedizioni-ars-utils-clipper.common.d.ts +1151 -1163
  55. package/types/arsedizioni-ars-utils-clipper.ui.d.ts +1588 -1426
  56. package/types/arsedizioni-ars-utils-core.d.ts +1169 -1172
  57. package/types/arsedizioni-ars-utils-core.date.d.ts +204 -208
  58. package/types/arsedizioni-ars-utils-core.markdown.d.ts +128 -126
  59. package/types/arsedizioni-ars-utils-core.validators.d.ts +270 -236
  60. package/types/arsedizioni-ars-utils-evolution.common.d.ts +1054 -1067
  61. package/types/arsedizioni-ars-utils-support.common.d.ts +225 -234
  62. package/types/arsedizioni-ars-utils-ui.controls.d.ts +440 -278
  63. package/types/arsedizioni-ars-utils-ui.controls.date.d.ts +24 -28
  64. package/types/arsedizioni-ars-utils-ui.controls.tree.d.ts +172 -136
  65. package/types/arsedizioni-ars-utils-ui.d.ts +2035 -821
  66. package/types/arsedizioni-ars-utils-ui.dialogs.auth.d.ts +327 -322
  67. package/types/arsedizioni-ars-utils-ui.dialogs.d.ts +343 -347
  68. package/types/arsedizioni-ars-utils-ui.dialogs.prompt.d.ts +167 -167
  69. package/types/arsedizioni-ars-utils-ui.dialogs.select.d.ts +373 -367
  70. package/types/arsedizioni-ars-utils-ui.files.d.ts +335 -283
  71. package/types/arsedizioni-ars-utils-ui.filters.d.ts +232 -160
  72. package/types/arsedizioni-ars-utils-ui.help.d.ts +204 -211
  73. package/types/arsedizioni-ars-utils-ui.navigation.d.ts +811 -646
  74. package/types/arsedizioni-ars-utils-ui.notifications.d.ts +74 -78
  75. package/types/arsedizioni-ars-utils-ui.oauth.d.ts +102 -62
  76. package/types/arsedizioni-ars-utils-ui.paginator.d.ts +19 -22
  77. package/types/arsedizioni-ars-utils-ui.shell.d.ts +376 -382
  78. package/types/arsedizioni-ars-utils-ui.tinymce.d.ts +244 -231
  79. package/types/arsedizioni-ars-utils.d.ts +1 -3
@@ -1 +1 @@
1
- {"version":3,"file":"arsedizioni-ars-utils-ui.controls.tree.mjs","sources":["../../../projects/ars-utils/ui.controls.tree/tree-picker/tree-picker.component.ts","../../../projects/ars-utils/ui.controls.tree/tree-picker/tree-picker.component.html","../../../projects/ars-utils/ui.controls.tree/public_api.ts","../../../projects/ars-utils/ui.controls.tree/arsedizioni-ars-utils-ui.controls.tree.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, model, output, signal, viewChild } from '@angular/core';\nimport { FormField, form } from '@angular/forms/signals';\nimport { INode, SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\nimport { MatTree, MatTreeModule } from '@angular/material/tree';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\ninterface TaxonomyMaps {\n parentMap: Map<string, INode>;\n depthMap: Map<string, number>;\n nodeMap: Map<string, INode>;\n}\n\n@Component({\n selector: 'tree-picker',\n templateUrl: './tree-picker.component.html',\n styleUrls: ['./tree-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatTreeModule, MatCheckboxModule, MatIconModule, MatTabsModule, MatChipsModule,\n MatButtonModule, MatTooltipModule, MatFormFieldModule, MatInputModule, FormField, FlexLayoutModule, SafeHtmlPipe]\n})\nexport class TreePickerComponent {\n /** Nested tree data to display. */\n readonly tree = input<INode[]>([]);\n\n /** Currently selected node ids. Supports two-way binding via [(selection)]. */\n readonly selection = model<string[]>([]);\n\n /** When true, checkboxes and chip remove buttons are disabled (mirrors Material convention). */\n readonly disabled = input<boolean>(false);\n\n /** Description to display when no selection is made. */\n readonly descriptionEmpty = input<string>('<span>Nessuna selezione: vengono inclusi <strong>tutti gli elementi</strong>.</span>');\n\n /** Maximum number of tree levels to display (default: 3). */\n readonly maxDepth = input<number>(3);\n\n /**\n * List of node IDs at depth >= maxDepth that unlock selection for themselves\n * and all their descendants, regardless of depth.\n */\n readonly maxDepthOverrides = input<string[]>([]);\n\n /**\n * Number of levels to auto-expand on load.\n * 0 or undefined = only top level visible (no expansion);\n * 1 = expand depth-0 nodes; 2 = expand depth-0 and depth-1 nodes; etc.\n * Must be less than maxDepth.\n */\n readonly minDepth = input<number | undefined>(undefined);\n\n /**\n * Emits the count of visible selected nodes whenever the selection changes.\n * Emits 0 when nothing is selected (meaning all items are implicitly included).\n */\n readonly selectionCount = output<number>();\n\n /** Emits void whenever the user changes the selection (toggle, remove, clear). */\n readonly changed = output<void>();\n\n private readonly _treeRef = viewChild(MatTree<INode>);\n private readonly _elRef = inject(ElementRef);\n\n /**\n * Set of all node IDs selectable via overrides: each listed root and all its descendants.\n * Recomputed whenever the tree data or the override list changes.\n */\n private readonly _overrideSubtreeSet = computed(() => {\n const overrideIds = new Set(this.maxDepthOverrides());\n const maps = this._maps();\n const result = new Set<string>();\n for (const id of overrideIds) {\n const root = maps.nodeMap.get(id);\n if (!root) continue;\n const addSubtree = (n: INode): void => {\n result.add(n.id);\n for (const child of (n.children ?? [])) addSubtree(child as INode);\n };\n addSubtree(root);\n }\n return result;\n });\n\n /** All three maps rebuilt lazily as a single computed whenever taxonomy changes. */\n private readonly _maps = computed<TaxonomyMaps>(() => {\n const parentMap = new Map<string, INode>();\n const depthMap = new Map<string, number>();\n const nodeMap = new Map<string, INode>();\n const build = (nodes: INode[], parent?: INode, depth = 0): void => {\n for (const node of nodes) {\n depthMap.set(node.id, depth);\n nodeMap.set(node.id, node);\n if (parent) parentMap.set(node.id, parent);\n if (node.children?.length) build(node.children as INode[], node, depth + 1);\n }\n };\n build(this.tree());\n return { parentMap, depthMap, nodeMap };\n });\n\n /** O(1) set of selected ids, rebuilt only when selection changes. */\n private readonly _selectedSet = computed(() => new Set(this.selection()));\n\n /** True when at least one node is explicitly selected. */\n protected readonly hasSelection = computed(() => this.selection().length > 0);\n\n /** Count of selected nodes within selectable levels (depth < maxDepth or in overrides), shown in the tab label. */\n protected readonly selectedVisibleCount = computed(() =>\n this.selection().filter(id => {\n const node = this._maps().nodeMap.get(id);\n return node ? this._isSelectableNode(node) : false;\n }).length\n );\n\n readonly treeChildrenAccessor = (node: INode): INode[] => {\n return (node.children ?? []) as INode[];\n };\n\n readonly hasChild = (_: number, node: INode): boolean =>\n !!(node.children?.length);\n\n /** Returns true when the node can be selected: depth < maxDepth or explicitly listed in maxDepthOverrides. */\n protected isSelectable(node: INode): boolean {\n return this._isSelectableNode(node);\n }\n\n private _isSelectableNode(node: INode): boolean {\n const depth = this._maps().depthMap.get(node.id) ?? 0;\n return depth < this.maxDepth() || this._overrideSubtreeSet().has(node.id);\n }\n\n\n /** Current filter text. */\n protected readonly filterText = signal<string>('');\n /** Root signal form bound to the filter text input. */\n protected readonly filterForm = form(this.filterText);\n /** Nodes matching the current filter text, in nodeMap iteration order. */\n protected readonly filteredItems = signal<INode[]>([]);\n /** Index of the currently highlighted filtered node (-1 = none). */\n protected readonly filterIndex = signal(-1);\n /** The currently highlighted filtered node, or null. */\n protected readonly filteredNode = computed<INode | null>(() => {\n const idx = this.filterIndex();\n return idx >= 0 ? (this.filteredItems()[idx] ?? null) : null;\n });\n\n constructor() {\n // Expand nodes up to minDepth whenever new taxonomy data arrives\n effect(() => {\n const maps = this._maps();\n const expandLevels = this.minDepth() ?? 0;\n setTimeout(() => {\n const tree = this._treeRef();\n if (!tree) return;\n tree.collapseAll();\n if (expandLevels <= 0) return;\n maps.depthMap.forEach((depth, id) => {\n if (depth < expandLevels) {\n const node = maps.nodeMap.get(id);\n if (node) tree.expand(node);\n }\n });\n });\n });\n // Emit visible selection count on every selection change\n effect(() => {\n this.selectionCount.emit(this.selectedVisibleCount());\n });\n }\n\n /** Expands all visible nodes in the tree. */\n protected expandAll(): void {\n this._treeRef()?.expandAll();\n }\n\n /** Collapses all nodes in the tree. */\n protected collapseAll(): void {\n this._treeRef()?.collapseAll();\n }\n\n /** Clears the entire selection. */\n protected clearAll(): void {\n this.selection.set([]);\n this.changed.emit();\n }\n\n /** Searches nodes by text and moves to the first match. */\n protected doFilter(): void {\n const text = this.filterText().trim().toLowerCase();\n if (text.length < 3) {\n this.filteredItems.set([]);\n this.filterIndex.set(-1);\n return;\n }\n const matches = Array.from(this._maps().nodeMap.values())\n .filter(n => n.name?.toLowerCase().includes(text));\n this.filteredItems.set(matches);\n const idx = matches.length > 0 ? 0 : -1;\n this.filterIndex.set(idx);\n if (idx >= 0) this._scrollToFiltered(idx, matches);\n }\n\n /** Clears the filter and restores the original tree state. */\n protected clearFilter(): void {\n this.filterText.set('');\n this.filteredItems.set([]);\n this.filterIndex.set(-1);\n }\n\n /** Moves to the next matching node, cycling back to the first. */\n protected nextFiltered(): void {\n const items = this.filteredItems();\n if (!items.length) return;\n const next = (this.filterIndex() + 1) % items.length;\n this.filterIndex.set(next);\n this._scrollToFiltered(next, items);\n }\n\n /** Returns true when the node is the currently highlighted filter match. */\n protected isFilteredNode(node: INode): boolean {\n return this.filteredNode()?.id === node.id;\n }\n\n /** Expands ancestors of the target node and scrolls it into view. */\n private _scrollToFiltered(index: number, items: INode[]): void {\n const node = items[index];\n if (!node) return;\n const tree = this._treeRef();\n if (tree) {\n let parent = this._maps().parentMap.get(node.id);\n while (parent) {\n tree.expand(parent);\n parent = this._maps().parentMap.get(parent.id);\n }\n }\n setTimeout(() => {\n const el: HTMLElement | null = this._elRef.nativeElement.querySelector(`[data-node-id=\"${node.id}\"]`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n });\n }\n\n /**\n * Returns true when the node is in the active selection.\n * @param node - tree node to check\n * @returns true if selected\n */\n protected isSelected(node: INode): boolean {\n return this._selectedSet().has(node.id);\n }\n\n /**\n * Returns true when a subset (but not all) of the node's descendants are selected,\n * producing the indeterminate checkbox state.\n * @param node - tree node to evaluate\n * @returns true if the node is in a partial-selection (indeterminate) state\n */\n protected isIndeterminate(node: INode): boolean {\n if (!node.children?.length) return false;\n const descendants = this._getSelectableDescendants(node);\n const set = this._selectedSet();\n const count = descendants.filter(d => set.has(d.id)).length;\n return count > 0 && count < descendants.length;\n }\n\n /**\n * Toggles the node and all its descendants; then syncs the ancestor chain.\n * @param node - the node that was clicked\n */\n protected toggleNode(node: INode): void {\n this.selection.update(current => {\n const set = new Set(current);\n if (set.has(node.id)) {\n set.delete(node.id);\n } else {\n set.add(node.id);\n }\n this._syncParentsInSet(node, set);\n return Array.from(set);\n });\n this.changed.emit();\n }\n\n /**\n * Deselects the node and all its descendants. Called by the chip remove button.\n * @param node - the node to remove from the selection\n */\n protected removeNode(node: INode): void {\n this.selection.update(current => {\n const set = new Set(current);\n set.delete(node.id);\n this._syncParentsInSet(node, set);\n return Array.from(set);\n });\n this.changed.emit();\n }\n\n /**\n * Returns the INode for the given id, or undefined if not found.\n * @param id - node id to look up\n * @returns the matching INode\n */\n protected nodeById(id: string): INode | undefined {\n return this._maps().nodeMap.get(id);\n }\n\n /**\n * Returns true when the node at the given id is within the visible depth range\n * and should appear in the chip list.\n * @param id - node id to check\n * @returns true if the node depth is less than maxDepth\n */\n protected isChipVisible(id: string): boolean {\n const node = this._maps().nodeMap.get(id);\n return node ? this._isSelectableNode(node) : false;\n }\n\n /**\n * Returns only the selectable descendants of node (depth < maxDepth or in overrides),\n * used for indeterminate state and parent auto-selection logic.\n * @param node - root of the subtree to traverse\n * @returns flat array of selectable descendant INodes\n */\n private _getSelectableDescendants(node: INode): INode[] {\n const result: INode[] = [];\n for (const child of (node.children ?? [])) {\n const c = child as INode;\n if (this._isSelectableNode(c)) result.push(c);\n result.push(...this._getSelectableDescendants(c));\n }\n return result;\n }\n\n /**\n * Walks up the ancestor chain from node, selecting a parent only when all\n * its descendants are in the set, deselecting it otherwise.\n * @param node - starting node for the upward traversal\n * @param set - mutable selection set updated in place\n */\n private _syncParentsInSet(node: INode, set: Set<string>): void {\n let parent = this._maps().parentMap.get(node.id);\n while (parent) {\n const descendants = this._getSelectableDescendants(parent);\n if (descendants.length > 0 && descendants.every(d => set.has(d.id))) {\n set.add(parent.id);\n } else {\n set.delete(parent.id);\n }\n parent = this._maps().parentMap.get(parent.id);\n }\n }\n \n}\n","<mat-tab-group class=\"taxonomy-picker-tabs\" style=\"height:100%\">\n <mat-tab style=\"overflow-x: hidden !important; height: 100%\">\n <ng-template mat-tab-label>\n Seleziona\n <mat-icon\n style=\"font-size:16px;height:16px;width:16px;margin-left:4px;vertical-align:middle;color:var(--mat-sys-primary)\"\n [matTooltip]=\"'Nessuna selezione = tutti gli argomenti inclusi;\\r\\nOgni elemento selezionato include sempre tutti i suoi sottoelementi'\"\n matTooltipPosition=\"above\">\n info\n </mat-icon>\n </ng-template>\n <div fxLayout=\"column\" fxFill style=\"overflow: hidden; height: 100%;\">\n <div fxFlex>\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\n <div fxFlex fxHide.xs>\n <mat-form-field style=\"width:200px; padding: 8px 0px\" appearance=\"outline\"\n subscriptSizing=\"dynamic\">\n <mat-label>Cerca...</mat-label>\n <input type=\"text\" (keyup)=\"doFilter()\" matInput [formField]=\"filterForm\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation(); nextFiltered()\"\n (keydown.arrowDown)=\"$event.preventDefault(); $event.stopPropagation(); nextFiltered()\">\n @if (filterText()) {\n <button type=\"button\" type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button\n aria-label=\"Clear\" (click)=\"clearFilter()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n @if (filteredItems().length > 0) {\n <div fxFlex=\"50px\" fxHide.xs fxLayoutAlign=\"end center\">\n <div class=\"small\">{{filterIndex() + 1}} / {{filteredItems().length}}</div>\n </div>\n <div fxFlex=\"48px\" fxHide.xs fxLayoutAlign=\"end center\">\n <button mat-icon-button (click)=\"nextFiltered()\">\n <mat-icon aria-label=\"Vai al prossimo\"\n matTooltip=\"Vai al prossimo\">arrow_downward</mat-icon>\n </button>\n </div>\n }\n <div fxFlex=\"*\" fxLayoutAlign=\"end center\">\n <button mat-icon-button [matTooltip]=\"'Espandi tutto'\" (click)=\"expandAll()\">\n <mat-icon>unfold_more</mat-icon>\n </button>\n <button mat-icon-button [matTooltip]=\"'Comprimi tutto'\" (click)=\"collapseAll()\">\n <mat-icon>unfold_less</mat-icon>\n </button>\n <button mat-icon-button [matTooltip]=\"'Azzera selezione'\" [disabled]=\"!hasSelection()\"\n (click)=\"clearAll()\">\n <mat-icon>deselect</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div fxFlex=\"*\" style=\"overflow-y: auto;\">\n <mat-tree [dataSource]=\"tree()\" [childrenAccessor]=\"treeChildrenAccessor\" class=\"tree\">\n <!-- Leaf node -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding [matTreeNodePaddingIndent]=\"20\"\n class=\"tree-node\" [class.tree-node-filtered]=\"filteredNode()?.id === node.id\"\n [class.tree-node-no-select]=\"!isSelectable(node)\"\n [attr.data-node-id]=\"node.id\">\n <button mat-icon-button disabled style=\"visibility: hidden\"></button>\n @if (isSelectable(node)) {\n <mat-checkbox [checked]=\"isSelected(node)\" [disabled]=\"disabled()\" (change)=\"toggleNode(node)\">\n <span class=\"small\">{{node.name}}</span>\n </mat-checkbox>\n } @else {\n <div class=\"tree-node-label-only\">\n <span class=\"small\">{{node.name}}</span>\n </div>\n }\n </mat-tree-node>\n <!-- Expandable node with children -->\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [matTreeNodePaddingIndent]=\"20\" #treeNode=\"matTreeNode\" class=\"tree-node\"\n [class.tree-node-filtered]=\"filteredNode()?.id === node.id\"\n [class.tree-node-no-select]=\"!isSelectable(node)\"\n [attr.data-node-id]=\"node.id\">\n <button mat-icon-button matTreeNodeToggle>\n <mat-icon>{{treeNode.isExpanded ? 'expand_more' : 'chevron_right'}}</mat-icon>\n </button>\n @if (isSelectable(node)) {\n <mat-checkbox [checked]=\"isSelected(node)\" [indeterminate]=\"isIndeterminate(node)\"\n [disabled]=\"disabled()\" (change)=\"toggleNode(node)\">\n <span class=\"small\">{{node.name}}</span>\n </mat-checkbox>\n } @else {\n <div class=\"tree-node-label-only\">\n <span class=\"small\">{{node.name}}</span>\n </div>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n </div>\n </mat-tab>\n <mat-tab [label]=\"hasSelection() ? 'Selezionati (' + selectedVisibleCount() + ')' : 'Selezionati (tutti)'\"\n style=\"height: 100%;\">\n <div fxLayout=\"column\" fxFill style=\"overflow: hidden; height: 100%;\">\n <div fxFlex>\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"8px\" style=\"padding:12px\">\n @if (!hasSelection()) {\n <mat-icon>info</mat-icon>\n <span [innerHTML]=\"descriptionEmpty() | safeHtml\"></span>\n } @else {\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\n <button mat-button color=\"warn\" style=\"margin-left:auto\" (click)=\"clearAll()\">\n <mat-icon>deselect</mat-icon> Azzera tutto\n </button>\n </div>\n }\n </div>\n </div>\n <div fxFlex=\"*\" style=\"overflow-y: auto; padding-bottom: 12px;\">\n <mat-chip-set>\n @for (id of selection(); track id) {\n @let node = nodeById(id);\n @if (node && isChipVisible(id)) {\n <mat-chip (removed)=\"removeNode(node)\" style=\"max-width: 280px;\" [matTooltip]=\"node.name\">\n {{node.name}}\n @if (!disabled()) {\n <button matChipRemove matTooltip=\"Elimina\"><mat-icon>cancel</mat-icon></button>\n }\n </mat-chip>\n }\n }\n </mat-chip-set>\n </div>\n </div>\n </mat-tab>\n</mat-tab-group>","/*\n * Public API Surface of @arsedizioni/ars-utils/ui.controls.tree\n *\n * `TreePickerComponent` alone. It is the only consumer of `mat-tree`, `mat-tabs`, `mat-input` and\n * `mat-checkbox` in the library: leaving it next to the small controls of `ui.controls` would tie\n * the placement of that whole Material subtree to whichever chunk first reaches a button.\n */\nexport * from './tree-picker/tree-picker.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"arsedizioni-ars-utils-ui.controls.tree.mjs","names":[],"sources":["../../../projects/ars-utils/ui.controls.tree/tree-picker/tree-picker.component.ts","../../../projects/ars-utils/ui.controls.tree/tree-picker/tree-picker.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, model, output, signal, viewChild } from '@angular/core';\nimport { FormField, form } from '@angular/forms/signals';\nimport { INode, SafeHtmlPipe } from '@arsedizioni/ars-utils/core';\nimport { MatTree, MatTreeModule } from '@angular/material/tree';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { FlexLayoutModule } from '@arsedizioni/ars-utils/ui';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\ninterface TaxonomyMaps {\n parentMap: Map<string, INode>;\n depthMap: Map<string, number>;\n nodeMap: Map<string, INode>;\n}\n\n@Component({\n selector: 'tree-picker',\n templateUrl: './tree-picker.component.html',\n styleUrls: ['./tree-picker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MatTreeModule, MatCheckboxModule, MatIconModule, MatTabsModule, MatChipsModule,\n MatButtonModule, MatTooltipModule, MatFormFieldModule, MatInputModule, FormField, FlexLayoutModule, SafeHtmlPipe]\n})\nexport class TreePickerComponent {\n /** Nested tree data to display. */\n readonly tree = input<INode[]>([]);\n\n /** Currently selected node ids. Supports two-way binding via [(selection)]. */\n readonly selection = model<string[]>([]);\n\n /** When true, checkboxes and chip remove buttons are disabled (mirrors Material convention). */\n readonly disabled = input<boolean>(false);\n\n /** Description to display when no selection is made. */\n readonly descriptionEmpty = input<string>('<span>Nessuna selezione: vengono inclusi <strong>tutti gli elementi</strong>.</span>');\n\n /** Maximum number of tree levels to display (default: 3). */\n readonly maxDepth = input<number>(3);\n\n /**\n * List of node IDs at depth >= maxDepth that unlock selection for themselves\n * and all their descendants, regardless of depth.\n */\n readonly maxDepthOverrides = input<string[]>([]);\n\n /**\n * Number of levels to auto-expand on load.\n * 0 or undefined = only top level visible (no expansion);\n * 1 = expand depth-0 nodes; 2 = expand depth-0 and depth-1 nodes; etc.\n * Must be less than maxDepth.\n */\n readonly minDepth = input<number | undefined>(undefined);\n\n /**\n * Emits the count of visible selected nodes whenever the selection changes.\n * Emits 0 when nothing is selected (meaning all items are implicitly included).\n */\n readonly selectionCount = output<number>();\n\n /** Emits void whenever the user changes the selection (toggle, remove, clear). */\n readonly changed = output<void>();\n\n private readonly _treeRef = viewChild(MatTree<INode>);\n private readonly _elRef = inject(ElementRef);\n\n /**\n * Set of all node IDs selectable via overrides: each listed root and all its descendants.\n * Recomputed whenever the tree data or the override list changes.\n */\n private readonly _overrideSubtreeSet = computed(() => {\n const overrideIds = new Set(this.maxDepthOverrides());\n const maps = this._maps();\n const result = new Set<string>();\n for (const id of overrideIds) {\n const root = maps.nodeMap.get(id);\n if (!root) continue;\n const addSubtree = (n: INode): void => {\n result.add(n.id);\n for (const child of (n.children ?? [])) addSubtree(child as INode);\n };\n addSubtree(root);\n }\n return result;\n });\n\n /** All three maps rebuilt lazily as a single computed whenever taxonomy changes. */\n private readonly _maps = computed<TaxonomyMaps>(() => {\n const parentMap = new Map<string, INode>();\n const depthMap = new Map<string, number>();\n const nodeMap = new Map<string, INode>();\n const build = (nodes: INode[], parent?: INode, depth = 0): void => {\n for (const node of nodes) {\n depthMap.set(node.id, depth);\n nodeMap.set(node.id, node);\n if (parent) parentMap.set(node.id, parent);\n if (node.children?.length) build(node.children as INode[], node, depth + 1);\n }\n };\n build(this.tree());\n return { parentMap, depthMap, nodeMap };\n });\n\n /** O(1) set of selected ids, rebuilt only when selection changes. */\n private readonly _selectedSet = computed(() => new Set(this.selection()));\n\n /** True when at least one node is explicitly selected. */\n protected readonly hasSelection = computed(() => this.selection().length > 0);\n\n /** Count of selected nodes within selectable levels (depth < maxDepth or in overrides), shown in the tab label. */\n protected readonly selectedVisibleCount = computed(() =>\n this.selection().filter(id => {\n const node = this._maps().nodeMap.get(id);\n return node ? this._isSelectableNode(node) : false;\n }).length\n );\n\n readonly treeChildrenAccessor = (node: INode): INode[] => {\n return (node.children ?? []) as INode[];\n };\n\n readonly hasChild = (_: number, node: INode): boolean =>\n !!(node.children?.length);\n\n /** Returns true when the node can be selected: depth < maxDepth or explicitly listed in maxDepthOverrides. */\n protected isSelectable(node: INode): boolean {\n return this._isSelectableNode(node);\n }\n\n private _isSelectableNode(node: INode): boolean {\n const depth = this._maps().depthMap.get(node.id) ?? 0;\n return depth < this.maxDepth() || this._overrideSubtreeSet().has(node.id);\n }\n\n\n /** Current filter text. */\n protected readonly filterText = signal<string>('');\n /** Root signal form bound to the filter text input. */\n protected readonly filterForm = form(this.filterText);\n /** Nodes matching the current filter text, in nodeMap iteration order. */\n protected readonly filteredItems = signal<INode[]>([]);\n /** Index of the currently highlighted filtered node (-1 = none). */\n protected readonly filterIndex = signal(-1);\n /** The currently highlighted filtered node, or null. */\n protected readonly filteredNode = computed<INode | null>(() => {\n const idx = this.filterIndex();\n return idx >= 0 ? (this.filteredItems()[idx] ?? null) : null;\n });\n\n constructor() {\n // Expand nodes up to minDepth whenever new taxonomy data arrives\n effect(() => {\n const maps = this._maps();\n const expandLevels = this.minDepth() ?? 0;\n setTimeout(() => {\n const tree = this._treeRef();\n if (!tree) return;\n tree.collapseAll();\n if (expandLevels <= 0) return;\n maps.depthMap.forEach((depth, id) => {\n if (depth < expandLevels) {\n const node = maps.nodeMap.get(id);\n if (node) tree.expand(node);\n }\n });\n });\n });\n // Emit visible selection count on every selection change\n effect(() => {\n this.selectionCount.emit(this.selectedVisibleCount());\n });\n }\n\n /** Expands all visible nodes in the tree. */\n protected expandAll(): void {\n this._treeRef()?.expandAll();\n }\n\n /** Collapses all nodes in the tree. */\n protected collapseAll(): void {\n this._treeRef()?.collapseAll();\n }\n\n /** Clears the entire selection. */\n protected clearAll(): void {\n this.selection.set([]);\n this.changed.emit();\n }\n\n /** Searches nodes by text and moves to the first match. */\n protected doFilter(): void {\n const text = this.filterText().trim().toLowerCase();\n if (text.length < 3) {\n this.filteredItems.set([]);\n this.filterIndex.set(-1);\n return;\n }\n const matches = Array.from(this._maps().nodeMap.values())\n .filter(n => n.name?.toLowerCase().includes(text));\n this.filteredItems.set(matches);\n const idx = matches.length > 0 ? 0 : -1;\n this.filterIndex.set(idx);\n if (idx >= 0) this._scrollToFiltered(idx, matches);\n }\n\n /** Clears the filter and restores the original tree state. */\n protected clearFilter(): void {\n this.filterText.set('');\n this.filteredItems.set([]);\n this.filterIndex.set(-1);\n }\n\n /** Moves to the next matching node, cycling back to the first. */\n protected nextFiltered(): void {\n const items = this.filteredItems();\n if (!items.length) return;\n const next = (this.filterIndex() + 1) % items.length;\n this.filterIndex.set(next);\n this._scrollToFiltered(next, items);\n }\n\n /** Returns true when the node is the currently highlighted filter match. */\n protected isFilteredNode(node: INode): boolean {\n return this.filteredNode()?.id === node.id;\n }\n\n /** Expands ancestors of the target node and scrolls it into view. */\n private _scrollToFiltered(index: number, items: INode[]): void {\n const node = items[index];\n if (!node) return;\n const tree = this._treeRef();\n if (tree) {\n let parent = this._maps().parentMap.get(node.id);\n while (parent) {\n tree.expand(parent);\n parent = this._maps().parentMap.get(parent.id);\n }\n }\n setTimeout(() => {\n const el: HTMLElement | null = this._elRef.nativeElement.querySelector(`[data-node-id=\"${node.id}\"]`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n });\n }\n\n /**\n * Returns true when the node is in the active selection.\n * @param node - tree node to check\n * @returns true if selected\n */\n protected isSelected(node: INode): boolean {\n return this._selectedSet().has(node.id);\n }\n\n /**\n * Returns true when a subset (but not all) of the node's descendants are selected,\n * producing the indeterminate checkbox state.\n * @param node - tree node to evaluate\n * @returns true if the node is in a partial-selection (indeterminate) state\n */\n protected isIndeterminate(node: INode): boolean {\n if (!node.children?.length) return false;\n const descendants = this._getSelectableDescendants(node);\n const set = this._selectedSet();\n const count = descendants.filter(d => set.has(d.id)).length;\n return count > 0 && count < descendants.length;\n }\n\n /**\n * Toggles the node and all its descendants; then syncs the ancestor chain.\n * @param node - the node that was clicked\n */\n protected toggleNode(node: INode): void {\n this.selection.update(current => {\n const set = new Set(current);\n if (set.has(node.id)) {\n set.delete(node.id);\n } else {\n set.add(node.id);\n }\n this._syncParentsInSet(node, set);\n return Array.from(set);\n });\n this.changed.emit();\n }\n\n /**\n * Deselects the node and all its descendants. Called by the chip remove button.\n * @param node - the node to remove from the selection\n */\n protected removeNode(node: INode): void {\n this.selection.update(current => {\n const set = new Set(current);\n set.delete(node.id);\n this._syncParentsInSet(node, set);\n return Array.from(set);\n });\n this.changed.emit();\n }\n\n /**\n * Returns the INode for the given id, or undefined if not found.\n * @param id - node id to look up\n * @returns the matching INode\n */\n protected nodeById(id: string): INode | undefined {\n return this._maps().nodeMap.get(id);\n }\n\n /**\n * Returns true when the node at the given id is within the visible depth range\n * and should appear in the chip list.\n * @param id - node id to check\n * @returns true if the node depth is less than maxDepth\n */\n protected isChipVisible(id: string): boolean {\n const node = this._maps().nodeMap.get(id);\n return node ? this._isSelectableNode(node) : false;\n }\n\n /**\n * Returns only the selectable descendants of node (depth < maxDepth or in overrides),\n * used for indeterminate state and parent auto-selection logic.\n * @param node - root of the subtree to traverse\n * @returns flat array of selectable descendant INodes\n */\n private _getSelectableDescendants(node: INode): INode[] {\n const result: INode[] = [];\n for (const child of (node.children ?? [])) {\n const c = child as INode;\n if (this._isSelectableNode(c)) result.push(c);\n result.push(...this._getSelectableDescendants(c));\n }\n return result;\n }\n\n /**\n * Walks up the ancestor chain from node, selecting a parent only when all\n * its descendants are in the set, deselecting it otherwise.\n * @param node - starting node for the upward traversal\n * @param set - mutable selection set updated in place\n */\n private _syncParentsInSet(node: INode, set: Set<string>): void {\n let parent = this._maps().parentMap.get(node.id);\n while (parent) {\n const descendants = this._getSelectableDescendants(parent);\n if (descendants.length > 0 && descendants.every(d => set.has(d.id))) {\n set.add(parent.id);\n } else {\n set.delete(parent.id);\n }\n parent = this._maps().parentMap.get(parent.id);\n }\n }\n \n}\n","<mat-tab-group class=\"taxonomy-picker-tabs\" style=\"height:100%\">\n <mat-tab style=\"overflow-x: hidden !important; height: 100%\">\n <ng-template mat-tab-label>\n Seleziona\n <mat-icon\n style=\"font-size:16px;height:16px;width:16px;margin-left:4px;vertical-align:middle;color:var(--mat-sys-primary)\"\n [matTooltip]=\"'Nessuna selezione = tutti gli argomenti inclusi;\\r\\nOgni elemento selezionato include sempre tutti i suoi sottoelementi'\"\n matTooltipPosition=\"above\">\n info\n </mat-icon>\n </ng-template>\n <div fxLayout=\"column\" fxFill style=\"overflow: hidden; height: 100%;\">\n <div fxFlex>\n <div fxLayout=\"row\" fxLayoutGap=\"10px\" fxLayoutAlign=\"start center\" fxFill>\n <div fxFlex fxHide.xs>\n <mat-form-field style=\"width:200px; padding: 8px 0px\" appearance=\"outline\"\n subscriptSizing=\"dynamic\">\n <mat-label>Cerca...</mat-label>\n <input type=\"text\" (keyup)=\"doFilter()\" matInput [formField]=\"filterForm\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation(); nextFiltered()\"\n (keydown.arrowDown)=\"$event.preventDefault(); $event.stopPropagation(); nextFiltered()\">\n @if (filterText()) {\n <button type=\"button\" type=\"button\" tabindex=\"-1\" matSuffix mat-icon-button\n aria-label=\"Clear\" (click)=\"clearFilter()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n </div>\n @if (filteredItems().length > 0) {\n <div fxFlex=\"50px\" fxHide.xs fxLayoutAlign=\"end center\">\n <div class=\"small\">{{filterIndex() + 1}} / {{filteredItems().length}}</div>\n </div>\n <div fxFlex=\"48px\" fxHide.xs fxLayoutAlign=\"end center\">\n <button mat-icon-button (click)=\"nextFiltered()\">\n <mat-icon aria-label=\"Vai al prossimo\"\n matTooltip=\"Vai al prossimo\">arrow_downward</mat-icon>\n </button>\n </div>\n }\n <div fxFlex=\"*\" fxLayoutAlign=\"end center\">\n <button mat-icon-button [matTooltip]=\"'Espandi tutto'\" (click)=\"expandAll()\">\n <mat-icon>unfold_more</mat-icon>\n </button>\n <button mat-icon-button [matTooltip]=\"'Comprimi tutto'\" (click)=\"collapseAll()\">\n <mat-icon>unfold_less</mat-icon>\n </button>\n <button mat-icon-button [matTooltip]=\"'Azzera selezione'\" [disabled]=\"!hasSelection()\"\n (click)=\"clearAll()\">\n <mat-icon>deselect</mat-icon>\n </button>\n </div>\n </div>\n </div>\n <div fxFlex=\"*\" style=\"overflow-y: auto;\">\n <mat-tree [dataSource]=\"tree()\" [childrenAccessor]=\"treeChildrenAccessor\" class=\"tree\">\n <!-- Leaf node -->\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding [matTreeNodePaddingIndent]=\"20\"\n class=\"tree-node\" [class.tree-node-filtered]=\"filteredNode()?.id === node.id\"\n [class.tree-node-no-select]=\"!isSelectable(node)\"\n [attr.data-node-id]=\"node.id\">\n <button mat-icon-button disabled style=\"visibility: hidden\"></button>\n @if (isSelectable(node)) {\n <mat-checkbox [checked]=\"isSelected(node)\" [disabled]=\"disabled()\" (change)=\"toggleNode(node)\">\n <span class=\"small\">{{node.name}}</span>\n </mat-checkbox>\n } @else {\n <div class=\"tree-node-label-only\">\n <span class=\"small\">{{node.name}}</span>\n </div>\n }\n </mat-tree-node>\n <!-- Expandable node with children -->\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n [matTreeNodePaddingIndent]=\"20\" #treeNode=\"matTreeNode\" class=\"tree-node\"\n [class.tree-node-filtered]=\"filteredNode()?.id === node.id\"\n [class.tree-node-no-select]=\"!isSelectable(node)\"\n [attr.data-node-id]=\"node.id\">\n <button mat-icon-button matTreeNodeToggle>\n <mat-icon>{{treeNode.isExpanded ? 'expand_more' : 'chevron_right'}}</mat-icon>\n </button>\n @if (isSelectable(node)) {\n <mat-checkbox [checked]=\"isSelected(node)\" [indeterminate]=\"isIndeterminate(node)\"\n [disabled]=\"disabled()\" (change)=\"toggleNode(node)\">\n <span class=\"small\">{{node.name}}</span>\n </mat-checkbox>\n } @else {\n <div class=\"tree-node-label-only\">\n <span class=\"small\">{{node.name}}</span>\n </div>\n }\n </mat-tree-node>\n </mat-tree>\n </div>\n </div>\n </mat-tab>\n <mat-tab [label]=\"hasSelection() ? 'Selezionati (' + selectedVisibleCount() + ')' : 'Selezionati (tutti)'\"\n style=\"height: 100%;\">\n <div fxLayout=\"column\" fxFill style=\"overflow: hidden; height: 100%;\">\n <div fxFlex>\n <div fxLayout=\"row\" fxLayoutAlign=\"start center\" fxLayoutGap=\"8px\" style=\"padding:12px\">\n @if (!hasSelection()) {\n <mat-icon>info</mat-icon>\n <span [innerHTML]=\"descriptionEmpty() | safeHtml\"></span>\n } @else {\n <div fxFlex=\"*\" fxLayoutAlign=\"end\">\n <button mat-button color=\"warn\" style=\"margin-left:auto\" (click)=\"clearAll()\">\n <mat-icon>deselect</mat-icon> Azzera tutto\n </button>\n </div>\n }\n </div>\n </div>\n <div fxFlex=\"*\" style=\"overflow-y: auto; padding-bottom: 12px;\">\n <mat-chip-set>\n @for (id of selection(); track id) {\n @let node = nodeById(id);\n @if (node && isChipVisible(id)) {\n <mat-chip (removed)=\"removeNode(node)\" style=\"max-width: 280px;\" [matTooltip]=\"node.name\">\n {{node.name}}\n @if (!disabled()) {\n <button matChipRemove matTooltip=\"Elimina\"><mat-icon>cancel</mat-icon></button>\n }\n </mat-chip>\n }\n }\n </mat-chip-set>\n </div>\n </div>\n </mat-tab>\n</mat-tab-group>"],"mappings":"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"}