{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "table-tree-support", "title": "Table Tree Support", "files": [ { "path": "components/tree/types.ts", "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nexport interface TreeNodeProps {\n eventKey?: Key;\n prefixCls?: string;\n className?: string;\n style?: React.CSSProperties;\n id?: string;\n expanded?: boolean;\n selected?: boolean;\n checked?: boolean;\n loaded?: boolean;\n loading?: boolean;\n halfChecked?: boolean;\n title?: React.ReactNode | ((data: TreeDataType) => React.ReactNode);\n dragOver?: boolean;\n dragOverGapTop?: boolean;\n dragOverGapBottom?: boolean;\n pos?: string;\n domRef?: React.Ref;\n /** New added in Tree for easy data access */\n data?: TreeDataType;\n isStart?: boolean[];\n isEnd?: boolean[];\n active?: boolean;\n onMouseMove?: React.MouseEventHandler;\n isLeaf?: boolean;\n checkable?: boolean;\n selectable?: boolean;\n disabled?: boolean;\n disableCheckbox?: boolean;\n icon?: IconType;\n switcherIcon?: IconType;\n children?: React.ReactNode;\n}\nexport type IconType =\n | React.ReactNode\n | ((properties: TreeNodeProps) => React.ReactNode);\n/** For fieldNames, we provides a abstract interface */\nexport interface BasicDataNode {\n checkable?: boolean;\n disabled?: boolean;\n disableCheckbox?: boolean;\n icon?: IconType;\n isLeaf?: boolean;\n selectable?: boolean;\n switcherIcon?: IconType;\n /** Set style of TreeNode. This is not recommend if you don't have any force requirement */\n className?: string;\n style?: React.CSSProperties;\n}\n/** Provide a wrap type define for developer to wrap with customize fieldNames data type */\nexport type FieldDataNode<\n T,\n ChildFieldName extends string = \"children\",\n> = BasicDataNode &\n T &\n Partial[]>>;\nexport type Key = React.Key;\n/**\n * Typescript not support `bigint` as index type yet.\n * We use this to mark the `bigint` type is for `Key` usage.\n * It's safe to remove this when typescript fix:\n * https://github.com/microsoft/TypeScript/issues/50217\n */\nexport type SafeKey = Exclude;\n\nexport type KeyEntities = Record<\n SafeKey,\n DataEntity\n>;\nexport type DataNode = FieldDataNode<{\n key: Key;\n title?: React.ReactNode | ((data: DataNode) => React.ReactNode);\n}>;\nexport type EventDataNode = {\n key: Key;\n expanded: boolean;\n selected: boolean;\n checked: boolean;\n loaded: boolean;\n loading: boolean;\n halfChecked: boolean;\n dragOver: boolean;\n dragOverGapTop: boolean;\n dragOverGapBottom: boolean;\n pos: string;\n active: boolean;\n} & TreeDataType &\n BasicDataNode;\n\nexport type NodeElement = React.ReactElement & {\n selectHandle?: HTMLSpanElement;\n type: {\n isTreeNode: boolean;\n };\n};\n\nexport interface Entity {\n node: NodeElement;\n index: number;\n key: Key;\n pos: string;\n parent?: Entity;\n children?: Entity[];\n}\n\nexport interface DataEntity<\n TreeDataType extends BasicDataNode = DataNode,\n> extends Omit {\n node: TreeDataType;\n nodes: TreeDataType[];\n parent?: DataEntity;\n children?: DataEntity[];\n level: number;\n}\n\nexport interface FlattenNode {\n parent: FlattenNode | null;\n children: FlattenNode[];\n pos: string;\n data: TreeDataType;\n title: React.ReactNode;\n key: Key;\n isStart: boolean[];\n isEnd: boolean[];\n}\n\nexport type GetKey = (record: RecordType, index?: number) => Key;\n\nexport type GetCheckDisabled = (record: RecordType) => boolean;\n\nexport interface FieldNames {\n title?: string;\n /** @private Internal usage for `rc-tree-select`, safe to remove if no need */\n _title?: string[];\n key?: string;\n children?: string;\n}\n", "type": "registry:file", "target": "components/tree/types.ts" }, { "path": "components/tree/util.ts", "content": "import type { Key } from \"./types\";\n\nexport function arrDel(list: Key[], value: Key) {\n if (!list) return [];\n const clone = list.slice();\n const index = clone.indexOf(value);\n if (index >= 0) {\n clone.splice(index, 1);\n }\n return clone;\n}\n\nexport function arrAdd(list: Key[], value: Key) {\n const clone = (list || []).slice();\n if (clone.indexOf(value) === -1) {\n clone.push(value);\n }\n return clone;\n}\n", "type": "registry:file", "target": "components/tree/util.ts" }, { "path": "components/tree/utils/key-util.ts", "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { BasicDataNode, Key, KeyEntities, SafeKey } from \"../types\";\n\nexport default function getEntity(\n keyEntities: KeyEntities,\n key: Key,\n) {\n return keyEntities[key as SafeKey];\n}\n", "type": "registry:file", "target": "components/tree/utils/key-util.ts" }, { "path": "components/tree/utils/conduct-util.ts", "content": "import warning from \"@rc-component/util/es/warning\";\n\nimport type {\n BasicDataNode,\n DataEntity,\n DataNode,\n GetCheckDisabled,\n Key,\n KeyEntities,\n} from \"../types\";\nimport getEntity from \"./key-util\";\n\ninterface ConductReturnType {\n checkedKeys: Key[];\n halfCheckedKeys: Key[];\n}\n\nfunction removeFromCheckedKeys(\n halfCheckedKeys: Set,\n checkedKeys: Set,\n) {\n const filteredKeys = new Set();\n halfCheckedKeys.forEach((key) => {\n if (!checkedKeys.has(key)) {\n filteredKeys.add(key);\n }\n });\n return filteredKeys;\n}\n\nexport function isCheckDisabled(node: TreeDataType) {\n const { disabled, disableCheckbox, checkable } = (node || {}) as DataNode;\n return !!(disabled || disableCheckbox) || checkable === false;\n}\n\n// Fill miss keys\nfunction fillConductCheck(\n keys: Set,\n levelEntities: Map>>,\n maxLevel: number,\n syntheticGetCheckDisabled: GetCheckDisabled,\n): ConductReturnType {\n const checkedKeys = new Set(keys);\n const halfCheckedKeys = new Set();\n\n // Add checked keys top to bottom\n for (let level = 0; level <= maxLevel; level += 1) {\n const entities = levelEntities.get(level) || new Set();\n entities.forEach((entity) => {\n const { key, node, children = [] } = entity;\n\n if (checkedKeys.has(key) && !syntheticGetCheckDisabled(node)) {\n children\n .filter((childEntity) => !syntheticGetCheckDisabled(childEntity.node))\n .forEach((childEntity) => {\n checkedKeys.add(childEntity.key);\n });\n }\n });\n }\n\n // Add checked keys from bottom to top\n const visitedKeys = new Set();\n for (let level = maxLevel; level >= 0; level -= 1) {\n const entities = levelEntities.get(level) || new Set();\n entities.forEach((entity) => {\n const { parent, node } = entity;\n\n // Skip if no need to check\n if (\n syntheticGetCheckDisabled(node) ||\n !entity.parent ||\n visitedKeys.has(entity.parent.key)\n ) {\n return;\n }\n\n // Skip if parent is disabled\n if (syntheticGetCheckDisabled(entity.parent.node)) {\n visitedKeys.add(parent!.key);\n return;\n }\n\n let allChecked = true;\n let partialChecked = false;\n\n (parent!.children || [])\n .filter((childEntity) => !syntheticGetCheckDisabled(childEntity.node))\n .forEach(({ key }) => {\n const checked = checkedKeys.has(key);\n if (allChecked && !checked) {\n allChecked = false;\n }\n if (!partialChecked && (checked || halfCheckedKeys.has(key))) {\n partialChecked = true;\n }\n });\n\n if (allChecked) {\n checkedKeys.add(parent!.key);\n }\n if (partialChecked) {\n halfCheckedKeys.add(parent!.key);\n }\n\n visitedKeys.add(parent!.key);\n });\n }\n\n return {\n checkedKeys: Array.from(checkedKeys),\n halfCheckedKeys: Array.from(\n removeFromCheckedKeys(halfCheckedKeys, checkedKeys),\n ),\n };\n}\n\n// Remove useless key\nfunction cleanConductCheck(\n keys: Set,\n halfKeys: Key[],\n levelEntities: Map>>,\n maxLevel: number,\n syntheticGetCheckDisabled: GetCheckDisabled,\n): ConductReturnType {\n const checkedKeys = new Set(keys);\n let halfCheckedKeys = new Set(halfKeys);\n\n // Remove checked keys from top to bottom\n for (let level = 0; level <= maxLevel; level += 1) {\n const entities = levelEntities.get(level) || new Set();\n entities.forEach((entity) => {\n const { key, node, children = [] } = entity;\n\n if (\n !checkedKeys.has(key) &&\n !halfCheckedKeys.has(key) &&\n !syntheticGetCheckDisabled(node)\n ) {\n children\n .filter((childEntity) => !syntheticGetCheckDisabled(childEntity.node))\n .forEach((childEntity) => {\n checkedKeys.delete(childEntity.key);\n });\n }\n });\n }\n\n // Remove checked keys form bottom to top\n halfCheckedKeys = new Set();\n const visitedKeys = new Set();\n for (let level = maxLevel; level >= 0; level -= 1) {\n const entities = levelEntities.get(level) || new Set();\n\n entities.forEach((entity) => {\n const { parent, node } = entity;\n\n // Skip if no need to check\n if (\n syntheticGetCheckDisabled(node) ||\n !entity.parent ||\n visitedKeys.has(entity.parent.key)\n ) {\n return;\n }\n\n // Skip if parent is disabled\n if (syntheticGetCheckDisabled(entity.parent.node)) {\n visitedKeys.add(parent!.key);\n return;\n }\n\n let allChecked = true;\n let partialChecked = false;\n\n (parent!.children || [])\n .filter((childEntity) => !syntheticGetCheckDisabled(childEntity.node))\n .forEach(({ key }) => {\n const checked = checkedKeys.has(key);\n if (allChecked && !checked) {\n allChecked = false;\n }\n if (!partialChecked && (checked || halfCheckedKeys.has(key))) {\n partialChecked = true;\n }\n });\n\n if (!allChecked) {\n checkedKeys.delete(parent!.key);\n }\n if (partialChecked) {\n halfCheckedKeys.add(parent!.key);\n }\n\n visitedKeys.add(parent!.key);\n });\n }\n\n return {\n checkedKeys: Array.from(checkedKeys),\n halfCheckedKeys: Array.from(\n removeFromCheckedKeys(halfCheckedKeys, checkedKeys),\n ),\n };\n}\n\n/**\n * Conduct with keys.\n * @param keyList current key list\n * @param keyEntities key - dataEntity map\n * @param mode `fill` to fill missing key, `clean` to remove useless key\n */\nexport function conductCheck(\n keyList: Key[],\n checked: true | { checked: false; halfCheckedKeys: Key[] },\n keyEntities: KeyEntities,\n getCheckDisabled?: GetCheckDisabled,\n): ConductReturnType {\n const warningMissKeys: Key[] = [];\n\n let syntheticGetCheckDisabled: GetCheckDisabled;\n if (getCheckDisabled) {\n syntheticGetCheckDisabled = getCheckDisabled;\n } else {\n syntheticGetCheckDisabled = isCheckDisabled;\n }\n\n // We only handle exist keys\n const keys = new Set(\n keyList.filter((key) => {\n const hasEntity = !!getEntity(keyEntities, key);\n if (!hasEntity) {\n warningMissKeys.push(key);\n }\n\n return hasEntity;\n }),\n );\n const levelEntities = new Map>>();\n let maxLevel = 0;\n\n // Convert entities by level for calculation\n Object.keys(keyEntities).forEach((key) => {\n const entity = keyEntities[key]!;\n const { level } = entity;\n\n let levelSet: Set> = levelEntities.get(level)!;\n if (!levelSet) {\n levelSet = new Set();\n levelEntities.set(level, levelSet);\n }\n\n levelSet.add(entity);\n\n maxLevel = Math.max(maxLevel, level);\n });\n\n warning(\n !warningMissKeys.length,\n `Tree missing follow keys: ${warningMissKeys\n .slice(0, 100)\n .map((key) => `'${String(key)}'`)\n .join(\", \")}`,\n );\n\n let result: ConductReturnType;\n if (checked === true) {\n result = fillConductCheck(\n keys,\n levelEntities,\n maxLevel,\n syntheticGetCheckDisabled,\n );\n } else {\n result = cleanConductCheck(\n keys,\n checked.halfCheckedKeys,\n levelEntities,\n maxLevel,\n syntheticGetCheckDisabled,\n );\n }\n\n return result;\n}\n", "type": "registry:file", "target": "components/tree/utils/conduct-util.ts" }, { "path": "components/tree/utils/tree-util.ts", "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/* eslint-disable @typescript-eslint/prefer-for-of */\n/* eslint-disable @typescript-eslint/no-inferrable-types */\n\nimport type * as React from \"react\";\nimport toArray from \"@rc-component/util/es/Children/toArray\";\nimport omit from \"@rc-component/util/es/omit\";\nimport warning from \"@rc-component/util/es/warning\";\n\nimport type {\n BasicDataNode,\n DataEntity,\n DataNode,\n FieldNames,\n FlattenNode,\n GetKey,\n Key,\n KeyEntities,\n NodeElement,\n SafeKey,\n} from \"../types\";\nimport getEntity from \"./key-util\";\n\nexport function getPosition(level: string | number, index: number) {\n return `${level}-${index}`;\n}\n\nexport function isTreeNode(node: NodeElement) {\n return node && node.type && node.type.isTreeNode;\n}\n\nexport function getKey(key: Key, pos: string) {\n if (key !== null && key !== undefined) {\n return key;\n }\n return pos;\n}\n\nexport function fillFieldNames(fieldNames?: FieldNames): Required {\n const { title, _title, key, children } = fieldNames || {};\n const mergedTitle = title || \"title\";\n\n return {\n title: mergedTitle,\n _title: _title || [mergedTitle],\n key: key || \"key\",\n children: children || \"children\",\n };\n}\n\n/**\n * Warning if TreeNode do not provides key\n */\nexport function warningWithoutKey(\n treeData: DataNode[],\n fieldNames: FieldNames,\n) {\n const keys: Map = new Map();\n\n function dig(list: DataNode[], path: string = \"\") {\n (list || []).forEach((treeNode) => {\n const key = treeNode[fieldNames.key as keyof typeof treeNode] as string;\n const children = treeNode[\n fieldNames.children as keyof typeof treeNode\n ] as DataNode[];\n warning(\n key !== null && key !== undefined,\n `Tree node must have a certain key: [${path}${key}]`,\n );\n\n const recordKey = String(key);\n warning(\n !keys.has(recordKey) || key === null || key === undefined,\n `Same 'key' exist in the Tree: ${recordKey}`,\n );\n keys.set(recordKey, true);\n\n dig(children, `${path}${recordKey} > `);\n });\n }\n\n dig(treeData);\n}\n\n/**\n * Convert `children` of Tree into `treeData` structure.\n */\nexport function convertTreeToData(rootNodes: React.ReactNode): DataNode[] {\n function dig(node: React.ReactNode): DataNode[] {\n const treeNodes = toArray(node) as NodeElement[];\n return treeNodes\n .map((treeNode) => {\n // Filter invalidate node\n if (!isTreeNode(treeNode)) {\n warning(\n !treeNode,\n \"Tree/TreeNode can only accept TreeNode as children.\",\n );\n return;\n }\n\n const { key } = treeNode;\n const { children, ...rest } = treeNode.props;\n\n const dataNode: DataNode = {\n key: key as Key,\n ...rest,\n };\n\n const parsedChildren = dig(children);\n if (parsedChildren.length) {\n dataNode.children = parsedChildren;\n }\n\n return dataNode;\n })\n .filter(Boolean) as DataNode[];\n }\n\n return dig(rootNodes);\n}\n\n/**\n * Flat nest tree data into flatten list. This is used for virtual list render.\n * @param treeNodeList Origin data node list\n * @param expandedKeys\n * need expanded keys, provides `true` means all expanded (used in `rc-tree-select`).\n */\nexport function flattenTreeData(\n treeNodeList: TreeDataType[],\n expandedKeys: Key[] | true,\n fieldNames: FieldNames,\n): FlattenNode[] {\n const {\n _title: fieldTitles,\n key: fieldKey,\n children: fieldChildren,\n } = fillFieldNames(fieldNames);\n\n const expandedKeySet = new Set(expandedKeys === true ? [] : expandedKeys);\n const flattenList: FlattenNode[] = [];\n\n function dig(\n list: TreeDataType[],\n parent: FlattenNode | null = null,\n ): FlattenNode[] {\n return list.map((treeNode, index) => {\n const pos: string = getPosition(parent ? parent.pos : \"0\", index);\n const mergedKey = getKey(\n treeNode[fieldKey as keyof TreeDataType] as Key,\n pos,\n );\n\n // Pick matched title in field title list\n let mergedTitle: React.ReactNode;\n for (let index_ = 0; index_ < fieldTitles.length; index_ += 1) {\n const fieldTitle = fieldTitles[index_];\n if (treeNode[fieldTitle as keyof TreeDataType] !== undefined) {\n mergedTitle = treeNode[\n fieldTitle as keyof TreeDataType\n ] as React.ReactNode;\n break;\n }\n }\n\n // Add FlattenDataNode into list\n // We use `Object.assign` here to save perf since babel's `objectSpread` has perf issue\n const flattenNode: FlattenNode = Object.assign(\n omit(treeNode, [...fieldTitles, fieldKey, fieldChildren] as any),\n {\n title: mergedTitle,\n key: mergedKey as Key,\n parent,\n pos,\n children: undefined as unknown as FlattenNode[],\n data: treeNode,\n isStart: [...(parent ? parent.isStart : []), index === 0],\n isEnd: [...(parent ? parent.isEnd : []), index === list.length - 1],\n },\n );\n flattenList.push(flattenNode);\n\n // Loop treeNode children\n if (expandedKeys === true || expandedKeySet.has(mergedKey)) {\n flattenNode.children = dig(\n (treeNode[fieldChildren as keyof TreeDataType] as TreeDataType[]) ||\n [],\n flattenNode,\n );\n } else {\n flattenNode.children = [];\n }\n\n return flattenNode;\n });\n }\n\n dig(treeNodeList);\n\n return flattenList;\n}\n\ntype ExternalGetKey = GetKey | string;\n\ninterface TraverseDataNodesConfig {\n childrenPropName?: string;\n externalGetKey?: ExternalGetKey;\n fieldNames?: FieldNames;\n}\n\n/**\n * Traverse all the data by `treeData`.\n * Please not use it out of the `rc-tree` since we may refactor this code.\n */\nexport function traverseDataNodes(\n dataNodes: DataNode[],\n callback: (data: {\n node: DataNode;\n index: number;\n pos: string;\n key: Key;\n parentPos: string | number;\n level: number;\n nodes: DataNode[];\n }) => void,\n // To avoid too many params, let use config instead of origin param\n config?: TraverseDataNodesConfig | string,\n) {\n const mergedConfig: TraverseDataNodesConfig =\n typeof config === \"object\" ? config : { externalGetKey: config };\n\n // Init config\n const { childrenPropName, externalGetKey, fieldNames } = mergedConfig;\n\n const { key: fieldKey, children: fieldChildren } = fillFieldNames(fieldNames);\n\n const mergeChildrenPropertyName = childrenPropName || fieldChildren;\n\n // Get keys\n let syntheticGetKey: (node: DataNode, pos?: string) => Key;\n if (externalGetKey) {\n if (typeof externalGetKey === \"string\") {\n syntheticGetKey = (node: DataNode) => (node as any)[externalGetKey];\n } else if (typeof externalGetKey === \"function\") {\n syntheticGetKey = (node: DataNode) => externalGetKey(node);\n }\n } else {\n syntheticGetKey = (node, pos) =>\n getKey(node[fieldKey as keyof DataNode] as Key, pos!);\n }\n\n // Process\n function processNode(\n node: DataNode,\n index?: number,\n parent?: { node: DataNode; pos: string; level: number },\n pathNodes?: DataNode[],\n ) {\n const children = node\n ? (node[mergeChildrenPropertyName as keyof DataNode] as DataNode[])\n : dataNodes;\n const pos = node ? getPosition(parent!.pos, index!) : \"0\";\n const connectNodes = node ? [...pathNodes!, node] : [];\n\n // Process node if is not root\n if (node) {\n const key: Key = syntheticGetKey(node, pos);\n const data = {\n node,\n index: index!,\n pos,\n key: key as Key,\n parentPos: (parent!.node ? parent!.pos : undefined) as string | number,\n level: parent!.level + 1,\n nodes: connectNodes,\n };\n\n callback(data);\n }\n\n // Process children node\n if (children) {\n children.forEach((subNode, subIndex) => {\n processNode(\n subNode,\n subIndex,\n {\n node,\n pos,\n level: parent ? parent.level + 1 : -1,\n },\n connectNodes,\n );\n });\n }\n }\n\n processNode(undefined as unknown as DataNode);\n}\n\ninterface Wrapper {\n posEntities: Record;\n keyEntities: KeyEntities;\n}\n\n/**\n * Convert `treeData` into entity records.\n */\nexport function convertDataToEntities(\n dataNodes: DataNode[],\n {\n initWrapper,\n processEntity,\n onProcessFinished,\n externalGetKey,\n childrenPropName,\n fieldNames,\n }: {\n initWrapper?: (wrapper: Wrapper) => Wrapper;\n processEntity?: (entity: DataEntity, wrapper: Wrapper) => void;\n onProcessFinished?: (wrapper: Wrapper) => void;\n externalGetKey?: ExternalGetKey;\n childrenPropName?: string;\n fieldNames?: FieldNames;\n } = {},\n /** @deprecated Use `config.externalGetKey` instead */\n legacyExternalGetKey?: ExternalGetKey,\n) {\n // Init config\n const mergedExternalGetKey = externalGetKey || legacyExternalGetKey;\n\n const posEntities: Record = {};\n const keyEntities = {} as Record;\n let wrapper: Wrapper = {\n posEntities,\n keyEntities,\n };\n\n if (initWrapper) {\n wrapper = initWrapper(wrapper) || wrapper;\n }\n\n traverseDataNodes(\n dataNodes,\n (item) => {\n const { node, index, pos, key, parentPos, level, nodes } = item;\n const entity: DataEntity = { node, nodes, index, key, pos, level };\n\n const mergedKey = getKey(key, pos);\n\n posEntities[pos] = entity;\n keyEntities[mergedKey as SafeKey] = entity;\n\n // Fill children\n entity.parent = posEntities[parentPos];\n if (entity.parent) {\n entity.parent.children = entity.parent.children || [];\n entity.parent.children.push(entity);\n }\n\n if (processEntity) {\n processEntity(entity, wrapper);\n }\n },\n { externalGetKey: mergedExternalGetKey, childrenPropName, fieldNames },\n );\n\n if (onProcessFinished) {\n onProcessFinished(wrapper);\n }\n\n return wrapper;\n}\n\nexport interface TreeNodeRequiredProps<\n TreeDataType extends BasicDataNode = DataNode,\n> {\n expandedKeys: Key[];\n selectedKeys: Key[];\n loadedKeys: Key[];\n loadingKeys: Key[];\n checkedKeys: Key[];\n halfCheckedKeys: Key[];\n dragOverNodeKey: Key;\n dropPosition: number;\n keyEntities: KeyEntities;\n}\n\n/**\n * Get TreeNode props with Tree props.\n */\nexport function getTreeNodeProps(\n key: Key,\n {\n expandedKeys,\n selectedKeys,\n loadedKeys,\n loadingKeys,\n checkedKeys,\n halfCheckedKeys,\n dragOverNodeKey,\n dropPosition,\n keyEntities,\n }: TreeNodeRequiredProps,\n) {\n const entity = getEntity(keyEntities, key);\n\n const treeNodeProperties = {\n eventKey: key,\n expanded: expandedKeys.includes(key),\n selected: selectedKeys.includes(key),\n loaded: loadedKeys.includes(key),\n loading: loadingKeys.includes(key),\n checked: checkedKeys.includes(key),\n halfChecked: halfCheckedKeys.includes(key),\n pos: String(entity ? entity.pos : \"\"),\n\n // [Legacy] Drag props\n // Since the interaction of drag is changed, the semantic of the props are\n // not accuracy, I think it should be finally removed\n dragOver: dragOverNodeKey === key && dropPosition === 0,\n dragOverGapTop: dragOverNodeKey === key && dropPosition === -1,\n dragOverGapBottom: dragOverNodeKey === key && dropPosition === 1,\n };\n\n return treeNodeProperties;\n}\n\n// export function convertNodePropsToEventData<\n// TreeDataType extends BasicDataNode = DataNode,\n// >(props: TreeNodeProps): EventDataNode {\n// const {\n// data,\n// expanded,\n// selected,\n// checked,\n// loaded,\n// loading,\n// halfChecked,\n// dragOver,\n// dragOverGapTop,\n// dragOverGapBottom,\n// pos,\n// active,\n// eventKey,\n// } = props;\n\n// const eventData = {\n// ...data,\n// expanded,\n// selected,\n// checked,\n// loaded,\n// loading,\n// halfChecked,\n// dragOver,\n// dragOverGapTop,\n// dragOverGapBottom,\n// pos,\n// active,\n// key: eventKey,\n// };\n\n// if (!(\"props\" in eventData)) {\n// Object.defineProperty(eventData, \"props\", {\n// get() {\n// warning(\n// false,\n// \"Second param return from event is node data instead of TreeNode instance. Please read value directly instead of reading from `props`.\",\n// );\n// return props;\n// },\n// });\n// }\n\n// return eventData;\n// }\n", "type": "registry:file", "target": "components/tree/utils/tree-util.ts" } ], "type": "registry:component" }