@apia/tree 1.0.4 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/OOTree/OOTreeChildren.d.ts +14 -0
- package/dist/OOTree/OOTreeChildren.d.ts.map +1 -0
- package/dist/OOTree/OOTreeChildren.js +17 -0
- package/dist/OOTree/OOTreeChildren.js.map +1 -0
- package/dist/OOTree/OOTreeNode.d.ts +30 -0
- package/dist/OOTree/OOTreeNode.d.ts.map +1 -0
- package/dist/OOTree/OOTreeNode.js +133 -0
- package/dist/OOTree/OOTreeNode.js.map +1 -0
- package/dist/OOTree/index.d.ts +36 -0
- package/dist/OOTree/index.d.ts.map +1 -0
- package/dist/OOTree/index.js +126 -0
- package/dist/OOTree/index.js.map +1 -0
- package/dist/OOTree/types.d.ts +11 -0
- package/dist/OOTree/types.d.ts.map +1 -0
- package/dist/SearchLabel.js +32 -0
- package/dist/SearchLabel.js.map +1 -0
- package/dist/Tree.d.ts +7 -0
- package/dist/Tree.d.ts.map +1 -0
- package/dist/Tree.js +131 -0
- package/dist/Tree.js.map +1 -0
- package/dist/TreeContext.d.ts +13 -0
- package/dist/TreeContext.d.ts.map +1 -0
- package/dist/TreeContext.js +22 -0
- package/dist/TreeContext.js.map +1 -0
- package/dist/TreeDataController.d.ts +116 -0
- package/dist/TreeDataController.d.ts.map +1 -0
- package/dist/TreeDataController.js +616 -0
- package/dist/TreeDataController.js.map +1 -0
- package/dist/TreeItem.js +51 -0
- package/dist/TreeItem.js.map +1 -0
- package/dist/TreeItemChildren.js +20 -0
- package/dist/TreeItemChildren.js.map +1 -0
- package/dist/TreeItemLabel.js +72 -0
- package/dist/TreeItemLabel.js.map +1 -0
- package/dist/getDomProps.js +37 -0
- package/dist/getDomProps.js.map +1 -0
- package/dist/index.d.ts +8 -407
- package/dist/index.js +7 -1749
- package/dist/index.js.map +1 -1
- package/dist/renderers/DefaultIconRenderer.js +18 -0
- package/dist/renderers/DefaultIconRenderer.js.map +1 -0
- package/dist/renderers/DefaultLabelRenderer.js +10 -0
- package/dist/renderers/DefaultLabelRenderer.js.map +1 -0
- package/dist/renderers/Spacer.js +10 -0
- package/dist/renderers/Spacer.js.map +1 -0
- package/dist/types.d.ts +211 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/useTreeData.d.ts +25 -0
- package/dist/useTreeData.d.ts.map +1 -0
- package/dist/useTreeData.js +131 -0
- package/dist/useTreeData.js.map +1 -0
- package/dist/util.js +220 -0
- package/dist/util.js.map +1 -0
- package/package.json +22 -33
- package/LICENSE.md +0 -21
- package/README.md +0 -28
- package/cleanDist.json +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TreeDataController.js","sources":["../src/TreeDataController.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-dynamic-delete */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable max-classes-per-file */\nimport React, { RefObject, useEffect, useState } from 'react';\nimport {\n TDataNode,\n TDataNodeContainer,\n TId,\n TTreeDataControllerConfig,\n TTreeDataControllerState,\n} from './types';\nimport {\n getFirstNonFilteredChild,\n getLastVisibleChild,\n getNextChild,\n getNextNodeWithKey,\n getPreviousChild,\n selectAllNodesBetweenTwoNodes,\n} from './util';\nimport {\n EventEmitter,\n PropsStore,\n TModify,\n TRequireOnlyOne,\n addBoundary,\n getSpecificParent,\n TUpdateFieldConfiguration,\n TPropsConfiguration,\n usePropsSelector,\n useMount,\n useLatest,\n shallowEqual,\n} from '@apia/util';\n\nconst trees: Record<string, TreeDataController> = {};\nconst treesRecordEmitter = new (class TreesRecordEmitter extends EventEmitter<{\n addController: { name: string; controller: TreeDataController };\n}> {\n emit<K extends 'addController'>(\n eventName: K,\n params: {\n addController: {\n name: string;\n controller: TreeDataController;\n };\n }[K],\n ): void {\n super.emit(eventName, params);\n\n trees[params.name] = params.controller;\n }\n})();\n\nexport function useTreeDataController<\n TreeType extends TreeDataController<any, any> = TreeDataController<any, any>,\n>(name: string) {\n const [controller, setDataController] = useState<TreeDataController>(\n trees[name],\n );\n\n useEffect(() => {\n if (trees[name] !== controller) setDataController(trees[name]);\n\n return treesRecordEmitter.on('addController', (ev) => {\n if (ev.name === name) setDataController(ev.controller);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return controller as unknown as TreeType;\n}\n\nexport function getTreeDataController<TreeType = TreeDataController>(\n name: string,\n) {\n return trees[name] as unknown as TreeType;\n}\n\nexport function deleteTreeDataController(name: string) {\n delete trees[name];\n}\n\nclass TreeDataController<\n NodeProps extends Record<string, unknown> = Record<string, unknown>,\n NodeType extends TDataNode<NodeProps> = TDataNode<NodeProps>,\n> extends EventEmitter<{\n onArrowUpOnFirstElement: boolean;\n expandNode: NodeType;\n mustFocus: TId;\n stateUpdate: null;\n}> {\n _configuration: RefObject<TTreeDataControllerConfig<NodeProps, NodeType>>;\n\n get configuration() {\n return { ...this._configuration };\n }\n\n hasApendedFirstChild = false;\n\n /**\n * Este array se usa para conocer los padres faltantes al momento de la\n * construcción del árbol, de forma de optimizar el proceso\n */\n missingParents: TId[] = [];\n\n nonEmittedUpdates: TId[] = [];\n\n get state() {\n return this.propsStore.getFieldProps<TTreeDataControllerState>(\n this.stateKey,\n );\n }\n\n stateKey = 'treeState';\n\n get stateStore() {\n return this.propsStore as unknown as PropsStore<TTreeDataControllerState>;\n }\n\n constructor(\n public name: string,\n configuration: RefObject<\n Partial<TTreeDataControllerConfig<NodeProps, NodeType>>\n >,\n public propsStore = new PropsStore<NodeType>({\n logCommands: {\n propsStore: `treeProps_${name}`,\n propsLog: `treeLog_${name}`,\n propsSuscriptors: `propsSuscriptors_${name}`,\n updateProp: `updateProp_${name}`,\n },\n }),\n ) {\n super();\n\n this._configuration = (configuration ?? {\n current: { emitUpdates: true },\n }) as RefObject<Partial<TTreeDataControllerConfig<NodeProps, NodeType>>>;\n\n (this._configuration.current as TTreeDataControllerConfig).emitUpdates =\n (this._configuration.current as TTreeDataControllerConfig).emitUpdates ??\n true;\n\n this.setState(this.getInitialState());\n treesRecordEmitter.emit('addController', {\n name,\n controller: this as unknown as TreeDataController,\n });\n this.initRoot();\n }\n\n destructor() {\n this.propsStore.destructor();\n }\n\n append(\n node: Omit<\n TModify<\n NodeType,\n { children?: NodeType['children']; parentId?: NodeType['parentId'] }\n >,\n 'nodeProps' | 'actualParentId'\n > &\n Partial<Pick<NodeType, 'nodeProps'>>,\n ) {\n const newNode = { ...(node as NodeType), nodeProps: node.nodeProps ?? {} };\n\n // Se busca el padre, si el padre no existe se agrega a la raíz\n let father: TId;\n if (\n newNode.parentId !== undefined &&\n this.propsStore.getFieldProps(newNode.parentId)?.children\n ) {\n father = newNode.parentId;\n } else {\n father = 'root';\n if (newNode.parentId) this.missingParents.push(newNode.parentId);\n newNode.actualParentId = newNode.parentId;\n newNode.parentId = 'root';\n }\n\n this.propsStore.updateField(\n newNode.id,\n {\n ...newNode,\n children: newNode.children ?? [],\n },\n { isUrgent: true },\n );\n this.setState({ length: this.state.length + 1 });\n\n // Se buscan elementos que estén en la raíz y sean hijos del nodo que se\n // está agregando. De esta forma al crear el árbol nos aseguramos que ningún\n // nodo quede afuera y evitamos iteraciones innecesarias\n if (this.missingParents.includes(newNode.id)) {\n this.propsStore.getFieldProps('root').children.forEach((currentChild) => {\n if (\n this.propsStore.getFieldProps(currentChild).actualParentId ===\n newNode.id\n ) {\n this.move(currentChild, newNode.id);\n }\n });\n this.missingParents = this.missingParents.filter(\n (current) => current !== newNode.id,\n );\n }\n\n // Se agrega el nodo a los hijos del padre\n this.propsStore.updateField(\n father,\n {\n children: [\n ...this.propsStore.getFieldProps(father).children,\n newNode.id,\n ],\n hasLoaded: true,\n },\n { noEmit: this._configuration.current?.emitUpdates === false },\n );\n\n if (this._configuration.current?.emitUpdates === false)\n this.nonEmittedUpdates.push(father);\n\n if (!this.hasApendedFirstChild) {\n this.hasApendedFirstChild = true;\n this.setFocusedNode(newNode.id, true);\n }\n\n if (newNode.isExpanded) this.toggleNodeExpandedState(newNode.id, true);\n }\n\n /**\n * Cuando se quieren agregar muchos nodos, es conveniente llamar primero al\n * método batchInit y luego de finalizar, al método batchFinish()\n */\n batchInit() {\n this.config({ emitUpdates: false });\n this.setState({ isLoading: true }, { isUrgent: true });\n }\n\n private getNodesRecursive(nodeId: TId = 'root'): TId[] {\n const node = this.propsStore.getFieldProps(nodeId);\n\n return node.children.reduce<TId[]>(\n (prev, current) => [...prev, ...this.getNodesRecursive(current)],\n [...node.children],\n );\n }\n\n /**\n * Cuando se quieren agregar muchos nodos, es conveniente llamar primero al\n * método batchInit y luego de finalizar, al método batchFinish()\n */\n batchFinish() {\n this.config({ emitUpdates: true });\n setTimeout(() => this.setState({ isLoading: false }), 0);\n\n const children = [...this.getNodesRecursive()];\n\n const deleteNodes = this.previousNodes.filter(\n (current) => !children.find((search) => search === current),\n );\n deleteNodes.forEach((current) => this.remove(current));\n\n this.config({ emitUpdates: true });\n setTimeout(() => this.setState({ isLoading: false }), 0);\n }\n\n config(newConf: Partial<TTreeDataControllerConfig<NodeProps, NodeType>>) {\n if (\n this._configuration.current?.emitUpdates === false &&\n newConf.emitUpdates !== false\n ) {\n this.nonEmittedUpdates.forEach((current) =>\n this.propsStore.updateField(current, {\n children: [...this.propsStore.getFieldProps(current).children],\n }),\n );\n this.nonEmittedUpdates = [];\n }\n Object.assign(\n this._configuration.current as TTreeDataControllerConfig,\n newConf,\n );\n }\n\n deselectAll() {\n this.state.selectedNodes.forEach((currentId) =>\n this.propsStore.updateField(currentId, { isSelected: false }),\n );\n this.setState({ selectedNodes: [] });\n }\n\n forceEmitUpdate() {\n this.propsStore.updateField<{ forceUpdate: number }>('root', {\n forceUpdate:\n (this.propsStore.getFieldProps<{ forceUpdate: number }>('root')\n .forceUpdate ?? 0) + 1,\n });\n }\n\n getInitialState(): TTreeDataControllerState {\n return {\n expandedNodes: [],\n filteredNodes: [],\n focusedNode: null,\n isLoading: false,\n length: 0,\n selectedNodes: [],\n };\n }\n\n getNodesAsArray() {\n const allFields = { ...this.propsStore.fields };\n delete allFields[this.stateKey];\n delete allFields.root;\n return Object.values(allFields);\n }\n\n /**\n * Devuelve un array que contiene el id de todos los nodos pertenecientes al\n * árbol\n */\n getNodesIds() {\n const allFields = { ...this.propsStore.fields };\n delete allFields[this.stateKey];\n delete allFields.root;\n return Object.keys(allFields);\n }\n\n getParentId(parentId: TId) {\n return this.propsStore.getFieldProps(parentId).parentId;\n }\n\n /**\n * Este método permite controlar el comportamiento con el teclado desde fuera\n * del componente.\n */\n handleKey(ev: React.KeyboardEvent) {\n const focusedId = this.state.focusedNode as TId;\n const nodeProps = this.propsStore.getFieldProps(focusedId);\n if (ev.key === '*') {\n if (this.state.focusedNode === null) return;\n const parent = this.propsStore.getFieldProps(\n this.propsStore.getFieldProps(this.state.focusedNode).parentId,\n );\n parent.children.forEach((current) =>\n this.toggleNodeExpandedState(current, true),\n );\n } else if (ev.key.match(/^\\w$/)) {\n const nextChildWithKey = getNextNodeWithKey(\n this,\n focusedId,\n ev.key,\n true,\n );\n if (nextChildWithKey !== null) {\n this.setFocusedNode(nextChildWithKey);\n this.emit('mustFocus', nextChildWithKey);\n }\n } else\n switch (ev.code) {\n case 'Home': {\n const firstChild = getFirstNonFilteredChild(this, 'root');\n if (firstChild === null) return;\n if (ev.shiftKey && ev.ctrlKey && this.state.focusedNode !== null) {\n selectAllNodesBetweenTwoNodes(\n this,\n firstChild,\n this.state.focusedNode,\n true,\n );\n }\n this.setFocusedNode(firstChild);\n this.emit('mustFocus', firstChild);\n break;\n }\n case 'End': {\n const lastVisibleChild = getLastVisibleChild(this, 'root', true);\n if (lastVisibleChild !== null) {\n if (ev.shiftKey && ev.ctrlKey && this.state.focusedNode !== null) {\n selectAllNodesBetweenTwoNodes(\n this,\n lastVisibleChild,\n this.state.focusedNode,\n true,\n );\n }\n this.setFocusedNode(lastVisibleChild);\n this.emit('mustFocus', lastVisibleChild);\n }\n break;\n }\n case 'ArrowRight': {\n if (nodeProps.isLeaf) return;\n ev.preventDefault();\n if (nodeProps.isExpanded) {\n const firstChild = getFirstNonFilteredChild(this, nodeProps.id);\n if (firstChild !== null) {\n this.setFocusedNode(firstChild);\n this.emit('mustFocus', firstChild);\n }\n } else this.toggleNodeExpandedState(nodeProps.id, true);\n break;\n }\n case 'ArrowLeft': {\n ev.preventDefault();\n if (nodeProps.isLeaf || !nodeProps.isExpanded) {\n if (\n nodeProps.parentId !== 'root' &&\n nodeProps.parentId !== undefined\n ) {\n this.setFocusedNode(nodeProps.parentId);\n this.emit('mustFocus', nodeProps.parentId);\n }\n } else this.toggleNodeExpandedState(nodeProps.id, false);\n break;\n }\n case 'ArrowUp': {\n ev.preventDefault();\n const prevChild = getPreviousChild(this, nodeProps.id, true);\n if (prevChild !== null) {\n if (ev.shiftKey) this.toggleNodeSelectedState(prevChild, true);\n this.setFocusedNode(prevChild);\n this.emit('mustFocus', prevChild);\n } else this.emit('onArrowUpOnFirstElement', true);\n break;\n }\n case 'ArrowDown': {\n ev.preventDefault();\n const nextChild = getNextChild(this, nodeProps.id, false, true);\n if (nextChild !== null) {\n if (ev.shiftKey) this.toggleNodeSelectedState(nextChild, true);\n this.setFocusedNode(nextChild);\n this.emit('mustFocus', nextChild);\n }\n break;\n }\n case 'Space': {\n if (this._configuration.current?.disableSelection) return;\n ev.preventDefault();\n this.toggleNodeSelectedState(nodeProps.id);\n break;\n }\n default:\n break;\n }\n }\n\n isNode(\n node: NodeType | TDataNodeContainer<NodeProps> | TId,\n ): node is NodeType {\n return typeof node === 'object' && 'parentId' in node;\n }\n\n isNodeContainer(\n node: NodeType | TDataNodeContainer<NodeProps> | TId,\n ): node is TDataNodeContainer<NodeProps> {\n return typeof node === 'object' && !this.isNode(node);\n }\n\n includes(searchNode: NodeType) {\n return !!this.propsStore.getFieldProps(searchNode.id);\n }\n\n initRoot() {\n this.propsStore.updateField(\n 'root',\n { children: [], id: 'root' },\n { isUrgent: true },\n );\n }\n\n move(\n moveNode: TId,\n destinationNode: TId,\n afterOrBefore?: TRequireOnlyOne<{\n after: NodeType | TId;\n before: NodeType | TId;\n position: number;\n }>,\n ) {\n const currentFather = this.propsStore.getFieldProps(\n this.propsStore.getFieldProps(moveNode).parentId,\n );\n const newFather = this.propsStore.getFieldProps(destinationNode);\n\n if (!currentFather) {\n console.warn('The current node does not belong to the tree.', moveNode);\n return;\n }\n\n if (!newFather) {\n console.warn(\n 'The destination node does not belong to the tree. No action will be made',\n destinationNode,\n );\n return;\n }\n\n currentFather.children = currentFather.children?.filter(\n (search) => search !== moveNode,\n );\n if (!newFather.children) newFather.children = [];\n if (!afterOrBefore) newFather.children.push(moveNode);\n else if (afterOrBefore.position) {\n newFather.children.splice(afterOrBefore.position - 1, 0, moveNode);\n } else {\n const key = afterOrBefore.after\n ? afterOrBefore.after\n : afterOrBefore.before;\n\n const relatedNodeKey = key && this.isNode(key) ? key.id : key;\n const relatedNodeIndex = newFather.children.findIndex(\n (search) => search === relatedNodeKey,\n );\n\n const actualIndex = addBoundary(\n afterOrBefore.before !== undefined\n ? relatedNodeIndex\n : relatedNodeIndex + 1,\n 0,\n );\n\n if (actualIndex === -1 || actualIndex === newFather.children.length)\n newFather.children.push(moveNode);\n else newFather.children.splice(actualIndex, 0, moveNode);\n }\n\n this.propsStore.updateField(currentFather.id, {\n children: [...(currentFather.children ?? [])],\n });\n this.propsStore.updateField(newFather.id, {\n children: [...newFather.children],\n });\n this.propsStore.updateField(moveNode, {\n parentId: newFather.id,\n });\n }\n\n /**\n * Borra el nodo del árbol, y dependiendo del parámetro removeChildren, borra\n * también sus hijos.\n *\n * @param removeChildren - Si se pasa en false, los nodos hijos son movidos al root\n */\n remove(removeNode: NodeType | TId, removeChildren = true) {\n const removeNodeId = this.isNode(removeNode) ? removeNode.id : removeNode;\n\n const removingNode = this.propsStore.getFieldProps(removeNodeId);\n if (!removingNode) return;\n\n const father = this.propsStore.getFieldProps(removingNode.parentId);\n if (father) {\n this.propsStore.updateField(father.id, {\n children: father.children?.filter((search) => search !== removeNodeId),\n });\n }\n\n removingNode.children?.forEach((current) => {\n if (removeChildren) {\n this.remove(current);\n } else {\n this.move(current, 'root');\n }\n });\n\n this.setState({\n selectedNodes: this.state.selectedNodes.filter(\n (current) => current !== removeNodeId,\n ),\n focusedNode:\n this.state.focusedNode === removeNodeId ? null : this.state.focusedNode,\n length: this.state.length - 1,\n });\n this.propsStore.removeField(removeNodeId);\n }\n\n removeMultiple(nodes: TId[], removeChildren = true) {\n nodes.forEach((current) => this.remove(current, removeChildren));\n }\n\n previousNodes: TId[] = [];\n /**\n * Borra todos los nodos del árbol.\n */\n removeAll() {\n if (this.configuration.current?.emitUpdates === false) {\n this.previousNodes = this.getNodesIds();\n this.propsStore.updateField(\n 'root',\n { children: [], id: 'root' },\n { isUrgent: true, noEmit: true },\n );\n /* this.previousNodes.forEach((current) =>\n this.propsStore.removeField(current),\n ); */\n } else {\n this.hasApendedFirstChild = false;\n this.setState({ focusedNode: null }, { isUrgent: true });\n this.setSelectedNodes([]);\n this.initRoot();\n Object.keys(this.propsStore.fields).forEach((current) => {\n if (!['root', this.stateKey].includes(current))\n this.propsStore.removeField(current);\n });\n }\n }\n\n selectAll() {\n this.setState({\n selectedNodes: this.getNodesIds(),\n });\n this.state.selectedNodes.forEach((currentId) =>\n this.propsStore.updateField(currentId, { isSelected: true }),\n );\n }\n\n setExpandedNodes(nodes: TId[]) {\n this.state.expandedNodes.forEach((current) =>\n this.propsStore.updateField(current, { isExpanded: false }),\n );\n\n this.setState({ expandedNodes: nodes });\n nodes.forEach((current) =>\n this.propsStore.updateField(current, { isExpanded: true }),\n );\n }\n\n setFocusedNode(key: TId, avoidSelection?: boolean) {\n if (this.state.focusedNode !== null)\n this.propsStore.updateField(this.state.focusedNode, { isFocused: false });\n this.setState({\n focusedNode: key,\n });\n if (\n !this._configuration.current?.isMultiple &&\n !avoidSelection &&\n (this._configuration.current?.selectionMode ?? 'onFocus') === 'onFocus'\n )\n this.setSelectedNodes([key]);\n this.propsStore.updateField(key, { isFocused: true });\n }\n\n setSelectedNodes(nodes: TId[], force = false) {\n if (this._configuration.current?.disableSelection && !force) return;\n this.state.selectedNodes.forEach((current) =>\n this.propsStore.updateField(current, { isSelected: false }),\n );\n this.setState({\n selectedNodes: nodes.filter((current) => {\n const { isSelectable } = this.propsStore.getFieldProps(current);\n if (isSelectable !== false)\n this.propsStore.updateField(current, { isSelected: true });\n return isSelectable !== false;\n }),\n });\n }\n\n setSelectedNodesByClickEvent(ev: React.MouseEvent) {\n if (this._configuration.current?.disableSelection) return;\n const nodeKey = getSpecificParent(\n ev.target as HTMLElement,\n (current) => current.getAttribute('role') === 'treeitem',\n )?.getAttribute('data-key');\n if (nodeKey) {\n const nodeProps = this.propsStore.getFieldProps(nodeKey);\n if (nodeProps.isDisabled || nodeProps.isSelectable === false) return;\n\n const previousSelectionKeys = [...this.state.selectedNodes];\n const allowMultiple =\n this._configuration.current?.isMultiple &&\n (this._configuration.current?.selectionMode !== 'explicitMultiple' ||\n ev.ctrlKey ||\n ev.shiftKey);\n\n // eslint-disable-next-line no-nested-ternary\n const newSelection: TId[] = allowMultiple\n ? nodeProps.isSelected\n ? previousSelectionKeys.filter((current) => current !== nodeKey)\n : [...previousSelectionKeys, nodeKey]\n : [nodeKey];\n\n this.setSelectedNodes(newSelection);\n } else console.warn('Cannot set selection, no treeitem found', ev);\n }\n\n setState = (\n updateProps: Partial<TTreeDataControllerState>,\n conf?: TUpdateFieldConfiguration,\n ) => {\n this.propsStore.updateField<TTreeDataControllerState>(\n this.stateKey,\n {\n ...this.state,\n ...updateProps,\n },\n conf,\n );\n this.emit('stateUpdate', null);\n };\n\n useState = <T>(selector: (state: TTreeDataControllerState) => T) => {\n const [selectedState, setSelectedState] = useState(selector(this.state));\n const latestState = useLatest(selectedState);\n\n useMount(() => {\n return this.on('stateUpdate', () => {\n const newSelection = selector(this.state);\n\n if (!shallowEqual(newSelection, latestState.current)) {\n setSelectedState(newSelection);\n }\n });\n });\n\n return selectedState;\n };\n\n toggleNodeExpandedState(key: TId, shouldExpand?: boolean) {\n const nodeProps = this.propsStore.getFieldProps(key);\n if (nodeProps.isDisabled || nodeProps.isLeaf || nodeProps.isLoading) return;\n\n if (this._configuration.current?.onLoadData && !nodeProps.hasLoaded) {\n this.propsStore.updateField(key, { isLoading: true });\n this._configuration.current?.onLoadData(nodeProps).finally(() => {\n this.propsStore.updateField(key, {\n isLoading: false,\n isExpanded: true,\n hasLoaded: true,\n });\n\n this.setState({\n expandedNodes: [...this.state.expandedNodes, key],\n });\n this._configuration.current?.onExpand?.(\n this.propsStore.getFieldProps(key),\n );\n });\n } else {\n const { expandedNodes } = this.state;\n const shouldExpandInner =\n shouldExpand !== undefined\n ? shouldExpand\n : !expandedNodes.includes(key);\n if (this.propsStore.getFieldProps(key)?.isDisabled) return;\n\n this.setState({\n expandedNodes: shouldExpandInner\n ? [...expandedNodes, key]\n : expandedNodes.filter((current) => current !== key),\n });\n this.propsStore.updateField(key, { isExpanded: shouldExpandInner });\n this._configuration.current?.onExpand?.(\n this.propsStore.getFieldProps(key),\n );\n }\n }\n\n toggleNodeSelectedState(key: TId, isSelected?: boolean) {\n if (this._configuration.current?.disableSelection) return;\n const nodeProps = this.propsStore.getFieldProps(key);\n if (nodeProps.isDisabled || nodeProps.isSelectable === false) return;\n\n const shouldSelect =\n isSelected !== undefined\n ? isSelected\n : !this.state.selectedNodes.includes(key);\n\n if (\n (shouldSelect && nodeProps.isSelected) ||\n (isSelected === false && !nodeProps.isSelected)\n )\n return;\n\n if (\n shouldSelect &&\n !this._configuration.current?.isMultiple &&\n this.state.selectedNodes[0]\n )\n this.toggleNodeSelectedState(this.state.selectedNodes[0], false);\n this.propsStore.updateField(key, { isSelected: shouldSelect });\n this.setState({\n selectedNodes: shouldSelect\n ? [...this.state.selectedNodes, key]\n : this.state.selectedNodes.filter((current) => current !== key),\n });\n }\n}\n\n/**\n * Este hook permite escuchar las props de un árbol, para ello es necesario\n * pasar el handler.\n *\n * @param handler\n * @param configuration\n * @returns\n */\nexport function useTreeSelector<\n NodeProps extends Record<string, unknown> = Record<string, unknown>,\n NodeType extends TDataNode<NodeProps> = TDataNode<NodeProps>,\n Selected = Record<string, unknown>,\n PropsType extends Record<string, unknown> = TTreeDataControllerState,\n>(\n handler: TreeDataController<NodeProps, NodeType>,\n configuration?: TPropsConfiguration<Selected, PropsType>,\n): Selected {\n return usePropsSelector<Selected, PropsType>(\n handler?.stateKey ?? '__NO__TREE__KEY__',\n {\n propsStore: handler?.propsStore as unknown as PropsStore<PropsType>,\n ...configuration,\n },\n );\n}\n\n/**\n * Este hook permite escuchar las props de un árbol, para ello es necesario\n * pasar el handler.\n *\n * @param handler\n * @param configuration\n * @returns\n */\nexport function useTreeSelectorByName<\n NodeProps extends Record<string, unknown> = Record<string, unknown>,\n NodeType extends TDataNode<NodeProps> = TDataNode<NodeProps>,\n Selected = Record<string, unknown>,\n PropsType extends Record<string, unknown> = TTreeDataControllerState,\n>(\n treeName: string,\n configuration?: TPropsConfiguration<Selected, PropsType>,\n): {\n handler: TreeDataController<NodeProps, NodeType>;\n selection: Selected;\n} {\n const handler =\n useTreeDataController<TreeDataController<NodeProps, NodeType>>(treeName);\n const selection = usePropsSelector<Selected, PropsType>(\n handler?.stateKey ?? '__NO__TREE__KEY__',\n {\n propsStore: handler?.propsStore as unknown as PropsStore<PropsType>,\n ...configuration,\n },\n );\n return { selection, handler };\n}\n\nexport default TreeDataController;\n"],"names":[],"mappings":"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"}
|
package/dist/TreeItem.js
ADDED
|
@@ -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';\nimport { shallowEqual } from 'react-redux';\nimport { Box } from '@apia/theme';\nimport { getDomProps } from './getDomProps';\nimport { useTreeContext } from './TreeContext';\nimport TreeItemChildren from './TreeItemChildren';\nimport TreeItemLabel from './TreeItemLabel';\nimport { TDataNode, TId } from './types';\nimport { usePropsSelector } from '@apia/util';\n\nconst TreeItem = ({ level, treeKey }: { level: number; treeKey: TId }) => {\n const { handler, name, forceUpdate, treeProps } = useTreeContext();\n\n const props = usePropsSelector<TDataNode, TDataNode>(treeKey, {\n selector: (current) => current,\n comparator: (prevProps, newProps) => {\n return (\n shallowEqual(prevProps, newProps) &&\n shallowEqual(prevProps?.children, newProps?.children)\n );\n },\n propsStore: handler.propsStore,\n });\n\n const nodes = React.useMemo(\n () =>\n props.children?.map((current) =>\n handler.propsStore.getFieldProps(current),\n ) ?? [],\n [props.children, handler.propsStore],\n );\n\n const domProps = getDomProps(treeProps, name, 'node', props);\n\n return (\n <>\n <Box\n as=\"li\"\n {...domProps}\n className={`${domProps.className ?? ''} tree__item`}\n >\n <TreeItemLabel level={level} treeKey={treeKey} />\n {props.isExpanded && (\n <TreeItemChildren\n forceUpdate={forceUpdate}\n role=\"group\"\n level={level}\n nodes={nodes}\n />\n )}\n </Box>\n </>\n );\n};\n\nexport default React.memo(TreeItem);\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';\nimport { Box, BoxProps } from '@apia/theme';\nimport { useTreeContext } from './TreeContext';\nimport TreeItem from './TreeItem';\nimport { TDataNode } from './types';\n\nconst TreeItemChildren = React.forwardRef<\n HTMLDivElement,\n {\n forceUpdate: number;\n level: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nodes: TDataNode<any>[];\n } & BoxProps\n>(({ level, nodes, forceUpdate, ...props }, ref) => {\n const { handler } = useTreeContext();\n\n return (\n <Box ref={ref} as=\"ul\" {...props}>\n {nodes?.map((current) => {\n const currentProps = handler.propsStore.getFieldProps(current.id);\n if (!currentProps) return null;\n\n return currentProps.isFiltered ? null : (\n <TreeItem level={level + 1} key={current.id} treeKey={current.id} />\n );\n })}\n </Box>\n );\n});\n\nTreeItemChildren.displayName = 'TreeItemChildren';\n\nexport default React.memo(TreeItemChildren);\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';\nimport { shallowEqual } from 'react-redux';\nimport { Box, Spinner } from '@apia/theme';\nimport DefaultIconRenderer from './renderers/DefaultIconRenderer';\nimport DefaultLabelRenderer from './renderers/DefaultLabelRenderer';\nimport Spacer from './renderers/Spacer';\nimport { useTreeContext } from './TreeContext';\nimport { TDataNode, TId } from './types';\nimport { usePropsSelector } from '@apia/util';\nimport { Icon } from '@apia/icons';\n\nconst TreeItemLabel = ({ level, treeKey }: { level: number; treeKey: TId }) => {\n const {\n handler,\n treeProps: { toggleNodesOnLabelClick },\n } = useTreeContext();\n\n const props = usePropsSelector<TDataNode, TDataNode>(treeKey, {\n selector: (current) => current,\n comparator: (prevProps, newProps) => {\n return (\n shallowEqual(prevProps, newProps) &&\n shallowEqual(prevProps?.children, newProps?.children)\n );\n },\n propsStore: handler.propsStore,\n });\n\n const Renderer = React.useMemo(\n () => props.labelRenderer ?? DefaultLabelRenderer,\n [props.labelRenderer],\n );\n\n const handleToggle = React.useCallback(() => {\n handler.toggleNodeExpandedState(treeKey);\n }, [handler, treeKey]);\n\n const IconRenderer = React.useMemo(() => {\n return typeof props.icon === 'string' ? DefaultIconRenderer : props.icon;\n }, [props.icon]);\n\n const onClick = React.useCallback(() => {\n if (props.allowToggleExpandedFromLabel !== false)\n handler.toggleNodeExpandedState(treeKey);\n }, [handler, props.allowToggleExpandedFromLabel, treeKey]);\n\n return (\n <Box\n as=\"span\"\n className={`tree__nodeItemLabel ${props.isFocused ? 'focus' : ''}`}\n >\n <Spacer level={level} />\n {(props.isLoading ||\n (props.isExpanded && props.isLeaf !== true) ||\n props.isLeaf === false ||\n (props.children?.length ?? 0) > 0 ||\n (props.isLeaf === undefined &&\n !props.hasLoaded &&\n handler.configuration.current?.onLoadData)) && (\n <Box className=\"tree__expanderWrapper\">\n {props.isLoading ? (\n <Spinner sx={{ width: 'iconSm', height: 'iconSm' }} />\n ) : (\n <Icon\n className=\"tree__expandIcon\"\n onClick={handleToggle}\n name={props.isExpanded ? 'ArrowDownThin' : 'ArrowRightThin'}\n title=\"\"\n size={20}\n />\n )}\n </Box>\n )}\n {props.icon && IconRenderer && <IconRenderer {...props} />}\n <Box\n as=\"span\"\n className=\"tree__nodeItemLabelRenderer\"\n onClick={toggleNodesOnLabelClick !== false ? onClick : undefined}\n >\n <Renderer {...props} level={level} />\n </Box>\n </Box>\n );\n};\n\nexport default React.memo(TreeItemLabel);\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';\nimport { TTreeProps, TDataNode, TId } from './types';\nimport TreeDataController, {\n getTreeDataController,\n} from './TreeDataController';\n\nexport type TDomProps = Omit<BoxProps, 'as'> & Record<string, unknown>;\n\nexport function getActiveDescendantName(treeName: string, nodeId: TId) {\n return `${treeName}__${nodeId}`;\n}\n\nexport function getDomProps(\n treeProps: TTreeProps,\n treeName: string,\n type: 'tree',\n node: TTreeProps,\n controller: TreeDataController,\n): BoxProps;\nexport function getDomProps(\n treeProps: TTreeProps,\n treeName: string,\n type: 'node',\n node: TDataNode,\n): BoxProps;\nexport function getDomProps(\n _: TTreeProps,\n treeName: string,\n type: 'tree' | 'node',\n par: TDataNode | TTreeProps,\n): TDomProps {\n switch (type) {\n case 'node': {\n const node = par as TDataNode;\n const tree = getTreeDataController(treeName);\n return {\n 'aria-disabled': node.isDisabled,\n 'aria-expanded': node.isLeaf ? undefined : !!node.isExpanded,\n 'aria-label': node.label,\n ...(tree.configuration.current?.disableSelection\n ? undefined\n : {\n 'aria-selected':\n node.isSelectable !== false && !node.isDisabled\n ? !!node.isSelected\n : undefined,\n }),\n className: node.className,\n color: node.color,\n 'data-key': node.id,\n id: getActiveDescendantName(treeName, node.id),\n role: 'treeitem',\n title: node.title,\n };\n }\n default: {\n const tree = par as TTreeProps;\n return {\n role: 'tree',\n 'aria-multiselectable': tree.isMultiple,\n };\n }\n }\n}\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;;;;"}
|