wip: table列设置开发

This commit is contained in:
kailong321200875 2023-07-21 14:42:16 +08:00
parent ecd38282a3
commit 040476fe24
3 changed files with 105 additions and 2 deletions

View File

@ -1,5 +1,5 @@
<script lang="tsx"> <script lang="tsx">
import { defineComponent, unref, computed, PropType } from 'vue' import { defineComponent, unref, computed, PropType, watch } from 'vue'
import { import {
ElTooltip, ElTooltip,
ElDropdown, ElDropdown,
@ -14,6 +14,7 @@ import { useI18n } from '@/hooks/web/useI18n'
import { useAppStore } from '@/store/modules/app' import { useAppStore } from '@/store/modules/app'
import { TableColumn } from '../types' import { TableColumn } from '../types'
import { cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
import { eachTree } from '@/utils/tree'
const appStore = useAppStore() const appStore = useAppStore()
const sizeMap = computed(() => appStore.sizeMap) const sizeMap = computed(() => appStore.sizeMap)
@ -38,6 +39,16 @@ export default defineComponent({
emit('changSize', size) emit('changSize', size)
} }
const defaultCheckeds = computed(() => {
const checkeds: string[] = []
eachTree(unref(columns), (item: TableColumn) => {
if (!item.hidden) {
checkeds.push(item.field)
}
})
return checkeds
})
const columns = computed(() => { const columns = computed(() => {
return cloneDeep(props.columns).filter((v) => { return cloneDeep(props.columns).filter((v) => {
// typeselectionexpand // typeselectionexpand
@ -47,6 +58,91 @@ export default defineComponent({
}) })
}) })
watch(
() => columns.value,
(newColumns) => {
console.log('columns change', newColumns)
},
{
deep: true
}
)
//
function updateTreeData(treeData, draggedNode, targetNode, placement) {
let updatedTreeData = cloneDeep(treeData) //
//
function findNodes(nodeId, nodes) {
for (const node of nodes) {
if (node?.field === nodeId) {
return node
}
if (node.children && node.children.length) {
const foundNode = findNodes(nodeId, node.children)
if (foundNode) {
return foundNode
}
}
}
return null
}
const draggedNodeToUpdate = findNodes(draggedNode?.data?.field, updatedTreeData)
const targetNodeToUpdate = targetNode
? findNodes(targetNode?.data?.field, updatedTreeData)
: null
if (!draggedNodeToUpdate || (targetNode && !targetNodeToUpdate)) {
//
console.error('无法找到要更新的节点或目标节点')
return treeData //
}
//
function removeNode(node) {
const parent = updatedTreeData.find((n) => n.children.includes(node))
if (parent) {
parent.children = parent.children.filter((n) => n?.field !== node?.field)
} else {
updatedTreeData = updatedTreeData.filter((n) => n?.field !== node?.field)
}
}
removeNode(draggedNodeToUpdate)
//
function insertNode(placement) {
if (placement === 'before' || placement === 'after') {
const parent = updatedTreeData.find((n) => n.children.includes(targetNodeToUpdate))
const index = parent.children.findIndex((n) => n?.field === targetNodeToUpdate?.data?.id)
const insertionIndex = placement === 'before' ? index : index + 1
parent.children.splice(insertionIndex, 0, draggedNodeToUpdate)
} else if (placement === 'inner') {
targetNodeToUpdate.children.push(draggedNodeToUpdate)
}
}
if (targetNode) {
insertNode(placement)
} else {
// targetNode
updatedTreeData.push(draggedNodeToUpdate)
}
return updatedTreeData
}
const onNodeDragEnd = (before: any, after: any, inner: string) => {
if (inner === 'none') return
console.log(before, after, inner)
const cloneDeepColumns = cloneDeep(unref(props.columns))
const newColumns = updateTreeData(cloneDeepColumns, after, before, inner)
console.log(newColumns)
}
const onCheckChange = (data: TableColumn, isChecked: boolean, childrenHasChecked) => {
console.log(data, isChecked, childrenHasChecked)
}
return () => ( return () => (
<> <>
<div class="text-right h-28px flex items-center justify-end"> <div class="text-right h-28px flex items-center justify-end">
@ -101,6 +197,7 @@ export default defineComponent({
<ElTree <ElTree
data={unref(columns)} data={unref(columns)}
show-checkbox show-checkbox
default-checked-keys={unref(defaultCheckeds)}
draggable draggable
node-key="field" node-key="field"
allow-drop={(_draggingNode: any, _dropNode: any, type: string) => { allow-drop={(_draggingNode: any, _dropNode: any, type: string) => {
@ -110,6 +207,8 @@ export default defineComponent({
return true return true
} }
}} }}
onNode-drag-end={onNodeDragEnd}
onCheck-change={onCheckChange}
/> />
</div> </div>
) )

View File

@ -157,6 +157,7 @@ export const useTable = (config: UseTableConfig) => {
}, },
sortableChange: (e: any) => { sortableChange: (e: any) => {
console.log('sortableChange', e)
const { oldIndex, newIndex } = e const { oldIndex, newIndex } = e
dataList.value.splice(newIndex, 0, dataList.value.splice(oldIndex, 1)[0]) dataList.value.splice(newIndex, 0, dataList.value.splice(oldIndex, 1)[0])
// to do something // to do something

View File

@ -7,7 +7,7 @@ import { reactive, unref } from 'vue'
import { ElTag, ElButton } from 'element-plus' import { ElTag, ElButton } from 'element-plus'
import { useTable } from '@/hooks/web/useTable' import { useTable } from '@/hooks/web/useTable'
const { tableRegister, tableState } = useTable({ const { tableRegister, tableState, tableMethods } = useTable({
fetchDataApi: async () => { fetchDataApi: async () => {
const { currentPage, pageSize } = tableState const { currentPage, pageSize } = tableState
const res = await getTreeTableListApi({ const res = await getTreeTableListApi({
@ -21,6 +21,7 @@ const { tableRegister, tableState } = useTable({
} }
}) })
const { loading, dataList, total, currentPage, pageSize } = tableState const { loading, dataList, total, currentPage, pageSize } = tableState
const { sortableChange } = tableMethods
const { t } = useI18n() const { t } = useI18n()
@ -100,10 +101,12 @@ const actionFn = (data: TableSlotDefault) => {
:data="dataList" :data="dataList"
row-key="id" row-key="id"
:loading="loading" :loading="loading"
sortable
:pagination="{ :pagination="{
total: total total: total
}" }"
@register="tableRegister" @register="tableRegister"
@sortable-change="sortableChange"
/> />
</ContentWrap> </ContentWrap>
</template> </template>