diff --git a/src/components/RePureTableBar/src/bar.tsx b/src/components/RePureTableBar/src/bar.tsx index 6f14627a0..36b529fb0 100644 --- a/src/components/RePureTableBar/src/bar.tsx +++ b/src/components/RePureTableBar/src/bar.tsx @@ -1,6 +1,9 @@ import { useEpThemeStoreHook } from "@/store/modules/epTheme"; import { delay, getKeyList, cloneDeep } from "@pureadmin/utils"; -import { defineComponent, ref, computed, type PropType } from "vue"; +import { defineComponent, ref, computed, type PropType, nextTick } from "vue"; + +import Sortable from "sortablejs"; +import DragIcon from "./svg/drag.svg?component"; import ExpandIcon from "./svg/expand.svg?component"; import RefreshIcon from "./svg/refresh.svg?component"; import SettingIcon from "./svg/settings.svg?component"; @@ -107,16 +110,17 @@ export default defineComponent({ checkedCount > 0 && checkedCount < checkColumnList.length; } - function handleCheckColumnListChange(val: boolean, index: number) { - dynamicColumns.value[index].hide = !val; + function handleCheckColumnListChange(val: boolean, label: string) { + dynamicColumns.value.filter(item => item.label === label)[0].hide = !val; } - function onReset() { + async function onReset() { checkAll.value = true; isIndeterminate.value = false; - checkColumnList = getKeyList(cloneDeep(props?.columns), "label"); - checkedColumns.value = checkColumnList; dynamicColumns.value = cloneDeep(props?.columns); + checkColumnList = []; + checkColumnList = await getKeyList(cloneDeep(props?.columns), "label"); + checkedColumns.value = checkColumnList; } const dropdown = { @@ -144,6 +148,47 @@ export default defineComponent({ ) }; + /** 列展示拖拽排序 */ + const rowDrop = (event: { preventDefault: () => void }) => { + event.preventDefault(); + nextTick(() => { + const wrapper: HTMLElement = document.querySelector( + ".el-checkbox-group>div" + ); + Sortable.create(wrapper, { + animation: 300, + handle: ".drag-btn", + onEnd: ({ newIndex, oldIndex, item }) => { + const targetThElem = item; + const wrapperElem = targetThElem.parentNode as HTMLElement; + const oldColumn = dynamicColumns.value[oldIndex]; + const newColumn = dynamicColumns.value[newIndex]; + if (oldColumn?.fixed || newColumn?.fixed) { + // 当前列存在fixed属性 则不可拖拽 + const oldThElem = wrapperElem.children[oldIndex] as HTMLElement; + if (newIndex > oldIndex) { + wrapperElem.insertBefore(targetThElem, oldThElem); + } else { + wrapperElem.insertBefore( + targetThElem, + oldThElem ? oldThElem.nextElementSibling : oldThElem + ); + } + return; + } + const currentRow = dynamicColumns.value.splice(oldIndex, 1)[0]; + dynamicColumns.value.splice(newIndex, 0, currentRow); + } + }); + }); + }; + + const isFixedColumn = (label: string) => { + return dynamicColumns.value.filter(item => item.label === label)[0].fixed + ? true + : false; + }; + const reference = { reference: () => ( - @@ -228,22 +272,35 @@ export default defineComponent({ alignment="flex-start" size={0} > - {checkColumnList.map((item, index) => { + {checkColumnList.map(item => { return ( - - handleCheckColumnListChange(value, index) - } - > - + void; + }) => rowDrop(event)} + /> + + handleCheckColumnListChange(value, item) + } > - {item} - - + + {item} + + + ); })} diff --git a/src/components/RePureTableBar/src/svg/drag.svg b/src/components/RePureTableBar/src/svg/drag.svg new file mode 100644 index 000000000..8c373700f --- /dev/null +++ b/src/components/RePureTableBar/src/svg/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/views/system/role/hook.tsx b/src/views/system/role/hook.tsx index 4f40a0979..9fbe19fdd 100644 --- a/src/views/system/role/hook.tsx +++ b/src/views/system/role/hook.tsx @@ -21,16 +21,18 @@ export function useRole() { background: true }); const columns: TableColumnList = [ - { - label: "勾选列", // 如果需要表格多选,此处label必须设置 - type: "selection", - width: 55, - align: "left" - }, + // { + // label: "勾选列", // 如果需要表格多选,此处label必须设置 + // type: "selection", + // width: 55, + // align: "left", + // fixed: "left" + // }, { label: "序号", type: "index", - width: 70 + width: 70, + fixed: "left" }, { label: "角色编号", diff --git a/src/views/system/user/hook.tsx b/src/views/system/user/hook.tsx index 24cf50985..970979192 100644 --- a/src/views/system/user/hook.tsx +++ b/src/views/system/user/hook.tsx @@ -24,7 +24,8 @@ export function useUser() { { label: "序号", type: "index", - width: 70 + width: 70, + fixed: "left" }, { label: "用户编号",