vuestic-ui
Version:
Vue 3 UI Framework
1 lines • 11.1 kB
Source Map (JSON)
{"version":3,"file":"useTreeView.mjs","sources":["../../../../../../src/components/va-tree-view/hooks/useTreeView.ts"],"sourcesContent":["import {\n ref,\n toRefs,\n provide,\n computed,\n ComputedRef,\n ExtractPropTypes,\n WritableComputedRef,\n} from 'vue'\n\nimport { useColors, useStateful } from '../../../composables'\n\nimport type { TreeNode, TreeViewFilterMethod, TreeViewEmitsFunc } from '../types'\nimport { useTreeHelpers, useTreeViewProps } from './useTreeHelpers'\nimport { TreeViewKey } from '../types'\nimport useTreeKeyboardNavigation from './useTreeKeyboardNavigation'\n\ntype CreateNodeProps = {\n node: TreeNode\n level: number\n children?: TreeNode[]\n computedFilterMethod: ComputedRef<TreeViewFilterMethod>\n}\n\ntype CreateNodeFunc = (props: CreateNodeProps) => TreeNode\ntype TreeBuilderFunc = (nodes: TreeNode[], level?: number) => TreeNode[]\ntype TypeModelValue = (string | number | TreeNode)[]\n\ntype UseTreeViewFunc = (props: ExtractPropTypes<typeof useTreeViewProps>, emit: TreeViewEmitsFunc) => {\n treeItems: ComputedRef<TreeNode[]>\n getText: (node: TreeNode) => string | number\n getTrackBy: (node: TreeNode) => string | number\n toggleCheckbox: (node: TreeNode, state: boolean) => void\n}\n\nconst useTreeView: UseTreeViewFunc = (props, emit) => {\n const { getColor } = useColors()\n const colorComputed = computed(() => getColor(props.color))\n const isLeafSelectionComputed = computed(() => props.selectionType === 'leaf')\n const {\n getText,\n getValue,\n getChecked,\n getTrackBy,\n getChildren,\n getDisabled,\n getExpanded,\n iterateNodes,\n getNodeProperty,\n } = useTreeHelpers(props)\n const { nodes, expandAll, filter, filterMethod, textBy } = toRefs(props)\n const { valueComputed: expandedList } = useStateful(props, emit, 'expanded')\n const { valueComputed: checkedList } = useStateful(props, emit, 'checked')\n\n const selectedNode = ref()\n const selectedNodeComputed: WritableComputedRef<string | number | Record<string, unknown>> = computed({\n get: () => selectedNode.value,\n set: (node: TreeNode) => {\n const value = getValue(node)\n\n if (selectedNode.value !== value) {\n selectedNode.value = value\n emit('update:selected', node)\n }\n },\n })\n\n const updateModel = (model: WritableComputedRef<TypeModelValue>, values: TypeModelValue, state: boolean) => {\n if (state) {\n model.value = model.value.concat(values)\n .filter((value, idx, self) => self.indexOf(value) === idx)\n } else {\n model.value = model.value.filter(v => !values.includes(v))\n }\n }\n\n const toggleCheckbox = (node: TreeNode, state: boolean | null) => {\n let stateValue = state === null ? true : state\n\n if (state && node.indeterminate) {\n stateValue = false\n }\n\n const values = [getValue(node)]\n\n if (isLeafSelectionComputed.value && node.hasChildren) {\n const toggleChildren = (nodes: TreeNode[]) => {\n nodes.forEach((node: TreeNode) => {\n if (node.disabled) { return }\n\n const children = getChildren(node)\n\n if (children.length) { toggleChildren(children) }\n\n values.push(getValue(node))\n })\n }\n\n toggleChildren(getChildren(node))\n }\n\n updateModel(checkedList, values, stateValue)\n }\n\n const toggleNode = (node: TreeNode): void => {\n node.expanded = !node.expanded\n }\n\n const createNode: CreateNodeFunc = ({ node, level, children = [], computedFilterMethod }) => {\n const valueBy = getValue(node)\n let matchesFilter = true\n const hasChildren = !!children.length\n let indeterminate = false\n let checked: boolean | null = checkedList.value.includes(valueBy) || false\n\n if (isLeafSelectionComputed.value && hasChildren) {\n const isAllChildrenChecked = children.every(c => c.checked)\n\n checked = isAllChildrenChecked\n indeterminate = !isAllChildrenChecked && children.some(c => c.indeterminate || c.checked)\n\n if (indeterminate) { checked = null }\n }\n\n if (filter.value) {\n matchesFilter = children?.some(c => c.matchesFilter) || computedFilterMethod.value?.(node, filter.value, textBy.value)\n }\n\n return {\n ...node,\n level,\n checked,\n children,\n get disabled () {\n return getDisabled(node) || false\n },\n get expanded () {\n const expandKey = (props.expandedBy as string)\n\n return expandKey in node ? node[expandKey] : expandedList.value.includes(valueBy) || false\n },\n set expanded (value: boolean) {\n const expandKey = (props.expandedBy as string)\n node[expandKey] = value\n if (hasChildren) {\n updateModel(expandedList, [getValue(node)], value)\n }\n },\n hasChildren,\n matchesFilter,\n indeterminate,\n }\n }\n\n const computedFilterMethod = computed<TreeViewFilterMethod>(() => {\n if (filterMethod?.value) { return filterMethod.value }\n\n return (node, filter) => getText(node).toLowerCase().includes(filter.toLowerCase())\n })\n\n const buildTree: TreeBuilderFunc = (nodes: TreeNode[], level = 0) => nodes.map((node: TreeNode) => {\n const treeItemChildren = getChildren(node)\n\n if (treeItemChildren.length) {\n const children = buildTree(treeItemChildren, level + 1)\n\n return createNode({ node, level, children, computedFilterMethod })\n }\n\n return createNode({ node, level, computedFilterMethod })\n })\n\n const getFilteredNodes = (nodes: TreeNode[]): TreeNode[] => nodes.filter((node) => {\n if (node.children) { node.children = getFilteredNodes(node.children) }\n\n if (node.children.length === 0) { node.hasChildren = false }\n\n return node.matchesFilter\n })\n\n const { handleKeyboardNavigation } = useTreeKeyboardNavigation(props, { emit, toggleCheckbox, toggleNode })\n\n provide(TreeViewKey, {\n selectedNodeComputed,\n colorComputed,\n iconBy: props.iconBy,\n selectable: props.selectable,\n expandNodeBy: props.expandNodeBy,\n getText,\n getValue,\n getTrackBy,\n toggleNode,\n toggleCheckbox,\n getNodeProperty,\n handleKeyboardNavigation,\n })\n\n const treeItems = computed(() => buildTree(nodes.value))\n\n const checkForInitialValues = () => {\n const expandedValues: TypeModelValue = []\n const checkedValues: TypeModelValue = []\n\n iterateNodes(nodes.value, (node) => {\n if (expandAll.value) {\n expandedValues.push(getValue(node))\n } else {\n getExpanded(node) && expandedValues.push(getValue(node))\n }\n\n if (getChecked(node)) {\n checkedValues.push(getValue(node))\n }\n })\n\n if (expandedValues.length) {\n updateModel(expandedList, expandedValues, true)\n }\n\n if (checkedValues.length) {\n updateModel(checkedList, checkedValues, true)\n }\n }\n\n checkForInitialValues()\n\n return {\n treeItems: computed(() => getFilteredNodes(treeItems.value)),\n getText,\n getTrackBy,\n toggleCheckbox,\n }\n}\n\nexport default useTreeView\n"],"names":["nodes","node","computedFilterMethod","filter"],"mappings":"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"}