workdesktop-ai 1.2.0 → 1.2.2

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 (87) hide show
  1. package/CHANGELOG.md +192 -180
  2. package/README.md +11 -8
  3. package/dist/api-button/index.mjs +1 -1
  4. package/dist/auto-complete/index.mjs +1 -1
  5. package/dist/checkbox-list/index.mjs +1 -1
  6. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-CH_B3jbO.mjs → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs} +2 -2
  7. package/dist/chunks/{ApiButton.vue_vue_type_script_setup_true_lang-CH_B3jbO.mjs.map → ApiButton.vue_vue_type_script_setup_true_lang-3BjZSAPZ.mjs.map} +1 -1
  8. package/dist/chunks/{AutoComplete-6yrCFGZ5.mjs → AutoComplete-C6Nxatvt.mjs} +2 -2
  9. package/dist/chunks/{AutoComplete-6yrCFGZ5.mjs.map → AutoComplete-C6Nxatvt.mjs.map} +1 -1
  10. package/dist/chunks/{CheckboxList-ChmfF6zs.mjs → CheckboxList-5AEx33r5.mjs} +2 -2
  11. package/dist/chunks/{CheckboxList-ChmfF6zs.mjs.map → CheckboxList-5AEx33r5.mjs.map} +1 -1
  12. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D9ZUQB7V.mjs → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs} +2 -2
  13. package/dist/chunks/{ConfirmButton.vue_vue_type_script_setup_true_lang-D9ZUQB7V.mjs.map → ConfirmButton.vue_vue_type_script_setup_true_lang-CXYH1Rlc.mjs.map} +1 -1
  14. package/dist/chunks/{DataForm-Rsa1PT-X.mjs → DataForm-C6VLTSOm.mjs} +3 -3
  15. package/dist/chunks/{DataForm-Rsa1PT-X.mjs.map → DataForm-C6VLTSOm.mjs.map} +1 -1
  16. package/dist/chunks/{DataGrid-DzbJpT43.mjs → DataGrid-Dd7n5JM7.mjs} +3 -3
  17. package/dist/chunks/{DataGrid-DzbJpT43.mjs.map → DataGrid-Dd7n5JM7.mjs.map} +1 -1
  18. package/dist/chunks/{EditableGrid-C-0uy89H.mjs → EditableGrid-CDeeVkaX.mjs} +3 -3
  19. package/dist/chunks/{EditableGrid-C-0uy89H.mjs.map → EditableGrid-CDeeVkaX.mjs.map} +1 -1
  20. package/dist/chunks/{ImageUpload-CrDyIjWC.mjs → ImageUpload-CQA9XQ7Q.mjs} +2 -2
  21. package/dist/chunks/{ImageUpload-CrDyIjWC.mjs.map → ImageUpload-CQA9XQ7Q.mjs.map} +1 -1
  22. package/dist/chunks/Path-pIP0JQ0c.mjs +245 -0
  23. package/dist/chunks/Path-pIP0JQ0c.mjs.map +1 -0
  24. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-ClrF3C2w.mjs → PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs} +2 -2
  25. package/dist/chunks/{PromptButton.vue_vue_type_script_setup_true_lang-ClrF3C2w.mjs.map → PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs.map} +1 -1
  26. package/dist/chunks/{RadioList-BIwUZ6lm.mjs → RadioList-BUWcP_Pk.mjs} +2 -2
  27. package/dist/chunks/{RadioList-BIwUZ6lm.mjs.map → RadioList-BUWcP_Pk.mjs.map} +1 -1
  28. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs} +2 -2
  29. package/dist/chunks/{Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs.map → Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map} +1 -1
  30. package/dist/chunks/{Select-DlJ9U0nE.mjs → Select-uvFy7_NU.mjs} +2 -2
  31. package/dist/chunks/{Select-DlJ9U0nE.mjs.map → Select-uvFy7_NU.mjs.map} +1 -1
  32. package/dist/chunks/Station-BTP0SbBg.mjs +818 -0
  33. package/dist/chunks/Station-BTP0SbBg.mjs.map +1 -0
  34. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-BxJdsReQ.mjs → Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs} +2 -2
  35. package/dist/chunks/{Switch.vue_vue_type_script_setup_true_lang-BxJdsReQ.mjs.map → Switch.vue_vue_type_script_setup_true_lang-DUhXAGs2.mjs.map} +1 -1
  36. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-DORizGEF.mjs → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs} +2 -2
  37. package/dist/chunks/{Upload.vue_vue_type_script_setup_true_lang-DORizGEF.mjs.map → Upload.vue_vue_type_script_setup_true_lang-CHGCjpKK.mjs.map} +1 -1
  38. package/dist/chunks/{Viewer-DcMSN3_1.mjs → Viewer-CjLSQTrw.mjs} +2 -2
  39. package/dist/chunks/{Viewer-DcMSN3_1.mjs.map → Viewer-CjLSQTrw.mjs.map} +1 -1
  40. package/dist/chunks/{http-9ToPNkWJ.mjs → http-C06mNpwY.mjs} +1180 -1065
  41. package/dist/chunks/http-C06mNpwY.mjs.map +1 -0
  42. package/dist/chunks/station-linkage-D54-_iyL.mjs +77 -0
  43. package/dist/chunks/station-linkage-D54-_iyL.mjs.map +1 -0
  44. package/dist/chunks/{useApiAction-BetCGQrx.mjs → useApiAction-DxVQWWxv.mjs} +2 -2
  45. package/dist/chunks/{useApiAction-BetCGQrx.mjs.map → useApiAction-DxVQWWxv.mjs.map} +1 -1
  46. package/dist/chunks/{useColumnSettings-CnXeA0k7.mjs → useColumnSettings-BwG2V9xp.mjs} +2 -2
  47. package/dist/chunks/{useColumnSettings-CnXeA0k7.mjs.map → useColumnSettings-BwG2V9xp.mjs.map} +1 -1
  48. package/dist/chunks/{useOptionsLoader-BwRdHDPL.mjs → useOptionsLoader-DEVCYhrp.mjs} +2 -2
  49. package/dist/chunks/{useOptionsLoader-BwRdHDPL.mjs.map → useOptionsLoader-DEVCYhrp.mjs.map} +1 -1
  50. package/dist/confirm-button/index.mjs +1 -1
  51. package/dist/data-form/index.mjs +1 -1
  52. package/dist/data-form/style.css +1 -1
  53. package/dist/data-grid/index.mjs +1 -1
  54. package/dist/editable-grid/index.mjs +1 -1
  55. package/dist/image-upload/index.mjs +1 -1
  56. package/dist/index.esm.js +86 -80
  57. package/dist/index.esm.js.map +1 -1
  58. package/dist/index.umd.js +128 -25
  59. package/dist/index.umd.js.map +1 -1
  60. package/dist/path/index.mjs +7 -0
  61. package/dist/path/index.mjs.map +1 -0
  62. package/dist/path/style.css +1 -0
  63. package/dist/prompt-button/index.mjs +1 -1
  64. package/dist/radio-list/index.mjs +1 -1
  65. package/dist/requester/index.mjs +1 -1
  66. package/dist/select/index.mjs +1 -1
  67. package/dist/station/index.mjs +1 -1
  68. package/dist/station/style.css +1 -1
  69. package/dist/style.css +1 -1
  70. package/dist/switch/index.mjs +1 -1
  71. package/dist/types/src/components/index.d.ts +2 -1
  72. package/dist/types/src/components/layout/Station.vue.d.ts +30 -19
  73. package/dist/types/src/components/layout/types.d.ts +13 -0
  74. package/dist/types/src/components/styles/Path.vue.d.ts +103 -0
  75. package/dist/types/src/entries/path.d.ts +9 -0
  76. package/dist/types/src/index.d.ts +2 -1
  77. package/dist/types/src/lib/core/skins/business.d.ts +1 -1
  78. package/dist/types/src/lib/core/skins/tech.d.ts +1 -1
  79. package/dist/types/src/lib/core/station-linkage.d.ts +31 -0
  80. package/dist/upload/index.mjs +1 -1
  81. package/dist/viewer/index.mjs +1 -1
  82. package/llms.txt +69 -9
  83. package/package.json +11 -1
  84. package/dist/chunks/Station-CrMTjqfa.mjs +0 -796
  85. package/dist/chunks/Station-CrMTjqfa.mjs.map +0 -1
  86. package/dist/chunks/http-9ToPNkWJ.mjs.map +0 -1
  87. package/dist/types/src/lib/core/skins/tech-brain.d.ts +0 -5
