@apia/tree 2.0.9 → 2.0.10

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 (54) hide show
  1. package/dist/OOTree/OOTreeChildren.d.ts +14 -0
  2. package/dist/OOTree/OOTreeChildren.d.ts.map +1 -0
  3. package/dist/OOTree/OOTreeChildren.js +17 -0
  4. package/dist/OOTree/OOTreeChildren.js.map +1 -0
  5. package/dist/OOTree/OOTreeNode.d.ts +30 -0
  6. package/dist/OOTree/OOTreeNode.d.ts.map +1 -0
  7. package/dist/OOTree/OOTreeNode.js +133 -0
  8. package/dist/OOTree/OOTreeNode.js.map +1 -0
  9. package/dist/OOTree/index.d.ts +36 -0
  10. package/dist/OOTree/index.d.ts.map +1 -0
  11. package/dist/OOTree/index.js +126 -0
  12. package/dist/OOTree/index.js.map +1 -0
  13. package/dist/OOTree/types.d.ts +11 -0
  14. package/dist/OOTree/types.d.ts.map +1 -0
  15. package/dist/SearchLabel.js +30 -0
  16. package/dist/SearchLabel.js.map +1 -0
  17. package/dist/Tree.d.ts +7 -0
  18. package/dist/Tree.d.ts.map +1 -0
  19. package/dist/Tree.js +131 -0
  20. package/dist/Tree.js.map +1 -0
  21. package/dist/TreeContext.d.ts +13 -0
  22. package/dist/TreeContext.d.ts.map +1 -0
  23. package/dist/TreeContext.js +22 -0
  24. package/dist/TreeContext.js.map +1 -0
  25. package/dist/TreeDataController.d.ts +116 -0
  26. package/dist/TreeDataController.d.ts.map +1 -0
  27. package/dist/TreeDataController.js +611 -0
  28. package/dist/TreeDataController.js.map +1 -0
  29. package/dist/TreeItem.js +51 -0
  30. package/dist/TreeItem.js.map +1 -0
  31. package/dist/TreeItemChildren.js +20 -0
  32. package/dist/TreeItemChildren.js.map +1 -0
  33. package/dist/TreeItemLabel.js +72 -0
  34. package/dist/TreeItemLabel.js.map +1 -0
  35. package/dist/getDomProps.js +37 -0
  36. package/dist/getDomProps.js.map +1 -0
  37. package/dist/index.d.ts +7 -417
  38. package/dist/index.js +6 -1546
  39. package/dist/index.js.map +1 -1
  40. package/dist/renderers/DefaultIconRenderer.js +17 -0
  41. package/dist/renderers/DefaultIconRenderer.js.map +1 -0
  42. package/dist/renderers/DefaultLabelRenderer.js +9 -0
  43. package/dist/renderers/DefaultLabelRenderer.js.map +1 -0
  44. package/dist/renderers/Spacer.js +9 -0
  45. package/dist/renderers/Spacer.js.map +1 -0
  46. package/dist/types.d.ts +211 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/useTreeData.d.ts +25 -0
  49. package/dist/useTreeData.d.ts.map +1 -0
  50. package/dist/useTreeData.js +129 -0
  51. package/dist/useTreeData.js.map +1 -0
  52. package/dist/util.js +210 -0
  53. package/dist/util.js.map +1 -0
  54. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeDataController.js","sources":["../src/TreeDataController.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-dynamic-delete */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable max-classes-per-file */\r\nimport React, { RefObject, useEffect, useState } from 'react';\r\nimport {\r\n TDataNode,\r\n TDataNodeContainer,\r\n TId,\r\n TTreeDataControllerConfig,\r\n TTreeDataControllerState,\r\n} from './types';\r\nimport {\r\n getFirstNonFilteredChild,\r\n getLastVisibleChild,\r\n getNextChild,\r\n getNextNodeWithKey,\r\n getPreviousChild,\r\n selectAllNodesBetweenTwoNodes,\r\n} from './util';\r\nimport {\r\n EventEmitter,\r\n PropsStore,\r\n TModify,\r\n TRequireOnlyOne,\r\n addBoundary,\r\n getSpecificParent,\r\n TUpdateFieldConfiguration,\r\n TPropsConfiguration,\r\n usePropsSelector,\r\n useMount,\r\n useLatest,\r\n shallowEqual,\r\n} from '@apia/util';\r\n\r\nconst trees: Record<string, TreeDataController> = {};\r\nconst treesRecordEmitter = new (class TreesRecordEmitter extends EventEmitter<{\r\n addController: { name: string; controller: TreeDataController };\r\n}> {\r\n emit<K extends 'addController'>(\r\n eventName: K,\r\n params: {\r\n addController: {\r\n name: string;\r\n controller: TreeDataController;\r\n };\r\n }[K],\r\n ): void {\r\n super.emit(eventName, params);\r\n\r\n trees[params.name] = params.controller;\r\n }\r\n})();\r\n\r\nexport function useTreeDataController<\r\n TreeType extends TreeDataController<any, any> = TreeDataController<any, any>,\r\n>(name: string) {\r\n const [controller, setDataController] = useState<TreeDataController>(\r\n trees[name],\r\n );\r\n\r\n useEffect(() => {\r\n if (trees[name] !== controller) setDataController(trees[name]);\r\n\r\n return treesRecordEmitter.on('addController', (ev) => {\r\n if (ev.name === name) setDataController(ev.controller);\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return controller as unknown as TreeType;\r\n}\r\n\r\nexport function getTreeDataController<TreeType = TreeDataController>(\r\n name: string,\r\n) {\r\n return trees[name] as unknown as TreeType;\r\n}\r\n\r\nexport function deleteTreeDataController(name: string) {\r\n delete trees[name];\r\n}\r\n\r\nclass TreeDataController<\r\n NodeProps extends Record<string, unknown> = Record<string, unknown>,\r\n NodeType extends TDataNode<NodeProps> = TDataNode<NodeProps>,\r\n> extends EventEmitter<{\r\n onArrowUpOnFirstElement: boolean;\r\n expandNode: NodeType;\r\n mustFocus: TId;\r\n stateUpdate: null;\r\n}> {\r\n _configuration: RefObject<TTreeDataControllerConfig<NodeProps, NodeType>>;\r\n\r\n get configuration() {\r\n return { ...this._configuration };\r\n }\r\n\r\n hasApendedFirstChild = false;\r\n\r\n /**\r\n * Este array se usa para conocer los padres faltantes al momento de la\r\n * construcción del árbol, de forma de optimizar el proceso\r\n */\r\n missingParents: TId[] = [];\r\n\r\n nonEmittedUpdates: TId[] = [];\r\n\r\n get state() {\r\n return this.propsStore.getFieldProps<TTreeDataControllerState>(\r\n this.stateKey,\r\n );\r\n }\r\n\r\n stateKey = 'treeState';\r\n\r\n get stateStore() {\r\n return this.propsStore as unknown as PropsStore<TTreeDataControllerState>;\r\n }\r\n\r\n constructor(\r\n public name: string,\r\n configuration: RefObject<\r\n Partial<TTreeDataControllerConfig<NodeProps, NodeType>>\r\n >,\r\n public propsStore = new PropsStore<NodeType>({\r\n logCommands: {\r\n propsStore: `treeProps_${name}`,\r\n propsLog: `treeLog_${name}`,\r\n propsSuscriptors: `propsSuscriptors_${name}`,\r\n updateProp: `updateProp_${name}`,\r\n },\r\n }),\r\n ) {\r\n super();\r\n\r\n this._configuration = (configuration ?? {\r\n current: { emitUpdates: true },\r\n }) as RefObject<Partial<TTreeDataControllerConfig<NodeProps, NodeType>>>;\r\n\r\n (this._configuration.current as TTreeDataControllerConfig).emitUpdates =\r\n (this._configuration.current as TTreeDataControllerConfig).emitUpdates ??\r\n true;\r\n\r\n this.setState(this.getInitialState());\r\n treesRecordEmitter.emit('addController', {\r\n name,\r\n controller: this as unknown as TreeDataController,\r\n });\r\n this.initRoot();\r\n }\r\n\r\n destructor() {\r\n this.propsStore.destructor();\r\n }\r\n\r\n append(\r\n node: Omit<\r\n TModify<\r\n NodeType,\r\n { children?: NodeType['children']; parentId?: NodeType['parentId'] }\r\n >,\r\n 'nodeProps' | 'actualParentId'\r\n > &\r\n Partial<Pick<NodeType, 'nodeProps'>>,\r\n ) {\r\n const newNode = { ...(node as NodeType), nodeProps: node.nodeProps ?? {} };\r\n\r\n // Se busca el padre, si el padre no existe se agrega a la raíz\r\n let father: TId;\r\n if (\r\n newNode.parentId !== undefined &&\r\n this.propsStore.getFieldProps(newNode.parentId)?.children\r\n ) {\r\n father = newNode.parentId;\r\n } else {\r\n father = 'root';\r\n if (newNode.parentId) this.missingParents.push(newNode.parentId);\r\n newNode.actualParentId = newNode.parentId;\r\n newNode.parentId = 'root';\r\n }\r\n\r\n this.propsStore.updateField(\r\n newNode.id,\r\n {\r\n ...newNode,\r\n children: newNode.children ?? [],\r\n },\r\n { isUrgent: true },\r\n );\r\n this.setState({ length: this.state.length + 1 });\r\n\r\n // Se buscan elementos que estén en la raíz y sean hijos del nodo que se\r\n // está agregando. De esta forma al crear el árbol nos aseguramos que ningún\r\n // nodo quede afuera y evitamos iteraciones innecesarias\r\n if (this.missingParents.includes(newNode.id)) {\r\n this.propsStore.getFieldProps('root').children.forEach((currentChild) => {\r\n if (\r\n this.propsStore.getFieldProps(currentChild).actualParentId ===\r\n newNode.id\r\n ) {\r\n this.move(currentChild, newNode.id);\r\n }\r\n });\r\n this.missingParents = this.missingParents.filter(\r\n (current) => current !== newNode.id,\r\n );\r\n }\r\n\r\n // Se agrega el nodo a los hijos del padre\r\n this.propsStore.updateField(\r\n father,\r\n {\r\n children: [\r\n ...this.propsStore.getFieldProps(father).children,\r\n newNode.id,\r\n ],\r\n hasLoaded: true,\r\n },\r\n { noEmit: this._configuration.current?.emitUpdates === false },\r\n );\r\n\r\n if (this._configuration.current?.emitUpdates === false)\r\n this.nonEmittedUpdates.push(father);\r\n\r\n if (!this.hasApendedFirstChild) {\r\n this.hasApendedFirstChild = true;\r\n this.setFocusedNode(newNode.id, true);\r\n }\r\n\r\n if (newNode.isExpanded) this.toggleNodeExpandedState(newNode.id, true);\r\n }\r\n\r\n /**\r\n * Cuando se quieren agregar muchos nodos, es conveniente llamar primero al\r\n * método batchInit y luego de finalizar, al método batchFinish()\r\n */\r\n batchInit() {\r\n this.config({ emitUpdates: false });\r\n this.setState({ isLoading: true }, { isUrgent: true });\r\n }\r\n\r\n private getNodesRecursive(nodeId: TId = 'root'): TId[] {\r\n const node = this.propsStore.getFieldProps(nodeId);\r\n\r\n return node.children.reduce<TId[]>(\r\n (prev, current) => [...prev, ...this.getNodesRecursive(current)],\r\n [...node.children],\r\n );\r\n }\r\n\r\n /**\r\n * Cuando se quieren agregar muchos nodos, es conveniente llamar primero al\r\n * método batchInit y luego de finalizar, al método batchFinish()\r\n */\r\n batchFinish() {\r\n this.config({ emitUpdates: true });\r\n setTimeout(() => this.setState({ isLoading: false }), 0);\r\n\r\n const children = [...this.getNodesRecursive()];\r\n\r\n const deleteNodes = this.previousNodes.filter(\r\n (current) => !children.find((search) => search === current),\r\n );\r\n deleteNodes.forEach((current) => this.remove(current));\r\n\r\n this.config({ emitUpdates: true });\r\n setTimeout(() => this.setState({ isLoading: false }), 0);\r\n }\r\n\r\n config(newConf: Partial<TTreeDataControllerConfig<NodeProps, NodeType>>) {\r\n if (\r\n this._configuration.current?.emitUpdates === false &&\r\n newConf.emitUpdates !== false\r\n ) {\r\n this.nonEmittedUpdates.forEach((current) =>\r\n this.propsStore.updateField(current, {\r\n children: [...this.propsStore.getFieldProps(current).children],\r\n }),\r\n );\r\n this.nonEmittedUpdates = [];\r\n }\r\n Object.assign(\r\n this._configuration.current as TTreeDataControllerConfig,\r\n newConf,\r\n );\r\n }\r\n\r\n deselectAll() {\r\n this.state.selectedNodes.forEach((currentId) =>\r\n this.propsStore.updateField(currentId, { isSelected: false }),\r\n );\r\n this.setState({ selectedNodes: [] });\r\n }\r\n\r\n forceEmitUpdate() {\r\n this.propsStore.updateField<{ forceUpdate: number }>('root', {\r\n forceUpdate:\r\n (this.propsStore.getFieldProps<{ forceUpdate: number }>('root')\r\n .forceUpdate ?? 0) + 1,\r\n });\r\n }\r\n\r\n getInitialState(): TTreeDataControllerState {\r\n return {\r\n expandedNodes: [],\r\n filteredNodes: [],\r\n focusedNode: null,\r\n isLoading: false,\r\n length: 0,\r\n selectedNodes: [],\r\n };\r\n }\r\n\r\n getNodesAsArray() {\r\n const allFields = { ...this.propsStore.fields };\r\n delete allFields[this.stateKey];\r\n delete allFields.root;\r\n return Object.values(allFields);\r\n }\r\n\r\n /**\r\n * Devuelve un array que contiene el id de todos los nodos pertenecientes al\r\n * árbol\r\n */\r\n getNodesIds() {\r\n const allFields = { ...this.propsStore.fields };\r\n delete allFields[this.stateKey];\r\n delete allFields.root;\r\n return Object.keys(allFields);\r\n }\r\n\r\n getParentId(parentId: TId) {\r\n return this.propsStore.getFieldProps(parentId).parentId;\r\n }\r\n\r\n /**\r\n * Este método permite controlar el comportamiento con el teclado desde fuera\r\n * del componente.\r\n */\r\n handleKey(ev: React.KeyboardEvent) {\r\n const focusedId = this.state.focusedNode as TId;\r\n const nodeProps = this.propsStore.getFieldProps(focusedId);\r\n if (ev.key === '*') {\r\n if (this.state.focusedNode === null) return;\r\n const parent = this.propsStore.getFieldProps(\r\n this.propsStore.getFieldProps(this.state.focusedNode).parentId,\r\n );\r\n parent.children.forEach((current) =>\r\n this.toggleNodeExpandedState(current, true),\r\n );\r\n } else if (ev.key.match(/^\\w$/)) {\r\n const nextChildWithKey = getNextNodeWithKey(\r\n this,\r\n focusedId,\r\n ev.key,\r\n true,\r\n );\r\n if (nextChildWithKey !== null) {\r\n this.setFocusedNode(nextChildWithKey);\r\n this.emit('mustFocus', nextChildWithKey);\r\n }\r\n } else\r\n switch (ev.code) {\r\n case 'Home': {\r\n const firstChild = getFirstNonFilteredChild(this, 'root');\r\n if (firstChild === null) return;\r\n if (ev.shiftKey && ev.ctrlKey && this.state.focusedNode !== null) {\r\n selectAllNodesBetweenTwoNodes(\r\n this,\r\n firstChild,\r\n this.state.focusedNode,\r\n true,\r\n );\r\n }\r\n this.setFocusedNode(firstChild);\r\n this.emit('mustFocus', firstChild);\r\n break;\r\n }\r\n case 'End': {\r\n const lastVisibleChild = getLastVisibleChild(this, 'root', true);\r\n if (lastVisibleChild !== null) {\r\n if (ev.shiftKey && ev.ctrlKey && this.state.focusedNode !== null) {\r\n selectAllNodesBetweenTwoNodes(\r\n this,\r\n lastVisibleChild,\r\n this.state.focusedNode,\r\n true,\r\n );\r\n }\r\n this.setFocusedNode(lastVisibleChild);\r\n this.emit('mustFocus', lastVisibleChild);\r\n }\r\n break;\r\n }\r\n case 'ArrowRight': {\r\n if (nodeProps.isLeaf) return;\r\n ev.preventDefault();\r\n if (nodeProps.isExpanded) {\r\n const firstChild = getFirstNonFilteredChild(this, nodeProps.id);\r\n if (firstChild !== null) {\r\n this.setFocusedNode(firstChild);\r\n this.emit('mustFocus', firstChild);\r\n }\r\n } else this.toggleNodeExpandedState(nodeProps.id, true);\r\n break;\r\n }\r\n case 'ArrowLeft': {\r\n ev.preventDefault();\r\n if (nodeProps.isLeaf || !nodeProps.isExpanded) {\r\n if (\r\n nodeProps.parentId !== 'root' &&\r\n nodeProps.parentId !== undefined\r\n ) {\r\n this.setFocusedNode(nodeProps.parentId);\r\n this.emit('mustFocus', nodeProps.parentId);\r\n }\r\n } else this.toggleNodeExpandedState(nodeProps.id, false);\r\n break;\r\n }\r\n case 'ArrowUp': {\r\n ev.preventDefault();\r\n const prevChild = getPreviousChild(this, nodeProps.id, true);\r\n if (prevChild !== null) {\r\n if (ev.shiftKey) this.toggleNodeSelectedState(prevChild, true);\r\n this.setFocusedNode(prevChild);\r\n this.emit('mustFocus', prevChild);\r\n } else this.emit('onArrowUpOnFirstElement', true);\r\n break;\r\n }\r\n case 'ArrowDown': {\r\n ev.preventDefault();\r\n const nextChild = getNextChild(this, nodeProps.id, false, true);\r\n if (nextChild !== null) {\r\n if (ev.shiftKey) this.toggleNodeSelectedState(nextChild, true);\r\n this.setFocusedNode(nextChild);\r\n this.emit('mustFocus', nextChild);\r\n }\r\n break;\r\n }\r\n case 'Space': {\r\n if (this._configuration.current?.disableSelection) return;\r\n ev.preventDefault();\r\n this.toggleNodeSelectedState(nodeProps.id);\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n isNode(\r\n node: NodeType | TDataNodeContainer<NodeProps> | TId,\r\n ): node is NodeType {\r\n return typeof node === 'object' && 'parentId' in node;\r\n }\r\n\r\n isNodeContainer(\r\n node: NodeType | TDataNodeContainer<NodeProps> | TId,\r\n ): node is TDataNodeContainer<NodeProps> {\r\n return typeof node === 'object' && !this.isNode(node);\r\n }\r\n\r\n includes(searchNode: NodeType) {\r\n return !!this.propsStore.getFieldProps(searchNode.id);\r\n }\r\n\r\n initRoot() {\r\n this.propsStore.updateField(\r\n 'root',\r\n { children: [], id: 'root' },\r\n { isUrgent: true },\r\n );\r\n }\r\n\r\n move(\r\n moveNode: TId,\r\n destinationNode: TId,\r\n afterOrBefore?: TRequireOnlyOne<{\r\n after: NodeType | TId;\r\n before: NodeType | TId;\r\n position: number;\r\n }>,\r\n ) {\r\n const currentFather = this.propsStore.getFieldProps(\r\n this.propsStore.getFieldProps(moveNode).parentId,\r\n );\r\n const newFather = this.propsStore.getFieldProps(destinationNode);\r\n\r\n if (!currentFather) {\r\n console.warn('The current node does not belong to the tree.', moveNode);\r\n return;\r\n }\r\n\r\n if (!newFather) {\r\n console.warn(\r\n 'The destination node does not belong to the tree. No action will be made',\r\n destinationNode,\r\n );\r\n return;\r\n }\r\n\r\n currentFather.children = currentFather.children?.filter(\r\n (search) => search !== moveNode,\r\n );\r\n if (!newFather.children) newFather.children = [];\r\n if (!afterOrBefore) newFather.children.push(moveNode);\r\n else if (afterOrBefore.position) {\r\n newFather.children.splice(afterOrBefore.position - 1, 0, moveNode);\r\n } else {\r\n const key = afterOrBefore.after\r\n ? afterOrBefore.after\r\n : afterOrBefore.before;\r\n\r\n const relatedNodeKey = key && this.isNode(key) ? key.id : key;\r\n const relatedNodeIndex = newFather.children.findIndex(\r\n (search) => search === relatedNodeKey,\r\n );\r\n\r\n const actualIndex = addBoundary(\r\n afterOrBefore.before !== undefined\r\n ? relatedNodeIndex\r\n : relatedNodeIndex + 1,\r\n 0,\r\n );\r\n\r\n if (actualIndex === -1 || actualIndex === newFather.children.length)\r\n newFather.children.push(moveNode);\r\n else newFather.children.splice(actualIndex, 0, moveNode);\r\n }\r\n\r\n this.propsStore.updateField(currentFather.id, {\r\n children: [...(currentFather.children ?? [])],\r\n });\r\n this.propsStore.updateField(newFather.id, {\r\n children: [...newFather.children],\r\n });\r\n this.propsStore.updateField(moveNode, {\r\n parentId: newFather.id,\r\n });\r\n }\r\n\r\n /**\r\n * Borra el nodo del árbol, y dependiendo del parámetro removeChildren, borra\r\n * también sus hijos.\r\n *\r\n * @param removeChildren - Si se pasa en false, los nodos hijos son movidos al root\r\n */\r\n remove(removeNode: NodeType | TId, removeChildren = true) {\r\n const removeNodeId = this.isNode(removeNode) ? removeNode.id : removeNode;\r\n\r\n const removingNode = this.propsStore.getFieldProps(removeNodeId);\r\n if (!removingNode) return;\r\n\r\n const father = this.propsStore.getFieldProps(removingNode.parentId);\r\n if (father) {\r\n this.propsStore.updateField(father.id, {\r\n children: father.children?.filter((search) => search !== removeNodeId),\r\n });\r\n }\r\n\r\n removingNode.children?.forEach((current) => {\r\n if (removeChildren) {\r\n this.remove(current);\r\n } else {\r\n this.move(current, 'root');\r\n }\r\n });\r\n\r\n this.setState({\r\n selectedNodes: this.state.selectedNodes.filter(\r\n (current) => current !== removeNodeId,\r\n ),\r\n focusedNode:\r\n this.state.focusedNode === removeNodeId ? null : this.state.focusedNode,\r\n length: this.state.length - 1,\r\n });\r\n this.propsStore.removeField(removeNodeId);\r\n }\r\n\r\n removeMultiple(nodes: TId[], removeChildren = true) {\r\n nodes.forEach((current) => this.remove(current, removeChildren));\r\n }\r\n\r\n previousNodes: TId[] = [];\r\n /**\r\n * Borra todos los nodos del árbol.\r\n */\r\n removeAll() {\r\n if (this.configuration.current?.emitUpdates === false) {\r\n this.previousNodes = this.getNodesIds();\r\n this.propsStore.updateField(\r\n 'root',\r\n { children: [], id: 'root' },\r\n { isUrgent: true, noEmit: true },\r\n );\r\n /* this.previousNodes.forEach((current) =>\r\n this.propsStore.removeField(current),\r\n ); */\r\n } else {\r\n this.hasApendedFirstChild = false;\r\n this.setState({ focusedNode: null }, { isUrgent: true });\r\n this.setSelectedNodes([]);\r\n this.initRoot();\r\n Object.keys(this.propsStore.fields).forEach((current) => {\r\n if (!['root', this.stateKey].includes(current))\r\n this.propsStore.removeField(current);\r\n });\r\n }\r\n }\r\n\r\n selectAll() {\r\n this.setState({\r\n selectedNodes: this.getNodesIds(),\r\n });\r\n this.state.selectedNodes.forEach((currentId) =>\r\n this.propsStore.updateField(currentId, { isSelected: true }),\r\n );\r\n }\r\n\r\n setExpandedNodes(nodes: TId[]) {\r\n this.state.expandedNodes.forEach((current) =>\r\n this.propsStore.updateField(current, { isExpanded: false }),\r\n );\r\n\r\n this.setState({ expandedNodes: nodes });\r\n nodes.forEach((current) =>\r\n this.propsStore.updateField(current, { isExpanded: true }),\r\n );\r\n }\r\n\r\n setFocusedNode(key: TId, avoidSelection?: boolean) {\r\n if (this.state.focusedNode !== null)\r\n this.propsStore.updateField(this.state.focusedNode, { isFocused: false });\r\n this.setState({\r\n focusedNode: key,\r\n });\r\n if (\r\n !this._configuration.current?.isMultiple &&\r\n !avoidSelection &&\r\n (this._configuration.current?.selectionMode ?? 'onFocus') === 'onFocus'\r\n )\r\n this.setSelectedNodes([key]);\r\n this.propsStore.updateField(key, { isFocused: true });\r\n }\r\n\r\n setSelectedNodes(nodes: TId[], force = false) {\r\n if (this._configuration.current?.disableSelection && !force) return;\r\n this.state.selectedNodes.forEach((current) =>\r\n this.propsStore.updateField(current, { isSelected: false }),\r\n );\r\n this.setState({\r\n selectedNodes: nodes.filter((current) => {\r\n const { isSelectable } = this.propsStore.getFieldProps(current);\r\n if (isSelectable !== false)\r\n this.propsStore.updateField(current, { isSelected: true });\r\n return isSelectable !== false;\r\n }),\r\n });\r\n }\r\n\r\n setSelectedNodesByClickEvent(ev: React.MouseEvent) {\r\n if (this._configuration.current?.disableSelection) return;\r\n const nodeKey = getSpecificParent(\r\n ev.target as HTMLElement,\r\n (current) => current.getAttribute('role') === 'treeitem',\r\n )?.getAttribute('data-key');\r\n if (nodeKey) {\r\n const nodeProps = this.propsStore.getFieldProps(nodeKey);\r\n if (nodeProps.isDisabled || nodeProps.isSelectable === false) return;\r\n\r\n const previousSelectionKeys = [...this.state.selectedNodes];\r\n const allowMultiple =\r\n this._configuration.current?.isMultiple &&\r\n (this._configuration.current?.selectionMode !== 'explicitMultiple' ||\r\n ev.ctrlKey ||\r\n ev.shiftKey);\r\n\r\n // eslint-disable-next-line no-nested-ternary\r\n const newSelection: TId[] = allowMultiple\r\n ? nodeProps.isSelected\r\n ? previousSelectionKeys.filter((current) => current !== nodeKey)\r\n : [...previousSelectionKeys, nodeKey]\r\n : [nodeKey];\r\n\r\n this.setSelectedNodes(newSelection);\r\n } else console.warn('Cannot set selection, no treeitem found', ev);\r\n }\r\n\r\n setState = (\r\n updateProps: Partial<TTreeDataControllerState>,\r\n conf?: TUpdateFieldConfiguration,\r\n ) => {\r\n this.propsStore.updateField<TTreeDataControllerState>(\r\n this.stateKey,\r\n {\r\n ...this.state,\r\n ...updateProps,\r\n },\r\n conf,\r\n );\r\n this.emit('stateUpdate', null);\r\n };\r\n\r\n useState = <T>(selector: (state: TTreeDataControllerState) => T) => {\r\n const [selectedState, setSelectedState] = useState(selector(this.state));\r\n const latestState = useLatest(selectedState);\r\n\r\n useMount(() => {\r\n return this.on('stateUpdate', () => {\r\n const newSelection = selector(this.state);\r\n\r\n if (!shallowEqual(newSelection, latestState.current)) {\r\n setSelectedState(newSelection);\r\n }\r\n });\r\n });\r\n\r\n return selectedState;\r\n };\r\n\r\n toggleNodeExpandedState(key: TId, shouldExpand?: boolean) {\r\n const nodeProps = this.propsStore.getFieldProps(key);\r\n if (nodeProps.isDisabled || nodeProps.isLeaf || nodeProps.isLoading) return;\r\n\r\n if (this._configuration.current?.onLoadData && !nodeProps.hasLoaded) {\r\n this.propsStore.updateField(key, { isLoading: true });\r\n this._configuration.current?.onLoadData(nodeProps).finally(() => {\r\n this.propsStore.updateField(key, {\r\n isLoading: false,\r\n isExpanded: true,\r\n hasLoaded: true,\r\n });\r\n\r\n this.setState({\r\n expandedNodes: [...this.state.expandedNodes, key],\r\n });\r\n this._configuration.current?.onExpand?.(\r\n this.propsStore.getFieldProps(key),\r\n );\r\n });\r\n } else {\r\n const { expandedNodes } = this.state;\r\n const shouldExpandInner =\r\n shouldExpand !== undefined\r\n ? shouldExpand\r\n : !expandedNodes.includes(key);\r\n if (this.propsStore.getFieldProps(key)?.isDisabled) return;\r\n\r\n this.setState({\r\n expandedNodes: shouldExpandInner\r\n ? [...expandedNodes, key]\r\n : expandedNodes.filter((current) => current !== key),\r\n });\r\n this.propsStore.updateField(key, { isExpanded: shouldExpandInner });\r\n this._configuration.current?.onExpand?.(\r\n this.propsStore.getFieldProps(key),\r\n );\r\n }\r\n }\r\n\r\n toggleNodeSelectedState(key: TId, isSelected?: boolean) {\r\n if (this._configuration.current?.disableSelection) return;\r\n const nodeProps = this.propsStore.getFieldProps(key);\r\n if (nodeProps.isDisabled || nodeProps.isSelectable === false) return;\r\n\r\n const shouldSelect =\r\n isSelected !== undefined\r\n ? isSelected\r\n : !this.state.selectedNodes.includes(key);\r\n\r\n if (\r\n (shouldSelect && nodeProps.isSelected) ||\r\n (isSelected === false && !nodeProps.isSelected)\r\n )\r\n return;\r\n\r\n if (\r\n shouldSelect &&\r\n !this._configuration.current?.isMultiple &&\r\n this.state.selectedNodes[0]\r\n )\r\n this.toggleNodeSelectedState(this.state.selectedNodes[0], false);\r\n this.propsStore.updateField(key, { isSelected: shouldSelect });\r\n this.setState({\r\n selectedNodes: shouldSelect\r\n ? [...this.state.selectedNodes, key]\r\n : this.state.selectedNodes.filter((current) => current !== key),\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Este hook permite escuchar las props de un árbol, para ello es necesario\r\n * pasar el handler.\r\n *\r\n * @param handler\r\n * @param configuration\r\n * @returns\r\n */\r\nexport function useTreeSelector<\r\n NodeProps extends Record<string, unknown> = Record<string, unknown>,\r\n NodeType extends TDataNode<NodeProps> = TDataNode<NodeProps>,\r\n Selected = Record<string, unknown>,\r\n PropsType extends Record<string, unknown> = TTreeDataControllerState,\r\n>(\r\n handler: TreeDataController<NodeProps, NodeType>,\r\n configuration?: TPropsConfiguration<Selected, PropsType>,\r\n): Selected {\r\n return usePropsSelector<Selected, PropsType>(\r\n handler?.stateKey ?? '__NO__TREE__KEY__',\r\n {\r\n propsStore: handler?.propsStore as unknown as PropsStore<PropsType>,\r\n ...configuration,\r\n },\r\n );\r\n}\r\n\r\n/**\r\n * Este hook permite escuchar las props de un árbol, para ello es necesario\r\n * pasar el handler.\r\n *\r\n * @param handler\r\n * @param configuration\r\n * @returns\r\n */\r\nexport function useTreeSelectorByName<\r\n NodeProps extends Record<string, unknown> = Record<string, unknown>,\r\n NodeType extends TDataNode<NodeProps> = TDataNode<NodeProps>,\r\n Selected = Record<string, unknown>,\r\n PropsType extends Record<string, unknown> = TTreeDataControllerState,\r\n>(\r\n treeName: string,\r\n configuration?: TPropsConfiguration<Selected, PropsType>,\r\n): {\r\n handler: TreeDataController<NodeProps, NodeType>;\r\n selection: Selected;\r\n} {\r\n const handler =\r\n useTreeDataController<TreeDataController<NodeProps, NodeType>>(treeName);\r\n const selection = usePropsSelector<Selected, PropsType>(\r\n handler?.stateKey ?? '__NO__TREE__KEY__',\r\n {\r\n propsStore: handler?.propsStore as unknown as PropsStore<PropsType>,\r\n ...configuration,\r\n },\r\n );\r\n return { selection, handler };\r\n}\r\n\r\nexport default TreeDataController;\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { jsx, Fragment, jsxs } from '@apia/theme/jsx-runtime';
2
+ import React from 'react';
3
+ import { shallowEqual } from 'react-redux';
4
+ import { Box } from '@apia/theme';
5
+ import { getDomProps } from './getDomProps.js';
6
+ import { useTreeContext } from './TreeContext.js';
7
+ import TreeItemChildren from './TreeItemChildren.js';
8
+ import TreeItemLabel from './TreeItemLabel.js';
9
+ import { usePropsSelector } from '@apia/util';
10
+
11
+ const TreeItem = ({ level, treeKey }) => {
12
+ const { handler, name, forceUpdate, treeProps } = useTreeContext();
13
+ const props = usePropsSelector(treeKey, {
14
+ selector: (current) => current,
15
+ comparator: (prevProps, newProps) => {
16
+ return shallowEqual(prevProps, newProps) && shallowEqual(prevProps?.children, newProps?.children);
17
+ },
18
+ propsStore: handler.propsStore
19
+ });
20
+ const nodes = React.useMemo(
21
+ () => props.children?.map(
22
+ (current) => handler.propsStore.getFieldProps(current)
23
+ ) ?? [],
24
+ [props.children, handler.propsStore]
25
+ );
26
+ const domProps = getDomProps(treeProps, name, "node", props);
27
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
28
+ Box,
29
+ {
30
+ as: "li",
31
+ ...domProps,
32
+ className: `${domProps.className ?? ""} tree__item`,
33
+ children: [
34
+ /* @__PURE__ */ jsx(TreeItemLabel, { level, treeKey }),
35
+ props.isExpanded && /* @__PURE__ */ jsx(
36
+ TreeItemChildren,
37
+ {
38
+ forceUpdate,
39
+ role: "group",
40
+ level,
41
+ nodes
42
+ }
43
+ )
44
+ ]
45
+ }
46
+ ) });
47
+ };
48
+ var TreeItem$1 = React.memo(TreeItem);
49
+
50
+ export { TreeItem$1 as default };
51
+ //# sourceMappingURL=TreeItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeItem.js","sources":["../src/TreeItem.tsx"],"sourcesContent":["import React from 'react';\r\nimport { shallowEqual } from 'react-redux';\r\nimport { Box } from '@apia/theme';\r\nimport { getDomProps } from './getDomProps';\r\nimport { useTreeContext } from './TreeContext';\r\nimport TreeItemChildren from './TreeItemChildren';\r\nimport TreeItemLabel from './TreeItemLabel';\r\nimport { TDataNode, TId } from './types';\r\nimport { usePropsSelector } from '@apia/util';\r\n\r\nconst TreeItem = ({ level, treeKey }: { level: number; treeKey: TId }) => {\r\n const { handler, name, forceUpdate, treeProps } = useTreeContext();\r\n\r\n const props = usePropsSelector<TDataNode, TDataNode>(treeKey, {\r\n selector: (current) => current,\r\n comparator: (prevProps, newProps) => {\r\n return (\r\n shallowEqual(prevProps, newProps) &&\r\n shallowEqual(prevProps?.children, newProps?.children)\r\n );\r\n },\r\n propsStore: handler.propsStore,\r\n });\r\n\r\n const nodes = React.useMemo(\r\n () =>\r\n props.children?.map((current) =>\r\n handler.propsStore.getFieldProps(current),\r\n ) ?? [],\r\n [props.children, handler.propsStore],\r\n );\r\n\r\n const domProps = getDomProps(treeProps, name, 'node', props);\r\n\r\n return (\r\n <>\r\n <Box\r\n as=\"li\"\r\n {...domProps}\r\n className={`${domProps.className ?? ''} tree__item`}\r\n >\r\n <TreeItemLabel level={level} treeKey={treeKey} />\r\n {props.isExpanded && (\r\n <TreeItemChildren\r\n forceUpdate={forceUpdate}\r\n role=\"group\"\r\n level={level}\r\n nodes={nodes}\r\n />\r\n )}\r\n </Box>\r\n </>\r\n );\r\n};\r\n\r\nexport default React.memo(TreeItem);\r\n"],"names":[],"mappings":";;;;;;;;;;AAUA,MAAM,QAAW,GAAA,CAAC,EAAE,KAAA,EAAO,SAA+C,KAAA;AACxE,EAAA,MAAM,EAAE,OAAS,EAAA,IAAA,EAAM,WAAa,EAAA,SAAA,KAAc,cAAe,EAAA,CAAA;AAEjE,EAAM,MAAA,KAAA,GAAQ,iBAAuC,OAAS,EAAA;AAAA,IAC5D,QAAA,EAAU,CAAC,OAAY,KAAA,OAAA;AAAA,IACvB,UAAA,EAAY,CAAC,SAAA,EAAW,QAAa,KAAA;AACnC,MACE,OAAA,YAAA,CAAa,WAAW,QAAQ,CAAA,IAChC,aAAa,SAAW,EAAA,QAAA,EAAU,UAAU,QAAQ,CAAA,CAAA;AAAA,KAExD;AAAA,IACA,YAAY,OAAQ,CAAA,UAAA;AAAA,GACrB,CAAA,CAAA;AAED,EAAA,MAAM,QAAQ,KAAM,CAAA,OAAA;AAAA,IAClB,MACE,MAAM,QAAU,EAAA,GAAA;AAAA,MAAI,CAAC,OAAA,KACnB,OAAQ,CAAA,UAAA,CAAW,cAAc,OAAO,CAAA;AAAA,SACrC,EAAC;AAAA,IACR,CAAC,KAAA,CAAM,QAAU,EAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,GACrC,CAAA;AAEA,EAAA,MAAM,QAAW,GAAA,WAAA,CAAY,SAAW,EAAA,IAAA,EAAM,QAAQ,KAAK,CAAA,CAAA;AAE3D,EAAA,uBAEI,GAAA,CAAA,QAAA,EAAA,EAAA,QAAA,kBAAA,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,IAAA;AAAA,MACF,GAAG,QAAA;AAAA,MACJ,SAAW,EAAA,CAAA,EAAG,QAAS,CAAA,SAAA,IAAa,EAAE,CAAA,WAAA,CAAA;AAAA,MAEtC,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,aAAA,EAAA,EAAc,OAAc,OAAkB,EAAA,CAAA;AAAA,QAC9C,MAAM,UACL,oBAAA,GAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,WAAA;AAAA,YACA,IAAK,EAAA,OAAA;AAAA,YACL,KAAA;AAAA,YACA,KAAA;AAAA,WAAA;AAAA,SACF;AAAA,OAAA;AAAA,KAAA;AAAA,GAGN,EAAA,CAAA,CAAA;AAEJ,CAAA,CAAA;AAEA,iBAAe,KAAA,CAAM,KAAK,QAAQ,CAAA;;;;"}
@@ -0,0 +1,20 @@
1
+ import { jsx } from '@apia/theme/jsx-runtime';
2
+ import React from 'react';
3
+ import { Box } from '@apia/theme';
4
+ import { useTreeContext } from './TreeContext.js';
5
+ import TreeItem from './TreeItem.js';
6
+
7
+ const TreeItemChildren = React.forwardRef(({ level, nodes, forceUpdate, ...props }, ref) => {
8
+ const { handler } = useTreeContext();
9
+ return /* @__PURE__ */ jsx(Box, { ref, as: "ul", ...props, children: nodes?.map((current) => {
10
+ const currentProps = handler.propsStore.getFieldProps(current.id);
11
+ if (!currentProps)
12
+ return null;
13
+ return currentProps.isFiltered ? null : /* @__PURE__ */ jsx(TreeItem, { level: level + 1, treeKey: current.id }, current.id);
14
+ }) });
15
+ });
16
+ TreeItemChildren.displayName = "TreeItemChildren";
17
+ var TreeItemChildren$1 = React.memo(TreeItemChildren);
18
+
19
+ export { TreeItemChildren$1 as default };
20
+ //# sourceMappingURL=TreeItemChildren.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeItemChildren.js","sources":["../src/TreeItemChildren.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Box, BoxProps } from '@apia/theme';\r\nimport { useTreeContext } from './TreeContext';\r\nimport TreeItem from './TreeItem';\r\nimport { TDataNode } from './types';\r\n\r\nconst TreeItemChildren = React.forwardRef<\r\n HTMLDivElement,\r\n {\r\n forceUpdate: number;\r\n level: number;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n nodes: TDataNode<any>[];\r\n } & BoxProps\r\n>(({ level, nodes, forceUpdate, ...props }, ref) => {\r\n const { handler } = useTreeContext();\r\n\r\n return (\r\n <Box ref={ref} as=\"ul\" {...props}>\r\n {nodes?.map((current) => {\r\n const currentProps = handler.propsStore.getFieldProps(current.id);\r\n if (!currentProps) return null;\r\n\r\n return currentProps.isFiltered ? null : (\r\n <TreeItem level={level + 1} key={current.id} treeKey={current.id} />\r\n );\r\n })}\r\n </Box>\r\n );\r\n});\r\n\r\nTreeItemChildren.displayName = 'TreeItemChildren';\r\n\r\nexport default React.memo(TreeItemChildren);\r\n"],"names":[],"mappings":";;;;;;AAMA,MAAM,gBAAA,GAAmB,KAAM,CAAA,UAAA,CAQ7B,CAAC,EAAE,KAAO,EAAA,KAAA,EAAO,WAAa,EAAA,GAAG,KAAM,EAAA,EAAG,GAAQ,KAAA;AAClD,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,cAAe,EAAA,CAAA;AAEnC,EACE,uBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,GAAA,EAAU,EAAG,EAAA,IAAA,EAAM,GAAG,KACxB,EAAA,QAAA,EAAA,KAAA,EAAO,GAAI,CAAA,CAAC,OAAY,KAAA;AACvB,IAAA,MAAM,YAAe,GAAA,OAAA,CAAQ,UAAW,CAAA,aAAA,CAAc,QAAQ,EAAE,CAAA,CAAA;AAChE,IAAA,IAAI,CAAC,YAAA;AAAc,MAAO,OAAA,IAAA,CAAA;AAE1B,IAAA,OAAO,YAAa,CAAA,UAAA,GAAa,IAC/B,mBAAA,GAAA,CAAC,QAAS,EAAA,EAAA,KAAA,EAAO,KAAQ,GAAA,CAAA,EAAoB,OAAS,EAAA,OAAA,CAAQ,EAA7B,EAAA,EAAA,OAAA,CAAQ,EAAyB,CAAA,CAAA;AAAA,GAErE,CACH,EAAA,CAAA,CAAA;AAEJ,CAAC,CAAA,CAAA;AAED,gBAAA,CAAiB,WAAc,GAAA,kBAAA,CAAA;AAE/B,yBAAe,KAAA,CAAM,KAAK,gBAAgB,CAAA;;;;"}
@@ -0,0 +1,72 @@
1
+ import { jsxs, jsx } from '@apia/theme/jsx-runtime';
2
+ import React from 'react';
3
+ import { shallowEqual } from 'react-redux';
4
+ import { Box, Spinner } from '@apia/theme';
5
+ import DefaultIconRenderer from './renderers/DefaultIconRenderer.js';
6
+ import DefaultLabelRenderer from './renderers/DefaultLabelRenderer.js';
7
+ import Spacer from './renderers/Spacer.js';
8
+ import { useTreeContext } from './TreeContext.js';
9
+ import { usePropsSelector } from '@apia/util';
10
+ import { Icon } from '@apia/icons';
11
+
12
+ const TreeItemLabel = ({ level, treeKey }) => {
13
+ const {
14
+ handler,
15
+ treeProps: { toggleNodesOnLabelClick }
16
+ } = useTreeContext();
17
+ const props = usePropsSelector(treeKey, {
18
+ selector: (current) => current,
19
+ comparator: (prevProps, newProps) => {
20
+ return shallowEqual(prevProps, newProps) && shallowEqual(prevProps?.children, newProps?.children);
21
+ },
22
+ propsStore: handler.propsStore
23
+ });
24
+ const Renderer = React.useMemo(
25
+ () => props.labelRenderer ?? DefaultLabelRenderer,
26
+ [props.labelRenderer]
27
+ );
28
+ const handleToggle = React.useCallback(() => {
29
+ handler.toggleNodeExpandedState(treeKey);
30
+ }, [handler, treeKey]);
31
+ const IconRenderer = React.useMemo(() => {
32
+ return typeof props.icon === "string" ? DefaultIconRenderer : props.icon;
33
+ }, [props.icon]);
34
+ const onClick = React.useCallback(() => {
35
+ if (props.allowToggleExpandedFromLabel !== false)
36
+ handler.toggleNodeExpandedState(treeKey);
37
+ }, [handler, props.allowToggleExpandedFromLabel, treeKey]);
38
+ return /* @__PURE__ */ jsxs(
39
+ Box,
40
+ {
41
+ as: "span",
42
+ className: `tree__nodeItemLabel ${props.isFocused ? "focus" : ""}`,
43
+ children: [
44
+ /* @__PURE__ */ jsx(Spacer, { level }),
45
+ (props.isLoading || props.isExpanded && props.isLeaf !== true || props.isLeaf === false || (props.children?.length ?? 0) > 0 || props.isLeaf === void 0 && !props.hasLoaded && handler.configuration.current?.onLoadData) && /* @__PURE__ */ jsx(Box, { className: "tree__expanderWrapper", children: props.isLoading ? /* @__PURE__ */ jsx(Spinner, { sx: { width: "iconSm", height: "iconSm" } }) : /* @__PURE__ */ jsx(
46
+ Icon,
47
+ {
48
+ className: "tree__expandIcon",
49
+ onClick: handleToggle,
50
+ name: props.isExpanded ? "ArrowDownThin" : "ArrowRightThin",
51
+ title: "",
52
+ size: 20
53
+ }
54
+ ) }),
55
+ props.icon && IconRenderer && /* @__PURE__ */ jsx(IconRenderer, { ...props }),
56
+ /* @__PURE__ */ jsx(
57
+ Box,
58
+ {
59
+ as: "span",
60
+ className: "tree__nodeItemLabelRenderer",
61
+ onClick: toggleNodesOnLabelClick !== false ? onClick : void 0,
62
+ children: /* @__PURE__ */ jsx(Renderer, { ...props, level })
63
+ }
64
+ )
65
+ ]
66
+ }
67
+ );
68
+ };
69
+ var TreeItemLabel$1 = React.memo(TreeItemLabel);
70
+
71
+ export { TreeItemLabel$1 as default };
72
+ //# sourceMappingURL=TreeItemLabel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeItemLabel.js","sources":["../src/TreeItemLabel.tsx"],"sourcesContent":["import React from 'react';\r\nimport { shallowEqual } from 'react-redux';\r\nimport { Box, Spinner } from '@apia/theme';\r\nimport DefaultIconRenderer from './renderers/DefaultIconRenderer';\r\nimport DefaultLabelRenderer from './renderers/DefaultLabelRenderer';\r\nimport Spacer from './renderers/Spacer';\r\nimport { useTreeContext } from './TreeContext';\r\nimport { TDataNode, TId } from './types';\r\nimport { usePropsSelector } from '@apia/util';\r\nimport { Icon } from '@apia/icons';\r\n\r\nconst TreeItemLabel = ({ level, treeKey }: { level: number; treeKey: TId }) => {\r\n const {\r\n handler,\r\n treeProps: { toggleNodesOnLabelClick },\r\n } = useTreeContext();\r\n\r\n const props = usePropsSelector<TDataNode, TDataNode>(treeKey, {\r\n selector: (current) => current,\r\n comparator: (prevProps, newProps) => {\r\n return (\r\n shallowEqual(prevProps, newProps) &&\r\n shallowEqual(prevProps?.children, newProps?.children)\r\n );\r\n },\r\n propsStore: handler.propsStore,\r\n });\r\n\r\n const Renderer = React.useMemo(\r\n () => props.labelRenderer ?? DefaultLabelRenderer,\r\n [props.labelRenderer],\r\n );\r\n\r\n const handleToggle = React.useCallback(() => {\r\n handler.toggleNodeExpandedState(treeKey);\r\n }, [handler, treeKey]);\r\n\r\n const IconRenderer = React.useMemo(() => {\r\n return typeof props.icon === 'string' ? DefaultIconRenderer : props.icon;\r\n }, [props.icon]);\r\n\r\n const onClick = React.useCallback(() => {\r\n if (props.allowToggleExpandedFromLabel !== false)\r\n handler.toggleNodeExpandedState(treeKey);\r\n }, [handler, props.allowToggleExpandedFromLabel, treeKey]);\r\n\r\n return (\r\n <Box\r\n as=\"span\"\r\n className={`tree__nodeItemLabel ${props.isFocused ? 'focus' : ''}`}\r\n >\r\n <Spacer level={level} />\r\n {(props.isLoading ||\r\n (props.isExpanded && props.isLeaf !== true) ||\r\n props.isLeaf === false ||\r\n (props.children?.length ?? 0) > 0 ||\r\n (props.isLeaf === undefined &&\r\n !props.hasLoaded &&\r\n handler.configuration.current?.onLoadData)) && (\r\n <Box className=\"tree__expanderWrapper\">\r\n {props.isLoading ? (\r\n <Spinner sx={{ width: 'iconSm', height: 'iconSm' }} />\r\n ) : (\r\n <Icon\r\n className=\"tree__expandIcon\"\r\n onClick={handleToggle}\r\n name={props.isExpanded ? 'ArrowDownThin' : 'ArrowRightThin'}\r\n title=\"\"\r\n size={20}\r\n />\r\n )}\r\n </Box>\r\n )}\r\n {props.icon && IconRenderer && <IconRenderer {...props} />}\r\n <Box\r\n as=\"span\"\r\n className=\"tree__nodeItemLabelRenderer\"\r\n onClick={toggleNodesOnLabelClick !== false ? onClick : undefined}\r\n >\r\n <Renderer {...props} level={level} />\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n\r\nexport default React.memo(TreeItemLabel);\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { getTreeDataController } from './TreeDataController.js';
2
+
3
+ function getActiveDescendantName(treeName, nodeId) {
4
+ return `${treeName}__${nodeId}`;
5
+ }
6
+ function getDomProps(_, treeName, type, par) {
7
+ switch (type) {
8
+ case "node": {
9
+ const node = par;
10
+ const tree = getTreeDataController(treeName);
11
+ return {
12
+ "aria-disabled": node.isDisabled,
13
+ "aria-expanded": node.isLeaf ? void 0 : !!node.isExpanded,
14
+ "aria-label": node.label,
15
+ ...tree.configuration.current?.disableSelection ? void 0 : {
16
+ "aria-selected": node.isSelectable !== false && !node.isDisabled ? !!node.isSelected : void 0
17
+ },
18
+ className: node.className,
19
+ color: node.color,
20
+ "data-key": node.id,
21
+ id: getActiveDescendantName(treeName, node.id),
22
+ role: "treeitem",
23
+ title: node.title
24
+ };
25
+ }
26
+ default: {
27
+ const tree = par;
28
+ return {
29
+ role: "tree",
30
+ "aria-multiselectable": tree.isMultiple
31
+ };
32
+ }
33
+ }
34
+ }
35
+
36
+ export { getActiveDescendantName, getDomProps };
37
+ //# sourceMappingURL=getDomProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDomProps.js","sources":["../src/getDomProps.ts"],"sourcesContent":["import { BoxProps } from '@apia/theme';\r\nimport { TTreeProps, TDataNode, TId } from './types';\r\nimport TreeDataController, {\r\n getTreeDataController,\r\n} from './TreeDataController';\r\n\r\nexport type TDomProps = Omit<BoxProps, 'as'> & Record<string, unknown>;\r\n\r\nexport function getActiveDescendantName(treeName: string, nodeId: TId) {\r\n return `${treeName}__${nodeId}`;\r\n}\r\n\r\nexport function getDomProps(\r\n treeProps: TTreeProps,\r\n treeName: string,\r\n type: 'tree',\r\n node: TTreeProps,\r\n controller: TreeDataController,\r\n): BoxProps;\r\nexport function getDomProps(\r\n treeProps: TTreeProps,\r\n treeName: string,\r\n type: 'node',\r\n node: TDataNode,\r\n): BoxProps;\r\nexport function getDomProps(\r\n _: TTreeProps,\r\n treeName: string,\r\n type: 'tree' | 'node',\r\n par: TDataNode | TTreeProps,\r\n): TDomProps {\r\n switch (type) {\r\n case 'node': {\r\n const node = par as TDataNode;\r\n const tree = getTreeDataController(treeName);\r\n return {\r\n 'aria-disabled': node.isDisabled,\r\n 'aria-expanded': node.isLeaf ? undefined : !!node.isExpanded,\r\n 'aria-label': node.label,\r\n ...(tree.configuration.current?.disableSelection\r\n ? undefined\r\n : {\r\n 'aria-selected':\r\n node.isSelectable !== false && !node.isDisabled\r\n ? !!node.isSelected\r\n : undefined,\r\n }),\r\n className: node.className,\r\n color: node.color,\r\n 'data-key': node.id,\r\n id: getActiveDescendantName(treeName, node.id),\r\n role: 'treeitem',\r\n title: node.title,\r\n };\r\n }\r\n default: {\r\n const tree = par as TTreeProps;\r\n return {\r\n role: 'tree',\r\n 'aria-multiselectable': tree.isMultiple,\r\n };\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAQgB,SAAA,uBAAA,CAAwB,UAAkB,MAAa,EAAA;AACrE,EAAO,OAAA,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,CAAA;AAC/B,CAAA;AAeO,SAAS,WACd,CAAA,CAAA,EACA,QACA,EAAA,IAAA,EACA,GACW,EAAA;AACX,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,MAAQ,EAAA;AACX,MAAA,MAAM,IAAO,GAAA,GAAA,CAAA;AACb,MAAM,MAAA,IAAA,GAAO,sBAAsB,QAAQ,CAAA,CAAA;AAC3C,MAAO,OAAA;AAAA,QACL,iBAAiB,IAAK,CAAA,UAAA;AAAA,QACtB,iBAAiB,IAAK,CAAA,MAAA,GAAS,KAAY,CAAA,GAAA,CAAC,CAAC,IAAK,CAAA,UAAA;AAAA,QAClD,cAAc,IAAK,CAAA,KAAA;AAAA,QACnB,GAAI,IAAA,CAAK,aAAc,CAAA,OAAA,EAAS,mBAC5B,KACA,CAAA,GAAA;AAAA,UACE,eAAA,EACE,IAAK,CAAA,YAAA,KAAiB,KAAS,IAAA,CAAC,KAAK,UACjC,GAAA,CAAC,CAAC,IAAA,CAAK,UACP,GAAA,KAAA,CAAA;AAAA,SACR;AAAA,QACJ,WAAW,IAAK,CAAA,SAAA;AAAA,QAChB,OAAO,IAAK,CAAA,KAAA;AAAA,QACZ,YAAY,IAAK,CAAA,EAAA;AAAA,QACjB,EAAI,EAAA,uBAAA,CAAwB,QAAU,EAAA,IAAA,CAAK,EAAE,CAAA;AAAA,QAC7C,IAAM,EAAA,UAAA;AAAA,QACN,OAAO,IAAK,CAAA,KAAA;AAAA,OACd,CAAA;AAAA,KACF;AAAA,IACA,SAAS;AACP,MAAA,MAAM,IAAO,GAAA,GAAA,CAAA;AACb,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,MAAA;AAAA,QACN,wBAAwB,IAAK,CAAA,UAAA;AAAA,OAC/B,CAAA;AAAA,KACF;AAAA,GACF;AACF;;;;"}