@sd-angular/core 19.0.4 → 19.0.7

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 (56) hide show
  1. package/README.md +13 -8
  2. package/assets/{scss/README.md → STYLE-GUIDE.md} +3 -0
  3. package/components/index.d.ts +3 -0
  4. package/components/org-chart/index.d.ts +3 -0
  5. package/components/org-chart/src/org-chart-item-def.directive.d.ts +9 -0
  6. package/components/org-chart/src/org-chart.component.d.ts +26 -0
  7. package/components/org-chart/src/org-chart.model.d.ts +32 -0
  8. package/components/query-bar/src/query-bar.component.d.ts +15 -2
  9. package/components/query-bar/src/query-bar.model.d.ts +22 -0
  10. package/components/query-builder/src/query-builder.component.d.ts +23 -6
  11. package/components/query-builder/src/query-builder.model.d.ts +71 -23
  12. package/components/section/src/section.component.d.ts +4 -1
  13. package/components/splitter/src/splitter.component.d.ts +8 -2
  14. package/components/splitter/src/splitter.models.d.ts +13 -0
  15. package/components/table/src/services/table-filter/table-filter.model.d.ts +2 -0
  16. package/components/tree/index.d.ts +3 -0
  17. package/components/tree/src/tree-item-def.directive.d.ts +9 -0
  18. package/components/tree/src/tree.component.d.ts +102 -0
  19. package/components/tree/src/tree.model.d.ts +142 -0
  20. package/components/upload-file/src/upload-file.component.d.ts +7 -4
  21. package/fesm2022/sd-angular-core-components-form-generic.mjs +2 -2
  22. package/fesm2022/sd-angular-core-components-form-generic.mjs.map +1 -1
  23. package/fesm2022/sd-angular-core-components-org-chart.mjs +110 -0
  24. package/fesm2022/sd-angular-core-components-org-chart.mjs.map +1 -0
  25. package/fesm2022/sd-angular-core-components-query-bar.mjs +37 -8
  26. package/fesm2022/sd-angular-core-components-query-bar.mjs.map +1 -1
  27. package/fesm2022/sd-angular-core-components-query-builder.mjs +257 -59
  28. package/fesm2022/sd-angular-core-components-query-builder.mjs.map +1 -1
  29. package/fesm2022/sd-angular-core-components-section.mjs +7 -4
  30. package/fesm2022/sd-angular-core-components-section.mjs.map +1 -1
  31. package/fesm2022/sd-angular-core-components-splitter.mjs +39 -14
  32. package/fesm2022/sd-angular-core-components-splitter.mjs.map +1 -1
  33. package/fesm2022/sd-angular-core-components-table.mjs +6 -2
  34. package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
  35. package/fesm2022/sd-angular-core-components-tree.mjs +526 -0
  36. package/fesm2022/sd-angular-core-components-tree.mjs.map +1 -0
  37. package/fesm2022/sd-angular-core-components-upload-file.mjs +15 -9
  38. package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
  39. package/fesm2022/sd-angular-core-components.mjs +3 -0
  40. package/fesm2022/sd-angular-core-components.mjs.map +1 -1
  41. package/fesm2022/sd-angular-core-forms-autocomplete.mjs +2 -2
  42. package/fesm2022/sd-angular-core-forms-autocomplete.mjs.map +1 -1
  43. package/fesm2022/sd-angular-core-forms-select.mjs +65 -6
  44. package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
  45. package/fesm2022/sd-angular-core-modules-keycloak.mjs +30 -7
  46. package/fesm2022/sd-angular-core-modules-keycloak.mjs.map +1 -1
  47. package/forms/select/index.d.ts +1 -0
  48. package/forms/select/src/select-footer-action.directive.d.ts +11 -0
  49. package/forms/select/src/select.component.d.ts +17 -1
  50. package/modules/keycloak/htmls/auth-keycloak-error.html +54 -0
  51. package/modules/keycloak/htmls/silent-renew.html +7 -0
  52. package/modules/keycloak/keycloak.configuration.d.ts +25 -0
  53. package/modules/keycloak/keycloak.service.d.ts +5 -0
  54. package/package.json +76 -68
  55. package/sd-angular-core-19.0.7.tgz +0 -0
  56. package/sd-angular-core-19.0.4.tgz +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sd-angular-core-components-tree.mjs","sources":["../../../projects/sd-angular/components/tree/src/tree-item-def.directive.ts","../../../projects/sd-angular/components/tree/src/tree.component.ts","../../../projects/sd-angular/components/tree/src/tree.component.html","../../../projects/sd-angular/components/tree/sd-angular-core-components-tree.ts"],"sourcesContent":["import { Directive, TemplateRef, inject } from '@angular/core';\nimport { SdTreeItemContext } from './tree.model';\n\n@Directive({\n selector: '[sdTreeItemDef]',\n standalone: true,\n})\nexport class SdTreeItemDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTreeItemDefDirective<T>, ctx: unknown): ctx is SdTreeItemContext<T> {\n return true;\n }\n\n readonly templateRef: TemplateRef<SdTreeItemContext<T>> = inject(TemplateRef);\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChild,\n effect,\n input,\n isSignal,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdButton } from '@sd-angular/core/components/button';\nimport { SdQuickAction } from '@sd-angular/core/components/quick-action';\nimport { SdTreeItemDefDirective } from './tree-item-def.directive';\nimport {\n SdTreeCommand,\n SdTreeDataSource,\n SdTreeComponentOption,\n SdTreeItem,\n SdTreeItemContext,\n SdTreeItemLazy,\n SdTreeNode,\n SdTreeOption,\n SdTreeSelectionAction,\n SdTreeSelectionEvent,\n SdTreeSelectorOption,\n SdTreeToggleEvent,\n} from './tree.model';\n\nexport type SdTreeAutoIdPart = 'row' | 'toggle' | 'checkbox' | 'icon' | 'label' | 'command';\n\nexport interface SdTreeNodeAutoIds {\n row?: string;\n toggle?: string;\n checkbox?: string;\n icon?: string;\n label?: string;\n command?: string;\n}\n\nexport interface SdTreeViewCommand<T = any> {\n key: string;\n command: SdTreeCommand<T>;\n title: string;\n icon: string;\n color: SdTreeCommand<T>['color'];\n fontSet: SdTreeCommand<T>['fontSet'];\n disabled: boolean;\n autoId?: string;\n defaultColor: boolean;\n}\n\nexport interface SdTreeViewNode<T = any> extends SdTreeNode<T> {\n icon?: string;\n selected: boolean;\n selectionDisabled: boolean;\n toggleDisabled: boolean;\n toggleLabel: string;\n ariaExpanded: boolean | null;\n autoIds: SdTreeNodeAutoIds;\n commands: SdTreeViewCommand<T>[];\n context: SdTreeItemContext<T>;\n}\n\nexport interface SdTreeSelectionActionView<T = any> {\n action: SdTreeSelectionAction<T>;\n autoId: string | null;\n}\n\nconst DEFAULT_STATIC_TREE: SdTreeOption<any> = { loadType: 'static' };\nconst EMPTY_TREE_ITEMS: SdTreeItem<any>[] = [];\n\n@Component({\n selector: 'sd-tree',\n standalone: true,\n imports: [\n CommonModule,\n MatButtonModule,\n MatCheckboxModule,\n MatIconModule,\n MatMenuModule,\n MatProgressSpinnerModule,\n MatTooltipModule,\n SdButton,\n SdQuickAction,\n ],\n templateUrl: './tree.component.html',\n styleUrls: ['./tree.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.data-autoid]': 'autoId()',\n },\n})\nexport class SdTree<T = any> {\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n readonly option = input<SdTreeComponentOption<T> | undefined>(undefined);\n\n /** Migration bridge. New usage should put the data source in `option.items`. */\n readonly items = input<SdTreeDataSource<SdTreeItem<T>> | undefined>(undefined);\n /** Migration bridge. New usage should put static/lazy config in `option.tree`. */\n readonly tree = input<SdTreeOption<T> | undefined>(DEFAULT_STATIC_TREE);\n readonly selectedItemsInput = input<T[] | undefined | null>(undefined, { alias: 'selectedItems' });\n readonly commands = input<SdTreeCommand<T>[] | undefined | null>([]);\n readonly selectable = input(true, { transform: booleanAttribute });\n readonly selector = input<SdTreeSelectorOption<T> | undefined | null>(undefined);\n readonly itemTemplate = input<TemplateRef<SdTreeItemContext<T>> | undefined | null>(undefined);\n\n readonly selectedItemsChange = output<T[]>();\n readonly selectChange = output<SdTreeSelectionEvent<T>>();\n readonly expandChange = output<SdTreeToggleEvent<T>>();\n readonly collapseChange = output<SdTreeToggleEvent<T>>();\n\n readonly itemDef = contentChild(SdTreeItemDefDirective<T>);\n readonly resolvedItemsSource = computed<SdTreeDataSource<SdTreeItem<T>>>(() => {\n return this.option()?.items ?? this.items() ?? (EMPTY_TREE_ITEMS as SdTreeItem<T>[]);\n });\n readonly resolvedTree = computed<SdTreeOption<T>>(() => this.option()?.tree ?? this.tree() ?? (DEFAULT_STATIC_TREE as SdTreeOption<T>));\n readonly resolvedSelector = computed(() => this.option()?.selector ?? this.selector());\n readonly resolvedCommands = computed(() => this.option()?.commands ?? this.commands() ?? []);\n readonly resolvedSelectable = computed(() => this.option()?.selectable ?? this.selectable());\n readonly autoId = computed(() => {\n const scope = this.option()?.autoId ?? this.autoIdInput();\n return scope ? `components-tree-${scope}` : undefined;\n });\n readonly resolvedItemTemplate = computed<TemplateRef<SdTreeItemContext<T>> | undefined>(() => {\n return this.itemDef()?.templateRef || this.option()?.itemTemplate || this.itemTemplate() || undefined;\n });\n readonly indentSize = computed(() => this.resolvedTree().indentSize ?? 20);\n\n readonly #rootItems = signal<SdTreeItem<T>[]>([]);\n readonly #expandedState = signal<Record<string, boolean>>({});\n readonly #loadingState = signal<Record<string, boolean>>({});\n readonly #lazyChildren = signal<Record<string, SdTreeItemLazy<T>[]>>({});\n readonly #selectedIds = signal<Set<string>>(new Set());\n readonly #filterText = signal('');\n readonly #reloadTick = signal(0);\n\n #rootLoadId = 0;\n #lastSource?: SdTreeDataSource<SdTreeItem<T>>;\n #lastSourceValue?: SdTreeItem<T>[];\n #lastReloadTick = -1;\n\n readonly normalizedFilterText = computed(() => normalizeText(this.#filterText()));\n readonly selectionVisible = computed(() => this.resolvedSelectable() && this.resolvedSelector()?.visible === true);\n readonly selectedIdSet = computed(() => {\n const selectedItems = this.option()?.selectedItems ?? this.selectedItemsInput();\n return selectedItems ? this.#idsFromSelectedItems(selectedItems) : this.#selectedIds();\n });\n\n readonly rootNodes = computed<SdTreeNode<T>[]>(() => this.#buildNodes(this.#rootItems(), 0, null));\n\n readonly visibleNodes = computed<SdTreeNode<T>[]>(() => {\n const filterText = this.normalizedFilterText();\n const result: SdTreeNode<T>[] = [];\n\n const walk = (nodes: SdTreeNode<T>[]) => {\n for (const node of nodes) {\n const nodeOrDescendantMatches = this.#subtreeMatches(node, filterText);\n if (!filterText || nodeOrDescendantMatches) {\n result.push(node);\n }\n\n const shouldShowChildren = filterText ? nodeOrDescendantMatches : node.isExpanded;\n if (shouldShowChildren) {\n walk(node.children);\n }\n }\n };\n\n walk(this.rootNodes());\n return result;\n });\n readonly selectedItems = computed(() => this.#selectedItemsFromIds(this.selectedIdSet()));\n readonly selectedCount = computed(() => this.selectedItems().length);\n readonly selectionMessage = computed(() => {\n const items = this.selectedItems();\n const message = this.resolvedSelector()?.message;\n if (typeof message === 'function') return message(items);\n return message || `Đã chọn ${items.length} mục`;\n });\n readonly visibleSelectionActions = computed(() => {\n const items = this.selectedItems();\n return (this.resolvedSelector()?.actions || []).filter(action => {\n const hidden = typeof action.hidden === 'function' ? action.hidden(items) : action.hidden;\n return !hidden;\n });\n });\n readonly selectionActionViews = computed<SdTreeSelectionActionView<T>[]>(() => {\n return this.visibleSelectionActions().map((action, index) => ({\n action,\n autoId: this.#selectionActionAutoId(index),\n }));\n });\n readonly clearSelectionAutoId = computed(() => {\n const base = this.autoId();\n return base ? `${base}-clear-selection` : null;\n });\n\n /**\n * Template-facing row model. Expensive/variable values are resolved once per\n * signal recomputation so the HTML does not call helper methods for every CD pass.\n */\n readonly visibleViewNodes = computed<SdTreeViewNode<T>[]>(() => {\n const selectedIds = this.selectedIdSet();\n const selectedItems = this.selectedItems();\n const selector = this.resolvedSelector();\n const commands = this.resolvedCommands();\n return this.visibleNodes().map(node => this.#toViewNode(node, selectedIds, selectedItems, selector, commands));\n });\n\n readonly trackByNode = (_index: number, node: SdTreeNode<T>): string => node.id;\n\n constructor() {\n effect(() => {\n const source = this.resolvedItemsSource();\n const reloadTick = this.#reloadTick();\n\n // Data sources can be arrays, signals, sync loaders, or async loaders.\n // The effect normalizes them into #rootItems; `reload()` only bumps the tick.\n if (isSignal(source)) {\n const items = source();\n untracked(() => this.#applySignalSource(source, items, reloadTick));\n return;\n }\n\n untracked(() => {\n if (source === this.#lastSource && reloadTick === this.#lastReloadTick) return;\n\n this.#lastSource = source;\n this.#lastSourceValue = undefined;\n this.#lastReloadTick = reloadTick;\n this.#loadRootItems(source);\n });\n });\n }\n\n reload(): void {\n this.#reloadTick.update(value => value + 1);\n }\n\n filter(searchText: string | undefined | null): void {\n this.#filterText.set(searchText ?? '');\n }\n\n isSelected(node: SdTreeNode<T>): boolean {\n return this.selectedIdSet().has(node.id);\n }\n\n nodeIcon(node: SdTreeNode<T>): string | undefined {\n return this.#iconOf(node);\n }\n\n visibleCommands(node: SdTreeNode<T>): SdTreeCommand<T>[] {\n return this.resolvedCommands().filter(command => !this.#resolveBoolean(command.hidden, node.data));\n }\n\n isSelectionDisabled(node: SdTreeNode<T>): boolean {\n const disabled = this.resolvedSelector()?.disabled;\n return disabled ? disabled(node.data, this.selectedItems()) : false;\n }\n\n commandTitle(command: SdTreeCommand<T>, item: T): string {\n return typeof command.title === 'function' ? command.title(item) : command.title;\n }\n\n commandIcon(command: SdTreeCommand<T>, item: T): string {\n const icon = typeof command.icon === 'function' ? command.icon(item) : command.icon;\n return icon || 'more_horiz';\n }\n\n isCommandDisabled(command: SdTreeCommand<T>, item: T): boolean {\n return this.#resolveBoolean(command.disabled, item);\n }\n\n async toggle(node: SdTreeNode<T>, event?: Event): Promise<void> {\n event?.stopPropagation();\n const currentNode = this.#findNode(node.id) ?? node;\n if (!currentNode.hasChildren || currentNode.isLoading) return;\n\n if (currentNode.isExpanded) {\n this.#expandedState.update(state => ({ ...state, [currentNode.id]: false }));\n const toggleEvent = { item: currentNode.data, expanded: false, node: { ...currentNode, isExpanded: false } };\n this.option()?.onCollapse?.(toggleEvent);\n this.collapseChange.emit(toggleEvent);\n return;\n }\n\n await this.#ensureLazyChildren(currentNode);\n const nextNode = this.#findNode(currentNode.id) ?? currentNode;\n if (!nextNode.hasChildren) return;\n\n this.#expandedState.update(state => ({ ...state, [currentNode.id]: true }));\n const toggleEvent = { item: currentNode.data, expanded: true, node: { ...nextNode, isExpanded: true } };\n this.option()?.onExpand?.(toggleEvent);\n this.expandChange.emit(toggleEvent);\n }\n\n toggleSelection(node: SdTreeNode<T>, event?: Event): void {\n event?.stopPropagation();\n if (!this.selectionVisible() || this.isSelectionDisabled(node)) return;\n\n const selectedIds = new Set(this.selectedIdSet());\n const nextSelected = !selectedIds.has(node.id);\n if (nextSelected) {\n selectedIds.add(node.id);\n } else {\n selectedIds.delete(node.id);\n }\n\n this.#selectedIds.set(selectedIds);\n const selectedItems = this.#selectedItemsFromIds(selectedIds);\n this.option()?.onSelectedItemsChange?.(selectedItems);\n this.selectedItemsChange.emit(selectedItems);\n const selectionEvent = { item: node.data, selected: nextSelected, selectedItems };\n this.option()?.onSelect?.(selectionEvent);\n this.selectChange.emit(selectionEvent);\n }\n\n clearSelection(): void {\n this.#selectedIds.set(new Set());\n this.option()?.onSelectedItemsChange?.([]);\n this.selectedItemsChange.emit([]);\n }\n\n onSelectionAction(action: SdTreeSelectionAction<T>): void {\n action.click(this.selectedItems());\n }\n\n createContext(node: SdTreeNode<T>): SdTreeItemContext<T> {\n return this.#createContext(node, this.isSelected(node));\n }\n\n nodeAutoId(node: SdTreeNode<T>, part: SdTreeAutoIdPart): string | undefined {\n const base = this.autoId();\n return base ? `${base}-${part}-${sanitizeId(node.id)}` : undefined;\n }\n\n commandAutoId(node: SdTreeNode<T>, command: SdTreeCommand<T>): string | undefined {\n const base = this.nodeAutoId(node, 'command');\n return base ? `${base}-${sanitizeId(command.key)}` : undefined;\n }\n\n #applySignalSource(source: SdTreeDataSource<SdTreeItem<T>>, items: SdTreeItem<T>[], reloadTick: number): void {\n if (source === this.#lastSource && items === this.#lastSourceValue && reloadTick === this.#lastReloadTick) return;\n\n this.#lastSource = source;\n this.#lastSourceValue = items;\n this.#lastReloadTick = reloadTick;\n this.#setRootItems(items);\n }\n\n #loadRootItems(source: SdTreeDataSource<SdTreeItem<T>>): void {\n const loadId = ++this.#rootLoadId;\n try {\n const result = this.#readItemsSource(source);\n if (isPromiseLike(result)) {\n result\n .then(items => {\n if (loadId === this.#rootLoadId) {\n this.#setRootItems(items);\n }\n })\n .catch(() => {\n if (loadId === this.#rootLoadId) {\n this.#setRootItems([]);\n }\n });\n return;\n }\n\n if (loadId === this.#rootLoadId) {\n this.#setRootItems(result);\n }\n } catch {\n if (loadId === this.#rootLoadId) {\n this.#setRootItems([]);\n }\n }\n }\n\n #readItemsSource(source: SdTreeDataSource<SdTreeItem<T>>): SdTreeItem<T>[] | Promise<SdTreeItem<T>[]> {\n if (isSignal(source)) return source();\n if (typeof source === 'function') return source();\n return source;\n }\n\n #setRootItems(items: SdTreeItem<T>[] | undefined | null): void {\n this.#rootItems.set([...(items ?? [])]);\n this.#lazyChildren.set({});\n this.#loadingState.set({});\n }\n\n #toViewNode(\n node: SdTreeNode<T>,\n selectedIds: Set<string>,\n selectedItems: T[],\n selector: SdTreeSelectorOption<T> | undefined | null,\n commands: SdTreeCommand<T>[],\n ): SdTreeViewNode<T> {\n const selected = selectedIds.has(node.id);\n const selectionDisabled = selector?.disabled ? selector.disabled(node.data, selectedItems) : false;\n const viewNode = {\n ...node,\n icon: this.#iconOf(node),\n selected,\n selectionDisabled,\n toggleDisabled: !node.hasChildren || node.isLoading,\n toggleLabel: node.isExpanded ? 'Collapse tree item' : 'Expand tree item',\n ariaExpanded: node.hasChildren ? node.isExpanded : null,\n autoIds: this.#nodeAutoIds(node),\n commands: this.#commandViews(node, commands),\n context: undefined as unknown as SdTreeItemContext<T>,\n };\n\n viewNode.context = this.#createContext(viewNode, selected);\n return viewNode;\n }\n\n #commandViews(node: SdTreeNode<T>, commands: SdTreeCommand<T>[]): SdTreeViewCommand<T>[] {\n return commands\n .filter(command => !this.#resolveBoolean(command.hidden, node.data))\n .map(command => ({\n key: command.key,\n command,\n title: this.commandTitle(command, node.data),\n icon: this.commandIcon(command, node.data),\n color: command.color || 'secondary',\n fontSet: command.fontSet || 'material-icons-outlined',\n disabled: this.isCommandDisabled(command, node.data),\n autoId: this.commandAutoId(node, command),\n defaultColor: !command.color,\n }));\n }\n\n #createContext(node: SdTreeNode<T>, selected: boolean): SdTreeItemContext<T> {\n return {\n $implicit: node.data,\n item: node.data,\n treeItem: node.treeItem,\n node,\n level: node.level,\n expanded: node.isExpanded,\n selected,\n loading: node.isLoading,\n hasChildren: node.hasChildren,\n isLeaf: !node.hasChildren,\n toggle: () => void this.toggle(node),\n select: () => this.toggleSelection(node),\n };\n }\n\n #nodeAutoIds(node: SdTreeNode<T>): SdTreeNodeAutoIds {\n return {\n row: this.nodeAutoId(node, 'row'),\n toggle: this.nodeAutoId(node, 'toggle'),\n checkbox: this.nodeAutoId(node, 'checkbox'),\n icon: this.nodeAutoId(node, 'icon'),\n label: this.nodeAutoId(node, 'label'),\n command: this.nodeAutoId(node, 'command'),\n };\n }\n\n #selectionActionAutoId(index: number): string | null {\n const base = this.autoId();\n return base ? `${base}-selection-action-${index}` : null;\n }\n\n #buildNodes(items: SdTreeItem<T>[], level: number, parent: SdTreeNode<T> | null): SdTreeNode<T>[] {\n const option = this.resolvedTree();\n const maxDepth = option.maxDepth;\n if (maxDepth !== undefined && level > maxDepth) return [];\n\n return items.map(item => {\n const rawChildren = this.#childrenOf(item);\n const hasChildren = rawChildren.length > 0 || this.#hasLazyChildren(item);\n const isExpanded = this.#expandedState()[item.id] ?? item.expanded ?? this.#defaultExpanded(level);\n const node: SdTreeNode<T> = {\n treeItem: item,\n data: item.data,\n id: item.id,\n label: item.label,\n level,\n parent,\n children: [],\n hasChildren,\n isExpanded,\n isLoading: this.#loadingState()[item.id] ?? false,\n };\n node.children = this.#buildNodes(rawChildren, level + 1, node);\n return node;\n });\n }\n\n #childrenOf(item: SdTreeItem<T>): SdTreeItem<T>[] {\n const option = this.resolvedTree();\n // Static items own their `children`; lazy items keep loaded children in component state.\n if (option.loadType === 'lazy') {\n return this.#lazyChildren()[item.id] ?? [];\n }\n\n return item.children ?? [];\n }\n\n #hasLazyChildren(item: SdTreeItem<T>): boolean {\n const option = this.resolvedTree();\n if (option.loadType !== 'lazy' || this.#lazyChildren()[item.id]) return false;\n // Lazy mode uses `hasChildren` as the branch hint before children are loaded.\n return item.hasChildren ?? true;\n }\n\n #defaultExpanded(level: number): boolean {\n const option = this.resolvedTree();\n if (option.loadType !== 'static') return false;\n\n const value = option.defaultExpanded ?? false;\n if (value === true) return true;\n if (value === false) return false;\n return level < value;\n }\n\n #iconOf(node: SdTreeNode<T>): string | undefined {\n // One optional `treeItem.icon` handles both branch and leaf overrides.\n // Without it, branches get folder icons while leaves intentionally render no icon.\n if (node.treeItem.icon) return node.treeItem.icon;\n if (!node.hasChildren) return undefined;\n return node.isExpanded ? 'folder_open' : 'folder';\n }\n\n async #ensureLazyChildren(node: SdTreeNode<T>): Promise<void> {\n const option = this.resolvedTree();\n if (option.loadType !== 'lazy' || node.children.length > 0 || this.#lazyChildren()[node.id]) return;\n\n this.#loadingState.update(state => ({ ...state, [node.id]: true }));\n try {\n const lazyItem = node.treeItem as SdTreeItemLazy<T>;\n const children = await Promise.resolve(option.onExpandChildren(lazyItem));\n this.#lazyChildren.update(state => ({ ...state, [node.id]: children }));\n // Do not write `children` onto lazy items; that field belongs to static items only.\n lazyItem.hasChildren = children.length > 0;\n } finally {\n this.#loadingState.update(state => ({ ...state, [node.id]: false }));\n }\n }\n\n #findNode(id: string): SdTreeNode<T> | undefined {\n return this.#flattenAll(this.rootNodes()).find(node => node.id === id);\n }\n\n #flattenAll(nodes: SdTreeNode<T>[]): SdTreeNode<T>[] {\n const result: SdTreeNode<T>[] = [];\n const walk = (current: SdTreeNode<T>[]) => {\n for (const node of current) {\n result.push(node);\n walk(node.children);\n }\n };\n walk(nodes);\n return result;\n }\n\n #selectedItemsFromIds(selectedIds: Set<string>): T[] {\n return this.#flattenAll(this.rootNodes())\n .filter(node => selectedIds.has(node.id))\n .map(node => node.data);\n }\n\n #idsFromSelectedItems(selectedItems: T[]): Set<string> {\n const selectedRefs = new Set(selectedItems);\n const selectedDataIds = new Set(selectedItems.map(item => this.#dataId(item)).filter((id): id is string => !!id));\n const result = new Set<string>();\n\n for (const node of this.#flattenAll(this.rootNodes())) {\n const dataId = this.#dataId(node.data);\n if (selectedRefs.has(node.data) || (dataId && selectedDataIds.has(dataId))) {\n result.add(node.id);\n }\n }\n\n return result;\n }\n\n #dataId(item: T): string | undefined {\n const record = item as Record<string, unknown>;\n const value = record?.['id'] ?? record?.['code'] ?? record?.['value'];\n return value != null && value !== '' ? String(value) : undefined;\n }\n\n #nodeMatches(node: SdTreeNode<T>, filterText: string): boolean {\n return normalizeText(node.label).includes(filterText);\n }\n\n #subtreeMatches(node: SdTreeNode<T>, filterText: string): boolean {\n if (this.#nodeMatches(node, filterText)) return true;\n return node.children.some(child => this.#subtreeMatches(child, filterText));\n }\n\n #resolveBoolean(resolver: boolean | ((item: T) => boolean) | undefined, item: T): boolean {\n return typeof resolver === 'function' ? resolver(item) : !!resolver;\n }\n}\n\nfunction normalizeText(value: string): string {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[\\u0111\\u0110]/g, match => (match === '\\u0110' ? 'D' : 'd'))\n .toLowerCase()\n .trim();\n}\n\nfunction sanitizeId(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, '-');\n}\n\nfunction isPromiseLike<T>(value: T[] | Promise<T[]>): value is Promise<T[]> {\n return !!value && typeof (value as Promise<T[]>).then === 'function';\n}\n","@let _templateRef = resolvedItemTemplate();\n@let _selectionVisible = selectionVisible();\n@let _selectedCount = selectedCount();\n@let _selectionMessage = selectionMessage();\n@let _selectionActions = selectionActionViews();\n\n<div class=\"sd-tree\" role=\"tree\" [style.--sd-tree-indent-size]=\"indentSize() + 'px'\">\n @for (node of visibleViewNodes(); track node.id) {\n <div\n class=\"sd-tree__row\"\n role=\"treeitem\"\n [class.sd-tree__row--selected]=\"node.selected\"\n [style.--sd-tree-level]=\"node.level\"\n [attr.aria-expanded]=\"node.ariaExpanded\"\n [attr.aria-selected]=\"_selectionVisible ? node.selected : null\"\n [attr.data-autoid]=\"node.autoIds.row\">\n <div class=\"sd-tree__main\">\n <button\n type=\"button\"\n class=\"sd-tree__toggle\"\n [class.sd-tree__toggle--placeholder]=\"!node.hasChildren\"\n [disabled]=\"node.toggleDisabled\"\n [attr.aria-label]=\"node.toggleLabel\"\n [attr.data-autoid]=\"node.autoIds.toggle\"\n (click)=\"toggle(node, $event)\">\n @if (node.isLoading) {\n <mat-progress-spinner diameter=\"16\" mode=\"indeterminate\" />\n } @else if (node.hasChildren) {\n <mat-icon>{{ node.isExpanded ? 'expand_more' : 'chevron_right' }}</mat-icon>\n }\n </button>\n\n @if (_selectionVisible) {\n <mat-checkbox\n class=\"sd-tree__checkbox\"\n [checked]=\"node.selected\"\n [disabled]=\"node.selectionDisabled\"\n [attr.data-autoid]=\"node.autoIds.checkbox\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleSelection(node)\" />\n }\n\n @if (node.icon) {\n <mat-icon class=\"sd-tree__item-icon\" color=\"primary\" [attr.data-autoid]=\"node.autoIds.icon\">{{ node.icon }}</mat-icon>\n }\n\n <div class=\"sd-tree__content\" [class.sd-tree__content--custom]=\"_templateRef\" [attr.data-autoid]=\"node.autoIds.label\">\n @if (_templateRef) {\n <ng-container *ngTemplateOutlet=\"_templateRef; context: node.context\" />\n } @else {\n <span class=\"sd-tree__label\">{{ node.label }}</span>\n }\n </div>\n </div>\n\n @if (node.commands.length) {\n <button\n type=\"button\"\n class=\"sd-tree__command-trigger\"\n mat-icon-button\n [matMenuTriggerFor]=\"commandMenu\"\n [attr.data-autoid]=\"node.autoIds.command\"\n (click)=\"$event.stopPropagation()\">\n <mat-icon class=\"c-icon\" fontSet=\"material-icons-outlined\">more_vert</mat-icon>\n </button>\n <mat-menu #commandMenu=\"matMenu\" class=\"sd-tree__command-menu\">\n @for (command of node.commands; track command.key) {\n <button\n type=\"button\"\n class=\"sd-tree__command-menu-item\"\n mat-menu-item\n [disabled]=\"command.disabled\"\n [attr.data-autoid]=\"command.autoId\"\n (click)=\"command.command.click(node.data)\">\n <span class=\"sd-tree__command-menu-content\">\n <mat-icon\n class=\"c-icon sd-tree__command-menu-icon\"\n [class.sd-tree__command-menu-icon--default]=\"command.defaultColor\"\n [color]=\"command.color\"\n [fontSet]=\"command.fontSet\">\n {{ command.icon }}\n </mat-icon>\n <span class=\"sd-tree__command-title\">{{ command.title }}</span>\n </span>\n </button>\n }\n </mat-menu>\n }\n </div>\n }\n</div>\n\n<sd-quick-action [opened]=\"_selectedCount > 0\">\n <div class=\"d-flex align-items-center\" sdMessage>\n <div class=\"c-bg-length\">\n <span class=\"c-length sd-tree__qa-count\">{{ _selectedCount }}</span>\n </div>\n <div class=\"c-message\">\n {{ _selectionMessage }}\n </div>\n </div>\n\n <div class=\"d-flex align-items-center mr-8 sd-tree__qa-actions\" sdAction>\n @for (actionView of _selectionActions; track $index) {\n <sd-button\n [autoId]=\"actionView.autoId\"\n class=\"ml-4\"\n [tooltip]=\"actionView.action.tooltip\"\n [prefixIcon]=\"actionView.action.icon\"\n [color]=\"actionView.action.color || 'primary'\"\n [type]=\"actionView.action.type || 'light'\"\n [fontSet]=\"actionView.action.fontSet\"\n [title]=\"actionView.action.title\"\n (click)=\"onSelectionAction(actionView.action)\" />\n }\n <sd-button\n [autoId]=\"clearSelectionAutoId()\"\n class=\"ml-4\"\n prefixIcon=\"close\"\n color=\"secondary\"\n type=\"outline\"\n width=\"35px\"\n (click)=\"clearSelection()\" />\n </div>\n</sd-quick-action>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -722,23 +722,29 @@ class SdUploadFile {
722
722
  };
