@ant-design/x
Version:
Craft AI-driven interfaces effortlessly
115 lines (112 loc) • 4.08 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _icons = require("@ant-design/icons");
var _antd = require("antd");
var _clsx = _interopRequireDefault(require("clsx"));
var _react = _interopRequireWildcard(require("react"));
var _xProvider = require("../x-provider");
// File tree node type
const {
DirectoryTree: AntDirectoryTree
} = _antd.Tree;
const DirectoryTree = ({
treeData,
selectedKeys,
expandedKeys,
onSelect,
onExpand,
showLine = false,
defaultExpandAll = true,
className,
classNames,
directoryIcons,
styles,
style,
directoryTitle,
prefixCls: customizePrefixCls
}) => {
// ============================ Tree Config ============================
const isFolder = node => {
return !!node.children && node.children.length > 0;
};
const getIcon = (0, _react.useCallback)(node => {
// If directoryIcons is false or null, do not display icons
if (directoryIcons === false || directoryIcons === null) {
return null;
}
if (isFolder(node)) {
const icon = directoryIcons?.directory;
if (typeof icon === 'function') {
return icon();
}
return icon || /*#__PURE__*/_react.default.createElement(_icons.FolderOutlined, null);
}
// Return corresponding icon based on file extension
const filePath = node.path.toLowerCase();
const extension = filePath.split('.').pop();
if (extension) {
// Check if custom icon configuration exists
const icon = directoryIcons?.[extension];
if (icon) {
return typeof icon === 'function' ? icon() : icon;
}
}
return /*#__PURE__*/_react.default.createElement(_icons.FileOutlined, null);
}, [directoryIcons]);
const buildPathSegments = (0, _react.useCallback)((node, parentSegments = []) => {
if (node.path === '/' && parentSegments.length === 0) {
return ['/'];
}
return [...parentSegments, node.path].filter(segment => segment !== '');
}, []);
const convertToTreeData = (0, _react.useCallback)((nodes, parentSegments = []) => {
return nodes.map(node => {
const pathSegments = buildPathSegments(node, parentSegments);
const fullPath = pathSegments.join('/').replace(/^\/+/, '');
return {
...node,
key: fullPath,
path: fullPath,
pathSegments,
title: node.title,
icon: getIcon(node),
isLeaf: !isFolder(node),
children: node.children ? convertToTreeData(node.children, pathSegments) : undefined
};
});
}, [buildPathSegments, getIcon]);
const treeDataConverted = convertToTreeData(treeData);
const titleNode = directoryTitle === false || directoryTitle === null ? null : typeof directoryTitle === 'function' ? directoryTitle() : directoryTitle;
// ============================ Prefix ============================
const {
getPrefixCls
} = (0, _xProvider.useXProviderContext)();
const prefixCls = getPrefixCls('folder', customizePrefixCls);
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, titleNode ? /*#__PURE__*/_react.default.createElement("div", {
style: {
...styles?.directoryTitle,
...style
},
className: (0, _clsx.default)(`${prefixCls}-directory-tree-title`, className, classNames?.directoryTitle)
}, titleNode) : null, /*#__PURE__*/_react.default.createElement(AntDirectoryTree, {
treeData: treeDataConverted,
selectedKeys: selectedKeys,
expandedKeys: expandedKeys,
onSelect: onSelect,
onExpand: onExpand,
multiple: false,
blockNode: true,
classNames: {
itemTitle: `${prefixCls}-directory-tree-item-title`
},
showLine: showLine,
defaultExpandAll: defaultExpandAll,
className: (0, _clsx.default)(`${prefixCls}-directory-tree-content`)
}));
};
var _default = exports.default = DirectoryTree;