From 7472c25c0a111348b725966c385af799e2f2c41c Mon Sep 17 00:00:00 2001
From: xiaoxian521 <1923740402@qq.com>
Date: Wed, 23 Nov 2022 12:03:17 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20`@pureadmin/table`?=
=?UTF-8?q?=20=E8=A1=8C=E3=80=81=E5=88=97=E6=8B=96=E6=8B=BD=E7=A4=BA?=
=?UTF-8?q?=E4=BE=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
locales/en.yaml | 2 +
locales/zh-CN.yaml | 2 +
package.json | 4 +-
pnpm-lock.yaml | 10 +--
src/assets/svg/hot.svg | 1 +
src/router/modules/table.ts | 18 ++--
src/store/modules/app.ts | 7 +-
src/store/modules/types.ts | 1 +
src/views/components/draggable/index.vue | 10 ++-
.../pure-table/{components => base}/base.vue | 0
.../{components => base}/border.vue | 0
.../column-template/columns.tsx | 0
.../column-template/index.vue | 0
.../{components => base}/customIndex.vue | 0
.../pure-table/{components => base}/data.ts | 0
.../{components => base}/expand.vue | 0
.../{components => base}/filters.vue | 0
.../{components => base}/fixColumn.vue | 0
.../{components => base}/fixHeader.vue | 0
.../{components => base}/fluidHeight.vue | 0
.../{components => base}/groupHeader.vue | 0
.../header-renderer/columns.tsx | 0
.../header-renderer/index.vue | 0
.../{components => base}/imgPreview.vue | 0
.../{components => base}/layout.vue | 0
src/views/pure-table/{ => base}/list.tsx | 48 +++++-----
.../pure-table/{components => base}/merge.vue | 0
.../{components => base}/multipleChoice.vue | 0
.../{components => base}/nestProp.vue | 0
.../pure-table/{components => base}/radio.vue | 0
.../{components => base}/sortable.vue | 0
.../{components => base}/status.vue | 0
.../{components => base}/stripe.vue | 0
.../{components => base}/totalRow.vue | 0
.../pure-table/{components => base}/tree.vue | 0
src/views/pure-table/components/index.ts | 47 ----------
src/views/pure-table/high.vue | 56 ++++++++++++
src/views/pure-table/high/data.ts | 88 +++++++++++++++++++
.../pure-table/high/drag/column/columns.tsx | 68 ++++++++++++++
.../pure-table/high/drag/column/index.vue | 16 ++++
.../pure-table/high/drag/row/columns.tsx | 69 +++++++++++++++
src/views/pure-table/high/drag/row/index.vue | 16 ++++
src/views/pure-table/high/list.tsx | 20 +++++
src/views/pure-table/index.vue | 13 ++-
44 files changed, 406 insertions(+), 90 deletions(-)
create mode 100644 src/assets/svg/hot.svg
rename src/views/pure-table/{components => base}/base.vue (100%)
rename src/views/pure-table/{components => base}/border.vue (100%)
rename src/views/pure-table/{components => base}/column-template/columns.tsx (100%)
rename src/views/pure-table/{components => base}/column-template/index.vue (100%)
rename src/views/pure-table/{components => base}/customIndex.vue (100%)
rename src/views/pure-table/{components => base}/data.ts (100%)
rename src/views/pure-table/{components => base}/expand.vue (100%)
rename src/views/pure-table/{components => base}/filters.vue (100%)
rename src/views/pure-table/{components => base}/fixColumn.vue (100%)
rename src/views/pure-table/{components => base}/fixHeader.vue (100%)
rename src/views/pure-table/{components => base}/fluidHeight.vue (100%)
rename src/views/pure-table/{components => base}/groupHeader.vue (100%)
rename src/views/pure-table/{components => base}/header-renderer/columns.tsx (100%)
rename src/views/pure-table/{components => base}/header-renderer/index.vue (100%)
rename src/views/pure-table/{components => base}/imgPreview.vue (100%)
rename src/views/pure-table/{components => base}/layout.vue (100%)
rename src/views/pure-table/{ => base}/list.tsx (75%)
rename src/views/pure-table/{components => base}/merge.vue (100%)
rename src/views/pure-table/{components => base}/multipleChoice.vue (100%)
rename src/views/pure-table/{components => base}/nestProp.vue (100%)
rename src/views/pure-table/{components => base}/radio.vue (100%)
rename src/views/pure-table/{components => base}/sortable.vue (100%)
rename src/views/pure-table/{components => base}/status.vue (100%)
rename src/views/pure-table/{components => base}/stripe.vue (100%)
rename src/views/pure-table/{components => base}/totalRow.vue (100%)
rename src/views/pure-table/{components => base}/tree.vue (100%)
delete mode 100644 src/views/pure-table/components/index.ts
create mode 100644 src/views/pure-table/high.vue
create mode 100644 src/views/pure-table/high/data.ts
create mode 100644 src/views/pure-table/high/drag/column/columns.tsx
create mode 100644 src/views/pure-table/high/drag/column/index.vue
create mode 100644 src/views/pure-table/high/drag/row/columns.tsx
create mode 100644 src/views/pure-table/high/drag/row/index.vue
create mode 100644 src/views/pure-table/high/list.tsx
diff --git a/locales/en.yaml b/locales/en.yaml
index f11573397..d2e78c5c3 100644
--- a/locales/en.yaml
+++ b/locales/en.yaml
@@ -95,6 +95,8 @@ menus:
hsExecl: Export Excel
hsInfiniteScroll: Table Infinite Scroll
hsdanmaku: Danmaku Components
+ hsPureTableBase: Base Usage
+ hsPureTableHigh: High Usage
status:
hsLoad: Loading...
login:
diff --git a/locales/zh-CN.yaml b/locales/zh-CN.yaml
index fa1e29d2a..fb50c89db 100644
--- a/locales/zh-CN.yaml
+++ b/locales/zh-CN.yaml
@@ -95,6 +95,8 @@ menus:
hsExecl: 导出Excel
hsInfiniteScroll: 表格无限滚动
hsdanmaku: 弹幕组件
+ hsPureTableBase: 基础用法
+ hsPureTableHigh: 高级用法
status:
hsLoad: 加载中...
login:
diff --git a/package.json b/package.json
index 3eb219734..0c77cbbc3 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
"@logicflow/extension": "^1.1.30",
"@pureadmin/components": "^1.1.0",
"@pureadmin/descriptions": "^1.1.0",
- "@pureadmin/table": "^1.6.0",
+ "@pureadmin/table": "^1.7.0",
"@pureadmin/utils": "^1.6.7",
"@vueuse/core": "^9.5.0",
"@vueuse/motion": "2.0.0-beta.12",
@@ -107,7 +107,7 @@
"@types/nprogress": "0.2.0",
"@types/qrcode": "^1.4.2",
"@types/qs": "^6.9.7",
- "@types/sortablejs": "^1.13.0",
+ "@types/sortablejs": "^1.15.0",
"@typescript-eslint/eslint-plugin": "^5.43.0",
"@typescript-eslint/parser": "^5.43.0",
"@vitejs/plugin-vue": "^3.2.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ac80caca0..61a6f9bd1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,7 +20,7 @@ specifiers:
"@logicflow/extension": ^1.1.30
"@pureadmin/components": ^1.1.0
"@pureadmin/descriptions": ^1.1.0
- "@pureadmin/table": ^1.6.0
+ "@pureadmin/table": ^1.7.0
"@pureadmin/theme": ^2.4.0
"@pureadmin/utils": ^1.6.7
"@types/element-resize-detector": 1.1.3
@@ -33,7 +33,7 @@ specifiers:
"@types/nprogress": 0.2.0
"@types/qrcode": ^1.4.2
"@types/qs": ^6.9.7
- "@types/sortablejs": ^1.13.0
+ "@types/sortablejs": ^1.15.0
"@typescript-eslint/eslint-plugin": ^5.43.0
"@typescript-eslint/parser": ^5.43.0
"@vitejs/plugin-vue": ^3.2.0
@@ -132,7 +132,7 @@ dependencies:
"@logicflow/extension": 1.1.31
"@pureadmin/components": 1.1.0_vue@3.2.45
"@pureadmin/descriptions": 1.1.1_element-plus@2.2.22
- "@pureadmin/table": 1.6.0_element-plus@2.2.22
+ "@pureadmin/table": 1.7.0_element-plus@2.2.22
"@pureadmin/utils": 1.6.7_aotapuqn7htzdjltsyimavekky
"@vueuse/core": 9.5.0_vue@3.2.45
"@vueuse/motion": 2.0.0-beta.12_vue@3.2.45
@@ -1379,10 +1379,10 @@ packages:
vue: 3.2.45
dev: false
- /@pureadmin/table/1.6.0_element-plus@2.2.22:
+ /@pureadmin/table/1.7.0_element-plus@2.2.22:
resolution:
{
- integrity: sha512-ryTZbfkNT/PTUS6pdrq7vuHr3f74lXs6kgRHaAPz64iTZmzaeVzf27TPakf4YDEcnQ/Gw6RqlQzE71W9m+P48w==
+ integrity: sha512-6SWHJFiMf0V3L+Y5/1MZMClZo8QrOvkpLjkqeaZFO5N80Th17Nv1I4Feve6HPPS4dFBf5J0oRPr8L6OjjdaASw==
}
peerDependencies:
element-plus: ^2.0.0
diff --git a/src/assets/svg/hot.svg b/src/assets/svg/hot.svg
new file mode 100644
index 000000000..817e54c37
--- /dev/null
+++ b/src/assets/svg/hot.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/router/modules/table.ts b/src/router/modules/table.ts
index de721ebd6..fa765d0d9 100644
--- a/src/router/modules/table.ts
+++ b/src/router/modules/table.ts
@@ -1,10 +1,12 @@
+import { $t } from "@/plugins/i18n";
+import hot from "@/assets/svg/hot.svg?component";
import type { RouteConfigsTable } from "/#/index";
const flowChartRouter: RouteConfigsTable = {
path: "/pure-table",
redirect: "/pure-table/index",
meta: {
- icon: "mdi:table-large",
+ icon: hot,
title: "pure-admin-table",
rank: 4
},
@@ -14,11 +16,15 @@ const flowChartRouter: RouteConfigsTable = {
name: "PureTable",
component: () => import("@/views/pure-table/index.vue"),
meta: {
- title: "pure-admin-table",
- extraIcon: {
- svg: true,
- name: "team-iconxinpin"
- }
+ title: $t("menus.hsPureTableBase")
+ }
+ },
+ {
+ path: "/pure-table/high",
+ name: "PureTableHigh",
+ component: () => import("@/views/pure-table/high.vue"),
+ meta: {
+ title: $t("menus.hsPureTableHigh")
}
}
]
diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts
index b185c5654..79a6acb4e 100644
--- a/src/store/modules/app.ts
+++ b/src/store/modules/app.ts
@@ -19,7 +19,9 @@ export const useAppStore = defineStore({
layout:
storageLocal.getItem("responsive-layout")?.layout ??
getConfig().Layout,
- device: deviceDetection() ? "mobile" : "desktop"
+ device: deviceDetection() ? "mobile" : "desktop",
+ // 作用于 src/views/components/draggable/index.vue 页面,当离开页面并不会销毁 new Swap(),sortablejs 官网也没有提供任何销毁的 api
+ sortSwap: false
}),
getters: {
getSidebarStatus() {
@@ -56,6 +58,9 @@ export const useAppStore = defineStore({
},
setLayout(layout) {
this.layout = layout;
+ },
+ setSortSwap(val) {
+ this.sortSwap = val;
}
}
});
diff --git a/src/store/modules/types.ts b/src/store/modules/types.ts
index 22fa40478..95228fc93 100644
--- a/src/store/modules/types.ts
+++ b/src/store/modules/types.ts
@@ -19,6 +19,7 @@ export type appType = {
};
layout: string;
device: string;
+ sortSwap: boolean;
};
export type multiType = {
diff --git a/src/views/components/draggable/index.vue b/src/views/components/draggable/index.vue
index 247fef940..74fbcd78c 100644
--- a/src/views/components/draggable/index.vue
+++ b/src/views/components/draggable/index.vue
@@ -1,13 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pure-table/high/data.ts b/src/views/pure-table/high/data.ts
new file mode 100644
index 000000000..0ad9b38e6
--- /dev/null
+++ b/src/views/pure-table/high/data.ts
@@ -0,0 +1,88 @@
+import dayjs from "dayjs";
+import { clone } from "@pureadmin/utils";
+
+const date = dayjs(new Date()).format("YYYY-MM-DD");
+
+const tableData = [
+ {
+ date,
+ name: "Tom",
+ address: "No. 189, Grove St, Los Angeles"
+ },
+ {
+ date,
+ name: "Jack",
+ address: "No. 189, Grove St, Los Angeles"
+ },
+ {
+ date,
+ name: "Dick",
+ address: "No. 189, Grove St, Los Angeles"
+ },
+ {
+ date,
+ name: "Harry",
+ address: "No. 189, Grove St, Los Angeles"
+ },
+ {
+ date,
+ name: "Sam",
+ address: "No. 189, Grove St, Los Angeles"
+ },
+ {
+ date,
+ name: "Lucy",
+ address: "No. 189, Grove St, Los Angeles"
+ },
+ {
+ date,
+ name: "Mary",
+ address: "No. 189, Grove St, Los Angeles"
+ },
+ {
+ date,
+ name: "Mike",
+ address: "No. 189, Grove St, Los Angeles"
+ }
+];
+
+const tableDataMore = clone(tableData, true).map(item =>
+ Object.assign(item, {
+ state: "California",
+ city: "Los Angeles",
+ "post-code": "CA 90036"
+ })
+);
+
+const tableDataImage = clone(tableData, true).map((item, index) =>
+ Object.assign(item, {
+ image: `https://xiaoxian521.github.io/pure-admin-table/imgs/${
+ index + 1
+ }.jpg`
+ })
+);
+
+const tableDataSortable = clone(tableData, true).map((item, index) =>
+ Object.assign(item, {
+ date: `${dayjs(new Date()).format("YYYY-MM")}-${index + 1}`
+ })
+);
+
+const tableDataDrag = clone(tableData, true).map((item, index) => {
+ delete item["address"];
+ return Object.assign(
+ {
+ id: index + 1,
+ date: `${dayjs(new Date()).format("YYYY-MM")}-${index + 1}`
+ },
+ item
+ );
+});
+
+export {
+ tableData,
+ tableDataDrag,
+ tableDataMore,
+ tableDataImage,
+ tableDataSortable
+};
diff --git a/src/views/pure-table/high/drag/column/columns.tsx b/src/views/pure-table/high/drag/column/columns.tsx
new file mode 100644
index 000000000..4bb04d343
--- /dev/null
+++ b/src/views/pure-table/high/drag/column/columns.tsx
@@ -0,0 +1,68 @@
+import Sortable from "sortablejs";
+import { tableDataDrag } from "../../data";
+import { ref, nextTick, onMounted } from "vue";
+
+// 行拖拽演示
+export function useColumns() {
+ const dataList = ref(tableDataDrag);
+
+ const columnsDrag = ref([
+ {
+ label: "ID",
+ prop: "id"
+ },
+ {
+ label: "日期",
+ prop: "date"
+ },
+ {
+ label: "姓名",
+ prop: "name"
+ }
+ ]);
+
+ const columns = ref([
+ {
+ label: "ID",
+ prop: index => columnsDrag.value[index].prop as string
+ },
+ {
+ label: "日期",
+ prop: index => columnsDrag.value[index].prop as string
+ },
+ {
+ label: "姓名",
+ prop: index => columnsDrag.value[index].prop as string
+ }
+ ]);
+
+ const columnDrop = (event: { preventDefault: () => void }) => {
+ event.preventDefault();
+ nextTick(() => {
+ const wrapper: HTMLElement = document.querySelector(
+ ".el-table__header-wrapper tr"
+ );
+ Sortable.create(wrapper, {
+ animation: 300,
+ delay: 0,
+ onEnd: ({ newIndex, oldIndex }) => {
+ const oldItem = columnsDrag.value[oldIndex];
+ columnsDrag.value.splice(oldIndex, 1);
+ columnsDrag.value.splice(newIndex, 0, oldItem);
+ }
+ });
+ });
+ };
+
+ onMounted(() => {
+ nextTick(() => {
+ columnDrop(event);
+ });
+ });
+
+ return {
+ columns,
+ dataList,
+ columnsDrag
+ };
+}
diff --git a/src/views/pure-table/high/drag/column/index.vue b/src/views/pure-table/high/drag/column/index.vue
new file mode 100644
index 000000000..edc95e7fb
--- /dev/null
+++ b/src/views/pure-table/high/drag/column/index.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ {{ columnsDrag }}
+
+
+
+
+
diff --git a/src/views/pure-table/high/drag/row/columns.tsx b/src/views/pure-table/high/drag/row/columns.tsx
new file mode 100644
index 000000000..96f8c063a
--- /dev/null
+++ b/src/views/pure-table/high/drag/row/columns.tsx
@@ -0,0 +1,69 @@
+import Sortable from "sortablejs";
+import { ref, nextTick } from "vue";
+import { tableDataDrag } from "../../data";
+
+// 行拖拽演示
+export function useColumns() {
+ const dataList = ref(tableDataDrag);
+
+ const rowDrop = (event: { preventDefault: () => void }) => {
+ event.preventDefault();
+ nextTick(() => {
+ const wrapper: HTMLElement = document.querySelector(
+ ".el-table__body-wrapper tbody"
+ );
+ Sortable.create(wrapper, {
+ animation: 300,
+ handle: ".drag-btn",
+ onEnd: ({ newIndex, oldIndex }) => {
+ const currentRow = dataList.value.splice(oldIndex, 1)[0];
+ dataList.value.splice(newIndex, 0, currentRow);
+ }
+ });
+ });
+ };
+
+ const columns: TableColumnList = [
+ // {
+ // width: 60,
+ // cellRenderer: () => (
+ // void }) =>
+ // rowDrop(event)
+ // }
+ // />
+ // )
+ // },
+ {
+ label: "ID",
+ prop: "id",
+ cellRenderer: ({ row }) => (
+
+
void }) =>
+ rowDrop(event)
+ }
+ />
+ {row.id}
+
+ )
+ },
+ {
+ label: "日期",
+ prop: "date"
+ },
+ {
+ label: "姓名",
+ prop: "name"
+ }
+ ];
+
+ return {
+ columns,
+ dataList
+ };
+}
diff --git a/src/views/pure-table/high/drag/row/index.vue b/src/views/pure-table/high/drag/row/index.vue
new file mode 100644
index 000000000..65ee65fe9
--- /dev/null
+++ b/src/views/pure-table/high/drag/row/index.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ {{ dataList }}
+
+
+
+
+
diff --git a/src/views/pure-table/high/list.tsx b/src/views/pure-table/high/list.tsx
new file mode 100644
index 000000000..0fb397b74
--- /dev/null
+++ b/src/views/pure-table/high/list.tsx
@@ -0,0 +1,20 @@
+import RowDrag from "./drag/row/index.vue";
+import ColumnDrag from "./drag/column/index.vue";
+
+const rendContent = (val: string) =>
+ `代码位置:src/views/pure-table/high/${val}/index.vue`;
+
+export const list = [
+ {
+ key: "rowDrag",
+ content: rendContent("drag/row"),
+ title: "拖拽表格(行拖拽)",
+ component: RowDrag
+ },
+ {
+ key: "columnDrag",
+ content: rendContent("drag/column"),
+ title: "拖拽表格(列拖拽)",
+ component: ColumnDrag
+ }
+];
diff --git a/src/views/pure-table/index.vue b/src/views/pure-table/index.vue
index 6b26bba01..c5ce67b87 100644
--- a/src/views/pure-table/index.vue
+++ b/src/views/pure-table/index.vue
@@ -1,5 +1,5 @@