@@ -1,7 +1,7 @@
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 { a as _, r as p } from "./http-9ToPNkWJ.mjs";
4
+ import { a as _, r as p } from "./http-C06mNpwY.mjs";
5
5
  import { r as D } from "./linkage-FbL1mcz3.mjs";
6
6
  import { h as F, f as ee } from "./props-DAytpx7D.mjs";
7
7
  import { _ as te } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
@@ -190,4 +190,4 @@ const ae = {
190
190
  export {
191
191
  de as W
192
192
  };
193
- //# sourceMappingURL=ImageUpload-CrDyIjWC.mjs.map
193
+ //# sourceMappingURL=ImageUpload-CQA9XQ7Q.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageUpload-CrDyIjWC.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
+ {"version":3,"file":"ImageUpload-CQA9XQ7Q.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;;;;;"}
@@ -0,0 +1,245 @@
1
+ import { defineComponent as ce, getCurrentInstance as le, computed as g, ref as S, watch as y, onMounted as ue, onUnmounted as se, resolveComponent as E, openBlock as c, createElementBlock as P, createVNode as me, withCtx as h, createBlock as s, TransitionGroup as de, Fragment as z, renderList as G, normalizeClass as U, resolveDynamicComponent as Y, createCommentVNode as K, createTextVNode as Q, toDisplayString as X } from "vue";
2
+ import * as fe from "@element-plus/icons-vue";
3
+ import { f as pe } from "./props-DAytpx7D.mjs";
4
+ import { b as Z, g as he } from "./station-linkage-D54-_iyL.mjs";
5
+ import { _ as ve } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
6
+ const ge = ["data-animation"], ye = /* @__PURE__ */ ce({
7
+ name: "WdPath",
8
+ __name: "Path",
9
+ props: {
10
+ ...pe,
11
+ /** 模式:manual=手动填写路径 / auto=自动联动(Station 菜单链 + 页面标题) */
12
+ mode: { type: String, default: "manual" },
13
+ /** 手动模式路径节点(PathItem[],支持 JSON 字符串) */
14
+ items: { type: [Array, String], default: void 0 },
15
+ /** 自动模式:首页节点标题 */
16
+ home: { type: String, default: "首页" },
17
+ /** 自动模式:是否显示首页节点 */
18
+ showHome: { type: Boolean, default: !0 },
19
+ /** 分隔符 */
20
+ separator: { type: String, default: "/" },
21
+ /** 路径内容(路径段)变动时的动画:none=无 / fade=淡入淡出 / slide=横向滑移+淡入 */
22
+ animation: { type: String, default: "none" },
23
+ /** 标题扫描范围:CSS 选择器或元素;默认最近的 Station 内容区(.wd-station__content),无则整页 */
24
+ container: { type: [String, Object], default: void 0 }
25
+ },
26
+ emits: ["change", "item-click"],
27
+ setup(m, { expose: ee, emit: te }) {
28
+ const n = m, A = te, l = le(), I = g(() => {
29
+ var t, a;
30
+ const e = (a = (t = l == null ? void 0 : l.appContext) == null ? void 0 : t.config) == null ? void 0 : a.globalProperties;
31
+ return !!(e != null && e.$router);
32
+ });
33
+ function ne() {
34
+ if (!n.items) return [];
35
+ if (typeof n.items == "string")
36
+ try {
37
+ return JSON.parse(n.items);
38
+ } catch (e) {
39
+ return console.error("[WorkDesktop] WdPath items JSON 解析失败,已回退空路径:", e), [];
40
+ }
41
+ return n.items;
42
+ }
43
+ const C = S(null), N = S([]), _ = S([]), v = S(-1);
44
+ function B() {
45
+ var a;
46
+ const e = (a = l == null ? void 0 : l.proxy) == null ? void 0 : a.$el;
47
+ if (n.container) {
48
+ if (typeof n.container == "string") {
49
+ const r = document.querySelector(n.container);
50
+ if (r) return r;
51
+ } else if (n.container.nodeType === 1)
52
+ return n.container;
53
+ }
54
+ return (e == null ? void 0 : e.closest(".wd-station__content")) || document.body;
55
+ }
56
+ function oe() {
57
+ const e = C.value || document.body, t = [];
58
+ return e.querySelectorAll("h1,h2,h3,h4").forEach((a) => {
59
+ const r = (a.textContent || "").trim();
60
+ r && t.push({ el: a, level: Number(a.tagName.charAt(1)), title: r });
61
+ }), t;
62
+ }
63
+ function R(e) {
64
+ return e.map((t) => `${t.level}:${t.title}`).join("|");
65
+ }
66
+ function ae(e, t) {
67
+ const a = [];
68
+ for (let r = 0; r <= t; r++) {
69
+ const i = e[r];
70
+ for (; a.length && a[a.length - 1].level >= i.level; ) a.pop();
71
+ a.push(i);
72
+ }
73
+ return a.map((r) => ({ title: r.title, source: "heading", level: r.level }));
74
+ }
75
+ function T(e) {
76
+ return e === document.body || e === document.documentElement;
77
+ }
78
+ function H() {
79
+ const e = _.value;
80
+ if (!e.length) return -1;
81
+ const t = C.value || document.body, a = t.getBoundingClientRect(), r = T(t) ? window.scrollY || document.documentElement.scrollTop : t.scrollTop;
82
+ let i = e.length - 1;
83
+ for (let o = 0; o < e.length; o++)
84
+ if (e[o].el.getBoundingClientRect().top - a.top + r >= r - 1) {
85
+ i = o;
86
+ break;
87
+ }
88
+ return i;
89
+ }
90
+ function b() {
91
+ N.value = he(!0, n.filter).map((e) => ({
92
+ ...e,
93
+ source: "menu"
94
+ }));
95
+ }
96
+ function M() {
97
+ const e = oe();
98
+ R(e) !== R(_.value) && (_.value = e);
99
+ const t = H();
100
+ t !== v.value && (v.value = t);
101
+ }
102
+ function d() {
103
+ if (n.mode !== "auto") {
104
+ x();
105
+ return;
106
+ }
107
+ b(), M(), x();
108
+ }
109
+ const re = g(() => {
110
+ const e = _.value;
111
+ return e.length ? v.value >= 0 ? ae(e, v.value) : [] : [];
112
+ }), k = g(() => n.mode === "auto" ? [...n.showHome ? [{ title: n.home, source: "home" }] : [], ...N.value, ...re.value] : ne().map((e) => ({ ...e, source: e.source || "manual" }))), O = g(
113
+ () => k.value.map((e, t) => ({ ...e, key: `${e.source || "seg"}:${t}:${e.title}` }))
114
+ );
115
+ let W = "";
116
+ function x() {
117
+ const e = k.value.map((t) => `${t.level ?? ""}:${t.title}`).join("|");
118
+ e !== W && (W = e, A("change", k.value));
119
+ }
120
+ y(k, () => x());
121
+ let $ = !1;
122
+ function L() {
123
+ n.mode !== "auto" || $ || ($ = !0, requestAnimationFrame(() => {
124
+ $ = !1, n.mode === "auto" && (v.value = H());
125
+ }));
126
+ }
127
+ let f = null, p = null;
128
+ function V(e) {
129
+ j(), C.value = e, p = T(e) ? window : e, p.addEventListener("scroll", L, { passive: !0 }), typeof MutationObserver < "u" && (f = new MutationObserver((t) => {
130
+ if (n.mode !== "auto") return;
131
+ t.some((r) => {
132
+ const i = r.target;
133
+ return !(i && typeof i.closest == "function" && i.closest(".wd-path"));
134
+ }) && M();
135
+ }), f.observe(e, { childList: !0, subtree: !0 }));
136
+ }
137
+ function j() {
138
+ C.value = null, p == null || p.removeEventListener("scroll", L), p = null, f == null || f.disconnect(), f = null;
139
+ }
140
+ function q(e) {
141
+ A("item-click", e);
142
+ }
143
+ function w(e) {
144
+ return e ? typeof e == "string" ? fe[e] || null : e : null;
145
+ }
146
+ let u = null;
147
+ function D() {
148
+ n.mode === "auto" && (u = Z(n.filter, b), V(B()), d());
149
+ }
150
+ function F() {
151
+ j(), u == null || u(), u = null;
152
+ }
153
+ ue(() => {
154
+ D(), d();
155
+ }), y(
156
+ () => n.mode,
157
+ (e) => {
158
+ e === "auto" ? D() : (F(), d());
159
+ }
160
+ ), y(
161
+ () => n.filter,
162
+ () => {
163
+ n.mode === "auto" && (u == null || u(), u = Z(n.filter, b), b());
164
+ }
165
+ ), y(
166
+ () => n.container,
167
+ () => {
168
+ n.mode === "auto" && V(B()), d();
169
+ }
170
+ );
171
+ const ie = g(() => {
172
+ var e, t;
173
+ return (t = (e = l == null ? void 0 : l.proxy) == null ? void 0 : e.$route) == null ? void 0 : t.path;
174
+ });
175
+ return y(ie, () => {
176
+ n.mode === "auto" && d();
177
+ }), se(() => F()), ee({ refresh: d }), (e, t) => {
178
+ const a = E("el-icon"), r = E("el-breadcrumb-item"), i = E("el-breadcrumb");
179
+ return c(), P("div", {
180
+ class: "wd-path",
181
+ "data-animation": m.animation
182
+ }, [
183
+ me(i, { separator: m.separator }, {
184
+ default: h(() => [
185
+ m.animation !== "none" ? (c(), s(de, {
186
+ key: 0,
187
+ name: `wd-path-anim--${m.animation}`,
188
+ tag: "span",
189
+ class: "wd-path__anim",
190
+ "data-animation": m.animation
191
+ }, {
192
+ default: h(() => [
193
+ (c(!0), P(z, null, G(O.value, (o) => (c(), s(r, {
194
+ key: o.key,
195
+ class: U({ "is-heading": o.source === "heading", "is-active": o.source === "heading" || o.source === "home" }),
196
+ to: o.path && I.value ? { path: o.path } : void 0,
197
+ onClick: (J) => q(o)
198
+ }, {
199
+ default: h(() => [
200
+ w(o.icon) ? (c(), s(a, {
201
+ key: 0,
202
+ class: "wd-path__icon"
203
+ }, {
204
+ default: h(() => [
205
+ (c(), s(Y(w(o.icon))))
206
+ ]),
207
+ _: 2
208
+ }, 1024)) : K("", !0),
209
+ Q(" " + X(o.title), 1)
210
+ ]),
211
+ _: 2
212
+ }, 1032, ["class", "to", "onClick"]))), 128))
213
+ ]),
214
+ _: 1
215
+ }, 8, ["name", "data-animation"])) : (c(!0), P(z, { key: 1 }, G(O.value, (o) => (c(), s(r, {
216
+ key: o.key,
217
+ class: U({ "is-heading": o.source === "heading", "is-active": o.source === "heading" || o.source === "home" }),
218
+ to: o.path && I.value ? { path: o.path } : void 0,
219
+ onClick: (J) => q(o)
220
+ }, {
221
+ default: h(() => [
222
+ w(o.icon) ? (c(), s(a, {
223
+ key: 0,
224
+ class: "wd-path__icon"
225
+ }, {
226
+ default: h(() => [
227
+ (c(), s(Y(w(o.icon))))
228
+ ]),
229
+ _: 2
230
+ }, 1024)) : K("", !0),
231
+ Q(" " + X(o.title), 1)
232
+ ]),
233
+ _: 2
234
+ }, 1032, ["class", "to", "onClick"]))), 128))
235
+ ]),
236
+ _: 1
237
+ }, 8, ["separator"])
238
+ ], 8, ge);
239
+ };
240
+ }
241
+ }), Se = /* @__PURE__ */ ve(ye, [["__scopeId", "data-v-dd570e17"]]);
242
+ export {
243
+ Se as W
244
+ };
245
+ //# sourceMappingURL=Path-pIP0JQ0c.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Path-pIP0JQ0c.mjs","sources":["../../src/components/styles/Path.vue"],"sourcesContent":["<template>\n <div class=\"wd-path\" :data-animation=\"animation\">\n <el-breadcrumb :separator=\"separator\">\n <!-- 内容变动动画:fade/slide 时以 TransitionGroup 包裹路径段,段增删替换播放过渡 -->\n <TransitionGroup\n v-if=\"animation !== 'none'\"\n :name=\"`wd-path-anim--${animation}`\"\n tag=\"span\"\n class=\"wd-path__anim\"\n :data-animation=\"animation\"\n >\n <el-breadcrumb-item\n v-for=\"seg in segmentViews\"\n :key=\"seg.key\"\n :class=\"{ 'is-heading': seg.source === 'heading', 'is-active': seg.source === 'heading' || seg.source === 'home' }\"\n :to=\"seg.path && hasRouter ? { path: seg.path } : undefined\"\n @click=\"onSegmentClick(seg)\"\n >\n <el-icon v-if=\"resolveIcon(seg.icon)\" class=\"wd-path__icon\">\n <component :is=\"resolveIcon(seg.icon)\" />\n </el-icon>\n {{ seg.title }}\n </el-breadcrumb-item>\n </TransitionGroup>\n <template v-else>\n <el-breadcrumb-item\n v-for=\"seg in segmentViews\"\n :key=\"seg.key\"\n :class=\"{ 'is-heading': seg.source === 'heading', 'is-active': seg.source === 'heading' || seg.source === 'home' }\"\n :to=\"seg.path && hasRouter ? { path: seg.path } : undefined\"\n @click=\"onSegmentClick(seg)\"\n >\n <el-icon v-if=\"resolveIcon(seg.icon)\" class=\"wd-path__icon\">\n <component :is=\"resolveIcon(seg.icon)\" />\n </el-icon>\n {{ seg.title }}\n </el-breadcrumb-item>\n </template>\n </el-breadcrumb>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n getCurrentInstance,\n onMounted,\n onUnmounted,\n ref,\n watch,\n type PropType\n} from 'vue'\nimport * as ElIcons from '@element-plus/icons-vue'\nimport { filterProp } from '../common/props'\nimport { getStationMenuChain, subscribeStationChange } from '../../lib/core/station-linkage'\nimport type { PathItem } from '../layout/types'\n\ndefineOptions({ name: 'WdPath' })\n\nconst props = defineProps({\n ...filterProp,\n /** 模式:manual=手动填写路径 / auto=自动联动(Station 菜单链 + 页面标题) */\n mode: { type: String as PropType<'manual' | 'auto'>, default: 'manual' },\n /** 手动模式路径节点(PathItem[],支持 JSON 字符串) */\n items: { type: [Array, String] as PropType<PathItem[] | string>, default: undefined },\n /** 自动模式:首页节点标题 */\n home: { type: String, default: '首页' },\n /** 自动模式:是否显示首页节点 */\n showHome: { type: Boolean, default: true },\n /** 分隔符 */\n separator: { type: String, default: '/' },\n /** 路径内容(路径段)变动时的动画:none=无 / fade=淡入淡出 / slide=横向滑移+淡入 */\n animation: { type: String as PropType<'none' | 'fade' | 'slide'>, default: 'none' },\n /** 标题扫描范围:CSS 选择器或元素;默认最近的 Station 内容区(.wd-station__content),无则整页 */\n container: { type: [String, Object] as PropType<string | HTMLElement>, default: undefined }\n})\n\nconst emit = defineEmits<{\n (e: 'change', segments: PathItem[]): void\n (e: 'item-click', item: PathItem): void\n}>()\n\nconst instance = getCurrentInstance()\nconst hasRouter = computed(() => {\n const root = instance?.appContext?.config?.globalProperties as any\n return !!(root?.$router)\n})\n\n/* ---------- 手动模式:路径解析 ---------- */\nfunction parseItems(): PathItem[] {\n if (!props.items) return []\n if (typeof props.items === 'string') {\n try {\n return JSON.parse(props.items)\n } catch (e) {\n console.error('[WorkDesktop] WdPath items JSON 解析失败,已回退空路径:', e)\n return []\n }\n }\n return props.items\n}\n\n/* ---------- 自动模式:标题扫描 ---------- */\ninterface HeadingNode {\n el: HTMLElement\n level: number\n title: string\n}\n\nconst containerEl = ref<HTMLElement | null>(null)\nconst menuChain = ref<PathItem[]>([])\nconst headings = ref<HeadingNode[]>([])\nconst activeIndex = ref(-1)\n\nfunction resolveContainer(): HTMLElement {\n const root = instance?.proxy?.$el as HTMLElement | undefined\n if (props.container) {\n if (typeof props.container === 'string') {\n const el = document.querySelector(props.container)\n if (el) return el as HTMLElement\n } else if ((props.container as HTMLElement).nodeType === 1) {\n return props.container as HTMLElement\n }\n }\n // 默认:最近的 Station 内容区;无则整页\n const content = root?.closest('.wd-station__content') as HTMLElement | null\n return content || document.body\n}\n\nfunction collectHeadings(): HeadingNode[] {\n const container = containerEl.value || document.body\n const nodes: HeadingNode[] = []\n container.querySelectorAll('h1,h2,h3,h4').forEach((el) => {\n const title = (el.textContent || '').trim()\n if (!title) return\n nodes.push({ el: el as HTMLElement, level: Number(el.tagName.charAt(1)), title })\n })\n return nodes\n}\n\n/** 标题结构签名:层级+标题有序列表,用于判断容器变化是否真的影响标题集合 */\nfunction headingsSignature(list: HeadingNode[]): string {\n return list.map((h) => `${h.level}:${h.title}`).join('|')\n}\n\n/** 大纲链:以 end 位置的标题为终点,逐级收敛(h1→h2→h3→h4) */\nfunction buildChain(list: HeadingNode[], end: number): PathItem[] {\n const stack: HeadingNode[] = []\n for (let i = 0; i <= end; i++) {\n const h = list[i]\n while (stack.length && stack[stack.length - 1].level >= h.level) stack.pop()\n stack.push(h)\n }\n return stack.map((h) => ({ title: h.title, source: 'heading', level: h.level } as PathItem))\n}\n\nfunction isPageContainer(el: HTMLElement): boolean {\n return el === document.body || el === document.documentElement\n}\n\n/** 当前可视范围内的第一个标题:容器滚动位置处最先映入视口/容器顶部的 H1~H4(滚动跟随) */\nfunction computeActiveIndex(): number {\n const list = headings.value\n if (!list.length) return -1\n const container = containerEl.value || document.body\n const cRect = container.getBoundingClientRect()\n const scrollTop = isPageContainer(container)\n ? window.scrollY || document.documentElement.scrollTop\n : container.scrollTop\n // 默认取最后一个(全部标题均已滚出顶部时,锚定末尾章节)\n let active = list.length - 1\n for (let i = 0; i < list.length; i++) {\n const hRect = list[i].el.getBoundingClientRect()\n const top = hRect.top - cRect.top + scrollTop\n // 容器滚动内容中,位置位于可视区起点(scrollTop)之下的第一个标题即当前章节\n if (top >= scrollTop - 1) { active = i; break }\n }\n return active\n}\n\n/* ---------- 自动模式:数据刷新 ---------- */\nfunction refreshMenuChain() {\n menuChain.value = getStationMenuChain(true, props.filter).map((c) => ({\n ...c,\n source: 'menu'\n }) as PathItem)\n}\n\nfunction refreshHeadings() {\n const next = collectHeadings()\n // 标题结构未变(仅非标题节点变动)时不重建列表,避免无意义的全链重算\n if (headingsSignature(next) !== headingsSignature(headings.value)) {\n headings.value = next\n }\n const idx = computeActiveIndex()\n if (idx !== activeIndex.value) activeIndex.value = idx\n}\n\n/** 完整刷新(手动模式仅触发 change 事件;自动模式重读菜单链与标题) */\nfunction refresh() {\n if (props.mode !== 'auto') {\n emitChange()\n return\n }\n refreshMenuChain()\n refreshHeadings()\n emitChange()\n}\n\n/* ---------- 段组装 ---------- */\nconst displayHeadings = computed<PathItem[]>(() => {\n const list = headings.value\n if (!list.length) return []\n return activeIndex.value >= 0 ? buildChain(list, activeIndex.value) : []\n})\n\nconst segments = computed<PathItem[]>(() => {\n if (props.mode === 'auto') {\n const head: PathItem[] = props.showHome ? [{ title: props.home, source: 'home' }] : []\n return [...head, ...menuChain.value, ...displayHeadings.value]\n }\n return parseItems().map((it) => ({ ...it, source: it.source || 'manual' }))\n})\n\nconst segmentViews = computed(() =>\n segments.value.map((s, i) => ({ ...s, key: `${s.source || 'seg'}:${i}:${s.title}` }))\n)\n\nlet lastSig = ''\nfunction emitChange() {\n const sig = segments.value.map((s) => `${s.level ?? ''}:${s.title}`).join('|')\n if (sig === lastSig) return\n lastSig = sig\n emit('change', segments.value)\n}\n\nwatch(segments, () => emitChange())\n\n/* ---------- 容器事件绑定(标题扫描 + 滚动跟随当前可视范围内第一个标题) ---------- */\nlet scrollTicking = false\nfunction onScroll() {\n if (props.mode !== 'auto' || scrollTicking) return\n scrollTicking = true\n requestAnimationFrame(() => {\n scrollTicking = false\n if (props.mode === 'auto') {\n activeIndex.value = computeActiveIndex()\n }\n })\n}\n\nlet observer: MutationObserver | null = null\nlet scrollTarget: HTMLElement | Window | null = null\nfunction bindContainer(el: HTMLElement) {\n unbindContainer()\n containerEl.value = el\n // 页面级容器(body/documentElement)滚动事件挂在 window;元素级挂在自身\n scrollTarget = isPageContainer(el) ? window : el\n scrollTarget.addEventListener('scroll', onScroll, { passive: true })\n if (typeof MutationObserver !== 'undefined') {\n observer = new MutationObserver((records) => {\n if (props.mode !== 'auto') return\n // 路径自身(TransitionGroup 动画导致的段节点增删)位于观察容器内部,\n // 忽略全部落在 .wd-path 子树内的变动,避免「动画改 DOM → 触发重扫 → 重渲染 → 再触发动画」的自激循环\n const fromContent = records.some((r) => {\n const target = r.target as HTMLElement | null\n return !(target && typeof target.closest === 'function' && target.closest('.wd-path'))\n })\n if (fromContent) refreshHeadings()\n })\n observer.observe(el, { childList: true, subtree: true })\n }\n}\n\nfunction unbindContainer() {\n containerEl.value = null\n scrollTarget?.removeEventListener('scroll', onScroll)\n scrollTarget = null\n observer?.disconnect()\n observer = null\n}\n\n/* ---------- 事件 ---------- */\nfunction onSegmentClick(seg: PathItem) {\n emit('item-click', seg)\n}\n\nfunction resolveIcon(icon: any) {\n if (!icon) return null\n if (typeof icon === 'string') return (ElIcons as any)[icon] || null\n return icon\n}\n\n/* ---------- 生命周期:自动模式联动(Station 菜单链 + 路由 + 标题) ---------- */\nlet unsub: (() => void) | null = null\nfunction bindAuto() {\n if (props.mode !== 'auto') return\n unsub = subscribeStationChange(props.filter, refreshMenuChain)\n bindContainer(resolveContainer())\n refresh()\n}\n\nfunction unbindAuto() {\n unbindContainer()\n unsub?.()\n unsub = null\n}\n\nonMounted(() => {\n bindAuto()\n refresh()\n})\n\nwatch(\n () => props.mode,\n (mode) => {\n if (mode === 'auto') {\n bindAuto()\n } else {\n unbindAuto()\n refresh()\n }\n }\n)\n\nwatch(\n () => props.filter,\n () => {\n if (props.mode !== 'auto') return\n unsub?.()\n unsub = subscribeStationChange(props.filter, refreshMenuChain)\n refreshMenuChain()\n }\n)\n\n// 容器变化(如 :container=\"ref\" 延迟就绪)→ 重绑并重扫\nwatch(\n () => props.container,\n () => {\n if (props.mode === 'auto') bindContainer(resolveContainer())\n refresh()\n }\n)\n\n// router 模式:路由变化 → 重读菜单链与标题\nconst routePath = computed(() => (instance?.proxy as any)?.$route?.path)\nwatch(routePath, () => {\n if (props.mode === 'auto') refresh()\n})\n\nonUnmounted(() => unbindAuto())\n\ndefineExpose({ refresh })\n</script>\n\n<style scoped>\n.wd-path {\n display: inline-flex;\n align-items: center;\n min-width: 0;\n}\n.wd-path :deep(.el-breadcrumb__item) {\n /* 不限制单个路径段宽度(长标题如“HTTP 请求(RequestAPI / request 单例 / useRequest)”\n 按内容自然撑开,不被截断);整体宽度由容器(如顶栏)约束 */\n overflow: hidden;\n white-space: nowrap;\n}\n.wd-path :deep(.el-breadcrumb__inner) {\n display: inline-flex;\n align-items: center;\n color: var(--wd-text-color-secondary, #909399);\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n.wd-path :deep(.el-breadcrumb__inner.is-link) {\n color: var(--wd-color-primary, #409eff);\n font-weight: 400;\n}\n.wd-path :deep(.el-breadcrumb__inner.is-link:hover) {\n color: var(--wd-color-primary-light-3, #79bbff);\n}\n/* 首页与标题段:主色加粗,标识当前位置 */\n.wd-path :deep(.el-breadcrumb__item.is-active .el-breadcrumb__inner) {\n color: var(--wd-text-color-primary, #303133);\n font-weight: 600;\n}\n.wd-path__icon {\n margin-right: 4px;\n vertical-align: -2px;\n}\n\n/* —— 内容变动动画(TransitionGroup 过渡类作用于各路径段根节点) —— */\n.wd-path__anim {\n position: relative;\n display: inline-flex;\n align-items: center;\n}\n/* fade:纯淡入淡出 */\n.wd-path-anim--fade-enter-active,\n.wd-path-anim--fade-leave-active {\n transition: opacity 0.2s ease;\n}\n.wd-path-anim--fade-enter-from,\n.wd-path-anim--fade-leave-to {\n opacity: 0;\n}\n/* slide:新段自左滑入、旧段向右滑出,留存段 FLIP 位移 */\n.wd-path-anim--slide-enter-active,\n.wd-path-anim--slide-leave-active {\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.wd-path-anim--slide-enter-from {\n opacity: 0;\n transform: translateX(-8px);\n}\n.wd-path-anim--slide-leave-to {\n opacity: 0;\n transform: translateX(8px);\n}\n.wd-path-anim--slide-leave-active {\n position: absolute;\n}\n.wd-path-anim--slide-move {\n transition: transform 0.2s ease;\n}\n</style>\n"],"names":["props","__props","emit","__emit","instance","getCurrentInstance","hasRouter","computed","root","_b","_a","parseItems","containerEl","ref","menuChain","headings","activeIndex","resolveContainer","el","collectHeadings","container","nodes","title","headingsSignature","list","h","buildChain","end","stack","i","isPageContainer","computeActiveIndex","cRect","scrollTop","active","refreshMenuChain","getStationMenuChain","c","refreshHeadings","next","idx","refresh","emitChange","displayHeadings","segments","it","segmentViews","s","lastSig","sig","watch","scrollTicking","onScroll","observer","scrollTarget","bindContainer","unbindContainer","records","target","onSegmentClick","seg","resolveIcon","icon","ElIcons","unsub","bindAuto","subscribeStationChange","unbindAuto","onMounted","mode","routePath","onUnmounted","__expose","_createElementBlock","_createVNode","_component_el_breadcrumb","_createBlock","_TransitionGroup","_Fragment","_renderList","_component_el_breadcrumb_item","_normalizeClass","$event","_component_el_icon","_openBlock","_resolveDynamicComponent","_toDisplayString"],"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-BetCGQrx.mjs";
3
+ import { u as w } from "./useApiAction-DxVQWWxv.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-ClrF3C2w.mjs.map
118
+ //# sourceMappingURL=PromptButton.vue_vue_type_script_setup_true_lang-oYaMH-CI.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromptButton.vue_vue_type_script_setup_true_lang-ClrF3C2w.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-oYaMH-CI.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-BwRdHDPL.mjs";
2
+ import { u as A } from "./useOptionsLoader-DEVCYhrp.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-BIwUZ6lm.mjs.map
129
+ //# sourceMappingURL=RadioList-BUWcP_Pk.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"RadioList-BIwUZ6lm.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-BUWcP_Pk.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":";;;;;;;;;;;;;;;;AA+CA,UAAMA,IAAQC,GAORC,IAAOC,GAEPC,IAAOC,EAAOL,CAAK,GACnB,EAAE,SAAAM,GAAS,SAAAC,EAAA,IAAYC,EAAiB;AAAA,MAC5C,KAAKJ,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,GAEKO,IAAQC,EAAS;AAAA,MACrB,KAAK,MAAMV,EAAM;AAAA,MACjB,KAAK,CAACW,MAAQT,EAAK,qBAAqBS,CAAG;AAAA,IAAA,CAC5C;AAED,aAASC,EAASD,GAAU;AAC1B,MAAAT,EAAK,UAAUS,CAAG;AAAA,IACpB;;;AA7EE,aAAAE,GAAAC,EAAA,GAAAC,EAoCiBC,GApCjBC,EAoCiB;AAAA,oBAnCNR,EAAA;AAAA,sDAAAA,EAAK,QAAAS;AAAA,MAAA,GAENC,EAAAA,QAAM,EACb,UAAAP,EAAA,CAAgB,GAAA;AAAA,mBAEP,MAAsB;AAAA,kBAAhCQ,EA6BWC,GAAA,MAAAC,EA7BaC,EAAAjB,CAAA,GAAO,CAAdkB;iBAAsB,OAAOA,EAAI,KAAK;AAAA,UAAA;YAC9BvB,EAAA,oBAAvBc,EAakBU,GAAA;AAAA;cAbmB,OAAOD,EAAI;AAAA,YAAA;yBAC9C,MAUa;AAAA,gBATLA,EAAI,aADZT,EAUaW,GAAA;AAAA;kBARV,SAASF,EAAI;AAAA,kBACd,WAAU;AAAA,kBACV,QAAO;AAAA,kBACN,cAAY;AAAA,gBAAA;6BAEb,MAEO;AAAA,oBAFPG,EAEO,QAFPC,GAEO;AAAA,sBADLC,EAAkGC,EAAA,QAAA,WAAA;AAAA,wBAA3F,QAAQN,EAAI;AAAA,wBAAM,MAAMA,EAAI;AAAA,wBAAO,OAAOA,EAAI;AAAA,wBAAQ,MAAMA,EAAI;AAAA,sBAAA,GAAvE,MAAkG;AAAA,wBAAlBO,EAAAC,EAAAR,EAAI,IAAI,GAAA,CAAA;AAAA,sBAAA;;;;yCAG5FK,EAAyGC,EAAA,QAAA,WAAA;AAAA,kBAA3F,QAAQN,EAAI;AAAA,kBAAM,MAAMA,EAAI;AAAA,kBAAO,OAAOA,EAAI;AAAA,kBAAQ,MAAMA,EAAI;AAAA,gBAAA,GAA9E,MAAyG;AAAA,kBAAlBO,EAAAC,EAAAR,EAAI,IAAI,GAAA,CAAA;AAAA,gBAAA;;;yCAEjGT,EAaWkB,GAAA;AAAA;cAbO,OAAOT,EAAI;AAAA,YAAA;yBAC3B,MAUa;AAAA,gBATLA,EAAI,aADZT,EAUaW,GAAA;AAAA;kBARV,SAASF,EAAI;AAAA,kBACd,WAAU;AAAA,kBACV,QAAO;AAAA,kBACN,cAAY;AAAA,gBAAA;6BAEb,MAEO;AAAA,oBAFPG,EAEO,QAFPO,GAEO;AAAA,sBADLL,EAAkGC,EAAA,QAAA,WAAA;AAAA,wBAA3F,QAAQN,EAAI;AAAA,wBAAM,MAAMA,EAAI;AAAA,wBAAO,OAAOA,EAAI;AAAA,wBAAQ,MAAMA,EAAI;AAAA,sBAAA,GAAvE,MAAkG;AAAA,wBAAlBO,EAAAC,EAAAR,EAAI,IAAI,GAAA,CAAA;AAAA,sBAAA;;;;yCAG5FK,EAAyGC,EAAA,QAAA,WAAA;AAAA,kBAA3F,QAAQN,EAAI;AAAA,kBAAM,MAAMA,EAAI;AAAA,kBAAO,OAAOA,EAAI;AAAA,kBAAQ,MAAMA,EAAI;AAAA,gBAAA,GAA9E,MAAyG;AAAA,kBAAlBO,EAAAC,EAAAR,EAAI,IAAI,GAAA,CAAA;AAAA,gBAAA;;;;;;;;YA/BxFD,EAAAhB,CAAA,CAAO;AAAA,MAAA;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { shallowRef as g, onMounted as b, defineComponent as q, watch as C, onUnmounted as h, renderSlot as v } from "vue";
2
- import { a as w, g as R, d as _, r as c } from "./http-9ToPNkWJ.mjs";
2
+ import { a as w, g as R, d as _, r as c } from "./http-C06mNpwY.mjs";
3
3
  function O(n, s) {
4
4
  const e = g(p(n, s));
5
5
  return b(() => {
@@ -77,4 +77,4 @@ export {
77
77
  x as a,
78
78
  O as u
79
79
  };
80
- //# sourceMappingURL=Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs.map
80
+ //# sourceMappingURL=Requester.vue_vue_type_script_setup_true_lang-DkLqAjug.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Requester.vue_vue_type_script_setup_true_lang-Bu10N1Hj.mjs","sources":["../../src/lib/composables/useConfig.ts","../../src/components/core/Requester.vue"],"sourcesContent":["import { onMounted, shallowRef } from 'vue'\nimport { getGlobalConfig, getComponentDefault } from '../core/config'\nimport { deepMerge } from '../core/utils'\nimport type { WorkDesktopConfig } from '../../types/config'\n\n/**\n * useConfig(PRD 5.3 / 5.2)\n *\n * 组件内合并三级配置:全局 componentDefault[组件名] → 本地 props。\n * 全局配置在组件 onMounted 时读取一次并缓存(运行中改配置只影响新挂载组件)。\n *\n * 返回一个响应式 ref,merge 后的组件配置对象:\n * componentDefault 的值作为默认,props 中非 undefined 的值覆盖。\n *\n * @example\n * const cfg = useConfig('WdDataGrid', props)\n * cfg.value.withPager\n */\nexport function useConfig<T extends Record<string, any> = Record<string, any>>(\n componentName?: string,\n props?: T\n) {\n const configRef = shallowRef<T>(buildComponentConfig<T>(componentName, props))\n\n onMounted(() => {\n // onMounted 时 install 已完成、window.workDesktopConfig 已就绪,再读一次\n configRef.value = buildComponentConfig<T>(componentName, props)\n })\n\n return configRef\n}\n\n/**\n * 非响应式:直接取当前全局 WorkDesktopConfig\n */\nexport function useGlobalConfig(): WorkDesktopConfig {\n return getGlobalConfig()\n}\n\nfunction buildComponentConfig<T extends Record<string, any>>(\n componentName?: string,\n props?: T\n): T {\n const componentDefaults = componentName ? getComponentDefault(componentName) : {}\n const localProps: Record<string, any> = {}\n if (props) {\n for (const [k, v] of Object.entries(props)) {\n if (v !== undefined) localProps[k] = v\n }\n }\n // 优先级:componentDefault < 本地 props\n return deepMerge<T>({} as T, componentDefaults, localProps)\n}\n","<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":["useConfig","componentName","props","configRef","shallowRef","buildComponentConfig","onMounted","useGlobalConfig","getGlobalConfig","componentDefaults","getComponentDefault","localProps","k","v","deepMerge","__props","config","emit","__emit","currentController","abortActive","abortAndClear","doRequest","controller","reqOpts","result","method","request","e","watch","newVal","onUnmounted","_renderSlot","_ctx"],"mappings":";;AAkBO,SAASA,EACdC,GACAC,GACA;AACA,QAAMC,IAAYC,EAAcC,EAAwBJ,GAAeC,CAAK,CAAC;AAE7E,SAAAI,EAAU,MAAM;AAEd,IAAAH,EAAU,QAAQE,EAAwBJ,GAAeC,CAAK;AAAA,EAChE,CAAC,GAEMC;AACT;AAKO,SAASI,IAAqC;AACnD,SAAOC,EAAA;AACT;AAEA,SAASH,EACPJ,GACAC,GACG;AACH,QAAMO,IAAoBR,IAAgBS,EAAoBT,CAAa,IAAI,CAAA,GACzEU,IAAkC,CAAA;AACxC,MAAIT;AACF,eAAW,CAACU,GAAGC,CAAC,KAAK,OAAO,QAAQX,CAAK;AACvC,MAAIW,MAAM,WAAWF,EAAWC,CAAC,IAAIC;AAIzC,SAAOC,EAAa,CAAA,GAASL,GAAmBE,CAAU;AAC5D;;;;;;;;;;;;;ACDA,UAAMT,IAAQa,GAIRC,IAAShB,EAA+B,eAAeE,CAAK,GAW5De,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,GAAIR,EAAO,MAAM,cAAc,CAAA;AAAA,QAC/B,GAAId,EAAM,cAAc,CAAA;AAAA,QACxB,QAAQqB,EAAW;AAAA,MAAA;AAGrB,UAAI;AAKF,YAHAN,EAAK,cAAcG,CAAW,GAG1BG,EAAW,OAAO;AACpB;AAGF,YAAIE;AAEJ,cAAMC,KAAUxB,EAAM,UAAUc,EAAO,MAAM,UAAU,QAAQ,YAAA;AAQ/D,YANIU,MAAW,SAASA,MAAW,WACjCD,IAAS,MAAME,EAAQD,CAAM,EAAExB,EAAM,KAAKA,EAAM,QAAQsB,CAAO,IAE/DC,IAAS,MAAME,EAAQD,CAAM,EAAExB,EAAM,KAAKA,EAAM,QAAQsB,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,MAAM3B,EAAM;AAAA,MACZ,CAAC4B,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-DkLqAjug.mjs","sources":["../../src/lib/composables/useConfig.ts","../../src/components/core/Requester.vue"],"sourcesContent":["import { onMounted, shallowRef } from 'vue'\nimport { getGlobalConfig, getComponentDefault } from '../core/config'\nimport { deepMerge } from '../core/utils'\nimport type { WorkDesktopConfig } from '../../types/config'\n\n/**\n * useConfig(PRD 5.3 / 5.2)\n *\n * 组件内合并三级配置:全局 componentDefault[组件名] → 本地 props。\n * 全局配置在组件 onMounted 时读取一次并缓存(运行中改配置只影响新挂载组件)。\n *\n * 返回一个响应式 ref,merge 后的组件配置对象:\n * componentDefault 的值作为默认,props 中非 undefined 的值覆盖。\n *\n * @example\n * const cfg = useConfig('WdDataGrid', props)\n * cfg.value.withPager\n */\nexport function useConfig<T extends Record<string, any> = Record<string, any>>(\n componentName?: string,\n props?: T\n) {\n const configRef = shallowRef<T>(buildComponentConfig<T>(componentName, props))\n\n onMounted(() => {\n // onMounted 时 install 已完成、window.workDesktopConfig 已就绪,再读一次\n configRef.value = buildComponentConfig<T>(componentName, props)\n })\n\n return configRef\n}\n\n/**\n * 非响应式:直接取当前全局 WorkDesktopConfig\n */\nexport function useGlobalConfig(): WorkDesktopConfig {\n return getGlobalConfig()\n}\n\nfunction buildComponentConfig<T extends Record<string, any>>(\n componentName?: string,\n props?: T\n): T {\n const componentDefaults = componentName ? getComponentDefault(componentName) : {}\n const localProps: Record<string, any> = {}\n if (props) {\n for (const [k, v] of Object.entries(props)) {\n if (v !== undefined) localProps[k] = v\n }\n }\n // 优先级:componentDefault < 本地 props\n return deepMerge<T>({} as T, componentDefaults, localProps)\n}\n","<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":["useConfig","componentName","props","configRef","shallowRef","buildComponentConfig","onMounted","useGlobalConfig","getGlobalConfig","componentDefaults","getComponentDefault","localProps","k","v","deepMerge","__props","config","emit","__emit","currentController","abortActive","abortAndClear","doRequest","controller","reqOpts","result","method","request","e","watch","newVal","onUnmounted","_renderSlot","_ctx"],"mappings":";;AAkBO,SAASA,EACdC,GACAC,GACA;AACA,QAAMC,IAAYC,EAAcC,EAAwBJ,GAAeC,CAAK,CAAC;AAE7E,SAAAI,EAAU,MAAM;AAEd,IAAAH,EAAU,QAAQE,EAAwBJ,GAAeC,CAAK;AAAA,EAChE,CAAC,GAEMC;AACT;AAKO,SAASI,IAAqC;AACnD,SAAOC,EAAA;AACT;AAEA,SAASH,EACPJ,GACAC,GACG;AACH,QAAMO,IAAoBR,IAAgBS,EAAoBT,CAAa,IAAI,CAAA,GACzEU,IAAkC,CAAA;AACxC,MAAIT;AACF,eAAW,CAACU,GAAGC,CAAC,KAAK,OAAO,QAAQX,CAAK;AACvC,MAAIW,MAAM,WAAWF,EAAWC,CAAC,IAAIC;AAIzC,SAAOC,EAAa,CAAA,GAASL,GAAmBE,CAAU;AAC5D;;;;;;;;;;;;;ACDA,UAAMT,IAAQa,GAIRC,IAAShB,EAA+B,eAAeE,CAAK,GAW5De,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,GAAIR,EAAO,MAAM,cAAc,CAAA;AAAA,QAC/B,GAAId,EAAM,cAAc,CAAA;AAAA,QACxB,QAAQqB,EAAW;AAAA,MAAA;AAGrB,UAAI;AAKF,YAHAN,EAAK,cAAcG,CAAW,GAG1BG,EAAW,OAAO;AACpB;AAGF,YAAIE;AAEJ,cAAMC,KAAUxB,EAAM,UAAUc,EAAO,MAAM,UAAU,QAAQ,YAAA;AAQ/D,YANIU,MAAW,SAASA,MAAW,WACjCD,IAAS,MAAME,EAAQD,CAAM,EAAExB,EAAM,KAAKA,EAAM,QAAQsB,CAAO,IAE/DC,IAAS,MAAME,EAAQD,CAAM,EAAExB,EAAM,KAAKA,EAAM,QAAQsB,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,MAAM3B,EAAM;AAAA,MACZ,CAAC4B,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-BwRdHDPL.mjs";
3
+ import { u as O } from "./useOptionsLoader-DEVCYhrp.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-DlJ9U0nE.mjs.map
114
+ //# sourceMappingURL=Select-uvFy7_NU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Select-DlJ9U0nE.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-uvFy7_NU.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;;;;"}