workdesktop-ai 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/CHANGELOG.md +31 -6
  2. package/README.md +16 -6
  3. package/dist/api-button/index.mjs +1 -1
  4. package/dist/auto-complete/index.mjs +1 -1
  5. package/dist/base.css +1 -1
  6. package/dist/checkbox-list/index.mjs +1 -1
  7. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs → ApiButton.vue_vue_type_script_setup_true_lang-CH_B3jbO.mjs} +2 -2
  8. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-KKzJxwpV.mjs.map → ApiButton.vue_vue_type_script_setup_true_lang-CH_B3jbO.mjs.map} +1 -1
  9. package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs → AutoComplete-6yrCFGZ5.mjs} +2 -2
  10. package/dist/chunks/{AutoComplete-CLV_PwcZ.mjs.map → AutoComplete-6yrCFGZ5.mjs.map} +1 -1
  11. package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs → CheckboxList-ChmfF6zs.mjs} +2 -2
  12. package/dist/chunks/{CheckboxList-Bx3Ce1q5.mjs.map → CheckboxList-ChmfF6zs.mjs.map} +1 -1
  13. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs → ConfirmButton.vue_vue_type_script_setup_true_lang-D9ZUQB7V.mjs} +2 -2
  14. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs.map → ConfirmButton.vue_vue_type_script_setup_true_lang-D9ZUQB7V.mjs.map} +1 -1
  15. package/dist/chunks/{DataForm-C5MBVdei.mjs → DataForm-Rsa1PT-X.mjs} +16 -16
  16. package/dist/chunks/{DataForm-C5MBVdei.mjs.map → DataForm-Rsa1PT-X.mjs.map} +1 -1
  17. package/dist/chunks/{DataGrid-HUzKWuQx.mjs → DataGrid-DzbJpT43.mjs} +4 -4
  18. package/dist/chunks/{DataGrid-HUzKWuQx.mjs.map → DataGrid-DzbJpT43.mjs.map} +1 -1
  19. package/dist/chunks/{EditableGrid-C8A-nJZv.mjs → EditableGrid-C-0uy89H.mjs} +330 -333
  20. package/dist/chunks/EditableGrid-C-0uy89H.mjs.map +1 -0
  21. package/dist/chunks/{ImageUpload-DGehzaYa.mjs → ImageUpload-CrDyIjWC.mjs} +2 -2
  22. package/dist/chunks/{ImageUpload-DGehzaYa.mjs.map → ImageUpload-CrDyIjWC.mjs.map} +1 -1
  23. package/dist/chunks/{Panel-CrRqBTj6.mjs → Panel-BHqAeBaH.mjs} +8 -8
  24. package/dist/chunks/Panel-BHqAeBaH.mjs.map +1 -0
  25. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs → PromptButton.vue_vue_type_script_setup_true_lang-ClrF3C2w.mjs} +2 -2
  26. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-Gck1QAHc.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-ClrF3C2w.mjs.map} +1 -1
  27. package/dist/chunks/{RadioList-vE8JOuST.mjs → RadioList-BIwUZ6lm.mjs} +2 -2
  28. package/dist/chunks/{RadioList-vE8JOuST.mjs.map → RadioList-BIwUZ6lm.mjs.map} +1 -1
  29. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs → Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs} +2 -2
  30. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-B8TwXbYR.mjs.map → Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs.map} +1 -1
  31. package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs → SearchPanel-DPlWWuXb.mjs} +2 -2
  32. package/dist/chunks/{SearchPanel-xQ1hPaNq.mjs.map → SearchPanel-DPlWWuXb.mjs.map} +1 -1
  33. package/dist/chunks/{Select-DAGZDXvI.mjs → Select-DlJ9U0nE.mjs} +2 -2
  34. package/dist/chunks/{Select-DAGZDXvI.mjs.map → Select-DlJ9U0nE.mjs.map} +1 -1
  35. package/dist/chunks/{Station-BF_QlQ8c.mjs → Station-CrMTjqfa.mjs} +2 -2
  36. package/dist/chunks/{Station-BF_QlQ8c.mjs.map → Station-CrMTjqfa.mjs.map} +1 -1
  37. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs → Switch.vue_vue_type_script_setup_true_lang-BxJdsReQ.mjs} +2 -2
  38. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-CulPqp7M.mjs.map → Switch.vue_vue_type_script_setup_true_lang-BxJdsReQ.mjs.map} +1 -1
  39. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs → Upload.vue_vue_type_script_setup_true_lang-DORizGEF.mjs} +2 -2
  40. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-D07Bhllc.mjs.map → Upload.vue_vue_type_script_setup_true_lang-DORizGEF.mjs.map} +1 -1
  41. package/dist/chunks/{Viewer-iub6TjoD.mjs → Viewer-DcMSN3_1.mjs} +2 -2
  42. package/dist/chunks/{Viewer-iub6TjoD.mjs.map → Viewer-DcMSN3_1.mjs.map} +1 -1
  43. package/dist/chunks/http-9ToPNkWJ.mjs +4026 -0
  44. package/dist/chunks/http-9ToPNkWJ.mjs.map +1 -0
  45. package/dist/chunks/{useApiAction-6_vvf5Fd.mjs → useApiAction-BetCGQrx.mjs} +2 -2
  46. package/dist/chunks/{useApiAction-6_vvf5Fd.mjs.map → useApiAction-BetCGQrx.mjs.map} +1 -1
  47. package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs → useColumnSettings-CnXeA0k7.mjs} +2 -2
  48. package/dist/chunks/{useColumnSettings-BYDQdk4o.mjs.map → useColumnSettings-CnXeA0k7.mjs.map} +1 -1
  49. package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs → useOptionsLoader-BwRdHDPL.mjs} +2 -2
  50. package/dist/chunks/{useOptionsLoader-Bi8oqNbG.mjs.map → useOptionsLoader-BwRdHDPL.mjs.map} +1 -1
  51. package/dist/confirm-button/index.mjs +1 -1
  52. package/dist/data-form/index.mjs +1 -1
  53. package/dist/data-form/style.css +1 -1
  54. package/dist/data-grid/index.mjs +1 -1
  55. package/dist/data-grid/style.css +1 -1
  56. package/dist/editable-grid/index.mjs +1 -1
  57. package/dist/editable-grid/style.css +1 -1
  58. package/dist/image-upload/index.mjs +1 -1
  59. package/dist/index.esm.js +106 -103
  60. package/dist/index.umd.js +605 -18
  61. package/dist/index.umd.js.map +1 -1
  62. package/dist/panel/index.mjs +1 -1
  63. package/dist/panel/style.css +1 -1
  64. package/dist/prompt-button/index.mjs +1 -1
  65. package/dist/radio-list/index.mjs +1 -1
  66. package/dist/requester/index.mjs +1 -1
  67. package/dist/search-panel/index.mjs +1 -1
  68. package/dist/search-panel/style.css +1 -1
  69. package/dist/select/index.mjs +1 -1
  70. package/dist/station/index.mjs +1 -1
  71. package/dist/station/style.css +1 -1
  72. package/dist/style.css +1 -1
  73. package/dist/switch/index.mjs +1 -1
  74. package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +9 -9
  75. package/dist/types/src/index.d.ts +2 -0
  76. package/dist/types/src/lib/core/skins/apple.d.ts +3 -0
  77. package/dist/types/src/lib/core/skins/business.d.ts +3 -0
  78. package/dist/types/src/lib/core/skins/chinese.d.ts +3 -0
  79. package/dist/types/src/lib/core/skins/cool.d.ts +3 -0
  80. package/dist/types/src/lib/core/skins/cyberpunk.d.ts +3 -0
  81. package/dist/types/src/lib/core/skins/default.d.ts +3 -0
  82. package/dist/types/src/lib/core/skins/fashion.d.ts +3 -0
  83. package/dist/types/src/lib/core/skins/flat.d.ts +3 -0
  84. package/dist/types/src/lib/core/skins/governance.d.ts +3 -0
  85. package/dist/types/src/lib/core/skins/index.d.ts +15 -0
  86. package/dist/types/src/lib/core/skins/tech-brain.d.ts +5 -0
  87. package/dist/types/src/lib/core/skins/tech.d.ts +3 -0
  88. package/dist/types/src/lib/core/skins/types.d.ts +19 -0
  89. package/dist/types/src/lib/core/theme.d.ts +7 -2
  90. package/dist/types/src/types/config.d.ts +4 -0
  91. package/dist/upload/index.mjs +1 -1
  92. package/dist/viewer/index.mjs +1 -1
  93. package/llms.txt +36 -6
  94. package/package.json +1 -1
  95. package/dist/chunks/EditableGrid-C8A-nJZv.mjs.map +0 -1
  96. package/dist/chunks/Panel-CrRqBTj6.mjs.map +0 -1
  97. package/dist/chunks/http-Bs-dM076.mjs +0 -2951
  98. package/dist/chunks/http-Bs-dM076.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { ref as n } from "vue";
2
- import { r as d } from "./http-Bs-dM076.mjs";
2
+ import { r as d } from "./http-9ToPNkWJ.mjs";
3
3
  import { r as o } from "./linkage-FbL1mcz3.mjs";
