workdesktop-ai 1.2.4 → 1.2.5

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 (73) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/dist/api-button/index.mjs +1 -1
  3. package/dist/auto-complete/index.mjs +1 -1
  4. package/dist/checkbox-list/index.mjs +1 -1
  5. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-GBEBLUxz.mjs → ApiButton.vue_vue_type_script_setup_true_lang-ZLHP9S_H.mjs} +2 -2
  6. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-GBEBLUxz.mjs.map → ApiButton.vue_vue_type_script_setup_true_lang-ZLHP9S_H.mjs.map} +1 -1
  7. package/dist/chunks/{AutoComplete-DqyhsqiS.mjs → AutoComplete-BKWrR5pD.mjs} +2 -2
  8. package/dist/chunks/{AutoComplete-DqyhsqiS.mjs.map → AutoComplete-BKWrR5pD.mjs.map} +1 -1
  9. package/dist/chunks/{CheckboxList-RxJGe-LQ.mjs → CheckboxList-5o9E0Tzg.mjs} +2 -2
  10. package/dist/chunks/{CheckboxList-RxJGe-LQ.mjs.map → CheckboxList-5o9E0Tzg.mjs.map} +1 -1
  11. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-BPtvM5GB.mjs → ConfirmButton.vue_vue_type_script_setup_true_lang-Cz1M6QsL.mjs} +2 -2
  12. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-BPtvM5GB.mjs.map → ConfirmButton.vue_vue_type_script_setup_true_lang-Cz1M6QsL.mjs.map} +1 -1
  13. package/dist/chunks/{DataForm-DYMderSS.mjs → DataForm-Dvx6GxlR.mjs} +3 -3
  14. package/dist/chunks/{DataForm-DYMderSS.mjs.map → DataForm-Dvx6GxlR.mjs.map} +1 -1
  15. package/dist/chunks/{DataGrid-DWAhwLVk.mjs → DataGrid-Cw3yXhmR.mjs} +3 -3
  16. package/dist/chunks/{DataGrid-DWAhwLVk.mjs.map → DataGrid-Cw3yXhmR.mjs.map} +1 -1
  17. package/dist/chunks/{EditableGrid-e3wwCaem.mjs → EditableGrid-Dr48XzLH.mjs} +4 -4
  18. package/dist/chunks/{EditableGrid-e3wwCaem.mjs.map → EditableGrid-Dr48XzLH.mjs.map} +1 -1
  19. package/dist/chunks/{Iframe-DcFFi0S9.mjs → Iframe-BB1Va2kZ.mjs} +3 -3
  20. package/dist/chunks/{Iframe-DcFFi0S9.mjs.map → Iframe-BB1Va2kZ.mjs.map} +1 -1
  21. package/dist/chunks/{ImageUpload-BK7tbU2o.mjs → ImageUpload-DiJ16Aga.mjs} +3 -3
  22. package/dist/chunks/{ImageUpload-BK7tbU2o.mjs.map → ImageUpload-DiJ16Aga.mjs.map} +1 -1
  23. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-82Mxc2Qv.mjs → PromptButton.vue_vue_type_script_setup_true_lang-y_sfI324.mjs} +2 -2
  24. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-82Mxc2Qv.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-y_sfI324.mjs.map} +1 -1
  25. package/dist/chunks/{RadioList-DuEeHumw.mjs → RadioList-CQJDixnr.mjs} +2 -2
  26. package/dist/chunks/{RadioList-DuEeHumw.mjs.map → RadioList-CQJDixnr.mjs.map} +1 -1
  27. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-xCw4QHCA.mjs → Requester.vue_vue_type_script_setup_true_lang-nel6vN12.mjs} +3 -3
  28. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-xCw4QHCA.mjs.map → Requester.vue_vue_type_script_setup_true_lang-nel6vN12.mjs.map} +1 -1
  29. package/dist/chunks/{Select-MD3taMJo.mjs → Select-ByH7uxuS.mjs} +2 -2
  30. package/dist/chunks/{Select-MD3taMJo.mjs.map → Select-ByH7uxuS.mjs.map} +1 -1
  31. package/dist/chunks/{Station-2m9uznh3.mjs → Station-DDoJem4F.mjs} +150 -139
  32. package/dist/chunks/Station-DDoJem4F.mjs.map +1 -0
  33. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-vok-8-BT.mjs → Switch.vue_vue_type_script_setup_true_lang-DrSXmsj6.mjs} +2 -2
  34. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-vok-8-BT.mjs.map → Switch.vue_vue_type_script_setup_true_lang-DrSXmsj6.mjs.map} +1 -1
  35. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-DVDw-3mF.mjs → Upload.vue_vue_type_script_setup_true_lang-k-0PTz3l.mjs} +3 -3
  36. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-DVDw-3mF.mjs.map → Upload.vue_vue_type_script_setup_true_lang-k-0PTz3l.mjs.map} +1 -1
  37. package/dist/chunks/{Viewer-FSV6xObc.mjs → Viewer-CmTaneb6.mjs} +2 -2
  38. package/dist/chunks/{Viewer-FSV6xObc.mjs.map → Viewer-CmTaneb6.mjs.map} +1 -1
  39. package/dist/chunks/{config-B6nWG5dv.mjs → config-CDqjABpD.mjs} +2 -2
  40. package/dist/chunks/{config-B6nWG5dv.mjs.map → config-CDqjABpD.mjs.map} +1 -1
  41. package/dist/chunks/{http-BKKP0gEJ.mjs → http-CW9konD4.mjs} +2 -2
  42. package/dist/chunks/{http-BKKP0gEJ.mjs.map → http-CW9konD4.mjs.map} +1 -1
  43. package/dist/chunks/{useApiAction-71XPKjlQ.mjs → useApiAction-CQVmN1MH.mjs} +2 -2
  44. package/dist/chunks/{useApiAction-71XPKjlQ.mjs.map → useApiAction-CQVmN1MH.mjs.map} +1 -1
  45. package/dist/chunks/{useColumnSettings-CbiWd27-.mjs → useColumnSettings-CIFQCmzT.mjs} +3 -3
  46. package/dist/chunks/{useColumnSettings-CbiWd27-.mjs.map → useColumnSettings-CIFQCmzT.mjs.map} +1 -1
  47. package/dist/chunks/{useConfig-CPioiLWJ.mjs → useConfig-ChIkE3Lz.mjs} +2 -2
  48. package/dist/chunks/{useConfig-CPioiLWJ.mjs.map → useConfig-ChIkE3Lz.mjs.map} +1 -1
  49. package/dist/chunks/{useOptionsLoader-D4Jh4f1F.mjs → useOptionsLoader-BUO0VTjH.mjs} +2 -2
  50. package/dist/chunks/{useOptionsLoader-D4Jh4f1F.mjs.map → useOptionsLoader-BUO0VTjH.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-grid/index.mjs +1 -1
  54. package/dist/editable-grid/index.mjs +1 -1
  55. package/dist/iframe/index.mjs +1 -1
  56. package/dist/image-upload/index.mjs +1 -1
  57. package/dist/index.esm.js +24 -24
  58. package/dist/index.umd.js +9 -9
  59. package/dist/index.umd.js.map +1 -1
  60. package/dist/prompt-button/index.mjs +1 -1
  61. package/dist/radio-list/index.mjs +1 -1
  62. package/dist/requester/index.mjs +1 -1
  63. package/dist/select/index.mjs +1 -1
  64. package/dist/station/index.mjs +1 -1
  65. package/dist/station/style.css +1 -1
  66. package/dist/style.css +1 -1
  67. package/dist/switch/index.mjs +1 -1
  68. package/dist/types/src/components/layout/Station.vue.d.ts +15 -4
  69. package/dist/types/src/components/layout/types.d.ts +2 -0
  70. package/dist/upload/index.mjs +1 -1
  71. package/dist/viewer/index.mjs +1 -1
  72. package/package.json +1 -1
  73. package/dist/chunks/Station-2m9uznh3.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as M, ref as r, watch as w, computed as m, onMounted as N, onBeforeUnmount as R, resolveDirective as V, withDirectives as $, openBlock as _, createElementBlock as b, mergeProps as C } from "vue";
2
- import { a as x } from "./config-B6nWG5dv.mjs";
3
- import { u as q } from "./useConfig-CPioiLWJ.mjs";
2
+ import { a as x } from "./config-CDqjABpD.mjs";
3
+ import { u as q } from "./useConfig-ChIkE3Lz.mjs";
4
4
  import { _ as D } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
