From 43ddf7aba85c81aacb88347943356f3b25e051b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=AE=B8=E8=AF=BA?=
<86769380+shark-lajiao@users.noreply.github.com>
Date: Thu, 11 May 2023 19:58:49 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=20`PureTableBar`=20?=
=?UTF-8?q?=E7=BB=84=E4=BB=B6=EF=BC=8C=E5=88=97=E5=B1=95=E7=A4=BA=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0=E6=8B=96=E6=8B=BD=E5=8A=9F=E8=83=BD=20(#545)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: add 表格工具列拖拽
* fix: 修复拖拽
* fix: 修复警告
* fix: 修复点击checkbox表格数据隐藏
* chore: update
---------
Co-authored-by: RealityBoy <1923740402@qq.com>
---
src/components/RePureTableBar/src/bar.tsx | 99 +++++++++++++++----
.../RePureTableBar/src/svg/drag.svg | 1 +
src/views/system/role/hook.tsx | 16 +--
src/views/system/user/hook.tsx | 3 +-
4 files changed, 90 insertions(+), 29 deletions(-)
create mode 100644 src/components/RePureTableBar/src/svg/drag.svg
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: "用户编号",