4
4
  function A(e) {
5
5
  const s = n(!1);
@@ -27,4 +27,4 @@ function A(e) {
27
27
  export {
28
28
  A as u
29
29
  };
30
- //# sourceMappingURL=useApiAction-6_vvf5Fd.mjs.map
30
+ //# sourceMappingURL=useApiAction-BetCGQrx.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useApiAction-6_vvf5Fd.mjs","sources":["../../src/components/buttons/useApiAction.ts"],"sourcesContent":["import { ref } from 'vue'\nimport { request, type ApiEventPayload } from '../../lib/core/http'\nimport { refreshDataGrid } from '../../lib/core/linkage'\nimport type { ReqOptions } from '../../types/config'\n\n/**\n * 按钮组共享:点击 → 请求 → 提示 → 联动刷新(PRD 4.4 按钮组)\n * 业务失败 resolve 不抛异常;网络异常 reject。\n */\nexport function useApiAction(options: {\n getApi: () => string\n getMethod: () => 'get' | 'post' | 'put' | 'delete'\n getParam: () => Record<string, any>\n getFilter: () => string\n getHeadRefresh: () => boolean | string\n emit: (event: any, ...args: any[]) => void\n /** 是否按钮级 loading(ApiButton buttonLoading=false 时按钮不转圈) */\n buttonLoading?: () => boolean\n /** 请求附加项(pageLoading=true 时开启全局 ElLoading 遮罩) */\n getReqOptions?: () => ReqOptions\n}) {\n const loading = ref(false)\n\n async function doRequest(extraParam?: Record<string, any>): Promise<boolean> {\n const api = options.getApi()\n if (!api) return false\n\n const method = options.getMethod()\n const param = { ...options.getParam(), ...(extraParam || {}) }\n const useBtnLoading = options.buttonLoading ? options.buttonLoading() : true\n const reqOptions: ReqOptions = options.getReqOptions\n ? options.getReqOptions()\n : {}\n\n const beforePayload: ApiEventPayload = { type: 'apiBefore', url: api, method, params: param }\n options.emit('apiBefore', beforePayload)\n\n if (useBtnLoading) loading.value = true\n\n try {\n const result =\n method === 'get' || method === 'delete'\n ? await request.request({ url: api, method, params: param }, reqOptions)\n : await request.request({ url: api, method, data: param }, reqOptions)\n\n if (result.success) {\n options.emit('apiSuccess', { data: result.data, code: result.code, message: result.message })\n // 声明式联动:刷新目标 DataGrid\n const head = options.getHeadRefresh()\n if (head) {\n refreshDataGrid(head, options.getFilter())\n }\n options.emit('apiAfter', { data: result.data, code: result.code })\n return true\n }\n options.emit('apiFail', { data: null, code: result.code, message: result.message })\n options.emit('apiAfter', { code: result.code, message: result.message })\n return false\n } catch (error: any) {\n options.emit('apiException', { error, message: error?.message })\n options.emit('apiAfter', { error })\n return false\n } finally {\n loading.value = false\n }\n }\n\n return { loading, doRequest }\n}\n"],"names":["useApiAction","options","loading","ref","doRequest","extraParam","api","method","param","useBtnLoading","reqOptions","beforePayload","result","request","head","refreshDataGrid","error"],"mappings":";;;AASO,SAASA,EAAaC,GAW1B;AACD,QAAMC,IAAUC,EAAI,EAAK;AAEzB,iBAAeC,EAAUC,GAAoD;AAC3E,UAAMC,IAAML,EAAQ,OAAA;AACpB,QAAI,CAACK,EAAK,QAAO;AAEjB,UAAMC,IAASN,EAAQ,UAAA,GACjBO,IAAQ,EAAE,GAAGP,EAAQ,YAAY,GAAII,KAAc,GAAC,GACpDI,IAAgBR,EAAQ,gBAAgBA,EAAQ,kBAAkB,IAClES,IAAyBT,EAAQ,gBACnCA,EAAQ,cAAA,IACR,CAAA,GAEEU,IAAiC,EAAE,MAAM,aAAa,KAAKL,GAAK,QAAAC,GAAQ,QAAQC,EAAA;AACtF,IAAAP,EAAQ,KAAK,aAAaU,CAAa,GAEnCF,QAAuB,QAAQ;AAEnC,QAAI;AACF,YAAMG,IACJL,MAAW,SAASA,MAAW,WAC3B,MAAMM,EAAQ,QAAQ,EAAE,KAAKP,GAAK,QAAAC,GAAQ,QAAQC,EAAA,GAASE,CAAU,IACrE,MAAMG,EAAQ,QAAQ,EAAE,KAAKP,GAAK,QAAAC,GAAQ,MAAMC,EAAA,GAASE,CAAU;AAEzE,UAAIE,EAAO,SAAS;AAClB,QAAAX,EAAQ,KAAK,cAAc,EAAE,MAAMW,EAAO,MAAM,MAAMA,EAAO,MAAM,SAASA,EAAO,QAAA,CAAS;AAE5F,cAAME,IAAOb,EAAQ,eAAA;AACrB,eAAIa,KACFC,EAAgBD,GAAMb,EAAQ,WAAW,GAE3CA,EAAQ,KAAK,YAAY,EAAE,MAAMW,EAAO,MAAM,MAAMA,EAAO,MAAM,GAC1D;AAAA,MACT;AACA,aAAAX,EAAQ,KAAK,WAAW,EAAE,MAAM,MAAM,MAAMW,EAAO,MAAM,SAASA,EAAO,QAAA,CAAS,GAClFX,EAAQ,KAAK,YAAY,EAAE,MAAMW,EAAO,MAAM,SAASA,EAAO,SAAS,GAChE;AAAA,IACT,SAASI,GAAY;AACnB,aAAAf,EAAQ,KAAK,gBAAgB,EAAE,OAAAe,GAAO,SAASA,KAAA,gBAAAA,EAAO,SAAS,GAC/Df,EAAQ,KAAK,YAAY,EAAE,OAAAe,EAAA,CAAO,GAC3B;AAAA,IACT,UAAA;AACE,MAAAd,EAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,EAAE,SAAAA,GAAS,WAAAE,EAAA;AACpB;"}
1
+ {"version":3,"file":"useApiAction-BetCGQrx.mjs","sources":["../../src/components/buttons/useApiAction.ts"],"sourcesContent":["import { ref } from 'vue'\nimport { request, type ApiEventPayload } from '../../lib/core/http'\nimport { refreshDataGrid } from '../../lib/core/linkage'\nimport type { ReqOptions } from '../../types/config'\n\n/**\n * 按钮组共享:点击 → 请求 → 提示 → 联动刷新(PRD 4.4 按钮组)\n * 业务失败 resolve 不抛异常;网络异常 reject。\n */\nexport function useApiAction(options: {\n getApi: () => string\n getMethod: () => 'get' | 'post' | 'put' | 'delete'\n getParam: () => Record<string, any>\n getFilter: () => string\n getHeadRefresh: () => boolean | string\n emit: (event: any, ...args: any[]) => void\n /** 是否按钮级 loading(ApiButton buttonLoading=false 时按钮不转圈) */\n buttonLoading?: () => boolean\n /** 请求附加项(pageLoading=true 时开启全局 ElLoading 遮罩) */\n getReqOptions?: () => ReqOptions\n}) {\n const loading = ref(false)\n\n async function doRequest(extraParam?: Record<string, any>): Promise<boolean> {\n const api = options.getApi()\n if (!api) return false\n\n const method = options.getMethod()\n const param = { ...options.getParam(), ...(extraParam || {}) }\n const useBtnLoading = options.buttonLoading ? options.buttonLoading() : true\n const reqOptions: ReqOptions = options.getReqOptions\n ? options.getReqOptions()\n : {}\n\n const beforePayload: ApiEventPayload = { type: 'apiBefore', url: api, method, params: param }\n options.emit('apiBefore', beforePayload)\n\n if (useBtnLoading) loading.value = true\n\n try {\n const result =\n method === 'get' || method === 'delete'\n ? await request.request({ url: api, method, params: param }, reqOptions)\n : await request.request({ url: api, method, data: param }, reqOptions)\n\n if (result.success) {\n options.emit('apiSuccess', { data: result.data, code: result.code, message: result.message })\n // 声明式联动:刷新目标 DataGrid\n const head = options.getHeadRefresh()\n if (head) {\n refreshDataGrid(head, options.getFilter())\n }\n options.emit('apiAfter', { data: result.data, code: result.code })\n return true\n }\n options.emit('apiFail', { data: null, code: result.code, message: result.message })\n options.emit('apiAfter', { code: result.code, message: result.message })\n return false\n } catch (error: any) {\n options.emit('apiException', { error, message: error?.message })\n options.emit('apiAfter', { error })\n return false\n } finally {\n loading.value = false\n }\n }\n\n return { loading, doRequest }\n}\n"],"names":["useApiAction","options","loading","ref","doRequest","extraParam","api","method","param","useBtnLoading","reqOptions","beforePayload","result","request","head","refreshDataGrid","error"],"mappings":";;;AASO,SAASA,EAAaC,GAW1B;AACD,QAAMC,IAAUC,EAAI,EAAK;AAEzB,iBAAeC,EAAUC,GAAoD;AAC3E,UAAMC,IAAML,EAAQ,OAAA;AACpB,QAAI,CAACK,EAAK,QAAO;AAEjB,UAAMC,IAASN,EAAQ,UAAA,GACjBO,IAAQ,EAAE,GAAGP,EAAQ,YAAY,GAAII,KAAc,GAAC,GACpDI,IAAgBR,EAAQ,gBAAgBA,EAAQ,kBAAkB,IAClES,IAAyBT,EAAQ,gBACnCA,EAAQ,cAAA,IACR,CAAA,GAEEU,IAAiC,EAAE,MAAM,aAAa,KAAKL,GAAK,QAAAC,GAAQ,QAAQC,EAAA;AACtF,IAAAP,EAAQ,KAAK,aAAaU,CAAa,GAEnCF,QAAuB,QAAQ;AAEnC,QAAI;AACF,YAAMG,IACJL,MAAW,SAASA,MAAW,WAC3B,MAAMM,EAAQ,QAAQ,EAAE,KAAKP,GAAK,QAAAC,GAAQ,QAAQC,EAAA,GAASE,CAAU,IACrE,MAAMG,EAAQ,QAAQ,EAAE,KAAKP,GAAK,QAAAC,GAAQ,MAAMC,EAAA,GAASE,CAAU;AAEzE,UAAIE,EAAO,SAAS;AAClB,QAAAX,EAAQ,KAAK,cAAc,EAAE,MAAMW,EAAO,MAAM,MAAMA,EAAO,MAAM,SAASA,EAAO,QAAA,CAAS;AAE5F,cAAME,IAAOb,EAAQ,eAAA;AACrB,eAAIa,KACFC,EAAgBD,GAAMb,EAAQ,WAAW,GAE3CA,EAAQ,KAAK,YAAY,EAAE,MAAMW,EAAO,MAAM,MAAMA,EAAO,MAAM,GAC1D;AAAA,MACT;AACA,aAAAX,EAAQ,KAAK,WAAW,EAAE,MAAM,MAAM,MAAMW,EAAO,MAAM,SAASA,EAAO,QAAA,CAAS,GAClFX,EAAQ,KAAK,YAAY,EAAE,MAAMW,EAAO,MAAM,SAASA,EAAO,SAAS,GAChE;AAAA,IACT,SAASI,GAAY;AACnB,aAAAf,EAAQ,KAAK,gBAAgB,EAAE,OAAAe,GAAO,SAASA,KAAA,gBAAAA,EAAO,SAAS,GAC/Df,EAAQ,KAAK,YAAY,EAAE,OAAAe,EAAA,CAAO,GAC3B;AAAA,IACT,UAAA;AACE,MAAAd,EAAQ,QAAQ;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,EAAE,SAAAA,GAAS,WAAAE,EAAA;AACpB;"}
@@ -1,5 +1,5 @@
1
1
  import { ref as P, shallowRef as J, reactive as _, computed as A, nextTick as R } from "vue";
2
- import { a as B, r as M, c as H } from "./http-Bs-dM076.mjs";
2
+ import { a as B, r as M, e as H } from "./http-9ToPNkWJ.mjs";
3
3
  function X(p = {}) {
4
4
  const t = B(), {
5
5
  api: c,
@@ -213,4 +213,4 @@ export {
213
213
  Y as o,
214
214
  X as u
215
215
  };
216
- //# sourceMappingURL=useColumnSettings-BYDQdk4o.mjs.map
216
+ //# sourceMappingURL=useColumnSettings-CnXeA0k7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useColumnSettings-BYDQdk4o.mjs","sources":["../../src/lib/composables/useDataGrid.ts","../../src/components/data/datagrid/useColumnSettings.ts"],"sourcesContent":["import { ref, reactive, shallowRef } from 'vue'\r\nimport { request, type ApiResult } from '../core/http'\r\nimport { getGlobalConfig } from '../core/config'\r\n\r\n/**\r\n * useDataGrid(PRD 5.3)\r\n * DataGrid 状态管理:分页 / 搜索 / 选中 / 请求\r\n *\r\n * @example\r\n * const grid = useDataGrid({ pageSize: 20 })\r\n * grid.fetchData()\r\n */\r\n\r\nexport interface SortState {\r\n prop: string\r\n order: 'ascending' | 'descending'\r\n}\r\n\r\nexport interface UseDataGridOptions {\r\n /** 数据接口地址 */\r\n api?: string\r\n /** 请求方法,默认 post */\r\n apiMethod?: 'get' | 'post' | 'put' | 'delete'\r\n /** 固定请求参数 */\r\n apiParam?: Record<string, any>\r\n /** 初始每页条数 */\r\n pageSize?: number\r\n /** 是否自动请求 */\r\n immediate?: boolean\r\n /** 请求级覆盖 */\r\n reqOptions?: import('../../types/config').ReqOptions\r\n /** 请求成功回调(解封后的列表结果) */\r\n onLoaded?: (result: { list: any[]; total: number }) => void\r\n}\r\n\r\nexport interface ListData {\r\n list: any[]\r\n total: number\r\n pageSize: number\r\n currentPage: number\r\n}\r\n\r\nexport function useDataGrid(options: UseDataGridOptions = {}) {\r\n const cfg = getGlobalConfig()\r\n const {\r\n api,\r\n apiMethod = 'post',\r\n apiParam = {},\r\n pageSize: initPageSize = cfg.page.pager.pageSize,\r\n immediate = false,\r\n reqOptions,\r\n onLoaded\r\n } = options\r\n\r\n const currentPage = ref(1)\r\n const pageSize = ref(initPageSize)\r\n const total = ref(0)\r\n const list = shallowRef<any[]>([])\r\n const loading = ref(false)\r\n const searchParams = reactive<Record<string, any>>({})\r\n const selection = ref<any[]>([])\r\n // 排序状态\r\n const sortState = ref<SortState | null>(null)\r\n\r\n const pageParam = cfg.request.pageParam\r\n const listCfg = cfg.response.list\r\n\r\n let controller: AbortController | null = null\r\n\r\n /**\r\n * 组装列表请求体:{ currentPage, pageSize, param: {...搜索+固定参数+排序} }\r\n */\r\n function buildParams(extra?: Record<string, any>) {\r\n const params: Record<string, any> = {\r\n [pageParam.pageField]: currentPage.value,\r\n [pageParam.sizeField]: pageSize.value\r\n }\r\n const search = {\r\n ...apiParam,\r\n ...searchParams,\r\n ...(extra || {})\r\n }\r\n // 如果有排序,增加排序参数\r\n if (sortState.value) {\r\n search.sortProp = sortState.value.prop\r\n search.sortOrder = sortState.value.order\r\n }\r\n params[pageParam.searchField] = search\r\n return params\r\n }\r\n\r\n /**\r\n * 请求数据\r\n */\r\n async function fetchData(extra?: Record<string, any>): Promise<ListData> {\r\n if (!api) {\r\n list.value = []\r\n total.value = 0\r\n return { list: [], total: 0, pageSize: pageSize.value, currentPage: currentPage.value }\r\n }\r\n\r\n loading.value = true\r\n if (controller) controller.abort()\r\n controller = new AbortController()\r\n\r\n const body = buildParams(extra)\r\n try {\r\n let result: ApiResult<any>\r\n if (apiMethod === 'get') {\r\n result = await request.request({ url: api, method: 'get', params: body }, { ...reqOptions, signal: controller.signal })\r\n } else {\r\n result = await request.request({ url: api, method: apiMethod, data: body }, { ...reqOptions, signal: controller.signal })\r\n }\r\n\r\n if (result.success) {\r\n const data = result.data\r\n // 解封列表结构\r\n let rows: any[] = []\r\n let totalCount = 0\r\n if (Array.isArray(data)) {\r\n rows = data\r\n totalCount = data.length\r\n } else if (data && typeof data === 'object') {\r\n rows = data[listCfg.listName] ?? data.list ?? []\r\n totalCount = data[listCfg.totalName] ?? data.total ?? rows.length\r\n }\r\n list.value = rows\r\n total.value = totalCount\r\n onLoaded?.({ list: rows, total: totalCount })\r\n return {\r\n list: rows,\r\n total: totalCount,\r\n pageSize: data?.[listCfg.pageSizeName] ?? pageSize.value,\r\n currentPage: data?.[listCfg.currentPageName] ?? currentPage.value\r\n }\r\n }\r\n list.value = []\r\n total.value = 0\r\n return { list: [], total: 0, pageSize: pageSize.value, currentPage: currentPage.value }\r\n } finally {\r\n loading.value = false\r\n controller = null\r\n }\r\n }\r\n\r\n /** 刷新当前页 */\r\n function refresh() {\r\n return fetchData()\r\n }\r\n\r\n function onChangeCurrentpage(value: number) {\r\n currentPage.value = value\r\n return fetchData()\r\n }\r\n\r\n function onChangePagesize(value: number) {\r\n pageSize.value = value\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n function setSelection(rows: any[]) {\r\n selection.value = rows || []\r\n }\r\n\r\n function getSelection() {\r\n return selection.value\r\n }\r\n\r\n function clearSelection() {\r\n selection.value = []\r\n }\r\n\r\n /** 合并搜索条件并查询(搜索面板用) */\r\n function search(params?: Record<string, any>) {\r\n if (params) Object.assign(searchParams, params)\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n /** 排序变更,更新排序状态并查询 */\r\n function changeSort({ prop, order }: { prop: string; order: 'ascending' | 'descending' | null }) {\r\n if (!prop || !order) {\r\n sortState.value = null\r\n } else {\r\n sortState.value = { prop, order }\r\n }\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n /** 重置到第一页并清空搜索条件 + 排序 */\r\n function reset() {\r\n currentPage.value = 1\r\n Object.keys(searchParams).forEach((k) => delete searchParams[k])\r\n sortState.value = null\r\n return fetchData()\r\n }\r\n\r\n if (immediate) {\r\n fetchData()\r\n }\r\n\r\n return {\r\n // 状态\r\n currentPage,\r\n page: currentPage,\r\n pageSize,\r\n total,\r\n list,\r\n loading,\r\n searchParams,\r\n selection,\r\n sortState,\r\n // 方法\r\n fetchData,\r\n refresh,\r\n reset,\r\n search,\r\n changeSort,\r\n onChangeCurrentpage,\r\n onChangePagesize,\r\n setSelection,\r\n getSelection,\r\n clearSelection,\r\n buildParams\r\n }\r\n}\r\n\r\nexport type DataGridController = ReturnType<typeof useDataGrid>\r\n","import { ref, computed, nextTick } from 'vue'\r\nimport type { VNode } from 'vue'\r\nimport { safeJsonParse } from '../../../lib/core/utils'\r\n\r\n/**\r\n * 动态列:从默认插槽的 el-table-column vnode 中提取列元信息,\r\n * 支持显示/隐藏/排序,状态可持久化到 localStorage(PRD 4.2)。\r\n */\r\n\r\nexport interface ColumnMeta {\r\n /** el-table-column 的 key(prop 或自动 id) */\r\n key: string\r\n label: string\r\n /** 用户可控制的业务列(selection/index 等内置列不可控) */\r\n controllable: boolean\r\n visible: boolean\r\n order: number\r\n}\r\n\r\n/** 判定 vnode 是否为 el-table-column(type 显式声明或组件 name 匹配) */\r\nfunction isColumnVNode(vnode: VNode): boolean {\r\n const props = (vnode.props || {}) as Record<string, any>\r\n const typeName =\r\n (vnode.type as any)?.name ||\r\n (vnode.type as any)?.__name ||\r\n ''\r\n return (\r\n String(typeName).includes('TableColumn') ||\r\n (vnode.type as any) === Symbol.for('el-table-column') ||\r\n // 全局注册组件时 type 为对象带 name\r\n typeName === 'ElTableColumn' ||\r\n !!(props.prop || props.label || props.type)\r\n )\r\n}\r\n\r\n/**\r\n * 从插槽 vnode 数组中解析列\r\n */\r\nexport function extractColumns(vnodes: VNode[]): ColumnMeta[] {\r\n const columns: ColumnMeta[] = []\r\n let auto = 0\r\n const walk = (nodes: VNode[]) => {\r\n nodes.forEach((vnode) => {\r\n if (!vnode || typeof vnode !== 'object') return\r\n const props = (vnode.props || {}) as Record<string, any>\r\n\r\n if (isColumnVNode(vnode)) {\r\n auto += 1\r\n const colType = props.type // selection / index / expand\r\n const key = String(props.prop || props.columnKey || `col-${auto}`)\r\n columns.push({\r\n key,\r\n label: props.label || key,\r\n controllable: !colType,\r\n visible: props.hidden !== true,\r\n order: columns.length\r\n })\r\n }\r\n // 递归子节点(fragment)\r\n const children = (vnode as any).children\r\n if (Array.isArray(children)) {\r\n walk(children.filter((c: any) => c && typeof c === 'object') as VNode[])\r\n }\r\n })\r\n }\r\n walk(vnodes)\r\n return columns\r\n}\r\n\r\n/**\r\n * 按列设置中的 order 重排业务列 vnode。\r\n * key 解析规则必须与 extractColumns 完全一致(含自动编号计数),\r\n * 未匹配到列设置的 vnode 保持原相对顺序排在末尾。\r\n */\r\nexport function orderColumnVnodes(vnodes: VNode[], orderMap: Map<string, number>): VNode[] {\r\n let auto = 0\r\n const keyOf = (vnode: VNode): string => {\r\n const props = (vnode.props || {}) as Record<string, any>\r\n if (isColumnVNode(vnode)) {\r\n auto += 1\r\n return String(props.prop || props.columnKey || `col-${auto}`)\r\n }\r\n return ''\r\n }\r\n return vnodes\r\n .map((vnode, index) => ({ vnode, index, order: orderMap.get(keyOf(vnode)) }))\r\n .sort((a, b) => {\r\n if (a.order == null && b.order == null) return a.index - b.index\r\n if (a.order == null) return 1\r\n if (b.order == null) return -1\r\n return a.order - b.order\r\n })\r\n .map((item) => item.vnode)\r\n}\r\n\r\nexport function useColumnSettings(storageKey?: string) {\r\n const columns = ref<ColumnMeta[]>([])\r\n /** 初始列定义快照(插槽声明顺序),供「恢复默认」还原 */\r\n let initialColumns: ColumnMeta[] = []\r\n const settingVisible = ref(false)\r\n\r\n const storageKeyName = storageKey ? `wd:columns:${storageKey}` : ''\r\n\r\n function loadStored(): Record<string, { visible?: boolean; order?: number }> {\r\n if (!storageKeyName || typeof localStorage === 'undefined') return {}\r\n return safeJsonParse(localStorage.getItem(storageKeyName), {})\r\n }\r\n\r\n function persist() {\r\n if (!storageKeyName || typeof localStorage === 'undefined') return\r\n const data: Record<string, any> = {}\r\n columns.value.forEach((c, i) => {\r\n data[c.key] = { visible: c.visible, order: i }\r\n })\r\n localStorage.setItem(storageKeyName, JSON.stringify(data))\r\n }\r\n\r\n /** 合并本地存储的显隐/排序后写入列状态 */\r\n function applyParsed(parsed: ColumnMeta[]) {\r\n initialColumns = parsed.map((col) => ({ ...col }))\r\n const stored = loadStored()\r\n columns.value = parsed.map((col) => {\r\n const s = stored[col.key]\r\n if (s) {\r\n return { ...col, visible: s.visible ?? col.visible, order: s.order ?? col.order }\r\n }\r\n return col\r\n })\r\n columns.value.sort((a, b) => a.order - b.order)\r\n }\r\n\r\n function init(vnodes: VNode[]) {\r\n applyParsed(extractColumns(vnodes))\r\n }\r\n\r\n /** 直接以列元信息初始化(columns 配置驱动的组件用,如 EditableGrid) */\r\n function initMetas(metas: Array<{ key: string; label: string; controllable?: boolean; visible?: boolean }>) {\r\n applyParsed(\r\n metas.map((m, i) => ({\r\n key: m.key,\r\n label: m.label,\r\n controllable: m.controllable !== false,\r\n visible: m.visible !== false,\r\n order: i\r\n }))\r\n )\r\n }\r\n\r\n function setVisible(key: string, visible: boolean) {\r\n const col = columns.value.find((c) => c.key === key)\r\n if (col) {\r\n col.visible = visible\r\n persist()\r\n }\r\n }\r\n\r\n function move(key: string, direction: -1 | 1) {\r\n const idx = columns.value.findIndex((c) => c.key === key)\r\n const target = idx + direction\r\n if (idx < 0 || target < 0 || target >= columns.value.length) return\r\n const arr = columns.value.slice()\r\n const [item] = arr.splice(idx, 1)\r\n arr.splice(target, 0, item)\r\n arr.forEach((c, i) => (c.order = i))\r\n columns.value = arr\r\n persist()\r\n }\r\n\r\n /**\r\n * 拖拽重排:把 fromKey 拖到 toKey 的前面(before)或后面(after)。\r\n * 仅允许在可控列之间拖拽,selection/index 等内置列不参与。\r\n */\r\n function reorder(fromKey: string, toKey: string, position: 'before' | 'after' = 'before') {\r\n if (!fromKey || !toKey || fromKey === toKey) return\r\n const arr = columns.value.slice()\r\n const fromIdx = arr.findIndex((c) => c.key === fromKey)\r\n if (fromIdx < 0) return\r\n if (!arr[fromIdx].controllable) return\r\n const [item] = arr.splice(fromIdx, 1)\r\n let insertIdx = arr.findIndex((c) => c.key === toKey)\r\n if (insertIdx < 0 || !arr[insertIdx].controllable) return\r\n if (position === 'after') insertIdx += 1\r\n arr.splice(insertIdx, 0, item)\r\n arr.forEach((c, i) => (c.order = i))\r\n columns.value = arr\r\n persist()\r\n }\r\n\r\n /** 恢复到插槽声明时的原始顺序与显隐状态 */\r\n function reset() {\r\n columns.value = initialColumns.map((col, i) => ({ ...col, visible: true, order: i }))\r\n if (storageKeyName && typeof localStorage !== 'undefined') {\r\n localStorage.removeItem(storageKeyName)\r\n }\r\n }\r\n\r\n /** 隐藏列的 key 集合,供模板过滤插槽 vnode */\r\n const hiddenKeys = computed(() => new Set(columns.value.filter((c) => !c.visible).map((c) => c.key)))\r\n\r\n /** 列 key → 当前排序位置,供插槽 vnode 重排 */\r\n const columnOrderMap = computed(() => new Map(columns.value.map((c, i) => [c.key, i])))\r\n\r\n const controllableColumns = computed(() => columns.value.filter((c) => c.controllable))\r\n\r\n return {\r\n columns,\r\n controllableColumns,\r\n hiddenKeys,\r\n columnOrderMap,\r\n settingVisible,\r\n init,\r\n initMetas,\r\n setVisible,\r\n move,\r\n reorder,\r\n reset,\r\n nextTick\r\n }\r\n}\r\n"],"names":["useDataGrid","options","cfg","getGlobalConfig","api","apiMethod","apiParam","initPageSize","immediate","reqOptions","onLoaded","currentPage","ref","pageSize","total","list","shallowRef","loading","searchParams","reactive","selection","sortState","pageParam","listCfg","controller","buildParams","extra","params","search","fetchData","body","result","request","data","rows","totalCount","refresh","onChangeCurrentpage","value","onChangePagesize","setSelection","getSelection","clearSelection","changeSort","prop","order","reset","k","isColumnVNode","vnode","props","typeName","_a","_b","extractColumns","vnodes","columns","auto","walk","nodes","colType","key","children","c","orderColumnVnodes","orderMap","keyOf","index","a","b","item","useColumnSettings","storageKey","initialColumns","settingVisible","storageKeyName","loadStored","safeJsonParse","persist","i","applyParsed","parsed","col","stored","s","init","initMetas","metas","m","setVisible","visible","move","direction","idx","target","arr","reorder","fromKey","toKey","position","fromIdx","insertIdx","hiddenKeys","computed","columnOrderMap","controllableColumns","nextTick"],"mappings":"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"}
1
+ {"version":3,"file":"useColumnSettings-CnXeA0k7.mjs","sources":["../../src/lib/composables/useDataGrid.ts","../../src/components/data/datagrid/useColumnSettings.ts"],"sourcesContent":["import { ref, reactive, shallowRef } from 'vue'\r\nimport { request, type ApiResult } from '../core/http'\r\nimport { getGlobalConfig } from '../core/config'\r\n\r\n/**\r\n * useDataGrid(PRD 5.3)\r\n * DataGrid 状态管理:分页 / 搜索 / 选中 / 请求\r\n *\r\n * @example\r\n * const grid = useDataGrid({ pageSize: 20 })\r\n * grid.fetchData()\r\n */\r\n\r\nexport interface SortState {\r\n prop: string\r\n order: 'ascending' | 'descending'\r\n}\r\n\r\nexport interface UseDataGridOptions {\r\n /** 数据接口地址 */\r\n api?: string\r\n /** 请求方法,默认 post */\r\n apiMethod?: 'get' | 'post' | 'put' | 'delete'\r\n /** 固定请求参数 */\r\n apiParam?: Record<string, any>\r\n /** 初始每页条数 */\r\n pageSize?: number\r\n /** 是否自动请求 */\r\n immediate?: boolean\r\n /** 请求级覆盖 */\r\n reqOptions?: import('../../types/config').ReqOptions\r\n /** 请求成功回调(解封后的列表结果) */\r\n onLoaded?: (result: { list: any[]; total: number }) => void\r\n}\r\n\r\nexport interface ListData {\r\n list: any[]\r\n total: number\r\n pageSize: number\r\n currentPage: number\r\n}\r\n\r\nexport function useDataGrid(options: UseDataGridOptions = {}) {\r\n const cfg = getGlobalConfig()\r\n const {\r\n api,\r\n apiMethod = 'post',\r\n apiParam = {},\r\n pageSize: initPageSize = cfg.page.pager.pageSize,\r\n immediate = false,\r\n reqOptions,\r\n onLoaded\r\n } = options\r\n\r\n const currentPage = ref(1)\r\n const pageSize = ref(initPageSize)\r\n const total = ref(0)\r\n const list = shallowRef<any[]>([])\r\n const loading = ref(false)\r\n const searchParams = reactive<Record<string, any>>({})\r\n const selection = ref<any[]>([])\r\n // 排序状态\r\n const sortState = ref<SortState | null>(null)\r\n\r\n const pageParam = cfg.request.pageParam\r\n const listCfg = cfg.response.list\r\n\r\n let controller: AbortController | null = null\r\n\r\n /**\r\n * 组装列表请求体:{ currentPage, pageSize, param: {...搜索+固定参数+排序} }\r\n */\r\n function buildParams(extra?: Record<string, any>) {\r\n const params: Record<string, any> = {\r\n [pageParam.pageField]: currentPage.value,\r\n [pageParam.sizeField]: pageSize.value\r\n }\r\n const search = {\r\n ...apiParam,\r\n ...searchParams,\r\n ...(extra || {})\r\n }\r\n // 如果有排序,增加排序参数\r\n if (sortState.value) {\r\n search.sortProp = sortState.value.prop\r\n search.sortOrder = sortState.value.order\r\n }\r\n params[pageParam.searchField] = search\r\n return params\r\n }\r\n\r\n /**\r\n * 请求数据\r\n */\r\n async function fetchData(extra?: Record<string, any>): Promise<ListData> {\r\n if (!api) {\r\n list.value = []\r\n total.value = 0\r\n return { list: [], total: 0, pageSize: pageSize.value, currentPage: currentPage.value }\r\n }\r\n\r\n loading.value = true\r\n if (controller) controller.abort()\r\n controller = new AbortController()\r\n\r\n const body = buildParams(extra)\r\n try {\r\n let result: ApiResult<any>\r\n if (apiMethod === 'get') {\r\n result = await request.request({ url: api, method: 'get', params: body }, { ...reqOptions, signal: controller.signal })\r\n } else {\r\n result = await request.request({ url: api, method: apiMethod, data: body }, { ...reqOptions, signal: controller.signal })\r\n }\r\n\r\n if (result.success) {\r\n const data = result.data\r\n // 解封列表结构\r\n let rows: any[] = []\r\n let totalCount = 0\r\n if (Array.isArray(data)) {\r\n rows = data\r\n totalCount = data.length\r\n } else if (data && typeof data === 'object') {\r\n rows = data[listCfg.listName] ?? data.list ?? []\r\n totalCount = data[listCfg.totalName] ?? data.total ?? rows.length\r\n }\r\n list.value = rows\r\n total.value = totalCount\r\n onLoaded?.({ list: rows, total: totalCount })\r\n return {\r\n list: rows,\r\n total: totalCount,\r\n pageSize: data?.[listCfg.pageSizeName] ?? pageSize.value,\r\n currentPage: data?.[listCfg.currentPageName] ?? currentPage.value\r\n }\r\n }\r\n list.value = []\r\n total.value = 0\r\n return { list: [], total: 0, pageSize: pageSize.value, currentPage: currentPage.value }\r\n } finally {\r\n loading.value = false\r\n controller = null\r\n }\r\n }\r\n\r\n /** 刷新当前页 */\r\n function refresh() {\r\n return fetchData()\r\n }\r\n\r\n function onChangeCurrentpage(value: number) {\r\n currentPage.value = value\r\n return fetchData()\r\n }\r\n\r\n function onChangePagesize(value: number) {\r\n pageSize.value = value\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n function setSelection(rows: any[]) {\r\n selection.value = rows || []\r\n }\r\n\r\n function getSelection() {\r\n return selection.value\r\n }\r\n\r\n function clearSelection() {\r\n selection.value = []\r\n }\r\n\r\n /** 合并搜索条件并查询(搜索面板用) */\r\n function search(params?: Record<string, any>) {\r\n if (params) Object.assign(searchParams, params)\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n /** 排序变更,更新排序状态并查询 */\r\n function changeSort({ prop, order }: { prop: string; order: 'ascending' | 'descending' | null }) {\r\n if (!prop || !order) {\r\n sortState.value = null\r\n } else {\r\n sortState.value = { prop, order }\r\n }\r\n currentPage.value = 1\r\n return fetchData()\r\n }\r\n\r\n /** 重置到第一页并清空搜索条件 + 排序 */\r\n function reset() {\r\n currentPage.value = 1\r\n Object.keys(searchParams).forEach((k) => delete searchParams[k])\r\n sortState.value = null\r\n return fetchData()\r\n }\r\n\r\n if (immediate) {\r\n fetchData()\r\n }\r\n\r\n return {\r\n // 状态\r\n currentPage,\r\n page: currentPage,\r\n pageSize,\r\n total,\r\n list,\r\n loading,\r\n searchParams,\r\n selection,\r\n sortState,\r\n // 方法\r\n fetchData,\r\n refresh,\r\n reset,\r\n search,\r\n changeSort,\r\n onChangeCurrentpage,\r\n onChangePagesize,\r\n setSelection,\r\n getSelection,\r\n clearSelection,\r\n buildParams\r\n }\r\n}\r\n\r\nexport type DataGridController = ReturnType<typeof useDataGrid>\r\n","import { ref, computed, nextTick } from 'vue'\r\nimport type { VNode } from 'vue'\r\nimport { safeJsonParse } from '../../../lib/core/utils'\r\n\r\n/**\r\n * 动态列:从默认插槽的 el-table-column vnode 中提取列元信息,\r\n * 支持显示/隐藏/排序,状态可持久化到 localStorage(PRD 4.2)。\r\n */\r\n\r\nexport interface ColumnMeta {\r\n /** el-table-column 的 key(prop 或自动 id) */\r\n key: string\r\n label: string\r\n /** 用户可控制的业务列(selection/index 等内置列不可控) */\r\n controllable: boolean\r\n visible: boolean\r\n order: number\r\n}\r\n\r\n/** 判定 vnode 是否为 el-table-column(type 显式声明或组件 name 匹配) */\r\nfunction isColumnVNode(vnode: VNode): boolean {\r\n const props = (vnode.props || {}) as Record<string, any>\r\n const typeName =\r\n (vnode.type as any)?.name ||\r\n (vnode.type as any)?.__name ||\r\n ''\r\n return (\r\n String(typeName).includes('TableColumn') ||\r\n (vnode.type as any) === Symbol.for('el-table-column') ||\r\n // 全局注册组件时 type 为对象带 name\r\n typeName === 'ElTableColumn' ||\r\n !!(props.prop || props.label || props.type)\r\n )\r\n}\r\n\r\n/**\r\n * 从插槽 vnode 数组中解析列\r\n */\r\nexport function extractColumns(vnodes: VNode[]): ColumnMeta[] {\r\n const columns: ColumnMeta[] = []\r\n let auto = 0\r\n const walk = (nodes: VNode[]) => {\r\n nodes.forEach((vnode) => {\r\n if (!vnode || typeof vnode !== 'object') return\r\n const props = (vnode.props || {}) as Record<string, any>\r\n\r\n if (isColumnVNode(vnode)) {\r\n auto += 1\r\n const colType = props.type // selection / index / expand\r\n const key = String(props.prop || props.columnKey || `col-${auto}`)\r\n columns.push({\r\n key,\r\n label: props.label || key,\r\n controllable: !colType,\r\n visible: props.hidden !== true,\r\n order: columns.length\r\n })\r\n }\r\n // 递归子节点(fragment)\r\n const children = (vnode as any).children\r\n if (Array.isArray(children)) {\r\n walk(children.filter((c: any) => c && typeof c === 'object') as VNode[])\r\n }\r\n })\r\n }\r\n walk(vnodes)\r\n return columns\r\n}\r\n\r\n/**\r\n * 按列设置中的 order 重排业务列 vnode。\r\n * key 解析规则必须与 extractColumns 完全一致(含自动编号计数),\r\n * 未匹配到列设置的 vnode 保持原相对顺序排在末尾。\r\n */\r\nexport function orderColumnVnodes(vnodes: VNode[], orderMap: Map<string, number>): VNode[] {\r\n let auto = 0\r\n const keyOf = (vnode: VNode): string => {\r\n const props = (vnode.props || {}) as Record<string, any>\r\n if (isColumnVNode(vnode)) {\r\n auto += 1\r\n return String(props.prop || props.columnKey || `col-${auto}`)\r\n }\r\n return ''\r\n }\r\n return vnodes\r\n .map((vnode, index) => ({ vnode, index, order: orderMap.get(keyOf(vnode)) }))\r\n .sort((a, b) => {\r\n if (a.order == null && b.order == null) return a.index - b.index\r\n if (a.order == null) return 1\r\n if (b.order == null) return -1\r\n return a.order - b.order\r\n })\r\n .map((item) => item.vnode)\r\n}\r\n\r\nexport function useColumnSettings(storageKey?: string) {\r\n const columns = ref<ColumnMeta[]>([])\r\n /** 初始列定义快照(插槽声明顺序),供「恢复默认」还原 */\r\n let initialColumns: ColumnMeta[] = []\r\n const settingVisible = ref(false)\r\n\r\n const storageKeyName = storageKey ? `wd:columns:${storageKey}` : ''\r\n\r\n function loadStored(): Record<string, { visible?: boolean; order?: number }> {\r\n if (!storageKeyName || typeof localStorage === 'undefined') return {}\r\n return safeJsonParse(localStorage.getItem(storageKeyName), {})\r\n }\r\n\r\n function persist() {\r\n if (!storageKeyName || typeof localStorage === 'undefined') return\r\n const data: Record<string, any> = {}\r\n columns.value.forEach((c, i) => {\r\n data[c.key] = { visible: c.visible, order: i }\r\n })\r\n localStorage.setItem(storageKeyName, JSON.stringify(data))\r\n }\r\n\r\n /** 合并本地存储的显隐/排序后写入列状态 */\r\n function applyParsed(parsed: ColumnMeta[]) {\r\n initialColumns = parsed.map((col) => ({ ...col }))\r\n const stored = loadStored()\r\n columns.value = parsed.map((col) => {\r\n const s = stored[col.key]\r\n if (s) {\r\n return { ...col, visible: s.visible ?? col.visible, order: s.order ?? col.order }\r\n }\r\n return col\r\n })\r\n columns.value.sort((a, b) => a.order - b.order)\r\n }\r\n\r\n function init(vnodes: VNode[]) {\r\n applyParsed(extractColumns(vnodes))\r\n }\r\n\r\n /** 直接以列元信息初始化(columns 配置驱动的组件用,如 EditableGrid) */\r\n function initMetas(metas: Array<{ key: string; label: string; controllable?: boolean; visible?: boolean }>) {\r\n applyParsed(\r\n metas.map((m, i) => ({\r\n key: m.key,\r\n label: m.label,\r\n controllable: m.controllable !== false,\r\n visible: m.visible !== false,\r\n order: i\r\n }))\r\n )\r\n }\r\n\r\n function setVisible(key: string, visible: boolean) {\r\n const col = columns.value.find((c) => c.key === key)\r\n if (col) {\r\n col.visible = visible\r\n persist()\r\n }\r\n }\r\n\r\n function move(key: string, direction: -1 | 1) {\r\n const idx = columns.value.findIndex((c) => c.key === key)\r\n const target = idx + direction\r\n if (idx < 0 || target < 0 || target >= columns.value.length) return\r\n const arr = columns.value.slice()\r\n const [item] = arr.splice(idx, 1)\r\n arr.splice(target, 0, item)\r\n arr.forEach((c, i) => (c.order = i))\r\n columns.value = arr\r\n persist()\r\n }\r\n\r\n /**\r\n * 拖拽重排:把 fromKey 拖到 toKey 的前面(before)或后面(after)。\r\n * 仅允许在可控列之间拖拽,selection/index 等内置列不参与。\r\n */\r\n function reorder(fromKey: string, toKey: string, position: 'before' | 'after' = 'before') {\r\n if (!fromKey || !toKey || fromKey === toKey) return\r\n const arr = columns.value.slice()\r\n const fromIdx = arr.findIndex((c) => c.key === fromKey)\r\n if (fromIdx < 0) return\r\n if (!arr[fromIdx].controllable) return\r\n const [item] = arr.splice(fromIdx, 1)\r\n let insertIdx = arr.findIndex((c) => c.key === toKey)\r\n if (insertIdx < 0 || !arr[insertIdx].controllable) return\r\n if (position === 'after') insertIdx += 1\r\n arr.splice(insertIdx, 0, item)\r\n arr.forEach((c, i) => (c.order = i))\r\n columns.value = arr\r\n persist()\r\n }\r\n\r\n /** 恢复到插槽声明时的原始顺序与显隐状态 */\r\n function reset() {\r\n columns.value = initialColumns.map((col, i) => ({ ...col, visible: true, order: i }))\r\n if (storageKeyName && typeof localStorage !== 'undefined') {\r\n localStorage.removeItem(storageKeyName)\r\n }\r\n }\r\n\r\n /** 隐藏列的 key 集合,供模板过滤插槽 vnode */\r\n const hiddenKeys = computed(() => new Set(columns.value.filter((c) => !c.visible).map((c) => c.key)))\r\n\r\n /** 列 key → 当前排序位置,供插槽 vnode 重排 */\r\n const columnOrderMap = computed(() => new Map(columns.value.map((c, i) => [c.key, i])))\r\n\r\n const controllableColumns = computed(() => columns.value.filter((c) => c.controllable))\r\n\r\n return {\r\n columns,\r\n controllableColumns,\r\n hiddenKeys,\r\n columnOrderMap,\r\n settingVisible,\r\n init,\r\n initMetas,\r\n setVisible,\r\n move,\r\n reorder,\r\n reset,\r\n nextTick\r\n }\r\n}\r\n"],"names":["useDataGrid","options","cfg","getGlobalConfig","api","apiMethod","apiParam","initPageSize","immediate","reqOptions","onLoaded","currentPage","ref","pageSize","total","list","shallowRef","loading","searchParams","reactive","selection","sortState","pageParam","listCfg","controller","buildParams","extra","params","search","fetchData","body","result","request","data","rows","totalCount","refresh","onChangeCurrentpage","value","onChangePagesize","setSelection","getSelection","clearSelection","changeSort","prop","order","reset","k","isColumnVNode","vnode","props","typeName","_a","_b","extractColumns","vnodes","columns","auto","walk","nodes","colType","key","children","c","orderColumnVnodes","orderMap","keyOf","index","a","b","item","useColumnSettings","storageKey","initialColumns","settingVisible","storageKeyName","loadStored","safeJsonParse","persist","i","applyParsed","parsed","col","stored","s","init","initMetas","metas","m","setVisible","visible","move","direction","idx","target","arr","reorder","fromKey","toKey","position","fromIdx","insertIdx","hiddenKeys","computed","columnOrderMap","controllableColumns","nextTick"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { shallowRef as m, ref as g, onMounted as p, watch as w } from "vue";
2
- import { r as y } from "./http-Bs-dM076.mjs";
2
+ import { r as y } from "./http-9ToPNkWJ.mjs";
3
3
  function P(a) {
4
4
  const i = m([]), f = g(!1), s = g(!1);
5
5
  function n(r) {
@@ -61,4 +61,4 @@ function P(a) {
61
61
  export {
62
62
  P as u
63
63
  };
64
- //# sourceMappingURL=useOptionsLoader-Bi8oqNbG.mjs.map
64
+ //# sourceMappingURL=useOptionsLoader-BwRdHDPL.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useOptionsLoader-Bi8oqNbG.mjs","sources":["../../src/components/inputs/useOptionsLoader.ts"],"sourcesContent":["/**\n * 输入选择组共享:选项自动加载(静态数组 or api)、前插/后追加固定项\n */\nimport { ref, shallowRef, onMounted, watch, type Ref } from 'vue'\nimport { request } from '../../lib/core/http'\n\nexport interface UseOptionsOptions {\n api: Ref<string>\n apiMethod: Ref<'get' | 'post'>\n apiParam: Ref<Record<string, any>>\n active: Ref<boolean>\n dataSource: Ref<any[] | undefined>\n textProp: Ref<string>\n valueProp: Ref<string>\n tipsProp?: Ref<string>\n addData: Ref<any[] | undefined>\n appendData: Ref<any[] | undefined>\n emit: (event: any, ...args: any[]) => void\n}\n\nexport interface NormalizedOption {\n text: string\n value: any\n /** 悬停提示内容(取 tipsProp 字段,无则为空字符串) */\n tips: string\n /** 原始数据(默认插槽上下文 { option }) */\n raw: Record<string, any>\n}\n\nexport function useOptionsLoader(opts: UseOptionsOptions) {\n const options = shallowRef<NormalizedOption[]>([])\n const loading = ref(false)\n /** 标记是否加载过,避免重复请求 */\n const loaded = ref(false)\n\n function normalize(list: any[]): NormalizedOption[] {\n const textKey = opts.textProp.value\n const valueKey = opts.valueProp.value\n const tipsKey = opts.tipsProp?.value || 'tips'\n return (list || []).map((item) => {\n if (item && typeof item === 'object') {\n const tips = item[tipsKey]\n return {\n text: item[textKey],\n value: item[valueKey],\n tips: tips === null || tips === undefined ? '' : String(tips),\n raw: item\n }\n }\n // 基本类型数组 [1,2,3] / ['a','b']\n return { text: String(item), value: item, tips: '', raw: { [textKey]: String(item), [valueKey]: item } }\n })\n }\n\n async function fetchOptions(extraParam?: Record<string, any>) {\n // 静态数据源\n if (opts.dataSource.value) {\n options.value = mergeFixed(normalize(opts.dataSource.value))\n return\n }\n if (!opts.api.value) {\n options.value = mergeFixed([])\n return\n }\n loading.value = true\n opts.emit('apiBefore', { url: opts.api.value })\n try {\n const param = { ...opts.apiParam.value, ...(extraParam || {}) }\n const result =\n opts.apiMethod.value === 'get'\n ? await request.get(opts.api.value, param)\n : await request.post(opts.api.value, param)\n if (result.success) {\n const list = Array.isArray(result.data) ? result.data : result.data?.list || []\n options.value = mergeFixed(normalize(list))\n opts.emit('apiSuccess', { data: result.data })\n } else {\n opts.emit('apiFail', { code: result.code, message: result.message })\n }\n } catch (error: any) {\n opts.emit('apiFail', { error, message: error?.message })\n } finally {\n loading.value = false\n opts.emit('apiAfter')\n loaded.value = true\n }\n }\n\n /** 合并前插/后追加固定项 */\n function mergeFixed(main: NormalizedOption[]): NormalizedOption[] {\n const head = normalize(opts.addData.value || [])\n const tail = normalize(opts.appendData.value || [])\n return [...head, ...main, ...tail]\n }\n\n /** 远程搜索(Select remote / AutoComplete) */\n async function remoteSearch(keyword: string, keywordKey = 'keyword') {\n if (!opts.api.value) return\n await fetchOptions({ [keywordKey]: keyword })\n }\n\n onMounted(() => {\n if (opts.active.value) {\n fetchOptions()\n } else if (opts.dataSource.value || !opts.api.value) {\n options.value = mergeFixed(normalize(opts.dataSource.value || []))\n }\n })\n\n watch(\n () => [opts.api.value, opts.dataSource.value],\n () => {\n if (opts.active.value || opts.dataSource.value) fetchOptions()\n }\n )\n\n return { options, loading, fetchOptions, remoteSearch, loaded }\n}\n"],"names":["useOptionsLoader","opts","options","shallowRef","loading","ref","loaded","normalize","list","textKey","valueKey","tipsKey","_a","item","tips","fetchOptions","extraParam","mergeFixed","param","result","request","error","main","head","tail","remoteSearch","keyword","keywordKey","onMounted","watch"],"mappings":"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"}
1
+ {"version":3,"file":"useOptionsLoader-BwRdHDPL.mjs","sources":["../../src/components/inputs/useOptionsLoader.ts"],"sourcesContent":["/**\n * 输入选择组共享:选项自动加载(静态数组 or api)、前插/后追加固定项\n */\nimport { ref, shallowRef, onMounted, watch, type Ref } from 'vue'\nimport { request } from '../../lib/core/http'\n\nexport interface UseOptionsOptions {\n api: Ref<string>\n apiMethod: Ref<'get' | 'post'>\n apiParam: Ref<Record<string, any>>\n active: Ref<boolean>\n dataSource: Ref<any[] | undefined>\n textProp: Ref<string>\n valueProp: Ref<string>\n tipsProp?: Ref<string>\n addData: Ref<any[] | undefined>\n appendData: Ref<any[] | undefined>\n emit: (event: any, ...args: any[]) => void\n}\n\nexport interface NormalizedOption {\n text: string\n value: any\n /** 悬停提示内容(取 tipsProp 字段,无则为空字符串) */\n tips: string\n /** 原始数据(默认插槽上下文 { option }) */\n raw: Record<string, any>\n}\n\nexport function useOptionsLoader(opts: UseOptionsOptions) {\n const options = shallowRef<NormalizedOption[]>([])\n const loading = ref(false)\n /** 标记是否加载过,避免重复请求 */\n const loaded = ref(false)\n\n function normalize(list: any[]): NormalizedOption[] {\n const textKey = opts.textProp.value\n const valueKey = opts.valueProp.value\n const tipsKey = opts.tipsProp?.value || 'tips'\n return (list || []).map((item) => {\n if (item && typeof item === 'object') {\n const tips = item[tipsKey]\n return {\n text: item[textKey],\n value: item[valueKey],\n tips: tips === null || tips === undefined ? '' : String(tips),\n raw: item\n }\n }\n // 基本类型数组 [1,2,3] / ['a','b']\n return { text: String(item), value: item, tips: '', raw: { [textKey]: String(item), [valueKey]: item } }\n })\n }\n\n async function fetchOptions(extraParam?: Record<string, any>) {\n // 静态数据源\n if (opts.dataSource.value) {\n options.value = mergeFixed(normalize(opts.dataSource.value))\n return\n }\n if (!opts.api.value) {\n options.value = mergeFixed([])\n return\n }\n loading.value = true\n opts.emit('apiBefore', { url: opts.api.value })\n try {\n const param = { ...opts.apiParam.value, ...(extraParam || {}) }\n const result =\n opts.apiMethod.value === 'get'\n ? await request.get(opts.api.value, param)\n : await request.post(opts.api.value, param)\n if (result.success) {\n const list = Array.isArray(result.data) ? result.data : result.data?.list || []\n options.value = mergeFixed(normalize(list))\n opts.emit('apiSuccess', { data: result.data })\n } else {\n opts.emit('apiFail', { code: result.code, message: result.message })\n }\n } catch (error: any) {\n opts.emit('apiFail', { error, message: error?.message })\n } finally {\n loading.value = false\n opts.emit('apiAfter')\n loaded.value = true\n }\n }\n\n /** 合并前插/后追加固定项 */\n function mergeFixed(main: NormalizedOption[]): NormalizedOption[] {\n const head = normalize(opts.addData.value || [])\n const tail = normalize(opts.appendData.value || [])\n return [...head, ...main, ...tail]\n }\n\n /** 远程搜索(Select remote / AutoComplete) */\n async function remoteSearch(keyword: string, keywordKey = 'keyword') {\n if (!opts.api.value) return\n await fetchOptions({ [keywordKey]: keyword })\n }\n\n onMounted(() => {\n if (opts.active.value) {\n fetchOptions()\n } else if (opts.dataSource.value || !opts.api.value) {\n options.value = mergeFixed(normalize(opts.dataSource.value || []))\n }\n })\n\n watch(\n () => [opts.api.value, opts.dataSource.value],\n () => {\n if (opts.active.value || opts.dataSource.value) fetchOptions()\n }\n )\n\n return { options, loading, fetchOptions, remoteSearch, loaded }\n}\n"],"names":["useOptionsLoader","opts","options","shallowRef","loading","ref","loaded","normalize","list","textKey","valueKey","tipsKey","_a","item","tips","fetchOptions","extraParam","mergeFixed","param","result","request","error","main","head","tail","remoteSearch","keyword","keywordKey","onMounted","watch"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { _ as a } from "../chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-D4w6G2Kv.mjs";
2
+ import { _ as a } from "../chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-D9ZUQB7V.mjs";
3
3
  export {
4
4
  a as WdConfirmButton,
5
5
  a as default
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { W as r } from "../chunks/DataForm-C5MBVdei.mjs";
2
+ import { W as r } from "../chunks/DataForm-Rsa1PT-X.mjs";
3
3
  export {
4
4
  r as WdDataForm,
5
5
  r as default
@@ -1 +1 @@
1
- .wd-data-form[data-v-ad5b00d6]{width:100%}.wd-data-form__footer[data-v-ad5b00d6]{display:flex;justify-content:flex-end;gap:8px;padding-top:var(--wd-spacing-base, 12px);border-top:1px solid var(--wd-border-color-light, #e4e7ed);margin-top:var(--wd-spacing-base, 12px)}
1
+ .wd-data-form[data-v-2177fb08]{width:100%}.wd-data-form__footer[data-v-2177fb08]{display:flex;justify-content:flex-end;gap:8px;padding-top:var(--wd-spacing-base, 12px);border-top:var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light, #e4e7ed);margin-top:var(--wd-spacing-base, 12px);background:var(--wd-form-footer-bg, transparent)}
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { W as t } from "../chunks/DataGrid-HUzKWuQx.mjs";
2
+ import { W as t } from "../chunks/DataGrid-DzbJpT43.mjs";
3
3
  export {
4
4
  t as WdDataGrid,
5
5
  t as default
@@ -1 +1 @@
1
- .wd-datagrid[data-v-41e543b4]{display:flex;flex-direction:column;width:100%;height:100%;background:var(--wd-bg-color, #fff)}.wd-datagrid--auto-height[data-v-41e543b4]{height:100%}.wd-datagrid--fixed-height[data-v-41e543b4]{height:auto}.wd-datagrid__toolbar[data-v-41e543b4]{display:flex;align-items:center;justify-content:flex-start;gap:var(--wd-spacing-base, 12px);padding:0 0 var(--wd-spacing-base, 12px);flex-wrap:wrap}.wd-datagrid__toolbar[data-v-41e543b4] .el-button+.el-button{margin-left:0}.wd-datagrid__toolbar[data-v-41e543b4] .el-button .el-icon{font-size:16px}.wd-datagrid__toolbar-group[data-v-41e543b4],.wd-datagrid__bottom-group[data-v-41e543b4]{display:flex;align-items:center;flex-wrap:wrap}.wd-datagrid__toolbar-left[data-v-41e543b4]{gap:8px}.wd-datagrid__toolbar-right[data-v-41e543b4]{gap:6px;margin-left:auto}.wd-datagrid__toolbar-group.at-left[data-v-41e543b4]{order:1;margin-left:0}.wd-datagrid__toolbar-group.at-right[data-v-41e543b4]{order:2;margin-left:auto}.wd-datagrid__toolbar-group.at-right+.at-right[data-v-41e543b4]{margin-left:0}.wd-datagrid__toolbar-group.is-square[data-v-41e543b4] .el-button{border-radius:0}.wd-datagrid__toolbar-group.is-square[data-v-41e543b4] .el-button:not(.wd-datagrid__cart-btn--text){padding:0;width:var(--el-button-size, 32px)}.wd-datagrid__toolbar-group.is-group[data-v-41e543b4]{gap:0}.wd-datagrid__toolbar-group.is-group[data-v-41e543b4]>*:not(:first-child){margin-left:-1px}.wd-datagrid__toolbar-group.is-group[data-v-41e543b4] .el-button:not(.wd-datagrid__cart-btn--text){padding:0;width:var(--el-button-size, 32px)}.wd-datagrid__toolbar-group.is-group[data-v-41e543b4]>.el-button:not(:first-child),.wd-datagrid__toolbar-group.is-group[data-v-41e543b4]>*:not(:first-child) .el-button{border-top-left-radius:0;border-bottom-left-radius:0}.wd-datagrid__toolbar-group.is-group[data-v-41e543b4]>.el-button:not(:last-child),.wd-datagrid__toolbar-group.is-group[data-v-41e543b4]>*:not(:last-child) .el-button{border-top-right-radius:0;border-bottom-right-radius:0}.wd-datagrid__toolbar-group.is-group[data-v-41e543b4] .el-button:hover,.wd-datagrid__toolbar-group.is-group[data-v-41e543b4] .el-button:focus{position:relative;z-index:1}.wd-datagrid__table[data-v-41e543b4]{flex:1;min-height:0}.wd-datagrid--fixed-height .wd-datagrid__table[data-v-41e543b4]{flex:none}.wd-datagrid__pager[data-v-41e543b4]{display:flex;align-items:center;justify-content:flex-end;gap:var(--wd-spacing-base, 12px);flex-wrap:nowrap;overflow-x:auto;padding-top:var(--wd-spacing-base, 12px)}.wd-datagrid__bottom-group[data-v-41e543b4]{gap:6px;flex-wrap:nowrap;flex-shrink:0}.wd-datagrid__bottom-actions[data-v-41e543b4]{gap:8px}.wd-datagrid__bottom-group[data-v-41e543b4] .el-button+.el-button{margin-left:0}.wd-datagrid__bottom-group[data-v-41e543b4] .el-button .el-icon{font-size:16px}.wd-datagrid__pager-main[data-v-41e543b4]{margin-left:auto}.wd-datagrid__bottom-bar.pager-at-left .wd-datagrid__pager-main[data-v-41e543b4]{order:-1;margin-left:0;margin-right:auto}.wd-datagrid__bottom-bar.pager-at-center .wd-datagrid__pager-main[data-v-41e543b4]{margin-right:auto}.wd-datagrid__cards[data-v-41e543b4]{flex:1;min-height:0;overflow:auto}.wd-datagrid__card[data-v-41e543b4]{border:1px solid var(--wd-border-color-light, #e4e7ed);border-radius:var(--wd-radius-base, 4px);padding:var(--wd-spacing-base, 12px);margin-bottom:var(--wd-spacing-base, 12px)}.wd-datagrid__card-title[data-v-41e543b4]{font-weight:600;font-size:var(--wd-font-size-large, 16px);color:var(--wd-text-color-primary, #303133);margin-bottom:8px}.wd-datagrid__card-line[data-v-41e543b4]{display:flex;font-size:var(--wd-font-size-base, 14px);line-height:1.8}.wd-datagrid__card-label[data-v-41e543b4]{width:110px;color:var(--wd-text-color-secondary, #909399);flex-shrink:0}.wd-datagrid__card-value[data-v-41e543b4]{color:var(--wd-text-color-regular, #606266);word-break:break-all}.wd-datagrid__col-tip[data-v-41e543b4]{margin-bottom:8px;font-size:var(--wd-font-size-small, 12px);color:var(--wd-text-color-secondary, #909399)}.wd-datagrid__col-setting[data-v-41e543b4]{max-height:400px;overflow:auto}.wd-datagrid__col-item[data-v-41e543b4]{position:relative;display:flex;align-items:center;gap:8px;padding:6px 8px;border-bottom:1px solid var(--wd-border-color-light, #f0f0f0);border-radius:4px;transition:background-color .15s}.wd-datagrid__col-item[data-v-41e543b4]:hover{background-color:var(--wd-fill-color-light, #f5f7fa)}.wd-datagrid__col-handle[data-v-41e543b4]{display:inline-flex;align-items:center;cursor:grab;color:var(--wd-text-color-placeholder, #a8abb2);touch-action:none}.wd-datagrid__col-handle[data-v-41e543b4]:active{cursor:grabbing}.wd-datagrid__col-checkbox[data-v-41e543b4]{flex:1}.wd-datagrid__col-item.is-dragging[data-v-41e543b4]{opacity:.45}.wd-datagrid__col-item.drag-over--before[data-v-41e543b4]:before,.wd-datagrid__col-item.drag-over--after[data-v-41e543b4]:after{content:"";position:absolute;left:0;right:0;height:2px;background-color:var(--el-color-primary, #409eff);pointer-events:none}.wd-datagrid__col-item.drag-over--before[data-v-41e543b4]:before{top:-1px}.wd-datagrid__col-item.drag-over--after[data-v-41e543b4]:after{bottom:-1px}
1
+ .wd-datagrid[data-v-477e09fc]{display:flex;flex-direction:column;width:100%;height:100%;background:var(--wd-bg-color, #fff)}.wd-datagrid--auto-height[data-v-477e09fc]{height:100%}.wd-datagrid--fixed-height[data-v-477e09fc]{height:auto}.wd-datagrid__toolbar[data-v-477e09fc]{display:flex;align-items:center;justify-content:flex-start;gap:var(--wd-spacing-base, 12px);padding:0 0 var(--wd-spacing-base, 12px);flex-wrap:wrap}.wd-datagrid__toolbar[data-v-477e09fc] .el-button+.el-button{margin-left:0}.wd-datagrid__toolbar[data-v-477e09fc] .el-button .el-icon{font-size:16px}.wd-datagrid__toolbar-group[data-v-477e09fc],.wd-datagrid__bottom-group[data-v-477e09fc]{display:flex;align-items:center;flex-wrap:wrap}.wd-datagrid__toolbar-left[data-v-477e09fc]{gap:8px}.wd-datagrid__toolbar-right[data-v-477e09fc]{gap:6px;margin-left:auto}.wd-datagrid__toolbar-group.at-left[data-v-477e09fc]{order:1;margin-left:0}.wd-datagrid__toolbar-group.at-right[data-v-477e09fc]{order:2;margin-left:auto}.wd-datagrid__toolbar-group.at-right+.at-right[data-v-477e09fc]{margin-left:0}.wd-datagrid__toolbar-group.is-square[data-v-477e09fc] .el-button{border-radius:0}.wd-datagrid__toolbar-group.is-square[data-v-477e09fc] .el-button:not(.wd-datagrid__cart-btn--text){padding:0;width:var(--el-button-size, 32px)}.wd-datagrid__toolbar-group.is-group[data-v-477e09fc]{gap:0}.wd-datagrid__toolbar-group.is-group[data-v-477e09fc]>*:not(:first-child){margin-left:-1px}.wd-datagrid__toolbar-group.is-group[data-v-477e09fc] .el-button:not(.wd-datagrid__cart-btn--text){padding:0;width:var(--el-button-size, 32px)}.wd-datagrid__toolbar-group.is-group[data-v-477e09fc]>.el-button:not(:first-child),.wd-datagrid__toolbar-group.is-group[data-v-477e09fc]>*:not(:first-child) .el-button{border-top-left-radius:0;border-bottom-left-radius:0}.wd-datagrid__toolbar-group.is-group[data-v-477e09fc]>.el-button:not(:last-child),.wd-datagrid__toolbar-group.is-group[data-v-477e09fc]>*:not(:last-child) .el-button{border-top-right-radius:0;border-bottom-right-radius:0}.wd-datagrid__toolbar-group.is-group[data-v-477e09fc] .el-button:hover,.wd-datagrid__toolbar-group.is-group[data-v-477e09fc] .el-button:focus{position:relative;z-index:1}.wd-datagrid__table[data-v-477e09fc]{flex:1;min-height:0}.wd-datagrid--fixed-height .wd-datagrid__table[data-v-477e09fc]{flex:none}.wd-datagrid__pager[data-v-477e09fc]{display:flex;align-items:center;justify-content:flex-end;gap:var(--wd-spacing-base, 12px);flex-wrap:nowrap;overflow-x:auto;padding-top:var(--wd-spacing-base, 12px)}.wd-datagrid__bottom-group[data-v-477e09fc]{gap:6px;flex-wrap:nowrap;flex-shrink:0}.wd-datagrid__bottom-actions[data-v-477e09fc]{gap:8px}.wd-datagrid__bottom-group[data-v-477e09fc] .el-button+.el-button{margin-left:0}.wd-datagrid__bottom-group[data-v-477e09fc] .el-button .el-icon{font-size:16px}.wd-datagrid__pager-main[data-v-477e09fc]{margin-left:auto}.wd-datagrid__bottom-bar.pager-at-left .wd-datagrid__pager-main[data-v-477e09fc]{order:-1;margin-left:0;margin-right:auto}.wd-datagrid__bottom-bar.pager-at-center .wd-datagrid__pager-main[data-v-477e09fc]{margin-right:auto}.wd-datagrid__cards[data-v-477e09fc]{flex:1;min-height:0;overflow:auto}.wd-datagrid__card[data-v-477e09fc]{background:var(--wd-datagrid-bg, transparent);background-image:var(--wd-datagrid-bg-image, none);border:var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-datagrid-border-color, var(--wd-border-color-light, #e4e7ed));border-radius:var(--wd-datagrid-radius, var(--wd-radius-base, 4px));padding:var(--wd-datagrid-padding, var(--wd-spacing-base, 12px));margin-bottom:var(--wd-spacing-base, 12px)}.wd-datagrid__card-title[data-v-477e09fc]{font-weight:600;font-size:var(--wd-font-size-large, 16px);color:var(--wd-text-color-primary, #303133);margin-bottom:8px}.wd-datagrid__card-line[data-v-477e09fc]{display:flex;font-size:var(--wd-font-size-base, 14px);line-height:1.8}.wd-datagrid__card-label[data-v-477e09fc]{width:110px;color:var(--wd-text-color-secondary, #909399);flex-shrink:0}.wd-datagrid__card-value[data-v-477e09fc]{color:var(--wd-text-color-regular, #606266);word-break:break-all}.wd-datagrid__col-tip[data-v-477e09fc]{margin-bottom:8px;font-size:var(--wd-font-size-small, 12px);color:var(--wd-text-color-secondary, #909399)}.wd-datagrid__col-setting[data-v-477e09fc]{max-height:400px;overflow:auto}.wd-datagrid__col-item[data-v-477e09fc]{position:relative;display:flex;align-items:center;gap:8px;padding:6px 8px;border-bottom:var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light, #f0f0f0);border-radius:var(--wd-radius-small, 4px);transition:background-color .15s}.wd-datagrid__col-item[data-v-477e09fc]:hover{background-color:var(--wd-fill-color-light, #f5f7fa)}.wd-datagrid__col-handle[data-v-477e09fc]{display:inline-flex;align-items:center;cursor:grab;color:var(--wd-text-color-placeholder, #a8abb2);touch-action:none}.wd-datagrid__col-handle[data-v-477e09fc]:active{cursor:grabbing}.wd-datagrid__col-checkbox[data-v-477e09fc]{flex:1}.wd-datagrid__col-item.is-dragging[data-v-477e09fc]{opacity:.45}.wd-datagrid__col-item.drag-over--before[data-v-477e09fc]:before,.wd-datagrid__col-item.drag-over--after[data-v-477e09fc]:after{content:"";position:absolute;left:0;right:0;height:2px;background-color:var(--el-color-primary, #409eff);pointer-events:none}.wd-datagrid__col-item.drag-over--before[data-v-477e09fc]:before{top:-1px}.wd-datagrid__col-item.drag-over--after[data-v-477e09fc]:after{bottom:-1px}
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { W as a } from "../chunks/EditableGrid-C8A-nJZv.mjs";
2
+ import { W as a } from "../chunks/EditableGrid-C-0uy89H.mjs";
3
3
  export {
4
4
  a as WdEditableGrid,
5
5
  a as default
@@ -1 +1 @@
1
- .wd-editable-grid[data-v-34937ba1]{display:flex;flex-direction:column;width:100%;height:100%;background:var(--wd-bg-color, #fff)}.wd-editable-grid--auto-height[data-v-34937ba1]{height:100%}.wd-editable-grid__toolbar[data-v-34937ba1]{display:flex;align-items:center;justify-content:space-between;gap:var(--wd-spacing-base, 12px);padding:0 0 var(--wd-spacing-base, 12px);flex-wrap:wrap}.wd-editable-grid__toolbar[data-v-34937ba1] .el-button+.el-button{margin-left:0}.wd-editable-grid__toolbar[data-v-34937ba1] .el-button .el-icon{font-size:16px}.wd-editable-grid__toolbar-left[data-v-34937ba1]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.wd-editable-grid__toolbar-right[data-v-34937ba1]{display:flex;align-items:center;gap:6px;margin-left:auto;flex-wrap:wrap}.wd-editable-grid__table[data-v-34937ba1]{flex:1;min-height:0}.wd-editable-grid__cell[data-v-34937ba1]{width:100%;min-height:24px;border-radius:2px;transition:background-color .2s}.wd-editable-grid__cell.is-editable[data-v-34937ba1]{cursor:cell}.wd-editable-grid__cell.is-editable[data-v-34937ba1]:hover{color:var(--el-color-primary)}.wd-editable-grid__cell.is-dirty[data-v-34937ba1]{position:relative;padding-right:var(--wd-cell-dirty-padding-right, 20px);background:var(--wd-cell-dirty-bg, transparent)}.wd-editable-grid__cell.is-dirty .wd-editable-grid__cell-dirty-icon[data-v-34937ba1]{display:var(--wd-cell-dirty-show-icon, inline-block);position:absolute;right:2px;top:50%;transform:translateY(-50%);color:var(--wd-cell-dirty-color, var(--el-color-warning, #e6a23c));font-size:var(--wd-cell-dirty-icon-size, 14px)}.wd-editable-grid__cell.is-error[data-v-34937ba1]{background:var(--wd-cell-error-bg, rgba(245, 108, 108, .08));box-shadow:inset 0 0 0 1px var(--wd-cell-error-border, var(--el-color-danger, #f56c6c))}.wd-editable-grid__pager[data-v-34937ba1]{display:flex;justify-content:flex-end;padding-top:var(--wd-spacing-base, 12px)}.wd-editable-grid__cards[data-v-34937ba1]{flex:1;min-height:0;overflow:auto}.wd-editable-grid__card[data-v-34937ba1]{border:1px solid var(--wd-border-color-light, #e4e7ed);border-radius:var(--wd-radius-base, 4px);padding:var(--wd-spacing-base, 12px);margin-bottom:var(--wd-spacing-base, 12px)}.wd-editable-grid__card-title[data-v-34937ba1]{font-weight:600;font-size:var(--wd-font-size-large, 16px);color:var(--wd-text-color-primary, #303133);margin-bottom:8px}.wd-editable-grid__card-line[data-v-34937ba1]{display:flex;font-size:var(--wd-font-size-base, 14px);line-height:1.8}.wd-editable-grid__card-label[data-v-34937ba1]{width:110px;color:var(--wd-text-color-secondary, #909399);flex-shrink:0}.wd-editable-grid__card-value[data-v-34937ba1]{color:var(--wd-text-color-regular, #606266);word-break:break-all}.wd-editable-grid__col-setting[data-v-34937ba1]{max-height:400px;overflow:auto}.wd-editable-grid__col-item[data-v-34937ba1]{display:flex;align-items:center;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--wd-border-color-light, #f0f0f0)}.wd-editable-grid__col-actions[data-v-34937ba1]{display:flex;gap:4px}
1
+ .wd-editable-grid[data-v-799e1582]{display:flex;flex-direction:column;width:100%;height:100%;background:var(--wd-bg-color, #fff)}.wd-editable-grid--auto-height[data-v-799e1582]{height:100%}.wd-editable-grid__toolbar[data-v-799e1582]{display:flex;align-items:center;justify-content:space-between;gap:var(--wd-spacing-base, 12px);padding:0 0 var(--wd-spacing-base, 12px);flex-wrap:wrap}.wd-editable-grid__toolbar[data-v-799e1582] .el-button+.el-button{margin-left:0}.wd-editable-grid__toolbar[data-v-799e1582] .el-button .el-icon{font-size:16px}.wd-editable-grid__toolbar-left[data-v-799e1582]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.wd-editable-grid__toolbar-right[data-v-799e1582]{display:flex;align-items:center;gap:6px;margin-left:auto;flex-wrap:wrap}.wd-editable-grid__table[data-v-799e1582]{flex:1;min-height:0}.wd-editable-grid__cell[data-v-799e1582]{width:100%;min-height:24px;border-radius:var(--wd-radius-small, 2px);transition:background-color .2s}.wd-editable-grid__cell.is-editable[data-v-799e1582]{cursor:cell}.wd-editable-grid__cell.is-editable[data-v-799e1582]:hover{color:var(--el-color-primary)}.wd-editable-grid__cell.is-dirty[data-v-799e1582]{position:relative;padding-right:var(--wd-cell-dirty-padding-right, 20px);background:var(--wd-cell-dirty-bg, transparent)}.wd-editable-grid__cell.is-dirty .wd-editable-grid__cell-dirty-icon[data-v-799e1582]{display:var(--wd-cell-dirty-show-icon, inline-block);position:absolute;right:2px;top:50%;transform:translateY(-50%);color:var(--wd-cell-dirty-color, var(--el-color-warning, #e6a23c));font-size:var(--wd-cell-dirty-icon-size, 14px)}.wd-editable-grid__cell.is-error[data-v-799e1582]{background:var(--wd-cell-error-bg, rgba(245, 108, 108, .08));box-shadow:inset 0 0 0 1px var(--wd-cell-error-border, var(--el-color-danger, #f56c6c))}.wd-editable-grid__pager[data-v-799e1582]{display:flex;justify-content:flex-end;padding-top:var(--wd-spacing-base, 12px)}.wd-editable-grid__cards[data-v-799e1582]{flex:1;min-height:0;overflow:auto}.wd-editable-grid__card[data-v-799e1582]{background:var(--wd-editable-grid-bg, transparent);background-image:var(--wd-editable-grid-bg-image, none);border:var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-editable-grid-border-color, var(--wd-border-color-light, #e4e7ed));border-radius:var(--wd-editable-grid-radius, var(--wd-radius-base, 4px));padding:var(--wd-editable-grid-padding, var(--wd-spacing-base, 12px));margin-bottom:var(--wd-spacing-base, 12px)}.wd-editable-grid__card-title[data-v-799e1582]{font-weight:600;font-size:var(--wd-font-size-large, 16px);color:var(--wd-text-color-primary, #303133);margin-bottom:8px}.wd-editable-grid__card-line[data-v-799e1582]{display:flex;font-size:var(--wd-font-size-base, 14px);line-height:1.8}.wd-editable-grid__card-label[data-v-799e1582]{width:110px;color:var(--wd-text-color-secondary, #909399);flex-shrink:0}.wd-editable-grid__card-value[data-v-799e1582]{color:var(--wd-text-color-regular, #606266);word-break:break-all}.wd-editable-grid__col-setting[data-v-799e1582]{max-height:400px;overflow:auto}.wd-editable-grid__col-item[data-v-799e1582]{display:flex;align-items:center;justify-content:space-between;padding:6px 0;border-bottom:var(--wd-border-width, 1px) var(--wd-border-style, solid) var(--wd-border-color-light, #f0f0f0)}.wd-editable-grid__col-actions[data-v-799e1582]{display:flex;gap:4px}
@@ -1,5 +1,5 @@
1
1
  /* empty css */
2
- import { W as m } from "../chunks/ImageUpload-DGehzaYa.mjs";
2
+ import { W as m } from "../chunks/ImageUpload-CrDyIjWC.mjs";
3
3
  export {
4
4
  m as WdImageUpload,
5
5
  m as default