perf: 支持记忆字段排序

This commit is contained in:
xiaojunnuo
2025-10-31 16:57:32 +08:00
parent d0b7162b6a
commit d46b9c54b1
3 changed files with 143 additions and 95 deletions

View File

@@ -33,11 +33,11 @@
"@aws-sdk/s3-request-presigner": "^3.535.0",
"@certd/vue-js-cron-light": "^4.0.14",
"@ctrl/tinycolor": "^4.1.0",
"@fast-crud/editor-code": "^1.26.6",
"@fast-crud/fast-crud": "^1.26.6",
"@fast-crud/fast-extends": "^1.26.6",
"@fast-crud/ui-antdv4": "^1.26.6",
"@fast-crud/ui-interface": "^1.26.6",
"@fast-crud/editor-code": "^1.27.4",
"@fast-crud/fast-crud": "^1.27.4",
"@fast-crud/fast-extends": "^1.27.4",
"@fast-crud/ui-antdv4": "^1.27.4",
"@fast-crud/ui-interface": "^1.27.4",
"@iconify/tailwind": "^1.2.0",
"@iconify/vue": "^4.1.1",
"@manypkg/get-packages": "^2.2.2",

View File

@@ -1,6 +1,6 @@
import { request } from "/src/api/service";
// import "/src/mock";
import { ColumnCompositionProps, CrudOptions, FastCrud, PageQuery, PageRes, setLogger, TransformResProps, useColumns, UseCrudProps, UserPageQuery, useTypes, utils } from "@fast-crud/fast-crud";
import { ColumnCompositionProps, CrudOptions, FastCrud, PageQuery, PageRes, setLogger, TransformResProps, useColumns, UseCrudProps, UserPageQuery, useTypes, utils, forEachTableColumns } from "@fast-crud/fast-crud";
import "@fast-crud/fast-crud/dist/style.css";
import { FsExtendsCopyable, FsExtendsEditor, FsExtendsJson, FsExtendsTime, FsExtendsUploader, FsExtendsInput } from "@fast-crud/fast-extends";
import "@fast-crud/fast-extends/dist/style.css";
@@ -17,22 +17,24 @@ import { FsEditorCode } from "@fast-crud/editor-code";
import "@fast-crud/editor-code/dist/style.css";
class ColumnSizeSaver {
save: (key: string, size: number) => void;
constructor() {
this.save = debounce((key: string, size: number) => {
type: string;
save: (key: string, value: any) => void;
constructor(type: string = "columnSize") {
this.type = type;
this.save = debounce((key: string, value: any) => {
const saveKey = this.getKey();
let data = LocalStorage.get(saveKey);
if (!data) {
data = {};
}
data[key] = size;
data[key] = value;
LocalStorage.set(saveKey, data);
});
}
getKey() {
const loc = window.location;
const currentUrl = `${loc.pathname}${loc.search}${loc.hash}`;
return `columnSize-${currentUrl}`;
return `${this.type}-${currentUrl}`;
}
get(key: string) {
const saveKey = this.getKey();
@@ -45,6 +47,7 @@ class ColumnSizeSaver {
}
}
const columnSizeSaver = new ColumnSizeSaver();
const tableSortSaver = new ColumnSizeSaver("tableSorter");
function install(app: App, options: any = {}) {
app.use(UiAntdv);
@@ -63,6 +66,8 @@ function install(app: App, options: any = {}) {
commonOptions(props: UseCrudProps): CrudOptions {
utils.logger.debug("commonOptions:", props);
const crudBinding = props.crudExpose?.crudBinding;
const crudExpose = props.crudExpose;
const { isMobile } = usePreferences();
const opts: CrudOptions = {
settings: {
@@ -74,6 +79,20 @@ function install(app: App, options: any = {}) {
},
},
},
onUseCrud(bindings: any) {
const oldSorter = tableSortSaver.get("sorter");
if (oldSorter) {
const { prop, order } = oldSorter;
forEachTableColumns(bindings.table.columns, (column: any) => {
if (column.key === prop) {
column.sortOrder = order;
} else {
column.sortOrder = false;
}
});
bindings.table.sort = oldSorter;
}
},
},
table: {
scroll: {
@@ -104,6 +123,30 @@ function install(app: App, options: any = {}) {
return "-";
},
},
onSortChange: (sortChange: any) => {
const { isServerSort, prop, asc, order } = sortChange;
const oldSort = crudBinding.value.table.sort;
const newSorter = isServerSort ? { prop, order, asc } : null;
forEachTableColumns(crudBinding.value.table.columns, (column: any) => {
if (column.key === prop) {
column.sortOrder = order;
} else {
column.sortOrder = false;
}
});
crudBinding.value.table.sort = newSorter;
if (newSorter) {
tableSortSaver.save("sorter", newSorter);
} else {
tableSortSaver.clear();
}
if (isServerSort || oldSort != null) {
crudExpose.doRefresh();
}
},
},
toolbar: {
export: {
@@ -189,6 +232,10 @@ function install(app: App, options: any = {}) {
},
wrapperCol: {
span: null,
buttons: {
copy: { show: false },
paste: { show: false },
},
},
wrapper: {
saveRemind: true,

169
pnpm-lock.yaml generated
View File

@@ -46,7 +46,7 @@ importers:
packages/core/acme-client:
dependencies:
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../basic
'@peculiar/x509':
specifier: ^1.11.0
@@ -207,11 +207,11 @@ importers:
packages/core/pipeline:
dependencies:
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../basic
'@certd/plus-core':
specifier: ^1.37.2
version: 1.37.2
specifier: ^1.37.4
version: 1.37.4
dayjs:
specifier: ^1.11.7
version: 1.11.13
@@ -415,7 +415,7 @@ importers:
packages/libs/lib-k8s:
dependencies:
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@kubernetes/client-node':
specifier: 0.21.0
@@ -455,20 +455,20 @@ importers:
packages/libs/lib-server:
dependencies:
'@certd/acme-client':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/acme-client
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@certd/plugin-lib':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../plugins/plugin-lib
'@certd/plus-core':
specifier: ^1.37.2
version: 1.37.2
specifier: ^1.37.4
version: 1.37.4
'@midwayjs/cache':
specifier: 3.14.0
version: 3.14.0
@@ -613,16 +613,16 @@ importers:
packages/plugins/plugin-cert:
dependencies:
'@certd/acme-client':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/acme-client
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@certd/plugin-lib':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../plugin-lib
'@google-cloud/publicca':
specifier: ^1.3.0
@@ -701,10 +701,10 @@ importers:
specifier: ^3.787.0
version: 3.810.0(aws-crt@1.26.2)
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@kubernetes/client-node':
specifier: 0.21.0
@@ -789,19 +789,19 @@ importers:
packages/pro/commercial-core:
dependencies:
'@certd/basic':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/basic
'@certd/lib-server':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../libs/lib-server
'@certd/pipeline':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/pipeline
'@certd/plugin-plus':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../plugin-plus
'@certd/plus-core':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../plus-core
'@midwayjs/core':
specifier: 3.20.11
@@ -886,22 +886,22 @@ importers:
specifier: ^1.0.2
version: 1.0.3
'@certd/basic':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/basic
'@certd/lib-k8s':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../libs/lib-k8s
'@certd/pipeline':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/pipeline
'@certd/plugin-cert':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../plugins/plugin-cert
'@certd/plugin-lib':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../plugins/plugin-lib
'@certd/plus-core':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../plus-core
ali-oss:
specifier: ^6.21.0
@@ -1004,7 +1004,7 @@ importers:
packages/pro/plus-core:
dependencies:
'@certd/basic':
specifier: ^1.37.1
specifier: ^1.37.2
version: link:../../core/basic
dayjs:
specifier: ^1.11.7
@@ -1086,20 +1086,20 @@ importers:
specifier: ^4.1.0
version: 4.1.0
'@fast-crud/editor-code':
specifier: ^1.26.6
version: 1.26.6
specifier: ^1.27.4
version: 1.27.4
'@fast-crud/fast-crud':
specifier: ^1.26.6
version: 1.26.6(vue@3.5.14(typescript@5.8.3))
specifier: ^1.27.4
version: 1.27.4(vue@3.5.14(typescript@5.8.3))
'@fast-crud/fast-extends':
specifier: ^1.26.6
version: 1.26.6(aws-crt@1.26.2)(vue@3.5.14(typescript@5.8.3))
specifier: ^1.27.4
version: 1.27.4(aws-crt@1.26.2)(vue@3.5.14(typescript@5.8.3))
'@fast-crud/ui-antdv4':
specifier: ^1.26.6
version: 1.26.6
specifier: ^1.27.4
version: 1.27.4
'@fast-crud/ui-interface':
specifier: ^1.26.6
version: 1.26.6
specifier: ^1.27.4
version: 1.27.4
'@iconify/tailwind':
specifier: ^1.2.0
version: 1.2.0
@@ -1300,10 +1300,10 @@ importers:
version: 0.1.3(zod@3.24.4)
devDependencies:
'@certd/lib-iframe':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-iframe
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@rollup/plugin-commonjs':
specifier: ^25.0.7
@@ -1486,47 +1486,47 @@ importers:
specifier: ^3.705.0
version: 3.810.0(aws-crt@1.26.2)
'@certd/acme-client':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/acme-client
'@certd/basic':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/basic
'@certd/commercial-core':
specifier: ^1.37.2
version: 1.37.2(better-sqlite3@11.10.0)(encoding@0.1.13)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.8.3))
specifier: ^1.37.4
version: 1.37.4(better-sqlite3@11.10.0)(encoding@0.1.13)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.8.3))
'@certd/cv4pve-api-javascript':
specifier: ^8.4.2
version: 8.4.2
'@certd/jdcloud':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-jdcloud
'@certd/lib-huawei':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-huawei
'@certd/lib-k8s':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-k8s
'@certd/lib-server':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/lib-server
'@certd/midway-flyway-js':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../libs/midway-flyway-js
'@certd/pipeline':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../core/pipeline
'@certd/plugin-cert':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../plugins/plugin-cert
'@certd/plugin-lib':
specifier: ^1.37.2
specifier: ^1.37.4
version: link:../../plugins/plugin-lib
'@certd/plugin-plus':
specifier: ^1.37.2
version: 1.37.2(encoding@0.1.13)
specifier: ^1.37.4
version: 1.37.4(encoding@0.1.13)
'@certd/plus-core':
specifier: ^1.37.2
version: 1.37.2
specifier: ^1.37.4
version: 1.37.4
'@huaweicloud/huaweicloud-sdk-cdn':
specifier: ^3.1.120
version: 3.1.149
@@ -2769,17 +2769,17 @@ packages:
'@better-scroll/zoom@2.5.1':
resolution: {integrity: sha512-aGvFY5ooeZWS4RcxQLD+pGLpQHQxpPy0sMZV3yadcd2QK53PK9gS4Dp+BYfRv8lZ4/P2LoNEhr6Wq1DN6+uPlA==}
'@certd/commercial-core@1.37.2':
resolution: {integrity: sha512-fhDA3sr+iNPEj7xf9D2bJHIl6SzOhahJJ65wJID1HHHSKl8/o+QYpaa0vLfoxE7gmem7H+BoIDe2zB54/JVdFw==}
'@certd/commercial-core@1.37.4':
resolution: {integrity: sha512-Axx1yBekqPy6D9LjjrijVbmO8Ck6E9Fv0+Jcy8cuua269sSpME8k3nj0U8Y4ec0JwfE6GbQYF9gaUE0kSSNexg==}
'@certd/cv4pve-api-javascript@8.4.2':
resolution: {integrity: sha512-udGce7ewrVl4DmZvX+17PjsnqsdDIHEDatr8QP0AVrY2p+8JkaSPW4mXCKiLGf82C9K2+GXgT+qNIqgW7tfF9Q==}
'@certd/plugin-plus@1.37.2':
resolution: {integrity: sha512-mlhlNe3ft9DAt3sL01f5MbVnSqWprXdwW6G6Pvn1XZW+ZdvFK+/jDXcn4DwKKeBbQvbijB7VsdWMEooK8GWgoQ==}
'@certd/plugin-plus@1.37.4':
resolution: {integrity: sha512-h3oSqMBSBYAz8dPcZ4fexrUk32Y2pJcixZMycOZi5onaM9Q5skkWqW3X625B7kdyYaIsojWQzETerXmwJzTBxQ==}
'@certd/plus-core@1.37.2':
resolution: {integrity: sha512-UIugZvzmTt6OSJnKdPv6q4/06SRxPxFfPXyekLNLwGIB/LkG3qjqZyu98xOT/ytI0k/DT9WerM5X7EAyxD9oEw==}
'@certd/plus-core@1.37.4':
resolution: {integrity: sha512-7RFOBjZW98hgsTqoq2T8E6ANhWkuNP7Yi3Y1rZ7m5aXAOgn2H1Aci/Jz9bmD6MZgawfU7j2MLoBXFLEPLpwruQ==}
'@certd/vue-js-cron-core@6.0.3':
resolution: {integrity: sha512-kqzoAMhYz9j6FGNWEODRYtt4NpUEUwjpkU89z5WVg2tCtOcI5VhwyUGOd8AxiBCRfd6PtXvzuqw85PaOps9wrQ==}
@@ -3420,20 +3420,20 @@ packages:
resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
'@fast-crud/editor-code@1.26.6':
resolution: {integrity: sha512-Dq51jO3ACkJJB3eIfyyQ/cU14Sn5jBG5qui2ZTaibs16mpE1cSMLJNl1kk5VXucHeMAlaa5QEJWuuYO/dEKZcA==}
'@fast-crud/editor-code@1.27.4':
resolution: {integrity: sha512-syuSxpNc/So5xoGGZkiC4Iqa8MdrQpeHJRqs6/A8pRUDh9UEN1iBFm8PPxmSluHc7sFXZdt0IIRfJE6sDBhRiA==}
'@fast-crud/fast-crud@1.26.6':
resolution: {integrity: sha512-m44F0qPUaswEBAn+bUqpjNm/+zn/icsTEpr4rGnDd692eZKzx7uPP1szVFwCc0nZeVteI5hNNAioIKB/6Xns1w==}
'@fast-crud/fast-crud@1.27.4':
resolution: {integrity: sha512-wwTqwETgcgBa8v2P/C2MGFfAxZGvAPDFiyrg3b9k+6eMePR//RbY9+M1knsTVaHTTkabAmgwZ+OnnCJzpmnK/A==}
'@fast-crud/fast-extends@1.26.6':
resolution: {integrity: sha512-OHWxN7ZWmE0I0rGyqLjgx9RfZxHakWO68cAX5b6ADwFfFlGR2zfQuj6VjfYayPe6VSt5p3ZoUSsxQgmLbHYnKA==}
'@fast-crud/fast-extends@1.27.4':
resolution: {integrity: sha512-GVWmwondzouPsDD2mCLmxbR7RV5Cf1pJQS0nracQZfrwKsJdNcKlIZ3F3SULklAELMtW01hFbwt7VC+ZehjvAQ==}
'@fast-crud/ui-antdv4@1.26.6':
resolution: {integrity: sha512-VeTt75ejjhIzii5wcQFWY5ugEizLGZhU2cowLNTGskCBmMEAP3GGUwn4TP33dtmQWvTu7FMjwaKtyWnFaiYmuA==}
'@fast-crud/ui-antdv4@1.27.4':
resolution: {integrity: sha512-WcDYmlc06/BIpOnpfN7cZuWqW2kxZC5EfazVw1IaY+kxx3eLRdWX1dShh23oZEsKdwKwGcgY7xeiptFgEpel+Q==}
'@fast-crud/ui-interface@1.26.6':
resolution: {integrity: sha512-C6lWTWs8Vl76qQjORGbPmOy53clo3rO5KnVX2FhTcu5TTecR9JOc85IcQPSWRnWEn+dCdted2wXR83TgQK41eA==}
'@fast-crud/ui-interface@1.27.4':
resolution: {integrity: sha512-hZJiABhXOZma6kaxes9waKMdVEjaEMUtEGZ7TIXXJuExynNOMK1AVtfgACSP5uwTj8mKxUEa7iBKx2vr9EcfFA==}
'@fidm/asn1@1.0.4':
resolution: {integrity: sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==}
@@ -15385,13 +15385,13 @@ snapshots:
dependencies:
'@better-scroll/core': 2.5.1
'@certd/commercial-core@1.37.2(better-sqlite3@11.10.0)(encoding@0.1.13)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.8.3))':
'@certd/commercial-core@1.37.4(better-sqlite3@11.10.0)(encoding@0.1.13)(mysql2@3.14.1)(pg@8.16.0)(reflect-metadata@0.2.2)(ts-node@10.9.2(@types/node@18.19.100)(typescript@5.8.3))':
dependencies:
'@certd/basic': link:packages/core/basic
'@certd/lib-server': link:packages/libs/lib-server
'@certd/pipeline': link:packages/core/pipeline
'@certd/plugin-plus': 1.37.2(encoding@0.1.13)
'@certd/plus-core': 1.37.2
'@certd/plugin-plus': 1.37.4(encoding@0.1.13)
'@certd/plus-core': 1.37.4
'@midwayjs/core': 3.20.11
'@midwayjs/koa': 3.20.13
'@midwayjs/logger': 3.4.2
@@ -15430,7 +15430,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@certd/plugin-plus@1.37.2(encoding@0.1.13)':
'@certd/plugin-plus@1.37.4(encoding@0.1.13)':
dependencies:
'@alicloud/pop-core': 1.8.0
'@baiducloud/sdk': 1.0.3
@@ -15438,7 +15438,8 @@ snapshots:
'@certd/lib-k8s': link:packages/libs/lib-k8s
'@certd/pipeline': link:packages/core/pipeline
'@certd/plugin-cert': link:packages/plugins/plugin-cert
'@certd/plus-core': 1.37.2
'@certd/plugin-lib': link:packages/plugins/plugin-lib
'@certd/plus-core': 1.37.4
ali-oss: 6.23.0
baidu-aip-sdk: 4.16.16
basic-ftp: 5.0.5
@@ -15457,7 +15458,7 @@ snapshots:
- proxy-agent
- supports-color
'@certd/plus-core@1.37.2':
'@certd/plus-core@1.37.4':
dependencies:
'@certd/basic': link:packages/core/basic
dayjs: 1.11.13
@@ -15973,14 +15974,14 @@ snapshots:
'@eslint/js@8.57.0': {}
'@fast-crud/editor-code@1.26.6':
'@fast-crud/editor-code@1.27.4':
dependencies:
js-yaml: 4.1.0
lodash-es: 4.17.21
monaco-editor: 0.52.2
monaco-yaml: 5.4.0(monaco-editor@0.52.2)
'@fast-crud/fast-crud@1.26.6(vue@3.5.14(typescript@5.8.3))':
'@fast-crud/fast-crud@1.27.4(vue@3.5.14(typescript@5.8.3))':
dependencies:
'@iconify/types': 2.0.0
file-saver: 2.0.5
@@ -15990,7 +15991,7 @@ snapshots:
transitivePeerDependencies:
- vue
'@fast-crud/fast-extends@1.26.6(aws-crt@1.26.2)(vue@3.5.14(typescript@5.8.3))':
'@fast-crud/fast-extends@1.27.4(aws-crt@1.26.2)(vue@3.5.14(typescript@5.8.3))':
dependencies:
'@aws-sdk/client-s3': 3.810.0(aws-crt@1.26.2)
'@aws-sdk/s3-request-presigner': 3.810.0
@@ -16020,9 +16021,9 @@ snapshots:
- utf-8-validate
- vue
'@fast-crud/ui-antdv4@1.26.6': {}
'@fast-crud/ui-antdv4@1.27.4': {}
'@fast-crud/ui-interface@1.26.6':
'@fast-crud/ui-interface@1.27.4':
dependencies:
lodash-es: 4.17.21