import { __getItem, __setItem, ObjectInterface, requestPayload, buildParameter } from '../../script/index' import { ref, computed, reactive, watch, getCurrentInstance, nextTick } from 'vue' import Paging from './paging' import { ListInterface, ParentInterface } from '.' const editCode = ref(-1) // const treeRef = ref() export const initHooks = (treeProps: ObjectInterface, props: ObjectInterface, ctx1: any, proxy: any) => { const treeRef = ref() // eslint-disable-next-line complexity const nameFilter = computed(() => (name: string): string => { if (name.indexOf('/') > 0) { const nameSet = name.split('/') const transName = translate(nameSet[nameSet.length - 1]) nameSet.splice(nameSet.length - 1, 1, transName) return nameSet.join('/') } else { return translate(name) } }) const lazyComputed = computed(() => { return props.lazy !== undefined ? props.lazy : props.loadChildrenNodes !== undefined ? true : !props.isShowFilterText?.() }) const translate = (name) => { switch (name) { case 'Flows': return (window as any).$t('flows') case 'Datasets': return (window as any).$t('dataset') case 'Standards': return (window as any).$t('standards') case 'Datasources': return (window as any).$t('datasource') case 'Schemas': return (window as any).$t('schema') case 'OtherUser': return 'OtherUser' case 'DataResource': return (window as any).$t('dataResource') case 'Assets': return (window as any).$t('assets') case 'Filesets': return (window as any).$t('filesets') case 'DataAssets': return (window as any).$t('dataAssets') case 'JobViews': return (window as any).$t('jobViews') case 'DataService': return (window as any).$t('dataService') case 'AlgorithmResource': return (window as any).$t('algorithmResource') case 'Tasks': return (window as any).$t('task') case 'ModelResource': return (window as any).$t('modelResource') case 'Storages': return (window as any).$t('storages') case 'UstdJobs': return (window as any).$t('ustd_job_dir') case 'UstdDatasets': return (window as any).$t('ustd_dataset_dir') case 'UstdSchemas': return (window as any).$t('ustd_schema_dir') default: return name } } const routeName = location.pathname const nodeKey = treeProps.value.nodeKey || 'id' const currentNodeKey = ref('') const defaultExpandedKeys = reactive({ list: [] }) const nodeSources = reactive({ list: [] }) const loadCurrentNode = reactive({ node: {} }) const loadCurrentApi = reactive({ api: {} }) const serveConfig = __getItem('serveConfig') let loadPaging = new Paging(proxy, props.defaultProps.nodeKey as string) // const remoteFilterText = ref('') // const selectFilter = ref('') const inputTimer = ref(0) const filterText = ref('') const uploadNode = (node: ObjectInterface): void => { treeRef?.value?.setCurrentKey(node[nodeKey]) let currentNode = treeRef.value.getNode(node[nodeKey]) refreshNodeBy(currentNode) } const getNodeSources = (node: ObjectInterface): void => { nodeSources.list.push(node.data) if (node.parent && node.level as number > 1) { getNodeSources(node.parent as ObjectInterface) } } let lastTapTimeFunc = ref(0) let lastTapDiffTime = 0 const handleNodeClick = (data: ObjectInterface, node: any, ...val: any[]): void => { // 设置第一个有效节点 data = getValidNodeData(data) node = treeRef.value.getNode(data) const _currentNodeKey = data[nodeKey] treeRef.value.setCurrentKey(_currentNodeKey) setExpand(_currentNodeKey) if (editCode.value !== -1) return let curT = new Date().getTime() let lastT = lastTapDiffTime lastTapDiffTime = curT let diff = curT - lastT if (diff < 300) { // 清除上一次单击的定时器ID clearTimeout(lastTapTimeFunc.value) } else { // 定时器id lastTapTimeFunc.value = window.setTimeout(() => { nodeClickHandler(data, node) }, 300) } } const nodeClickHandler = (data: ObjectInterface, node: ObjectInterface) => { loadPaging.clickMore(data, node) nodeSources.list = [] getNodeSources(node) ctx1.emit('treeCurrentData', data, true, nodeSources.list, node) // 将返回来的数据添加到树的对应节点下 if (props.nodeCheck) { let nodeData = __getItem('nodeData') || {} const currentNode = { nodeId: data.id, nodePId: data.parentId || '' } nodeData[routeName as string] = currentNode __setItem('nodeData', nodeData) currentNodeKey.value = currentNode.nodeId } } // 获取第一个有效节点 const getValidNodeData = (data) => { if (data.selected === 1 || data.selected === undefined) { return data } for (let child of data.children) { return getValidNodeData(child) } } const handleContextmenu = (event: ObjectInterface, data: ObjectInterface, node: ObjectInterface): void => { nodeSources.list = [] getNodeSources(node) props.contextmenu(event.target, event, data, nodeSources.list, node) } const loadNode = (node: ObjectInterface, resolve: Function): void => { loadCurrentNode.node = node node.resolve = resolve if (!node.loadList) { node.loadList = [] } if (node.level === 0 && props.dataTree.length) { return resolve(props.dataTree) } loadNodeHandler(node, resolve) } const loadNodeHandler = (node: ObjectInterface, resolve: Function) => { if ((node.level as number) >= 1) { // 再次点击节点时候不会请求数据,还是原来的数据,isForceRefresh=true,强制刷新,重新请求数据 if ((node.data as ObjectInterface)[treeProps.value.children as string] !== undefined && !treeProps.value.isForceRefresh) { return resolve((node.data as ObjectInterface)[treeProps.value.children as string] || []) } else { nodeSources.list = [] getNodeSources(node) props.loadChildrenNodes && props.loadChildrenNodes(node, resolve, nodeSources.list) } } } const refreshNodeBy = (parent: ParentInterface): void => { parent.loaded = false parent.expand!() } const setExpand = async (nodeId: string): Promise => { if (nodeId) { defaultExpandedKeys.list = [nodeId] } } const setCurrent = async (data: ObjectInterface): Promise => { if (treeRef.value) { treeRef.value.setCurrentKey(data[nodeKey]) setExpand(data[nodeKey]) } } const handleCheckChange = (data: ObjectInterface, checked: boolean): void => { ctx1.emit('checkChange', data, checked) } const inputFilter = (val: string) => { clearTimeout(inputTimer.value) inputTimer.value = window.setTimeout(() => { treeRef.value.filter(val) }, 200) } const filterNode = (value: string, data: ObjectInterface): boolean => { if (!value) return true let lowName = (data.name as string).toLowerCase() return lowName.includes((value.toLowerCase())) } const handleCustom = (data: ObjectInterface): void => { ctx1.emit('handleCustom', data) } treeProps.value.isLeaf = (data: any) => { return data.leaf !== undefined ? data.leaf : (!props.loadChildrenNodes && !data[treeProps.value.children || 'children']?.length) } watch(() => props.dataTree, (n) => { const nodeData = __getItem('nodeData')?.[routeName] let _currentNodeKey = '' nextTick(() => { if (props.nodeCheck && nodeData?.nodeId) { _currentNodeKey = nodeData.nodeId } else if (props.initCurrent && n.length) { // _currentNodeKey = n[0]?.[treeProps.value.nodeKey] const currentData = getValidNodeData(n[0]) _currentNodeKey = currentData[nodeKey] } if (_currentNodeKey) { treeRef.value.setCurrentKey(_currentNodeKey) setExpand(_currentNodeKey) const currentNodeData = treeRef.value?.getCurrentNode() currentNodeData && ctx1.emit('treeCurrentData', currentNodeData, false) } }) }, { deep: true }) const getResourceHandler = (data: any) => { if (serveConfig?.isResourceNumber) { return data['resourceNum'] || 0 } else { return data.children?.length || 0 } } return { routeName, currentNodeKey, defaultExpandedKeys, treeProps, filterText, nameFilter, uploadNode, handleNodeClick, handleContextmenu, loadNode, setExpand, setCurrent, handleCheckChange, inputFilter, filterNode, handleCustom, requestPayload, buildParameter, getResourceHandler, loadCurrentApi, loadCurrentNode, loadPaging, lazyComputed, treeRef } } export const dropHooks = (config: ObjectInterface, ctx1: any) => { const allowDrag = (node: ObjectInterface): void => { if (config.allowDrag) { return config.allowDrag(node) } } const allowDrop = (sourceNode: ObjectInterface, targetNode: ObjectInterface, type: string): boolean => { if (config.dropPeer()) { // 系统目录的独有逻辑 只允许移动 不允许插入及跨级操作 if (sourceNode.level !== targetNode.level || type === 'inner') return false return true } return allowDropNoPeer(sourceNode, targetNode, type) } const allowDropNoPeer = (sourceNode: ObjectInterface, targetNode: ObjectInterface, type: string): boolean => { if (config.allowDrop) { return config.allowDrop(sourceNode, targetNode, type) } if (type !== 'inner') { return targetNode.level as number > 1 } return true } return { allowDrop, allowDrag } } export const editHooks = (treeProps: ObjectInterface, config: ObjectInterface, ctx1: any) => { const editNodeData = ref() const inputValue = ref('') const inputRef = ref() const dblclickHandler = (data: ObjectInterface) => { if (!config.isEdit) return editCode.value = data[treeProps.value.nodeKey || 'id'] inputValue.value = data[treeProps.value.label || 'name'] editNodeData.value = data nextTick(() => { inputRef.value?.focus() }) } const inputBlurHandler = () => { editCode.value = -1 const oldVal = editNodeData.value[treeProps.value.label || 'name'] editNodeData.value[treeProps.value.label || 'name'] = inputValue.value inputValue.value = '' ctx1.emit('editBlur', editNodeData.value, oldVal) } const inputClickHandler = () => { return 1 } return { editCode, inputValue, inputRef, inputBlurHandler, dblclickHandler, inputClickHandler } }