5
5
  const j = ["src"], G = /* @__PURE__ */ M({
6
6
  name: "WdIframe",
@@ -125,4 +125,4 @@ const j = ["src"], G = /* @__PURE__ */ M({
125
125
  export {
126
126
  A as W
127
127
  };
128
- //# sourceMappingURL=Iframe-DcFFi0S9.mjs.map
128
+ //# sourceMappingURL=Iframe-BB1Va2kZ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Iframe-DcFFi0S9.mjs","sources":["../../src/components/containers/Iframe.vue"],"sourcesContent":["<template>\n <div\n ref=\"wrapperRef\"\n class=\"wd-iframe-wrapper\"\n :style=\"wrapperStyle\"\n v-loading=\"loadingVisible\"\n v-bind=\"loadingBindings\"\n >\n <iframe\n ref=\"iframeRef\"\n :key=\"renderKey\"\n :src=\"src\"\n class=\"wd-iframe\"\n frameborder=\"0\"\n @load=\"onLoad\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'\nimport { getGlobalConfig } from '../../lib/core/config'\nimport { useConfig } from '../../lib/composables/useConfig'\n\ndefineOptions({ name: 'WdIframe' })\n\nconst props = defineProps({\n /** iframe 地址 */\n src: { type: String, default: '' },\n /** 固定高度(数字按 px) */\n height: { type: [String, Number], default: '480px' },\n /** 高度自适应(通过子页面 postMessage 上报高度) */\n autoHeight: { type: Boolean, default: false },\n /** 发送消息时使用的 targetOrigin(默认同源;跨域时需显式指定子页面 origin) */\n origin: { type: String, default: '' },\n /**\n * 刷新信号:值变化时强制重新加载 iframe 内容。\n * 常用于「每次显示时刷新」:父级在显示时机自增该值即可(例如 v-if 重建时不需此 prop,仅当 iframe 常驻 DOM 时才需要)。\n */\n refreshKey: { type: [Number, String], default: 0 },\n /**\n * 是否显示加载遮罩:\n * - 不传(undefined):跟随全局配置 request.loading.enable;\n * - true:强制显示(子页加载完成前);\n * - false:关闭 loading,加载过程不出现遮罩。\n */\n loading: { type: Boolean, default: undefined },\n /**\n * 加载超时时间(毫秒):超时后自动关闭遮罩并触发 timeout 事件;\n * 不传时取组件默认配置,默认 0 表示不限制(不超时)。\n */\n timeout: { type: Number, default: undefined }\n})\n\nconst emit = defineEmits(['load', 'message', 'complete', 'timeout'])\n\nconst iframeRef = ref<HTMLIFrameElement | null>(null)\nconst wrapperRef = ref<HTMLElement | null>(null)\nconst autoHeightValue = ref<number | null>(null)\n\n/** 合并全局组件默认配置(page.componentDefault.WdIframe)→ 本地 props */\nconst cfg = useConfig<{ loading?: boolean; timeout?: number }>('WdIframe', {\n loading: props.loading,\n timeout: props.timeout\n})\n\n/** 内部刷新计数:refreshKey 变化 或 调用 refresh() 时自增,驱动 iframe 重建(强制重新加载) */\nconst renderTick = ref(0)\nwatch(\n () => props.refreshKey,\n () => {\n renderTick.value += 1\n }\n)\nconst renderKey = computed(() => `${props.refreshKey}:${renderTick.value}`)\n\n/** 容器高度(iframe 填满容器,loading 遮罩按容器定位) */\nconst wrapperStyle = computed(() => {\n if (props.autoHeight && autoHeightValue.value) {\n return { height: `${autoHeightValue.value}px` }\n }\n return { height: typeof props.height === 'number' ? `${props.height}px` : props.height }\n})\n\n/* ---------------- loading 遮罩 ---------------- */\n\nconst loadingVisible = ref(false)\nlet timeoutTimer: ReturnType<typeof setTimeout> | null = null\n\n/** 是否启用 loading:本地 props / 组件默认(useConfig 已合并)→ 全局 request.loading.enable */\nfunction loadingEnabled(): boolean {\n return cfg.value.loading ?? getGlobalConfig().request.loading.enable\n}\n\n/** 超时毫秒:0 表示不限制 */\nfunction timeoutMs(): number {\n return cfg.value.timeout ?? 0\n}\n\n/** 遮罩外观跟随全局 request.loading.props(映射到 v-loading 支持的属性) */\nconst loadingBindings = computed<Record<string, any>>(() => {\n const p = getGlobalConfig().request.loading.props || {}\n return {\n elementLoadingText: p.text,\n elementLoadingBackground: p.background,\n elementLoadingSpinner: p.spinner,\n elementLoadingSvg: p.svg,\n elementLoadingSvgViewBox: p.svgViewBox\n }\n})\n\nfunction clearTimer() {\n if (timeoutTimer) {\n clearTimeout(timeoutTimer)\n timeoutTimer = null\n }\n}\n\n/** 开始一次加载:显示遮罩并启动超时计时 */\nfunction startLoading() {\n clearTimer()\n if (!props.src || !loadingEnabled()) {\n loadingVisible.value = false\n return\n }\n loadingVisible.value = true\n const ms = timeoutMs()\n if (ms > 0) {\n timeoutTimer = setTimeout(() => {\n loadingVisible.value = false\n timeoutTimer = null\n emit('timeout', { timeout: ms })\n }, ms)\n }\n}\n\nfunction onLoad() {\n clearTimer()\n loadingVisible.value = false\n // 保留 load(原生语义,向后兼容),complete 表示「加载完成、loading 结束」\n emit('load')\n emit('complete')\n}\n\n/* 地址变化或 iframe 重建(刷新)时,重新进入 loading */\nwatch(\n [() => props.src, renderKey],\n () => startLoading()\n)\n\n/**\n * 父 → 子:向 iframe 内页面发送消息(子页通过 window.addEventListener('message') 接收)\n */\nfunction send(message: any) {\n const targetOrigin = props.origin || window.location.origin\n iframeRef.value?.contentWindow?.postMessage(message, targetOrigin)\n}\n\n/** 强制重新加载 iframe 内容(重建 iframe 元素) */\nfunction refresh() {\n renderTick.value += 1\n}\n\n/** 子页面 postMessage 透传:约定 { type:'wd-iframe-height', height } 或任意消息 */\nfunction onMessage(event: MessageEvent) {\n const data = event.data\n if (props.autoHeight && data && typeof data === 'object' && data.type === 'wd-iframe-height') {\n autoHeightValue.value = Number(data.height) || null\n }\n emit('message', data)\n}\n\nonMounted(() => {\n window.addEventListener('message', onMessage)\n startLoading()\n})\nonBeforeUnmount(() => {\n clearTimer()\n window.removeEventListener('message', onMessage)\n})\n\ndefineExpose({ send, refresh })\n</script>\n\n<style scoped>\n.wd-iframe-wrapper {\n position: relative;\n width: 100%;\n}\n.wd-iframe {\n width: 100%;\n height: 100%;\n border: 0;\n display: block;\n}\n</style>\n"],"names":["props","__props","emit","__emit","iframeRef","ref","wrapperRef","autoHeightValue","cfg","useConfig","renderTick","watch","renderKey","computed","wrapperStyle","loadingVisible","timeoutTimer","loadingEnabled","getGlobalConfig","timeoutMs","loadingBindings","p","clearTimer","startLoading","ms","onLoad","send","message","targetOrigin","_b","_a","refresh","onMessage","event","data","onMounted","onBeforeUnmount","__expose","_withDirectives","_openBlock","_createElementBlock","_mergeProps"],"mappings":"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"}
1
+ {"version":3,"file":"Iframe-BB1Va2kZ.mjs","sources":["../../src/components/containers/Iframe.vue"],"sourcesContent":["<template>\n <div\n ref=\"wrapperRef\"\n class=\"wd-iframe-wrapper\"\n :style=\"wrapperStyle\"\n v-loading=\"loadingVisible\"\n v-bind=\"loadingBindings\"\n >\n <iframe\n ref=\"iframeRef\"\n :key=\"renderKey\"\n :src=\"src\"\n class=\"wd-iframe\"\n frameborder=\"0\"\n @load=\"onLoad\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted, onBeforeUnmount } from 'vue'\nimport { getGlobalConfig } from '../../lib/core/config'\nimport { useConfig } from '../../lib/composables/useConfig'\n\ndefineOptions({ name: 'WdIframe' })\n\nconst props = defineProps({\n /** iframe 地址 */\n src: { type: String, default: '' },\n /** 固定高度(数字按 px) */\n height: { type: [String, Number], default: '480px' },\n /** 高度自适应(通过子页面 postMessage 上报高度) */\n autoHeight: { type: Boolean, default: false },\n /** 发送消息时使用的 targetOrigin(默认同源;跨域时需显式指定子页面 origin) */\n origin: { type: String, default: '' },\n /**\n * 刷新信号:值变化时强制重新加载 iframe 内容。\n * 常用于「每次显示时刷新」:父级在显示时机自增该值即可(例如 v-if 重建时不需此 prop,仅当 iframe 常驻 DOM 时才需要)。\n */\n refreshKey: { type: [Number, String], default: 0 },\n /**\n * 是否显示加载遮罩:\n * - 不传(undefined):跟随全局配置 request.loading.enable;\n * - true:强制显示(子页加载完成前);\n * - false:关闭 loading,加载过程不出现遮罩。\n */\n loading: { type: Boolean, default: undefined },\n /**\n * 加载超时时间(毫秒):超时后自动关闭遮罩并触发 timeout 事件;\n * 不传时取组件默认配置,默认 0 表示不限制(不超时)。\n */\n timeout: { type: Number, default: undefined }\n})\n\nconst emit = defineEmits(['load', 'message', 'complete', 'timeout'])\n\nconst iframeRef = ref<HTMLIFrameElement | null>(null)\nconst wrapperRef = ref<HTMLElement | null>(null)\nconst autoHeightValue = ref<number | null>(null)\n\n/** 合并全局组件默认配置(page.componentDefault.WdIframe)→ 本地 props */\nconst cfg = useConfig<{ loading?: boolean; timeout?: number }>('WdIframe', {\n loading: props.loading,\n timeout: props.timeout\n})\n\n/** 内部刷新计数:refreshKey 变化 或 调用 refresh() 时自增,驱动 iframe 重建(强制重新加载) */\nconst renderTick = ref(0)\nwatch(\n () => props.refreshKey,\n () => {\n renderTick.value += 1\n }\n)\nconst renderKey = computed(() => `${props.refreshKey}:${renderTick.value}`)\n\n/** 容器高度(iframe 填满容器,loading 遮罩按容器定位) */\nconst wrapperStyle = computed(() => {\n if (props.autoHeight && autoHeightValue.value) {\n return { height: `${autoHeightValue.value}px` }\n }\n return { height: typeof props.height === 'number' ? `${props.height}px` : props.height }\n})\n\n/* ---------------- loading 遮罩 ---------------- */\n\nconst loadingVisible = ref(false)\nlet timeoutTimer: ReturnType<typeof setTimeout> | null = null\n\n/** 是否启用 loading:本地 props / 组件默认(useConfig 已合并)→ 全局 request.loading.enable */\nfunction loadingEnabled(): boolean {\n return cfg.value.loading ?? getGlobalConfig().request.loading.enable\n}\n\n/** 超时毫秒:0 表示不限制 */\nfunction timeoutMs(): number {\n return cfg.value.timeout ?? 0\n}\n\n/** 遮罩外观跟随全局 request.loading.props(映射到 v-loading 支持的属性) */\nconst loadingBindings = computed<Record<string, any>>(() => {\n const p = getGlobalConfig().request.loading.props || {}\n return {\n elementLoadingText: p.text,\n elementLoadingBackground: p.background,\n elementLoadingSpinner: p.spinner,\n elementLoadingSvg: p.svg,\n elementLoadingSvgViewBox: p.svgViewBox\n }\n})\n\nfunction clearTimer() {\n if (timeoutTimer) {\n clearTimeout(timeoutTimer)\n timeoutTimer = null\n }\n}\n\n/** 开始一次加载:显示遮罩并启动超时计时 */\nfunction startLoading() {\n clearTimer()\n if (!props.src || !loadingEnabled()) {\n loadingVisible.value = false\n return\n }\n loadingVisible.value = true\n const ms = timeoutMs()\n if (ms > 0) {\n timeoutTimer = setTimeout(() => {\n loadingVisible.value = false\n timeoutTimer = null\n emit('timeout', { timeout: ms })\n }, ms)\n }\n}\n\nfunction onLoad() {\n clearTimer()\n loadingVisible.value = false\n // 保留 load(原生语义,向后兼容),complete 表示「加载完成、loading 结束」\n emit('load')\n emit('complete')\n}\n\n/* 地址变化或 iframe 重建(刷新)时,重新进入 loading */\nwatch(\n [() => props.src, renderKey],\n () => startLoading()\n)\n\n/**\n * 父 → 子:向 iframe 内页面发送消息(子页通过 window.addEventListener('message') 接收)\n */\nfunction send(message: any) {\n const targetOrigin = props.origin || window.location.origin\n iframeRef.value?.contentWindow?.postMessage(message, targetOrigin)\n}\n\n/** 强制重新加载 iframe 内容(重建 iframe 元素) */\nfunction refresh() {\n renderTick.value += 1\n}\n\n/** 子页面 postMessage 透传:约定 { type:'wd-iframe-height', height } 或任意消息 */\nfunction onMessage(event: MessageEvent) {\n const data = event.data\n if (props.autoHeight && data && typeof data === 'object' && data.type === 'wd-iframe-height') {\n autoHeightValue.value = Number(data.height) || null\n }\n emit('message', data)\n}\n\nonMounted(() => {\n window.addEventListener('message', onMessage)\n startLoading()\n})\nonBeforeUnmount(() => {\n clearTimer()\n window.removeEventListener('message', onMessage)\n})\n\ndefineExpose({ send, refresh })\n</script>\n\n<style scoped>\n.wd-iframe-wrapper {\n position: relative;\n width: 100%;\n}\n.wd-iframe {\n width: 100%;\n height: 100%;\n border: 0;\n display: block;\n}\n</style>\n"],"names":["props","__props","emit","__emit","iframeRef","ref","wrapperRef","autoHeightValue","cfg","useConfig","renderTick","watch","renderKey","computed","wrapperStyle","loadingVisible","timeoutTimer","loadingEnabled","getGlobalConfig","timeoutMs","loadingBindings","p","clearTimer","startLoading","ms","onLoad","send","message","targetOrigin","_b","_a","refresh","onMessage","event","data","onMounted","onBeforeUnmount","__expose","_withDirectives","_openBlock","_createElementBlock","_mergeProps"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { defineComponent as L, useCssVars as T, ref as m, watch as j, computed as w, resolveComponent as b, openBlock as S, createElementBlock as N, normalizeClass as H, createVNode as C, mergeProps as J, withCtx as A, unref as O, toDisplayString as Q, createCommentVNode as V, createBlock as X } from "vue";
2
2
  import { Plus as Y } from "@element-plus/icons-vue";
3
3
  import { ElMessage as f, ElMessageBox as Z } from "element-plus";
4
- import { r as p } from "./http-BKKP0gEJ.mjs";
5
- import { a as _ } from "./config-B6nWG5dv.mjs";
4
+ import { r as p } from "./http-CW9konD4.mjs";
5
+ import { a as _ } from "./config-CDqjABpD.mjs";
6
6
  import { r as D } from "./linkage-FbL1mcz3.mjs";
7
7
  import { h as F, f as ee } from "./props-DAytpx7D.mjs";
8
8
  import { _ as te } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
@@ -191,4 +191,4 @@ const ae = {
191
191
  export {
192
192
  fe as W
193
193
  };
194
- //# sourceMappingURL=ImageUpload-BK7tbU2o.mjs.map
194
+ //# sourceMappingURL=ImageUpload-DiJ16Aga.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageUpload-BK7tbU2o.mjs","sources":["../../src/components/upload/ImageUpload.vue"],"sourcesContent":["<template>\r\n <div class=\"wd-image-upload\" :class=\"{ 'is-hide-add': hideAdd }\">\r\n <el-upload\r\n ref=\"uploadRef\"\r\n :action=\"resolvedAction\"\r\n list-type=\"picture-card\"\r\n :accept=\"accept || 'image/*'\"\r\n :limit=\"maxCount\"\r\n :multiple=\"maxCount > 1\"\r\n v-model:file-list=\"innerFileList\"\r\n :before-upload=\"beforeUpload\"\r\n :before-remove=\"beforeRemove\"\r\n :on-success=\"onSuccess\"\r\n :on-error=\"onError\"\r\n :on-preview=\"onPreview\"\r\n :on-exceed=\"onExceed\"\r\n v-bind=\"$attrs\"\r\n >\r\n <el-icon><Plus /></el-icon>\r\n <template #tip>\r\n <div v-if=\"tip\" class=\"el-upload__tip\">{{ tip }}</div>\r\n </template>\r\n </el-upload>\r\n\r\n <!-- 图片大图预览:使用 el-image-viewer 组件(ElementPlus 内置) -->\r\n <el-image-viewer\r\n v-if=\"preview && viewerVisible\"\r\n :url-list=\"viewerSources\"\r\n :initial-index=\"viewerPage - 1\"\r\n @close=\"viewerVisible = false\"\r\n @switch=\"onViewerPageChange\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport { Plus } from '@element-plus/icons-vue'\r\nimport type { UploadFile, UploadFiles, UploadInstance, UploadProps, UploadUserFile } from 'element-plus'\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport { request } from '../../lib/core/http'\r\nimport { getGlobalConfig } from '../../lib/core/config'\r\nimport { refreshDataGrid } from '../../lib/core/linkage'\r\nimport { filterProp, headRefreshDatagridProp } from '../common/props'\r\nimport type { PropType } from 'vue'\r\n\r\ndefineOptions({ name: 'WdImageUpload', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n /** 上传地址 */\r\n api: { type: String, default: '' },\r\n /** 后端删除地址 */\r\n deleteApi: { type: String, default: '' },\r\n /** 删除请求方法 */\r\n deleteMethod: {\r\n type: String as PropType<'get' | 'post' | 'put' | 'delete'>,\r\n default: 'post'\r\n },\r\n /** 删除主键字段 */\r\n primaryKey: { type: String, default: 'id' },\r\n /** 最大图片数量,超限隐藏加号 */\r\n maxCount: { type: Number, default: 8 },\r\n /** 缩略图尺寸(px,兼容属性式字符串写法) */\r\n thumbnailSize: { type: [Number, String], default: 100 },\r\n /** 是否点击缩略图大图预览 */\r\n preview: { type: Boolean, default: true },\r\n /** 接收类型,默认 image/* */\r\n accept: { type: String, default: '' },\r\n /** 单图大小限制(MB) */\r\n maxSize: { type: Number, default: 5 },\r\n /** 提示文案 */\r\n tip: { type: String, default: '' },\r\n /** v-model:已上传图片地址数组 */\r\n modelValue: { type: Array as PropType<string[]>, default: () => [] }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'update:modelValue',\r\n 'change',\r\n 'success',\r\n 'error',\r\n 'delete-success',\r\n 'preview',\r\n 'exceed',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst uploadRef = ref<UploadInstance>()\r\nconst innerFileList = ref<UploadUserFile[]>(\r\n props.modelValue.map((url) => ({ name: url.split('/').pop() || 'image', url }))\r\n)\r\nconst viewerVisible = ref(false)\r\nconst viewerPage = ref(1)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n innerFileList.value = val.map((url) => ({ name: url.split('/').pop() || 'image', url }))\r\n }\r\n)\r\n\r\n/** 仅展示成功图片的地址(用于预览轮播) */\r\nconst viewerSources = computed(() =>\r\n innerFileList.value.map((f) => f.url || (f as any).biz?.url || '').filter(Boolean)\r\n)\r\n\r\n/** 达到上限隐藏加号 */\r\nconst hideAdd = computed(() => innerFileList.value.length >= props.maxCount)\r\n\r\nconst resolvedAction = computed(() => {\r\n if (!props.api) return '#'\r\n if (/^https?:\\/\\//.test(props.api)) return props.api\r\n const prefix = getGlobalConfig().request.urlPrefix || ''\r\n return prefix ? `${prefix.replace(/\\/$/, '')}/${props.api.replace(/^\\//, '')}` : props.api\r\n})\r\n\r\nfunction syncModel() {\r\n const urls = innerFileList.value\r\n .map((f) => f.url || (f as any).biz?.url || (f as any).biz?.path || '')\r\n .filter(Boolean)\r\n emit('update:modelValue', urls)\r\n emit('change', urls)\r\n}\r\n\r\nconst beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {\r\n if (!rawFile.type.startsWith('image/')) {\r\n ElMessage.error('仅支持上传图片文件')\r\n return false\r\n }\r\n if (props.maxSize && rawFile.size / 1024 / 1024 > props.maxSize) {\r\n ElMessage.error(`图片大小不能超过 ${props.maxSize}MB`)\r\n return false\r\n }\r\n emit('apiBefore', { url: props.api, file: rawFile })\r\n return true\r\n}\r\n\r\nconst onSuccess: UploadProps['onSuccess'] = (response, uploadFile, uploadFiles) => {\r\n const cfg = getGlobalConfig()\r\n const { codeName, messageName, dataName } = cfg.response.props\r\n const code = response?.[codeName]\r\n const ok = code === undefined || code === null || Number.isNaN(Number(code)) || Number(code) >= cfg.response.successCode\r\n\r\n ;(uploadFile as any).response = response\r\n if (ok && response?.[dataName]) {\r\n const bizData = response[dataName]\r\n ;(uploadFile as any).biz = bizData\r\n if (bizData && typeof bizData === 'object') {\r\n uploadFile.url = uploadFile.url || bizData.url || bizData.path\r\n } else if (typeof bizData === 'string') {\r\n uploadFile.url = bizData\r\n }\r\n }\r\n\r\n if (ok) {\r\n emit('success', { response, file: uploadFile, files: uploadFiles })\r\n emit('apiSuccess', { data: response?.[dataName], raw: response })\r\n if (props.headRefreshDatagrid) refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n } else {\r\n ElMessage.error(response?.[messageName] || '上传失败')\r\n // 失败项从列表移除\r\n innerFileList.value = innerFileList.value.filter((f) => f.uid !== uploadFile.uid)\r\n emit('error', { response, file: uploadFile })\r\n emit('apiFail', { code, message: response?.[messageName] })\r\n }\r\n emit('apiAfter', { url: props.api })\r\n syncModel()\r\n}\r\n\r\nconst onError: UploadProps['onError'] = (err, uploadFile) => {\r\n ElMessage.error('上传失败,请稍后重试')\r\n innerFileList.value = innerFileList.value.filter((f) => f.uid !== uploadFile.uid)\r\n emit('error', { error: err, file: uploadFile })\r\n emit('apiException', { error: err, message: err?.message })\r\n emit('apiAfter', { url: props.api, error: err })\r\n syncModel()\r\n}\r\n\r\nconst beforeRemove: UploadProps['beforeRemove'] = async (uploadFile) => {\r\n try {\r\n await ElMessageBox.confirm('确认删除该图片?', '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n })\r\n } catch {\r\n return false\r\n }\r\n\r\n const biz = (uploadFile as any).biz || uploadFile\r\n const fileId = biz?.[props.primaryKey] ?? (uploadFile.response as any)?.[props.primaryKey]\r\n\r\n if (props.deleteApi && fileId !== undefined && fileId !== null) {\r\n emit('apiBefore', { url: props.deleteApi })\r\n try {\r\n const param = { [props.primaryKey]: fileId }\r\n const result =\r\n props.deleteMethod === 'get'\r\n ? await request.get(props.deleteApi, param)\r\n : props.deleteMethod === 'delete'\r\n ? await request.delete(props.deleteApi, param)\r\n : props.deleteMethod === 'put'\r\n ? await request.put(props.deleteApi, param)\r\n : await request.post(props.deleteApi, param)\r\n if (result.success) {\r\n emit('delete-success', { file: uploadFile, data: result.data })\r\n emit('apiSuccess', { data: result.data })\r\n if (props.headRefreshDatagrid) refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n } else {\r\n emit('apiFail', { code: result.code, message: result.message })\r\n return false\r\n }\r\n } catch (error: any) {\r\n emit('apiException', { error, message: error?.message })\r\n return false\r\n } finally {\r\n emit('apiAfter', { url: props.deleteApi })\r\n }\r\n } else {\r\n emit('delete-success', { file: uploadFile })\r\n }\r\n return true\r\n}\r\n\r\nconst onPreview: UploadProps['onPreview'] = (uploadFile) => {\r\n emit('preview', { file: uploadFile })\r\n if (!props.preview) return\r\n const idx = viewerSources.value.findIndex((url) => url === (uploadFile.url || (uploadFile as any).biz?.url))\r\n viewerPage.value = idx >= 0 ? idx + 1 : 1\r\n viewerVisible.value = true\r\n}\r\n\r\nfunction onViewerPageChange(index: number) {\r\n viewerPage.value = index + 1\r\n}\r\n\r\nconst onExceed: UploadProps['onExceed'] = () => {\r\n ElMessage.warning(`最多上传 ${props.maxCount} 张图片`)\r\n emit('exceed', { maxCount: props.maxCount })\r\n}\r\n\r\nfunction clearFiles() {\r\n uploadRef.value?.clearFiles()\r\n innerFileList.value = []\r\n syncModel()\r\n}\r\n\r\ndefineExpose({ clearFiles, uploadRef })\r\n</script>\r\n\r\n<style scoped>\r\n.wd-image-upload :deep(.el-upload-list--picture-card .el-upload-list__item),\r\n.wd-image-upload :deep(.el-upload--picture-card) {\r\n width: v-bind('thumbnailSize + \"px\"');\r\n height: v-bind('thumbnailSize + \"px\"');\r\n}\r\n.wd-image-upload.is-hide-add :deep(.el-upload--picture-card),\r\n.wd-image-upload :deep(.is-hide-add .el-upload--picture-card) {\r\n display: none;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","uploadRef","ref","innerFileList","url","viewerVisible","viewerPage","watch","val","viewerSources","computed","f","_a","hideAdd","resolvedAction","prefix","getGlobalConfig","syncModel","urls","_b","beforeUpload","rawFile","ElMessage","onSuccess","response","uploadFile","uploadFiles","cfg","codeName","messageName","dataName","code","ok","bizData","refreshDataGrid","onError","err","beforeRemove","ElMessageBox","biz","fileId","param","result","request","error","onPreview","idx","onViewerPageChange","index","onExceed","clearFiles","__expose","_createElementBlock","_normalizeClass","_createVNode","_component_el_upload","_mergeProps","$event","$attrs","_hoisted_1","_toDisplayString","_component_el_icon","_unref","Plus","_createBlock","_component_el_image_viewer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,UAAMA,IAAQC,GA8BRC,IAAOC,GAePC,IAAYC,EAAA,GACZC,IAAgBD;AAAA,MACpBL,EAAM,WAAW,IAAI,CAACO,OAAS,EAAE,MAAMA,EAAI,MAAM,GAAG,EAAE,IAAA,KAAS,SAAS,KAAAA,IAAM;AAAA,IAAA,GAE1EC,IAAgBH,EAAI,EAAK,GACzBI,IAAaJ,EAAI,CAAC;AAExB,IAAAK;AAAA,MACE,MAAMV,EAAM;AAAA,MACZ,CAACW,MAAQ;AACP,QAAAL,EAAc,QAAQK,EAAI,IAAI,CAACJ,OAAS,EAAE,MAAMA,EAAI,MAAM,GAAG,EAAE,IAAA,KAAS,SAAS,KAAAA,IAAM;AAAA,MACzF;AAAA,IAAA;AAIF,UAAMK,IAAgBC;AAAA,MAAS,MAC7BP,EAAc,MAAM,IAAI,CAACQ,MAAA;;AAAM,eAAAA,EAAE,SAAQC,IAAAD,EAAU,QAAV,gBAAAC,EAAe,QAAO;AAAA,OAAE,EAAE,OAAO,OAAO;AAAA,IAAA,GAI7EC,IAAUH,EAAS,MAAMP,EAAc,MAAM,UAAUN,EAAM,QAAQ,GAErEiB,IAAiBJ,EAAS,MAAM;AACpC,UAAI,CAACb,EAAM,IAAK,QAAO;AACvB,UAAI,eAAe,KAAKA,EAAM,GAAG,UAAUA,EAAM;AACjD,YAAMkB,IAASC,EAAA,EAAkB,QAAQ,aAAa;AACtD,aAAOD,IAAS,GAAGA,EAAO,QAAQ,OAAO,EAAE,CAAC,IAAIlB,EAAM,IAAI,QAAQ,OAAO,EAAE,CAAC,KAAKA,EAAM;AAAA,IACzF,CAAC;AAED,aAASoB,IAAY;AACnB,YAAMC,IAAOf,EAAc,MACxB,IAAI,CAACQ;;AAAM,eAAAA,EAAE,SAAQC,IAAAD,EAAU,QAAV,gBAAAC,EAAe,UAAQO,IAAAR,EAAU,QAAV,gBAAAQ,EAAe,SAAQ;AAAA,OAAE,EACrE,OAAO,OAAO;AACjB,MAAApB,EAAK,qBAAqBmB,CAAI,GAC9BnB,EAAK,UAAUmB,CAAI;AAAA,IACrB;AAEA,UAAME,IAA4C,CAACC,MAC5CA,EAAQ,KAAK,WAAW,QAAQ,IAIjCxB,EAAM,WAAWwB,EAAQ,OAAO,OAAO,OAAOxB,EAAM,WACtDyB,EAAU,MAAM,YAAYzB,EAAM,OAAO,IAAI,GACtC,OAETE,EAAK,aAAa,EAAE,KAAKF,EAAM,KAAK,MAAMwB,GAAS,GAC5C,OARLC,EAAU,MAAM,WAAW,GACpB,KAULC,IAAsC,CAACC,GAAUC,GAAYC,MAAgB;AACjF,YAAMC,IAAMX,EAAA,GACN,EAAE,UAAAY,GAAU,aAAAC,GAAa,UAAAC,EAAA,IAAaH,EAAI,SAAS,OACnDI,IAAOP,KAAA,gBAAAA,EAAWI,IAClBI,IAA2BD,KAAS,QAAQ,OAAO,MAAM,OAAOA,CAAI,CAAC,KAAK,OAAOA,CAAI,KAAKJ,EAAI,SAAS;AAG7G,UADEF,EAAmB,WAAWD,GAC5BQ,MAAMR,KAAA,QAAAA,EAAWM,KAAW;AAC9B,cAAMG,IAAUT,EAASM,CAAQ;AAC/B,QAAAL,EAAmB,MAAMQ,GACvBA,KAAW,OAAOA,KAAY,WAChCR,EAAW,MAAMA,EAAW,OAAOQ,EAAQ,OAAOA,EAAQ,OACjD,OAAOA,KAAY,aAC5BR,EAAW,MAAMQ;AAAA,MAErB;AAEA,MAAID,KACFjC,EAAK,WAAW,EAAE,UAAAyB,GAAU,MAAMC,GAAY,OAAOC,GAAa,GAClE3B,EAAK,cAAc,EAAE,MAAMyB,KAAA,gBAAAA,EAAWM,IAAW,KAAKN,GAAU,GAC5D3B,EAAM,uBAAqBqC,EAAgBrC,EAAM,qBAAqBA,EAAM,MAAM,MAEtFyB,EAAU,OAAME,KAAA,gBAAAA,EAAWK,OAAgB,MAAM,GAEjD1B,EAAc,QAAQA,EAAc,MAAM,OAAO,CAACQ,MAAMA,EAAE,QAAQc,EAAW,GAAG,GAChF1B,EAAK,SAAS,EAAE,UAAAyB,GAAU,MAAMC,GAAY,GAC5C1B,EAAK,WAAW,EAAE,MAAAgC,GAAM,SAASP,KAAA,gBAAAA,EAAWK,IAAc,IAE5D9B,EAAK,YAAY,EAAE,KAAKF,EAAM,KAAK,GACnCoB,EAAA;AAAA,IACF,GAEMkB,IAAkC,CAACC,GAAKX,MAAe;AAC3D,MAAAH,EAAU,MAAM,YAAY,GAC5BnB,EAAc,QAAQA,EAAc,MAAM,OAAO,CAACQ,MAAMA,EAAE,QAAQc,EAAW,GAAG,GAChF1B,EAAK,SAAS,EAAE,OAAOqC,GAAK,MAAMX,GAAY,GAC9C1B,EAAK,gBAAgB,EAAE,OAAOqC,GAAK,SAASA,KAAA,gBAAAA,EAAK,SAAS,GAC1DrC,EAAK,YAAY,EAAE,KAAKF,EAAM,KAAK,OAAOuC,GAAK,GAC/CnB,EAAA;AAAA,IACF,GAEMoB,IAA4C,OAAOZ,MAAe;;AACtE,UAAI;AACF,cAAMa,EAAa,QAAQ,YAAY,MAAM;AAAA,UAC3C,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,MAAM;AAAA,QAAA,CACP;AAAA,MACH,QAAQ;AACN,eAAO;AAAA,MACT;AAEA,YAAMC,IAAOd,EAAmB,OAAOA,GACjCe,KAASD,KAAA,gBAAAA,EAAM1C,EAAM,kBAAgBe,IAAAa,EAAW,aAAX,gBAAAb,EAA8Bf,EAAM;AAE/E,UAAIA,EAAM,aAAa2C,MAAW,UAAaA,MAAW,MAAM;AAC9D,QAAAzC,EAAK,aAAa,EAAE,KAAKF,EAAM,WAAW;AAC1C,YAAI;AACF,gBAAM4C,IAAQ,EAAE,CAAC5C,EAAM,UAAU,GAAG2C,EAAA,GAC9BE,IACJ7C,EAAM,iBAAiB,QACnB,MAAM8C,EAAQ,IAAI9C,EAAM,WAAW4C,CAAK,IACxC5C,EAAM,iBAAiB,WACrB,MAAM8C,EAAQ,OAAO9C,EAAM,WAAW4C,CAAK,IAC3C5C,EAAM,iBAAiB,QACrB,MAAM8C,EAAQ,IAAI9C,EAAM,WAAW4C,CAAK,IACxC,MAAME,EAAQ,KAAK9C,EAAM,WAAW4C,CAAK;AACnD,cAAIC,EAAO;AACT,YAAA3C,EAAK,kBAAkB,EAAE,MAAM0B,GAAY,MAAMiB,EAAO,MAAM,GAC9D3C,EAAK,cAAc,EAAE,MAAM2C,EAAO,MAAM,GACpC7C,EAAM,uBAAqBqC,EAAgBrC,EAAM,qBAAqBA,EAAM,MAAM;AAAA;AAEtF,mBAAAE,EAAK,WAAW,EAAE,MAAM2C,EAAO,MAAM,SAASA,EAAO,SAAS,GACvD;AAAA,QAEX,SAASE,GAAY;AACnB,iBAAA7C,EAAK,gBAAgB,EAAE,OAAA6C,GAAO,SAASA,KAAA,gBAAAA,EAAO,SAAS,GAChD;AAAA,QACT,UAAA;AACE,UAAA7C,EAAK,YAAY,EAAE,KAAKF,EAAM,WAAW;AAAA,QAC3C;AAAA,MACF;AACE,QAAAE,EAAK,kBAAkB,EAAE,MAAM0B,EAAA,CAAY;AAE7C,aAAO;AAAA,IACT,GAEMoB,IAAsC,CAACpB,MAAe;AAE1D,UADA1B,EAAK,WAAW,EAAE,MAAM0B,EAAA,CAAY,GAChC,CAAC5B,EAAM,QAAS;AACpB,YAAMiD,IAAMrC,EAAc,MAAM,UAAU,CAACL,MAAA;;AAAQ,eAAAA,OAASqB,EAAW,SAAQb,IAAAa,EAAmB,QAAnB,gBAAAb,EAAwB;AAAA,OAAI;AAC3G,MAAAN,EAAW,QAAQwC,KAAO,IAAIA,IAAM,IAAI,GACxCzC,EAAc,QAAQ;AAAA,IACxB;AAEA,aAAS0C,EAAmBC,GAAe;AACzC,MAAA1C,EAAW,QAAQ0C,IAAQ;AAAA,IAC7B;AAEA,UAAMC,IAAoC,MAAM;AAC9C,MAAA3B,EAAU,QAAQ,QAAQzB,EAAM,QAAQ,MAAM,GAC9CE,EAAK,UAAU,EAAE,UAAUF,EAAM,UAAU;AAAA,IAC7C;AAEA,aAASqD,IAAa;;AACpB,OAAAtC,IAAAX,EAAU,UAAV,QAAAW,EAAiB,cACjBT,EAAc,QAAQ,CAAA,GACtBc,EAAA;AAAA,IACF;AAEA,WAAAkC,EAAa,EAAE,YAAAD,GAAY,WAAAjD,GAAW;;kBA5PpCmD,EA+BM,OAAA;AAAA,QA/BD,OAAKC,EAAA,CAAC,mBAAiB,EAAA,eAA0BxC,EAAA,OAAO,CAAA;AAAA,MAAA;QAC3DyC,EAoBYC,GApBZC,EAoBY;AAAA,mBAnBN;AAAA,UAAJ,KAAIvD;AAAA,UACH,QAAQa,EAAA;AAAA,UACT,aAAU;AAAA,UACT,QAAQhB,EAAA,UAAM;AAAA,UACd,OAAOA,EAAA;AAAA,UACP,UAAUA,EAAA,WAAQ;AAAA,UACX,aAAWK,EAAA;AAAA,sDAAAA,EAAa,QAAAsD;AAAA,UAC/B,iBAAerC;AAAA,UACf,iBAAeiB;AAAA,UACf,cAAYd;AAAA,UACZ,YAAUY;AAAA,UACV,cAAYU;AAAA,UACZ,aAAWI;AAAA,QAAA,GACJS,EAAAA,MAAM,GAAA;AAAA,UAGH,OACT,MAAsD;AAAA,YAA3C5D,EAAA,YAAXsD,EAAsD,OAAtDO,IAAsDC,EAAZ9D,EAAA,GAAG,GAAA,CAAA;;qBAF/C,MAA2B;AAAA,YAA3BwD,EAA2BO,GAAA,MAAA;AAAA,yBAAlB,MAAQ;AAAA,gBAARP,EAAQQ,EAAAC,CAAA,CAAA;AAAA,cAAA;;;;;;QAQXjE,EAAA,WAAWO,EAAA,cADnB2D,EAMEC,GAAA;AAAA;UAJC,YAAUxD,EAAA;AAAA,UACV,iBAAeH,EAAA,QAAU;AAAA,UACzB,gCAAOD,EAAA,QAAa;AAAA,UACpB,UAAQ0C;AAAA,QAAA;;;;;"}
1
+ {"version":3,"file":"ImageUpload-DiJ16Aga.mjs","sources":["../../src/components/upload/ImageUpload.vue"],"sourcesContent":["<template>\r\n <div class=\"wd-image-upload\" :class=\"{ 'is-hide-add': hideAdd }\">\r\n <el-upload\r\n ref=\"uploadRef\"\r\n :action=\"resolvedAction\"\r\n list-type=\"picture-card\"\r\n :accept=\"accept || 'image/*'\"\r\n :limit=\"maxCount\"\r\n :multiple=\"maxCount > 1\"\r\n v-model:file-list=\"innerFileList\"\r\n :before-upload=\"beforeUpload\"\r\n :before-remove=\"beforeRemove\"\r\n :on-success=\"onSuccess\"\r\n :on-error=\"onError\"\r\n :on-preview=\"onPreview\"\r\n :on-exceed=\"onExceed\"\r\n v-bind=\"$attrs\"\r\n >\r\n <el-icon><Plus /></el-icon>\r\n <template #tip>\r\n <div v-if=\"tip\" class=\"el-upload__tip\">{{ tip }}</div>\r\n </template>\r\n </el-upload>\r\n\r\n <!-- 图片大图预览:使用 el-image-viewer 组件(ElementPlus 内置) -->\r\n <el-image-viewer\r\n v-if=\"preview && viewerVisible\"\r\n :url-list=\"viewerSources\"\r\n :initial-index=\"viewerPage - 1\"\r\n @close=\"viewerVisible = false\"\r\n @switch=\"onViewerPageChange\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, watch } from 'vue'\r\nimport { Plus } from '@element-plus/icons-vue'\r\nimport type { UploadFile, UploadFiles, UploadInstance, UploadProps, UploadUserFile } from 'element-plus'\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport { request } from '../../lib/core/http'\r\nimport { getGlobalConfig } from '../../lib/core/config'\r\nimport { refreshDataGrid } from '../../lib/core/linkage'\r\nimport { filterProp, headRefreshDatagridProp } from '../common/props'\r\nimport type { PropType } from 'vue'\r\n\r\ndefineOptions({ name: 'WdImageUpload', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n /** 上传地址 */\r\n api: { type: String, default: '' },\r\n /** 后端删除地址 */\r\n deleteApi: { type: String, default: '' },\r\n /** 删除请求方法 */\r\n deleteMethod: {\r\n type: String as PropType<'get' | 'post' | 'put' | 'delete'>,\r\n default: 'post'\r\n },\r\n /** 删除主键字段 */\r\n primaryKey: { type: String, default: 'id' },\r\n /** 最大图片数量,超限隐藏加号 */\r\n maxCount: { type: Number, default: 8 },\r\n /** 缩略图尺寸(px,兼容属性式字符串写法) */\r\n thumbnailSize: { type: [Number, String], default: 100 },\r\n /** 是否点击缩略图大图预览 */\r\n preview: { type: Boolean, default: true },\r\n /** 接收类型,默认 image/* */\r\n accept: { type: String, default: '' },\r\n /** 单图大小限制(MB) */\r\n maxSize: { type: Number, default: 5 },\r\n /** 提示文案 */\r\n tip: { type: String, default: '' },\r\n /** v-model:已上传图片地址数组 */\r\n modelValue: { type: Array as PropType<string[]>, default: () => [] }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'update:modelValue',\r\n 'change',\r\n 'success',\r\n 'error',\r\n 'delete-success',\r\n 'preview',\r\n 'exceed',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst uploadRef = ref<UploadInstance>()\r\nconst innerFileList = ref<UploadUserFile[]>(\r\n props.modelValue.map((url) => ({ name: url.split('/').pop() || 'image', url }))\r\n)\r\nconst viewerVisible = ref(false)\r\nconst viewerPage = ref(1)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n innerFileList.value = val.map((url) => ({ name: url.split('/').pop() || 'image', url }))\r\n }\r\n)\r\n\r\n/** 仅展示成功图片的地址(用于预览轮播) */\r\nconst viewerSources = computed(() =>\r\n innerFileList.value.map((f) => f.url || (f as any).biz?.url || '').filter(Boolean)\r\n)\r\n\r\n/** 达到上限隐藏加号 */\r\nconst hideAdd = computed(() => innerFileList.value.length >= props.maxCount)\r\n\r\nconst resolvedAction = computed(() => {\r\n if (!props.api) return '#'\r\n if (/^https?:\\/\\//.test(props.api)) return props.api\r\n const prefix = getGlobalConfig().request.urlPrefix || ''\r\n return prefix ? `${prefix.replace(/\\/$/, '')}/${props.api.replace(/^\\//, '')}` : props.api\r\n})\r\n\r\nfunction syncModel() {\r\n const urls = innerFileList.value\r\n .map((f) => f.url || (f as any).biz?.url || (f as any).biz?.path || '')\r\n .filter(Boolean)\r\n emit('update:modelValue', urls)\r\n emit('change', urls)\r\n}\r\n\r\nconst beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {\r\n if (!rawFile.type.startsWith('image/')) {\r\n ElMessage.error('仅支持上传图片文件')\r\n return false\r\n }\r\n if (props.maxSize && rawFile.size / 1024 / 1024 > props.maxSize) {\r\n ElMessage.error(`图片大小不能超过 ${props.maxSize}MB`)\r\n return false\r\n }\r\n emit('apiBefore', { url: props.api, file: rawFile })\r\n return true\r\n}\r\n\r\nconst onSuccess: UploadProps['onSuccess'] = (response, uploadFile, uploadFiles) => {\r\n const cfg = getGlobalConfig()\r\n const { codeName, messageName, dataName } = cfg.response.props\r\n const code = response?.[codeName]\r\n const ok = code === undefined || code === null || Number.isNaN(Number(code)) || Number(code) >= cfg.response.successCode\r\n\r\n ;(uploadFile as any).response = response\r\n if (ok && response?.[dataName]) {\r\n const bizData = response[dataName]\r\n ;(uploadFile as any).biz = bizData\r\n if (bizData && typeof bizData === 'object') {\r\n uploadFile.url = uploadFile.url || bizData.url || bizData.path\r\n } else if (typeof bizData === 'string') {\r\n uploadFile.url = bizData\r\n }\r\n }\r\n\r\n if (ok) {\r\n emit('success', { response, file: uploadFile, files: uploadFiles })\r\n emit('apiSuccess', { data: response?.[dataName], raw: response })\r\n if (props.headRefreshDatagrid) refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n } else {\r\n ElMessage.error(response?.[messageName] || '上传失败')\r\n // 失败项从列表移除\r\n innerFileList.value = innerFileList.value.filter((f) => f.uid !== uploadFile.uid)\r\n emit('error', { response, file: uploadFile })\r\n emit('apiFail', { code, message: response?.[messageName] })\r\n }\r\n emit('apiAfter', { url: props.api })\r\n syncModel()\r\n}\r\n\r\nconst onError: UploadProps['onError'] = (err, uploadFile) => {\r\n ElMessage.error('上传失败,请稍后重试')\r\n innerFileList.value = innerFileList.value.filter((f) => f.uid !== uploadFile.uid)\r\n emit('error', { error: err, file: uploadFile })\r\n emit('apiException', { error: err, message: err?.message })\r\n emit('apiAfter', { url: props.api, error: err })\r\n syncModel()\r\n}\r\n\r\nconst beforeRemove: UploadProps['beforeRemove'] = async (uploadFile) => {\r\n try {\r\n await ElMessageBox.confirm('确认删除该图片?', '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n })\r\n } catch {\r\n return false\r\n }\r\n\r\n const biz = (uploadFile as any).biz || uploadFile\r\n const fileId = biz?.[props.primaryKey] ?? (uploadFile.response as any)?.[props.primaryKey]\r\n\r\n if (props.deleteApi && fileId !== undefined && fileId !== null) {\r\n emit('apiBefore', { url: props.deleteApi })\r\n try {\r\n const param = { [props.primaryKey]: fileId }\r\n const result =\r\n props.deleteMethod === 'get'\r\n ? await request.get(props.deleteApi, param)\r\n : props.deleteMethod === 'delete'\r\n ? await request.delete(props.deleteApi, param)\r\n : props.deleteMethod === 'put'\r\n ? await request.put(props.deleteApi, param)\r\n : await request.post(props.deleteApi, param)\r\n if (result.success) {\r\n emit('delete-success', { file: uploadFile, data: result.data })\r\n emit('apiSuccess', { data: result.data })\r\n if (props.headRefreshDatagrid) refreshDataGrid(props.headRefreshDatagrid, props.filter)\r\n } else {\r\n emit('apiFail', { code: result.code, message: result.message })\r\n return false\r\n }\r\n } catch (error: any) {\r\n emit('apiException', { error, message: error?.message })\r\n return false\r\n } finally {\r\n emit('apiAfter', { url: props.deleteApi })\r\n }\r\n } else {\r\n emit('delete-success', { file: uploadFile })\r\n }\r\n return true\r\n}\r\n\r\nconst onPreview: UploadProps['onPreview'] = (uploadFile) => {\r\n emit('preview', { file: uploadFile })\r\n if (!props.preview) return\r\n const idx = viewerSources.value.findIndex((url) => url === (uploadFile.url || (uploadFile as any).biz?.url))\r\n viewerPage.value = idx >= 0 ? idx + 1 : 1\r\n viewerVisible.value = true\r\n}\r\n\r\nfunction onViewerPageChange(index: number) {\r\n viewerPage.value = index + 1\r\n}\r\n\r\nconst onExceed: UploadProps['onExceed'] = () => {\r\n ElMessage.warning(`最多上传 ${props.maxCount} 张图片`)\r\n emit('exceed', { maxCount: props.maxCount })\r\n}\r\n\r\nfunction clearFiles() {\r\n uploadRef.value?.clearFiles()\r\n innerFileList.value = []\r\n syncModel()\r\n}\r\n\r\ndefineExpose({ clearFiles, uploadRef })\r\n</script>\r\n\r\n<style scoped>\r\n.wd-image-upload :deep(.el-upload-list--picture-card .el-upload-list__item),\r\n.wd-image-upload :deep(.el-upload--picture-card) {\r\n width: v-bind('thumbnailSize + \"px\"');\r\n height: v-bind('thumbnailSize + \"px\"');\r\n}\r\n.wd-image-upload.is-hide-add :deep(.el-upload--picture-card),\r\n.wd-image-upload :deep(.is-hide-add .el-upload--picture-card) {\r\n display: none;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","uploadRef","ref","innerFileList","url","viewerVisible","viewerPage","watch","val","viewerSources","computed","f","_a","hideAdd","resolvedAction","prefix","getGlobalConfig","syncModel","urls","_b","beforeUpload","rawFile","ElMessage","onSuccess","response","uploadFile","uploadFiles","cfg","codeName","messageName","dataName","code","ok","bizData","refreshDataGrid","onError","err","beforeRemove","ElMessageBox","biz","fileId","param","result","request","error","onPreview","idx","onViewerPageChange","index","onExceed","clearFiles","__expose","_createElementBlock","_normalizeClass","_createVNode","_component_el_upload","_mergeProps","$event","$attrs","_hoisted_1","_toDisplayString","_component_el_icon","_unref","Plus","_createBlock","_component_el_image_viewer"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as S, useSlots as k, resolveComponent as u, openBlock as m, createBlock as f, withCtx as l, createVNode as L, mergeProps as d, unref as g, renderSlot as h, createTextVNode as y, toDisplayString as P } from "vue";
2
2
  import { ElMessageBox as n } from "element-plus";
3
- import { u as w } from "./useApiAction-71XPKjlQ.mjs";
3
+ import { u as w } from "./useApiAction-CQVmN1MH.mjs";
4
4
  import { t as D, b as _, a as A, h as R, f as v } from "./props-DAytpx7D.mjs";
5
5
  const q = /* @__PURE__ */ S({
6
6
  name: "WdPromptButton",
@@ -115,4 +115,4 @@ const q = /* @__PURE__ */ S({
115
115
  export {
116
116
  q as _
117
117
  };
118
- //# sourceMappingURL=PromptButton.vue_vue_type_script_setup_true_lang-82Mxc2Qv.mjs.map
118
+ //# sourceMappingURL=PromptButton.vue_vue_type_script_setup_true_lang-y_sfI324.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromptButton.vue_vue_type_script_setup_true_lang-82Mxc2Qv.mjs","sources":["../../src/components/buttons/PromptButton.vue"],"sourcesContent":["<template>\r\n <el-tooltip\r\n v-if=\"tips\"\r\n :content=\"tips\"\r\n :effect=\"tipsType\"\r\n :placement=\"placement\"\r\n >\r\n <el-button v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n </el-tooltip>\r\n <el-button v-else v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElMessageBox } from 'element-plus'\r\nimport { useSlots } from 'vue'\r\nimport { useApiAction } from './useApiAction'\r\nimport { filterProp, headRefreshDatagridProp, apiProps, buttonTextProp, tipsProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdPromptButton', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n ...apiProps,\r\n ...buttonTextProp,\r\n ...tipsProp,\r\n /** 输入框标题 */\r\n promptTitle: { type: String, default: '请输入' },\r\n /** 输入框占位文本(默认输入框模式有效) */\r\n promptPlaceholder: { type: String, default: '请输入内容' },\r\n /** 输入值并入 apiParam 的字段名(默认输入框模式有效) */\r\n paramKey: { type: String, default: 'value' },\r\n /** 输入框默认值(默认输入框模式有效) */\r\n promptDefault: { type: String, default: '' },\r\n buttonLoading: { type: Boolean, default: true },\r\n pageLoading: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'click',\r\n 'prompt',\r\n 'cancel',\r\n 'confirm',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst slots = useSlots()\r\nconst { loading, doRequest } = useApiAction({\r\n getApi: () => props.api,\r\n getMethod: () => props.apiMethod,\r\n getParam: () => props.apiParam,\r\n getFilter: () => props.filter,\r\n getHeadRefresh: () => props.headRefreshDatagrid,\r\n emit,\r\n buttonLoading: () => props.buttonLoading,\r\n getReqOptions: () => ({ showLoading: props.pageLoading })\r\n})\r\n\r\nasync function onClick(event: MouseEvent) {\r\n emit('click', event)\r\n if (slots.content) {\r\n // 自定义内容模式:弹窗内容由用户插槽 #content 提供,点击确认后请求 API\r\n try {\r\n await ElMessageBox.prompt(props.promptTitle, props.promptTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputPlaceholder: props.promptPlaceholder,\r\n inputValue: props.promptDefault,\r\n // 允许自定义内容:message 设为空,插槽内容会被保留\r\n dangerouslyUseHTMLString: true,\r\n message: ''\r\n })\r\n emit('confirm')\r\n const success = await doRequest({})\r\n // API 请求成功(success=true)自动关闭弹窗,失败不关闭让用户继续修改\r\n if (success) {\r\n ElMessageBox.close()\r\n }\r\n } catch {\r\n emit('cancel')\r\n }\r\n return\r\n }\r\n\r\n // 默认单输入框模式\r\n let value: string\r\n try {\r\n const res = await ElMessageBox.prompt(props.promptTitle, props.promptTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputPlaceholder: props.promptPlaceholder,\r\n inputValue: props.promptDefault\r\n })\r\n value = res.value\r\n } catch {\r\n emit('cancel')\r\n return\r\n }\r\n emit('prompt', value)\r\n const success = await doRequest({ [props.paramKey]: value })\r\n // 根据 API 返回 success 决定是否自动关闭:成功关闭,失败不关闭\r\n if (success) {\r\n ElMessageBox.close()\r\n }\r\n}\r\n</script>\r\n"],"names":["props","__props","emit","__emit","slots","useSlots","loading","doRequest","useApiAction","onClick","event","ElMessageBox","value","tips","_createBlock","_component_el_tooltip","tipsType","placement","_createVNode","_component_el_button","_mergeProps","_ctx","_unref","_renderSlot","label","$attrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,UAAMA,IAAQC,GAkBRC,IAAOC,GAYPC,IAAQC,EAAA,GACR,EAAE,SAAAC,GAAS,WAAAC,EAAA,IAAcC,EAAa;AAAA,MAC1C,QAAQ,MAAMR,EAAM;AAAA,MACpB,WAAW,MAAMA,EAAM;AAAA,MACvB,UAAU,MAAMA,EAAM;AAAA,MACtB,WAAW,MAAMA,EAAM;AAAA,MACvB,gBAAgB,MAAMA,EAAM;AAAA,MAC5B,MAAAE;AAAA,MACA,eAAe,MAAMF,EAAM;AAAA,MAC3B,eAAe,OAAO,EAAE,aAAaA,EAAM,YAAA;AAAA,IAAY,CACxD;AAED,mBAAeS,EAAQC,GAAmB;AAExC,UADAR,EAAK,SAASQ,CAAK,GACfN,EAAM,SAAS;AAEjB,YAAI;AACF,gBAAMO,EAAa,OAAOX,EAAM,aAAaA,EAAM,aAAa;AAAA,YAC9D,mBAAmB;AAAA,YACnB,kBAAkB;AAAA,YAClB,kBAAkBA,EAAM;AAAA,YACxB,YAAYA,EAAM;AAAA;AAAA,YAElB,0BAA0B;AAAA,YAC1B,SAAS;AAAA,UAAA,CACV,GACDE,EAAK,SAAS,GACE,MAAMK,EAAU,EAAE,KAGhCI,EAAa,MAAA;AAAA,QAEjB,QAAQ;AACN,UAAAT,EAAK,QAAQ;AAAA,QACf;AACA;AAAA,MACF;AAGA,UAAIU;AACJ,UAAI;AAOF,QAAAA,KANY,MAAMD,EAAa,OAAOX,EAAM,aAAaA,EAAM,aAAa;AAAA,UAC1E,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,kBAAkBA,EAAM;AAAA,UACxB,YAAYA,EAAM;AAAA,QAAA,CACnB,GACW;AAAA,MACd,QAAQ;AACN,QAAAE,EAAK,QAAQ;AACb;AAAA,MACF;AACA,MAAAA,EAAK,UAAUU,CAAK,GACJ,MAAML,EAAU,EAAE,CAACP,EAAM,QAAQ,GAAGY,GAAO,KAGzDD,EAAa,MAAA;AAAA,IAEjB;;;aA9GUE,EAAAA,aADRC,EASaC,GAAA;AAAA;QAPV,SAASF,EAAAA;AAAAA,QACT,QAAQG,EAAAA;AAAAA,QACR,WAAWC,EAAAA;AAAAA,MAAAA;mBAEZ,MAEY;AAAA,UAFZC,EAEYC,GAFZC,EAEYC,EAAA,QAFa;AAAA,YAAG,SAASC,EAAAhB,CAAA;AAAA,YAAU,SAAAG;AAAA,UAAA;uBAC7C,MAAwB;AAAA,cAAxBc,EAAwBF,yBAAxB,MAAwB;AAAA,oBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;yDAGlBV,EAEYK,GAFZC,EAEY,EAAA,KAAA,EAAA,GAFcK,EAAAA,QAAM;AAAA,QAAG,SAASH,EAAAhB,CAAA;AAAA,QAAU,SAAAG;AAAA,MAAA;mBACpD,MAAwB;AAAA,UAAxBc,EAAwBF,yBAAxB,MAAwB;AAAA,gBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,UAAA;;;;;;;"}
1
+ {"version":3,"file":"PromptButton.vue_vue_type_script_setup_true_lang-y_sfI324.mjs","sources":["../../src/components/buttons/PromptButton.vue"],"sourcesContent":["<template>\r\n <el-tooltip\r\n v-if=\"tips\"\r\n :content=\"tips\"\r\n :effect=\"tipsType\"\r\n :placement=\"placement\"\r\n >\r\n <el-button v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n </el-tooltip>\r\n <el-button v-else v-bind=\"$attrs\" :loading=\"loading\" @click=\"onClick\">\r\n <slot>{{ label }}</slot>\r\n </el-button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ElMessageBox } from 'element-plus'\r\nimport { useSlots } from 'vue'\r\nimport { useApiAction } from './useApiAction'\r\nimport { filterProp, headRefreshDatagridProp, apiProps, buttonTextProp, tipsProp } from '../common/props'\r\n\r\ndefineOptions({ name: 'WdPromptButton', inheritAttrs: false })\r\n\r\nconst props = defineProps({\r\n ...filterProp,\r\n ...headRefreshDatagridProp,\r\n ...apiProps,\r\n ...buttonTextProp,\r\n ...tipsProp,\r\n /** 输入框标题 */\r\n promptTitle: { type: String, default: '请输入' },\r\n /** 输入框占位文本(默认输入框模式有效) */\r\n promptPlaceholder: { type: String, default: '请输入内容' },\r\n /** 输入值并入 apiParam 的字段名(默认输入框模式有效) */\r\n paramKey: { type: String, default: 'value' },\r\n /** 输入框默认值(默认输入框模式有效) */\r\n promptDefault: { type: String, default: '' },\r\n buttonLoading: { type: Boolean, default: true },\r\n pageLoading: { type: Boolean, default: false }\r\n})\r\n\r\nconst emit = defineEmits([\r\n 'click',\r\n 'prompt',\r\n 'cancel',\r\n 'confirm',\r\n 'apiBefore',\r\n 'apiSuccess',\r\n 'apiFail',\r\n 'apiException',\r\n 'apiAfter'\r\n])\r\n\r\nconst slots = useSlots()\r\nconst { loading, doRequest } = useApiAction({\r\n getApi: () => props.api,\r\n getMethod: () => props.apiMethod,\r\n getParam: () => props.apiParam,\r\n getFilter: () => props.filter,\r\n getHeadRefresh: () => props.headRefreshDatagrid,\r\n emit,\r\n buttonLoading: () => props.buttonLoading,\r\n getReqOptions: () => ({ showLoading: props.pageLoading })\r\n})\r\n\r\nasync function onClick(event: MouseEvent) {\r\n emit('click', event)\r\n if (slots.content) {\r\n // 自定义内容模式:弹窗内容由用户插槽 #content 提供,点击确认后请求 API\r\n try {\r\n await ElMessageBox.prompt(props.promptTitle, props.promptTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputPlaceholder: props.promptPlaceholder,\r\n inputValue: props.promptDefault,\r\n // 允许自定义内容:message 设为空,插槽内容会被保留\r\n dangerouslyUseHTMLString: true,\r\n message: ''\r\n })\r\n emit('confirm')\r\n const success = await doRequest({})\r\n // API 请求成功(success=true)自动关闭弹窗,失败不关闭让用户继续修改\r\n if (success) {\r\n ElMessageBox.close()\r\n }\r\n } catch {\r\n emit('cancel')\r\n }\r\n return\r\n }\r\n\r\n // 默认单输入框模式\r\n let value: string\r\n try {\r\n const res = await ElMessageBox.prompt(props.promptTitle, props.promptTitle, {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n inputPlaceholder: props.promptPlaceholder,\r\n inputValue: props.promptDefault\r\n })\r\n value = res.value\r\n } catch {\r\n emit('cancel')\r\n return\r\n }\r\n emit('prompt', value)\r\n const success = await doRequest({ [props.paramKey]: value })\r\n // 根据 API 返回 success 决定是否自动关闭:成功关闭,失败不关闭\r\n if (success) {\r\n ElMessageBox.close()\r\n }\r\n}\r\n</script>\r\n"],"names":["props","__props","emit","__emit","slots","useSlots","loading","doRequest","useApiAction","onClick","event","ElMessageBox","value","tips","_createBlock","_component_el_tooltip","tipsType","placement","_createVNode","_component_el_button","_mergeProps","_ctx","_unref","_renderSlot","label","$attrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,UAAMA,IAAQC,GAkBRC,IAAOC,GAYPC,IAAQC,EAAA,GACR,EAAE,SAAAC,GAAS,WAAAC,EAAA,IAAcC,EAAa;AAAA,MAC1C,QAAQ,MAAMR,EAAM;AAAA,MACpB,WAAW,MAAMA,EAAM;AAAA,MACvB,UAAU,MAAMA,EAAM;AAAA,MACtB,WAAW,MAAMA,EAAM;AAAA,MACvB,gBAAgB,MAAMA,EAAM;AAAA,MAC5B,MAAAE;AAAA,MACA,eAAe,MAAMF,EAAM;AAAA,MAC3B,eAAe,OAAO,EAAE,aAAaA,EAAM,YAAA;AAAA,IAAY,CACxD;AAED,mBAAeS,EAAQC,GAAmB;AAExC,UADAR,EAAK,SAASQ,CAAK,GACfN,EAAM,SAAS;AAEjB,YAAI;AACF,gBAAMO,EAAa,OAAOX,EAAM,aAAaA,EAAM,aAAa;AAAA,YAC9D,mBAAmB;AAAA,YACnB,kBAAkB;AAAA,YAClB,kBAAkBA,EAAM;AAAA,YACxB,YAAYA,EAAM;AAAA;AAAA,YAElB,0BAA0B;AAAA,YAC1B,SAAS;AAAA,UAAA,CACV,GACDE,EAAK,SAAS,GACE,MAAMK,EAAU,EAAE,KAGhCI,EAAa,MAAA;AAAA,QAEjB,QAAQ;AACN,UAAAT,EAAK,QAAQ;AAAA,QACf;AACA;AAAA,MACF;AAGA,UAAIU;AACJ,UAAI;AAOF,QAAAA,KANY,MAAMD,EAAa,OAAOX,EAAM,aAAaA,EAAM,aAAa;AAAA,UAC1E,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,kBAAkBA,EAAM;AAAA,UACxB,YAAYA,EAAM;AAAA,QAAA,CACnB,GACW;AAAA,MACd,QAAQ;AACN,QAAAE,EAAK,QAAQ;AACb;AAAA,MACF;AACA,MAAAA,EAAK,UAAUU,CAAK,GACJ,MAAML,EAAU,EAAE,CAACP,EAAM,QAAQ,GAAGY,GAAO,KAGzDD,EAAa,MAAA;AAAA,IAEjB;;;aA9GUE,EAAAA,aADRC,EASaC,GAAA;AAAA;QAPV,SAASF,EAAAA;AAAAA,QACT,QAAQG,EAAAA;AAAAA,QACR,WAAWC,EAAAA;AAAAA,MAAAA;mBAEZ,MAEY;AAAA,UAFZC,EAEYC,GAFZC,EAEYC,EAAA,QAFa;AAAA,YAAG,SAASC,EAAAhB,CAAA;AAAA,YAAU,SAAAG;AAAA,UAAA;uBAC7C,MAAwB;AAAA,cAAxBc,EAAwBF,yBAAxB,MAAwB;AAAA,oBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;;;;;yDAGlBV,EAEYK,GAFZC,EAEY,EAAA,KAAA,EAAA,GAFcK,EAAAA,QAAM;AAAA,QAAG,SAASH,EAAAhB,CAAA;AAAA,QAAU,SAAAG;AAAA,MAAA;mBACpD,MAAwB;AAAA,UAAxBc,EAAwBF,yBAAxB,MAAwB;AAAA,gBAAfG,EAAAA,KAAK,GAAA,CAAA;AAAA,UAAA;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { defineComponent as B, toRefs as L, computed as $, resolveComponent as i, resolveDirective as C, withDirectives as R, openBlock as o, createBlock as n, mergeProps as N, withCtx as l, createElementBlock as _, Fragment as x, renderList as W, unref as g, createElementVNode as h, renderSlot as s, createTextVNode as r, toDisplayString as u } from "vue";
2
- import { u as A } from "./useOptionsLoader-D4Jh4f1F.mjs";
2
+ import { u as A } from "./useOptionsLoader-BUO0VTjH.mjs";
3
3
  import { o as E } from "./props-DAytpx7D.mjs";
4
4
  import { _ as F } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
5
5
  const M = { class: "wd-option-text" }, I = { class: "wd-option-text" }, O = /* @__PURE__ */ B({
@@ -126,4 +126,4 @@ const M = { class: "wd-option-text" }, I = { class: "wd-option-text" }, O = /* @
126
126
  export {
127
127
  z as W
128
128
  };
129
- //# sourceMappingURL=RadioList-DuEeHumw.mjs.map
129
+ //# sourceMappingURL=RadioList-CQJDixnr.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RadioList-DuEeHumw.mjs","sources":["../../src/components/inputs/RadioList.vue"],"sourcesContent":["<template>\n <el-radio-group\n v-model=\"inner\"\n v-loading=\"loading\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <template v-for=\"opt in options\" :key=\"String(opt.value)\">\n <el-radio-button v-if=\"buttonStyle\" :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-radio-button>\n <el-radio v-else :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-radio>\n </template>\n </el-radio-group>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdRadioList', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: [String, Number, Boolean] as PropType<any>, default: undefined },\n /** 按钮样式 */\n buttonStyle: { type: Boolean, default: false }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n</script>\n\n<style scoped>\n.wd-option-text {\n display: inline-block;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","useOptionsLoader","inner","computed","val","onChange","_withDirectives","_openBlock","_createBlock","_component_el_radio_group","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_radio_button","_component_el_tooltip","_createElementVNode","_hoisted_1","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_radio","_hoisted_2"],"mappings":"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"}
1
+ {"version":3,"file":"RadioList-CQJDixnr.mjs","sources":["../../src/components/inputs/RadioList.vue"],"sourcesContent":["<template>\n <el-radio-group\n v-model=\"inner\"\n v-loading=\"loading\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <template v-for=\"opt in options\" :key=\"String(opt.value)\">\n <el-radio-button v-if=\"buttonStyle\" :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-radio-button>\n <el-radio v-else :value=\"opt.value\">\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </span>\n </el-tooltip>\n <slot v-else :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">{{ opt.text }}</slot>\n </el-radio>\n </template>\n </el-radio-group>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdRadioList', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: [String, Number, Boolean] as PropType<any>, default: undefined },\n /** 按钮样式 */\n buttonStyle: { type: Boolean, default: false }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n</script>\n\n<style scoped>\n.wd-option-text {\n display: inline-block;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","useOptionsLoader","inner","computed","val","onChange","_withDirectives","_openBlock","_createBlock","_component_el_radio_group","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_radio_button","_component_el_tooltip","_createElementVNode","_hoisted_1","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_radio","_hoisted_2"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as d, watch as b, onUnmounted as q, renderSlot as g } from "vue";
2
- import { r as u } from "./http-BKKP0gEJ.mjs";
3
- import { u as h } from "./useConfig-CPioiLWJ.mjs";
2
+ import { r as u } from "./http-CW9konD4.mjs";
3
+ import { u as h } from "./useConfig-ChIkE3Lz.mjs";
4
4
  const C = /* @__PURE__ */ d({
5
5
  name: "WdRequester",
6
6
  __name: "Requester",
@@ -60,4 +60,4 @@ const C = /* @__PURE__ */ d({
60
60
  export {
61
61
  C as _
62
62
  };
63
- //# sourceMappingURL=Requester.vue_vue_type_script_setup_true_lang-xCw4QHCA.mjs.map
63
+ //# sourceMappingURL=Requester.vue_vue_type_script_setup_true_lang-nel6vN12.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Requester.vue_vue_type_script_setup_true_lang-xCw4QHCA.mjs","sources":["../../src/components/core/Requester.vue"],"sourcesContent":["<template>\n <!-- 无默认插槽 -->\n <slot></slot>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * WdRequester 请求触发组件\n *\n * 使用 v-model 控制请求触发:开关变为 true 时发起请求;请求完成后自动设置为 false,\n * 等待开发者下一次将它变为 true 再触发。所有组件都基于本库公开请求核心 RequestAPI。\n *\n * 特性:\n * 1. 封装 get/post/put/delete/request 全部请求方法;\n * 2. 全周期 emit 事件:apiBefore 触发后允许开发者手动 abort 请求;\n * 3. 支持中途发起新请求:旧请求会自动被中断;\n * 4. 请求完成(成功/失败/异常)后自动将 v-model 置为 false;\n *\n * @example\n * <template>\n * <wd-requester\n * v-model=\"trigger\"\n * url=\"/api/save\"\n * method=\"post\"\n * @api-before=\"onApiBefore\"\n * @api-success=\"onSuccess\"\n * />\n * <el-button @click=\"trigger = true\">提交</el-button>\n * </template>\n */\nimport { onUnmounted, watch } from 'vue'\nimport { request, type ApiResult } from '../../lib/core/http'\nimport type { Method } from 'axios'\nimport type { ReqOptions } from '../../types/config'\nimport { useConfig } from '../../lib/composables/useConfig'\n\ndefineOptions({ name: 'WdRequester' })\n\ninterface Props {\n /** v-model 触发开关:true 则发起请求,完成后自动变 false */\n modelValue: boolean\n /** 请求 URL */\n url: string\n /** 请求方法,默认 post(可通过全局配置 page.componentDefault.WdRequester.method 覆盖) */\n method?: Method\n /** 请求参数(get/delete 放 query,post/put 放 body) */\n params?: any\n /** 请求选项(透传给 http):showLoading/showTips/tipsConfig/axiosConfig/signal(可通过全局配置 page.componentDefault.WdRequester.reqOptions 覆盖) */\n reqOptions?: ReqOptions\n}\n\nconst props = defineProps<Props>()\n\n// 合并三级配置:默认层(default-config 的 WdRequester)→ 全局层(componentDefault)→ 本地 props\n// 注意:url/params 属业务参数,实时读 props;method/reqOptions 属配置类,走合并结果\nconst config = useConfig<Record<string, any>>('WdRequester', props)\n\ninterface Emits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'api-before', abort: () => void): void\n (e: 'api-success', result: ApiResult): void\n (e: 'api-fail', result: ApiResult): void\n (e: 'api-exception', error: any): void\n (e: 'api-after'): void\n}\n\nconst emit = defineEmits<Emits>()\n\nlet currentController: AbortController | null = null\n\n/**\n * 仅中断当前进行中的请求(不清引用)。\n * 传给 apiBefore 的 abort:中断后本请求仍走 finally 收尾(api-after + 复位开关)。\n */\nfunction abortActive() {\n currentController?.abort()\n}\n\n/**\n * 中断并清引用:用于外部关闭开关 / 组件卸载,不触发收尾事件。\n */\nfunction abortAndClear() {\n if (currentController) {\n currentController.abort()\n currentController = null\n }\n}\n\nasync function doRequest() {\n // 中断并清掉上一次请求(旧请求的收尾会被跳过,不触发 api-after)\n abortAndClear()\n\n const controller = new AbortController()\n currentController = controller\n\n // 组装请求选项:全局默认(reqOptions)→ 实例 props 覆盖 → 注入 abort signal\n const reqOpts: ReqOptions = {\n ...(config.value.reqOptions || {}),\n ...(props.reqOptions || {}),\n signal: controller.signal,\n }\n\n try {\n // 触发 apiBefore,允许开发者在事件中手动调用 abort() 中断本次请求\n emit('api-before', abortActive)\n\n // 如果在 apiBefore 中被手动中断:直接走收尾(api-after + 复位开关)\n if (controller.signal.aborted) {\n return\n }\n\n let result: ApiResult\n // 请求方法优先级:实例 props.method → 全局默认 config.method → 内置兜底 'post'\n const method = (props.method ?? config.value.method ?? 'post').toLowerCase() as 'get' | 'post' | 'put' | 'delete'\n\n if (method === 'get' || method === 'delete') {\n result = await request[method](props.url, props.params, reqOpts)\n } else {\n result = await request[method](props.url, props.params, reqOpts)\n }\n\n if (controller.signal.aborted) {\n // 已被中断,无需后续处理\n return\n }\n\n if (result.success) {\n emit('api-success', result)\n } else {\n emit('api-fail', result)\n }\n } catch (e) {\n if (controller.signal.aborted) {\n return\n }\n emit('api-exception', e)\n } finally {\n if (currentController === controller) {\n currentController = null\n emit('api-after')\n // 自动关闭触发开关\n emit('update:modelValue', false)\n }\n }\n}\n\n// 监听 v-model 开关:变为 true 就发起请求\nwatch(\n () => props.modelValue,\n (newVal) => {\n if (newVal === true) {\n doRequest()\n } else {\n // 外部关闭开关:中断进行中的请求(不触发收尾事件)\n abortAndClear()\n }\n },\n { immediate: true }\n)\n\nonUnmounted(() => {\n abortAndClear()\n})\n</script>\n\n<style scoped>\n</style>\n"],"names":["props","__props","config","useConfig","emit","__emit","currentController","abortActive","abortAndClear","doRequest","controller","reqOpts","result","method","request","e","watch","newVal","onUnmounted","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;;;;;AAmDA,UAAMA,IAAQC,GAIRC,IAASC,EAA+B,eAAeH,CAAK,GAW5DI,IAAOC;AAEb,QAAIC,IAA4C;AAMhD,aAASC,IAAc;AACrB,MAAAD,KAAA,QAAAA,EAAmB;AAAA,IACrB;AAKA,aAASE,IAAgB;AACvB,MAAIF,MACFA,EAAkB,MAAA,GAClBA,IAAoB;AAAA,IAExB;AAEA,mBAAeG,IAAY;AAEzB,MAAAD,EAAA;AAEA,YAAME,IAAa,IAAI,gBAAA;AACvB,MAAAJ,IAAoBI;AAGpB,YAAMC,IAAsB;AAAA,QAC1B,GAAIT,EAAO,MAAM,cAAc,CAAA;AAAA,QAC/B,GAAIF,EAAM,cAAc,CAAA;AAAA,QACxB,QAAQU,EAAW;AAAA,MAAA;AAGrB,UAAI;AAKF,YAHAN,EAAK,cAAcG,CAAW,GAG1BG,EAAW,OAAO;AACpB;AAGF,YAAIE;AAEJ,cAAMC,KAAUb,EAAM,UAAUE,EAAO,MAAM,UAAU,QAAQ,YAAA;AAQ/D,YANIW,MAAW,SAASA,MAAW,WACjCD,IAAS,MAAME,EAAQD,CAAM,EAAEb,EAAM,KAAKA,EAAM,QAAQW,CAAO,IAE/DC,IAAS,MAAME,EAAQD,CAAM,EAAEb,EAAM,KAAKA,EAAM,QAAQW,CAAO,GAG7DD,EAAW,OAAO;AAEpB;AAGF,QAAIE,EAAO,UACTR,EAAK,eAAeQ,CAAM,IAE1BR,EAAK,YAAYQ,CAAM;AAAA,MAE3B,SAASG,GAAG;AACV,YAAIL,EAAW,OAAO;AACpB;AAEF,QAAAN,EAAK,iBAAiBW,CAAC;AAAA,MACzB,UAAA;AACE,QAAIT,MAAsBI,MACxBJ,IAAoB,MACpBF,EAAK,WAAW,GAEhBA,EAAK,qBAAqB,EAAK;AAAA,MAEnC;AAAA,IACF;AAGA,WAAAY;AAAA,MACE,MAAMhB,EAAM;AAAA,MACZ,CAACiB,MAAW;AACV,QAAIA,MAAW,KACbR,EAAA,IAGAD,EAAA;AAAA,MAEJ;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAGpBU,EAAY,MAAM;AAChB,MAAAV,EAAA;AAAA,IACF,CAAC,aAhKCW,EAAaC,EAAA,QAAA,SAAA;AAAA;;"}
1
+ {"version":3,"file":"Requester.vue_vue_type_script_setup_true_lang-nel6vN12.mjs","sources":["../../src/components/core/Requester.vue"],"sourcesContent":["<template>\n <!-- 无默认插槽 -->\n <slot></slot>\n</template>\n\n<script setup lang=\"ts\">\n/**\n * WdRequester 请求触发组件\n *\n * 使用 v-model 控制请求触发:开关变为 true 时发起请求;请求完成后自动设置为 false,\n * 等待开发者下一次将它变为 true 再触发。所有组件都基于本库公开请求核心 RequestAPI。\n *\n * 特性:\n * 1. 封装 get/post/put/delete/request 全部请求方法;\n * 2. 全周期 emit 事件:apiBefore 触发后允许开发者手动 abort 请求;\n * 3. 支持中途发起新请求:旧请求会自动被中断;\n * 4. 请求完成(成功/失败/异常)后自动将 v-model 置为 false;\n *\n * @example\n * <template>\n * <wd-requester\n * v-model=\"trigger\"\n * url=\"/api/save\"\n * method=\"post\"\n * @api-before=\"onApiBefore\"\n * @api-success=\"onSuccess\"\n * />\n * <el-button @click=\"trigger = true\">提交</el-button>\n * </template>\n */\nimport { onUnmounted, watch } from 'vue'\nimport { request, type ApiResult } from '../../lib/core/http'\nimport type { Method } from 'axios'\nimport type { ReqOptions } from '../../types/config'\nimport { useConfig } from '../../lib/composables/useConfig'\n\ndefineOptions({ name: 'WdRequester' })\n\ninterface Props {\n /** v-model 触发开关:true 则发起请求,完成后自动变 false */\n modelValue: boolean\n /** 请求 URL */\n url: string\n /** 请求方法,默认 post(可通过全局配置 page.componentDefault.WdRequester.method 覆盖) */\n method?: Method\n /** 请求参数(get/delete 放 query,post/put 放 body) */\n params?: any\n /** 请求选项(透传给 http):showLoading/showTips/tipsConfig/axiosConfig/signal(可通过全局配置 page.componentDefault.WdRequester.reqOptions 覆盖) */\n reqOptions?: ReqOptions\n}\n\nconst props = defineProps<Props>()\n\n// 合并三级配置:默认层(default-config 的 WdRequester)→ 全局层(componentDefault)→ 本地 props\n// 注意:url/params 属业务参数,实时读 props;method/reqOptions 属配置类,走合并结果\nconst config = useConfig<Record<string, any>>('WdRequester', props)\n\ninterface Emits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'api-before', abort: () => void): void\n (e: 'api-success', result: ApiResult): void\n (e: 'api-fail', result: ApiResult): void\n (e: 'api-exception', error: any): void\n (e: 'api-after'): void\n}\n\nconst emit = defineEmits<Emits>()\n\nlet currentController: AbortController | null = null\n\n/**\n * 仅中断当前进行中的请求(不清引用)。\n * 传给 apiBefore 的 abort:中断后本请求仍走 finally 收尾(api-after + 复位开关)。\n */\nfunction abortActive() {\n currentController?.abort()\n}\n\n/**\n * 中断并清引用:用于外部关闭开关 / 组件卸载,不触发收尾事件。\n */\nfunction abortAndClear() {\n if (currentController) {\n currentController.abort()\n currentController = null\n }\n}\n\nasync function doRequest() {\n // 中断并清掉上一次请求(旧请求的收尾会被跳过,不触发 api-after)\n abortAndClear()\n\n const controller = new AbortController()\n currentController = controller\n\n // 组装请求选项:全局默认(reqOptions)→ 实例 props 覆盖 → 注入 abort signal\n const reqOpts: ReqOptions = {\n ...(config.value.reqOptions || {}),\n ...(props.reqOptions || {}),\n signal: controller.signal,\n }\n\n try {\n // 触发 apiBefore,允许开发者在事件中手动调用 abort() 中断本次请求\n emit('api-before', abortActive)\n\n // 如果在 apiBefore 中被手动中断:直接走收尾(api-after + 复位开关)\n if (controller.signal.aborted) {\n return\n }\n\n let result: ApiResult\n // 请求方法优先级:实例 props.method → 全局默认 config.method → 内置兜底 'post'\n const method = (props.method ?? config.value.method ?? 'post').toLowerCase() as 'get' | 'post' | 'put' | 'delete'\n\n if (method === 'get' || method === 'delete') {\n result = await request[method](props.url, props.params, reqOpts)\n } else {\n result = await request[method](props.url, props.params, reqOpts)\n }\n\n if (controller.signal.aborted) {\n // 已被中断,无需后续处理\n return\n }\n\n if (result.success) {\n emit('api-success', result)\n } else {\n emit('api-fail', result)\n }\n } catch (e) {\n if (controller.signal.aborted) {\n return\n }\n emit('api-exception', e)\n } finally {\n if (currentController === controller) {\n currentController = null\n emit('api-after')\n // 自动关闭触发开关\n emit('update:modelValue', false)\n }\n }\n}\n\n// 监听 v-model 开关:变为 true 就发起请求\nwatch(\n () => props.modelValue,\n (newVal) => {\n if (newVal === true) {\n doRequest()\n } else {\n // 外部关闭开关:中断进行中的请求(不触发收尾事件)\n abortAndClear()\n }\n },\n { immediate: true }\n)\n\nonUnmounted(() => {\n abortAndClear()\n})\n</script>\n\n<style scoped>\n</style>\n"],"names":["props","__props","config","useConfig","emit","__emit","currentController","abortActive","abortAndClear","doRequest","controller","reqOpts","result","method","request","e","watch","newVal","onUnmounted","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;;;;;AAmDA,UAAMA,IAAQC,GAIRC,IAASC,EAA+B,eAAeH,CAAK,GAW5DI,IAAOC;AAEb,QAAIC,IAA4C;AAMhD,aAASC,IAAc;AACrB,MAAAD,KAAA,QAAAA,EAAmB;AAAA,IACrB;AAKA,aAASE,IAAgB;AACvB,MAAIF,MACFA,EAAkB,MAAA,GAClBA,IAAoB;AAAA,IAExB;AAEA,mBAAeG,IAAY;AAEzB,MAAAD,EAAA;AAEA,YAAME,IAAa,IAAI,gBAAA;AACvB,MAAAJ,IAAoBI;AAGpB,YAAMC,IAAsB;AAAA,QAC1B,GAAIT,EAAO,MAAM,cAAc,CAAA;AAAA,QAC/B,GAAIF,EAAM,cAAc,CAAA;AAAA,QACxB,QAAQU,EAAW;AAAA,MAAA;AAGrB,UAAI;AAKF,YAHAN,EAAK,cAAcG,CAAW,GAG1BG,EAAW,OAAO;AACpB;AAGF,YAAIE;AAEJ,cAAMC,KAAUb,EAAM,UAAUE,EAAO,MAAM,UAAU,QAAQ,YAAA;AAQ/D,YANIW,MAAW,SAASA,MAAW,WACjCD,IAAS,MAAME,EAAQD,CAAM,EAAEb,EAAM,KAAKA,EAAM,QAAQW,CAAO,IAE/DC,IAAS,MAAME,EAAQD,CAAM,EAAEb,EAAM,KAAKA,EAAM,QAAQW,CAAO,GAG7DD,EAAW,OAAO;AAEpB;AAGF,QAAIE,EAAO,UACTR,EAAK,eAAeQ,CAAM,IAE1BR,EAAK,YAAYQ,CAAM;AAAA,MAE3B,SAASG,GAAG;AACV,YAAIL,EAAW,OAAO;AACpB;AAEF,QAAAN,EAAK,iBAAiBW,CAAC;AAAA,MACzB,UAAA;AACE,QAAIT,MAAsBI,MACxBJ,IAAoB,MACpBF,EAAK,WAAW,GAEhBA,EAAK,qBAAqB,EAAK;AAAA,MAEnC;AAAA,IACF;AAGA,WAAAY;AAAA,MACE,MAAMhB,EAAM;AAAA,MACZ,CAACiB,MAAW;AACV,QAAIA,MAAW,KACbR,EAAA,IAGAD,EAAA;AAAA,MAEJ;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK,GAGpBU,EAAY,MAAM;AAChB,MAAAV,EAAA;AAAA,IACF,CAAC,aAhKCW,EAAaC,EAAA,QAAA,SAAA;AAAA;;"}
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as b, toRefs as B, computed as D, resolveComponent as r, resolveDirective as C, withDirectives as N, openBlock as i, createBlock as d, mergeProps as A, withCtx as s, createElementBlock as F, Fragment as M, renderList as W, unref as c, createElementVNode as m, renderSlot as E, createTextVNode as K, toDisplayString as L, withModifiers as R, createVNode as f, createCommentVNode as $ } from "vue";
2
2
  import { QuestionFilled as I } from "@element-plus/icons-vue";
3
- import { u as O } from "./useOptionsLoader-D4Jh4f1F.mjs";
3
+ import { u as O } from "./useOptionsLoader-BUO0VTjH.mjs";
4
4
  import { o as Q } from "./props-DAytpx7D.mjs";
5
5
  import { _ as T } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
6
6
  const U = { class: "wd-option-row" }, j = { class: "wd-option-text" }, q = /* @__PURE__ */ b({
@@ -111,4 +111,4 @@ const U = { class: "wd-option-row" }, j = { class: "wd-option-text" }, q = /* @_
111
111
  export {
112
112
  Y as W
113
113
  };
114
- //# sourceMappingURL=Select-MD3taMJo.mjs.map
114
+ //# sourceMappingURL=Select-ByH7uxuS.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select-MD3taMJo.mjs","sources":["../../src/components/inputs/Select.vue"],"sourcesContent":["<template>\n <el-select\n v-model=\"inner\"\n v-loading=\"loading\"\n :multiple=\"multiple\"\n :filterable=\"remote || filterable\"\n :remote=\"remote\"\n :remote-method=\"onRemote\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <el-option\n v-for=\"opt in options\"\n :key=\"String(opt.value)\"\n :label=\"opt.text\"\n :value=\"opt.value\"\n >\n <span class=\"wd-option-row\">\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">\n {{ opt.text }}\n </slot>\n </span>\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-tip\" tabindex=\"0\" role=\"note\" aria-label=\"帮助说明\" @click.stop>\n <el-icon><QuestionFilled /></el-icon>\n </span>\n </el-tooltip>\n </span>\n </el-option>\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { QuestionFilled } from '@element-plus/icons-vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdSelect', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: [String, Number, Boolean, Array] as PropType<any>, default: undefined },\n multiple: { type: Boolean, default: false },\n /** 远程搜索 */\n remote: { type: Boolean, default: false },\n /** 本地可搜索 */\n filterable: { type: Boolean, default: true },\n /** 远程搜索关键字字段名 */\n keywordKey: { type: String, default: 'keyword' }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading, remoteSearch } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n\nfunction onRemote(query: string) {\n if (props.remote) remoteSearch(query, props.keywordKey)\n}\n</script>\n\n<style scoped>\n.wd-option-row {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n}\n.wd-option-text {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.wd-option-tip {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--el-text-color-secondary, #909399);\n font-size: 14px;\n cursor: help;\n}\n.wd-option-tip:focus-visible {\n outline: 1px dashed currentColor;\n outline-offset: 2px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","remoteSearch","useOptionsLoader","inner","computed","val","onChange","onRemote","query","_withDirectives","_openBlock","_createBlock","_component_el_select","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_option","_createElementVNode","_hoisted_1","_hoisted_2","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_tooltip","_createVNode","_component_el_icon","QuestionFilled"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA+CA,UAAMA,IAAQC,GAYRC,IAAOC,GAEPC,IAAOC,EAAOL,CAAK,GACnB,EAAE,SAAAM,GAAS,SAAAC,GAAS,cAAAC,EAAA,IAAiBC,EAAiB;AAAA,MAC1D,KAAKL,EAAK;AAAA,MACV,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,QAAQA,EAAK;AAAA,MACb,YAAYA,EAAK;AAAA,MACjB,UAAUA,EAAK;AAAA,MACf,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,SAASA,EAAK;AAAA,MACd,YAAYA,EAAK;AAAA,MACjB,MAAAF;AAAA,IAAA,CACD,GAEKQ,IAAQC,EAAS;AAAA,MACrB,KAAK,MAAMX,EAAM;AAAA,MACjB,KAAK,CAACY,MAAQV,EAAK,qBAAqBU,CAAG;AAAA,IAAA,CAC5C;AAED,aAASC,EAASD,GAAU;AAC1B,MAAAV,EAAK,UAAUU,CAAG;AAAA,IACpB;AAEA,aAASE,EAASC,GAAe;AAC/B,MAAIf,EAAM,UAAQQ,EAAaO,GAAOf,EAAM,UAAU;AAAA,IACxD;;;AAtFE,aAAAgB,GAAAC,EAAA,GAAAC,EAmCYC,GAnCZC,EAmCY;AAAA,oBAlCDV,EAAA;AAAA,sDAAAA,EAAK,QAAAW;AAAA,QAEb,UAAUpB,EAAA;AAAA,QACV,YAAYA,EAAA,UAAUA,EAAA;AAAA,QACtB,QAAQA,EAAA;AAAA,QACR,iBAAea;AAAA,MAAA,GACRQ,EAAAA,QAAM,EACb,UAAAT,EAAA,CAAgB,GAAA;AAAA,mBAGf,MAAsB;AAAA,kBADxBU,EAwBYC,GAAA,MAAAC,EAvBIC,EAAApB,CAAA,GAAO,CAAdqB,YADTT,EAwBYU,GAAA;AAAA,YAtBT,KAAK,OAAOD,EAAI,KAAK;AAAA,YACrB,OAAOA,EAAI;AAAA,YACX,OAAOA,EAAI;AAAA,UAAA;uBAEZ,MAiBO;AAAA,cAjBPE,EAiBO,QAjBPC,GAiBO;AAAA,gBAhBLD,EAIO,QAJPE,GAIO;AAAA,kBAHLC,EAEOC,EAAA,QAAA,WAAA;AAAA,oBAFA,QAAQN,EAAI;AAAA,oBAAM,MAAMA,EAAI;AAAA,oBAAO,OAAOA,EAAI;AAAA,oBAAQ,MAAMA,EAAI;AAAA,kBAAA,GAAvE,MAEO;AAAA,oBADFO,EAAAC,EAAAR,EAAI,IAAI,GAAA,CAAA;AAAA,kBAAA;;gBAIPA,EAAI,aADZT,EAUakB,GAAA;AAAA;kBARV,SAAST,EAAI;AAAA,kBACd,WAAU;AAAA,kBACV,QAAO;AAAA,kBACN,cAAY;AAAA,gBAAA;6BAEb,MAEO;AAAA,oBAFPE,EAEO,QAAA;AAAA,sBAFD,OAAM;AAAA,sBAAgB,UAAS;AAAA,sBAAI,MAAK;AAAA,sBAAO,cAAW;AAAA,sBAAQ,2BAAD,MAAA;AAAA,sBAAA,GAAW,CAAA,MAAA,CAAA;AAAA,oBAAA;sBAChFQ,EAAqCC,GAAA,MAAA;AAAA,mCAA5B,MAAkB;AAAA,0BAAlBD,EAAkBX,EAAAa,CAAA,CAAA;AAAA,wBAAA;;;;;;;;;;;;;;YA5BxBb,EAAAnB,CAAA,CAAO;AAAA,MAAA;;;;"}
1
+ {"version":3,"file":"Select-ByH7uxuS.mjs","sources":["../../src/components/inputs/Select.vue"],"sourcesContent":["<template>\n <el-select\n v-model=\"inner\"\n v-loading=\"loading\"\n :multiple=\"multiple\"\n :filterable=\"remote || filterable\"\n :remote=\"remote\"\n :remote-method=\"onRemote\"\n v-bind=\"$attrs\"\n @change=\"onChange\"\n >\n <el-option\n v-for=\"opt in options\"\n :key=\"String(opt.value)\"\n :label=\"opt.text\"\n :value=\"opt.value\"\n >\n <span class=\"wd-option-row\">\n <span class=\"wd-option-text\">\n <slot :option=\"opt.raw\" :text=\"opt.text\" :value=\"opt.value\" :tips=\"opt.tips\">\n {{ opt.text }}\n </slot>\n </span>\n <el-tooltip\n v-if=\"opt.tips\"\n :content=\"opt.tips\"\n placement=\"top\"\n effect=\"dark\"\n :show-after=\"200\"\n >\n <span class=\"wd-option-tip\" tabindex=\"0\" role=\"note\" aria-label=\"帮助说明\" @click.stop>\n <el-icon><QuestionFilled /></el-icon>\n </span>\n </el-tooltip>\n </span>\n </el-option>\n </el-select>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type PropType } from 'vue'\nimport { QuestionFilled } from '@element-plus/icons-vue'\nimport { useOptionsLoader } from './useOptionsLoader'\nimport { optionsProps } from '../common/props'\n\ndefineOptions({ name: 'WdSelect', inheritAttrs: false })\n\nconst props = defineProps({\n ...optionsProps,\n modelValue: { type: [String, Number, Boolean, Array] as PropType<any>, default: undefined },\n multiple: { type: Boolean, default: false },\n /** 远程搜索 */\n remote: { type: Boolean, default: false },\n /** 本地可搜索 */\n filterable: { type: Boolean, default: true },\n /** 远程搜索关键字字段名 */\n keywordKey: { type: String, default: 'keyword' }\n})\n\nconst emit = defineEmits(['update:modelValue', 'change', 'apiBefore', 'apiSuccess', 'apiFail', 'apiAfter'])\n\nconst refs = toRefs(props)\nconst { options, loading, remoteSearch } = useOptionsLoader({\n api: refs.api,\n apiMethod: refs.apiMethod as any,\n apiParam: refs.apiParam,\n active: refs.active,\n dataSource: refs.dataSource as any,\n textProp: refs.textProp,\n valueProp: refs.valueProp,\n tipsProp: refs.tipsProp,\n addData: refs.addData as any,\n appendData: refs.appendData as any,\n emit\n})\n\nconst inner = computed({\n get: () => props.modelValue,\n set: (val) => emit('update:modelValue', val)\n})\n\nfunction onChange(val: any) {\n emit('change', val)\n}\n\nfunction onRemote(query: string) {\n if (props.remote) remoteSearch(query, props.keywordKey)\n}\n</script>\n\n<style scoped>\n.wd-option-row {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n}\n.wd-option-text {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.wd-option-tip {\n flex: none;\n display: inline-flex;\n align-items: center;\n color: var(--el-text-color-secondary, #909399);\n font-size: 14px;\n cursor: help;\n}\n.wd-option-tip:focus-visible {\n outline: 1px dashed currentColor;\n outline-offset: 2px;\n}\n</style>\n"],"names":["props","__props","emit","__emit","refs","toRefs","options","loading","remoteSearch","useOptionsLoader","inner","computed","val","onChange","onRemote","query","_withDirectives","_openBlock","_createBlock","_component_el_select","_mergeProps","$event","$attrs","_createElementBlock","_Fragment","_renderList","_unref","opt","_component_el_option","_createElementVNode","_hoisted_1","_hoisted_2","_renderSlot","_ctx","_createTextVNode","_toDisplayString","_component_el_tooltip","_createVNode","_component_el_icon","QuestionFilled"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA+CA,UAAMA,IAAQC,GAYRC,IAAOC,GAEPC,IAAOC,EAAOL,CAAK,GACnB,EAAE,SAAAM,GAAS,SAAAC,GAAS,cAAAC,EAAA,IAAiBC,EAAiB;AAAA,MAC1D,KAAKL,EAAK;AAAA,MACV,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,QAAQA,EAAK;AAAA,MACb,YAAYA,EAAK;AAAA,MACjB,UAAUA,EAAK;AAAA,MACf,WAAWA,EAAK;AAAA,MAChB,UAAUA,EAAK;AAAA,MACf,SAASA,EAAK;AAAA,MACd,YAAYA,EAAK;AAAA,MACjB,MAAAF;AAAA,IAAA,CACD,GAEKQ,IAAQC,EAAS;AAAA,MACrB,KAAK,MAAMX,EAAM;AAAA,MACjB,KAAK,CAACY,MAAQV,EAAK,qBAAqBU,CAAG;AAAA,IAAA,CAC5C;AAED,aAASC,EAASD,GAAU;AAC1B,MAAAV,EAAK,UAAUU,CAAG;AAAA,IACpB;AAEA,aAASE,EAASC,GAAe;AAC/B,MAAIf,EAAM,UAAQQ,EAAaO,GAAOf,EAAM,UAAU;AAAA,IACxD;;;AAtFE,aAAAgB,GAAAC,EAAA,GAAAC,EAmCYC,GAnCZC,EAmCY;AAAA,oBAlCDV,EAAA;AAAA,sDAAAA,EAAK,QAAAW;AAAA,QAEb,UAAUpB,EAAA;AAAA,QACV,YAAYA,EAAA,UAAUA,EAAA;AAAA,QACtB,QAAQA,EAAA;AAAA,QACR,iBAAea;AAAA,MAAA,GACRQ,EAAAA,QAAM,EACb,UAAAT,EAAA,CAAgB,GAAA;AAAA,mBAGf,MAAsB;AAAA,kBADxBU,EAwBYC,GAAA,MAAAC,EAvBIC,EAAApB,CAAA,GAAO,CAAdqB,YADTT,EAwBYU,GAAA;AAAA,YAtBT,KAAK,OAAOD,EAAI,KAAK;AAAA,YACrB,OAAOA,EAAI;AAAA,YACX,OAAOA,EAAI;AAAA,UAAA;uBAEZ,MAiBO;AAAA,cAjBPE,EAiBO,QAjBPC,GAiBO;AAAA,gBAhBLD,EAIO,QAJPE,GAIO;AAAA,kBAHLC,EAEOC,EAAA,QAAA,WAAA;AAAA,oBAFA,QAAQN,EAAI;AAAA,oBAAM,MAAMA,EAAI;AAAA,oBAAO,OAAOA,EAAI;AAAA,oBAAQ,MAAMA,EAAI;AAAA,kBAAA,GAAvE,MAEO;AAAA,oBADFO,EAAAC,EAAAR,EAAI,IAAI,GAAA,CAAA;AAAA,kBAAA;;gBAIPA,EAAI,aADZT,EAUakB,GAAA;AAAA;kBARV,SAAST,EAAI;AAAA,kBACd,WAAU;AAAA,kBACV,QAAO;AAAA,kBACN,cAAY;AAAA,gBAAA;6BAEb,MAEO;AAAA,oBAFPE,EAEO,QAAA;AAAA,sBAFD,OAAM;AAAA,sBAAgB,UAAS;AAAA,sBAAI,MAAK;AAAA,sBAAO,cAAW;AAAA,sBAAQ,2BAAD,MAAA;AAAA,sBAAA,GAAW,CAAA,MAAA,CAAA;AAAA,oBAAA;sBAChFQ,EAAqCC,GAAA,MAAA;AAAA,mCAA5B,MAAkB;AAAA,0BAAlBD,EAAkBX,EAAAa,CAAA,CAAA;AAAA,wBAAA;;;;;;;;;;;;;;YA5BxBb,EAAAnB,CAAA,CAAO;AAAA,MAAA;;;;"}