723
723
  /**
724
724
  * Tải xuống một tệp tin dựa trên đối tượng PreviewFile.
725
- * * Ưu tiên:
726
- * 1. Tải xuống từ thuộc tính `file`.
727
- * 2. Tải xuống từ thuộc tính `src`.
728
- * 3. Gọi hàm download dựa vào `idOrKey`.
725
+ *
726
+ * Ưu tiên:
727
+ * 1. Nếu consumer implement hàm download (input `download` hoặc configuration) VÀ file có
728
+ * `idOrKey` (file đã lưu trên server) → LUÔN gọi hàm download. KHÔNG mở `src` (URL lấy từ detail).
729
+ * Dùng cho trường hợp tải file qua API có xác thực thay vì truy cập trực tiếp URL.
730
+ * 2. Ngược lại (không có hàm download, hoặc file local chưa upload nên chưa có `idOrKey`) →
731
+ * tải trực tiếp từ `file` (blob) hoặc `src` (URL).
729
732
  *
730
733
  * @param previewFile Đối tượng PreviewFile chứa thông tin tệp tin.
731
734
  */
732
735
  onDownload = (previewFile) => {
733
- if (previewFile.file || previewFile.src) {
734
- BrowserUtilities.download(previewFile.file || previewFile.src, previewFile.fileName);
736
+ const downloadHandler = this.#getDownloadHandler();
737
+ // (1) Có hàm download + file đã lưu (idOrKey) → luôn trigger hàm download, bỏ qua URL từ detail.
738
+ if (downloadHandler && previewFile.idOrKey) {
739
+ downloadHandler(previewFile.idOrKey, this.args());
735
740
  return;
736
741
  }
737
- if (previewFile.idOrKey) {
738
- this.#getDownloadHandler()?.(previewFile.idOrKey, this.args());
742
+ // (2) Không có hàm download (hoặc file local chưa có idOrKey) → tải trực tiếp từ blob/URL.
743
+ if (previewFile.file || previewFile.src) {
744
+ BrowserUtilities.download(previewFile.file || previewFile.src, previewFile.fileName);
739
745
  return;
740
746
  }
741
- console.error('Invalid preview file', previewFile);
747
+ console.error('Invalid preview file (no download handler / file / src)', previewFile);
742
748
  };
743
749
  isLastVisibleOverlay(fileIndex) {
744
750
  return this.formControl.disabled && fileIndex === this.maxOfImage() - 1 && this.previewFiles().length > this.maxOfImage();