workdesktop-ai 1.2.0 → 1.2.1

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 (173) hide show
  1. package/CHANGELOG.md +12 -0
  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-C_oyo6Dg.mjs +200 -0
  23. package/dist/chunks/Path-C_oyo6Dg.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-DLV19USa.mjs +780 -0
  33. package/dist/chunks/Station-DLV19USa.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 +124 -21
  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/upload/index.mjs +1 -1
  72. package/dist/viewer/index.mjs +1 -1
  73. package/llms.txt +69 -9
  74. package/package.json +6 -1
  75. package/dist/chunks/Station-CrMTjqfa.mjs +0 -796
  76. package/dist/chunks/Station-CrMTjqfa.mjs.map +0 -1
  77. package/dist/chunks/http-9ToPNkWJ.mjs.map +0 -1
  78. package/dist/types/src/components/buttons/ApiButton.vue.d.ts +0 -134
  79. package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +0 -169
  80. package/dist/types/src/components/buttons/DialogButton.vue.d.ts +0 -167
  81. package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +0 -186
  82. package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +0 -317
  83. package/dist/types/src/components/buttons/PromptButton.vue.d.ts +0 -180
  84. package/dist/types/src/components/buttons/RouteButton.vue.d.ts +0 -122
  85. package/dist/types/src/components/buttons/TipsButton.vue.d.ts +0 -66
  86. package/dist/types/src/components/buttons/useApiAction.d.ts +0 -20
  87. package/dist/types/src/components/common/props.d.ts +0 -122
  88. package/dist/types/src/components/containers/Drawer.vue.d.ts +0 -172
  89. package/dist/types/src/components/containers/Iframe.vue.d.ts +0 -81
  90. package/dist/types/src/components/containers/containerContext.d.ts +0 -15
  91. package/dist/types/src/components/containers/useContainerController.d.ts +0 -24
  92. package/dist/types/src/components/containers/useIframeContainer.d.ts +0 -20
  93. package/dist/types/src/components/core/Requester.vue.d.ts +0 -41
  94. package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +0 -542
  95. package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +0 -62
  96. package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +0 -586
  97. package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +0 -187
  98. package/dist/types/src/components/form/FormItem.vue.d.ts +0 -62
  99. package/dist/types/src/components/form/SearchItem.vue.d.ts +0 -62
  100. package/dist/types/src/components/form/SearchPanel.vue.d.ts +0 -167
  101. package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +0 -311
  102. package/dist/types/src/components/index.d.ts +0 -31
  103. package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +0 -166
  104. package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +0 -166
  105. package/dist/types/src/components/inputs/RadioList.vue.d.ts +0 -166
  106. package/dist/types/src/components/inputs/Select.vue.d.ts +0 -176
  107. package/dist/types/src/components/inputs/Switch.vue.d.ts +0 -116
  108. package/dist/types/src/components/inputs/useOptionsLoader.d.ts +0 -32
  109. package/dist/types/src/components/layout/Station.vue.d.ts +0 -302
  110. package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +0 -20
  111. package/dist/types/src/components/layout/types.d.ts +0 -54
  112. package/dist/types/src/components/styles/Panel.vue.d.ts +0 -94
  113. package/dist/types/src/components/styles/Tips.vue.d.ts +0 -60
  114. package/dist/types/src/components/upload/ImageUpload.vue.d.ts +0 -176
  115. package/dist/types/src/components/upload/Upload.vue.d.ts +0 -235
  116. package/dist/types/src/entries/api-button.d.ts +0 -9
  117. package/dist/types/src/entries/auto-complete.d.ts +0 -9
  118. package/dist/types/src/entries/checkbox-list.d.ts +0 -9
  119. package/dist/types/src/entries/components-map.d.ts +0 -8
  120. package/dist/types/src/entries/confirm-button.d.ts +0 -9
  121. package/dist/types/src/entries/data-form.d.ts +0 -9
  122. package/dist/types/src/entries/data-grid.d.ts +0 -9
  123. package/dist/types/src/entries/dialog-button.d.ts +0 -9
  124. package/dist/types/src/entries/drawer-button.d.ts +0 -9
  125. package/dist/types/src/entries/drawer.d.ts +0 -9
  126. package/dist/types/src/entries/editable-grid.d.ts +0 -9
  127. package/dist/types/src/entries/form-item.d.ts +0 -9
  128. package/dist/types/src/entries/iframe.d.ts +0 -9
  129. package/dist/types/src/entries/image-upload.d.ts +0 -9
  130. package/dist/types/src/entries/panel.d.ts +0 -9
  131. package/dist/types/src/entries/prompt-button.d.ts +0 -9
  132. package/dist/types/src/entries/radio-list.d.ts +0 -9
  133. package/dist/types/src/entries/requester.d.ts +0 -9
  134. package/dist/types/src/entries/route-button.d.ts +0 -9
  135. package/dist/types/src/entries/search-item.d.ts +0 -9
  136. package/dist/types/src/entries/search-panel.d.ts +0 -9
  137. package/dist/types/src/entries/select.d.ts +0 -9
  138. package/dist/types/src/entries/station.d.ts +0 -9
  139. package/dist/types/src/entries/switch.d.ts +0 -9
  140. package/dist/types/src/entries/tips-button.d.ts +0 -9
  141. package/dist/types/src/entries/tips.d.ts +0 -9
  142. package/dist/types/src/entries/upload.d.ts +0 -9
  143. package/dist/types/src/entries/viewer.d.ts +0 -9
  144. package/dist/types/src/index.d.ts +0 -23
  145. package/dist/types/src/lib/composables/useConfig.d.ts +0 -19
  146. package/dist/types/src/lib/composables/useDataGrid.d.ts +0 -69
  147. package/dist/types/src/lib/composables/useEventBus.d.ts +0 -16
  148. package/dist/types/src/lib/composables/useGlobalState.d.ts +0 -5
  149. package/dist/types/src/lib/composables/useRequest.d.ts +0 -42
  150. package/dist/types/src/lib/configs/default-config.d.ts +0 -6
  151. package/dist/types/src/lib/core/config.d.ts +0 -28
  152. package/dist/types/src/lib/core/http.d.ts +0 -100
  153. package/dist/types/src/lib/core/linkage.d.ts +0 -48
  154. package/dist/types/src/lib/core/skins/apple.d.ts +0 -3
  155. package/dist/types/src/lib/core/skins/business.d.ts +0 -3
  156. package/dist/types/src/lib/core/skins/chinese.d.ts +0 -3
  157. package/dist/types/src/lib/core/skins/cool.d.ts +0 -3
  158. package/dist/types/src/lib/core/skins/cyberpunk.d.ts +0 -3
  159. package/dist/types/src/lib/core/skins/default.d.ts +0 -3
  160. package/dist/types/src/lib/core/skins/fashion.d.ts +0 -3
  161. package/dist/types/src/lib/core/skins/flat.d.ts +0 -3
  162. package/dist/types/src/lib/core/skins/governance.d.ts +0 -3
  163. package/dist/types/src/lib/core/skins/index.d.ts +0 -15
  164. package/dist/types/src/lib/core/skins/tech-brain.d.ts +0 -5
  165. package/dist/types/src/lib/core/skins/tech.d.ts +0 -3
  166. package/dist/types/src/lib/core/skins/types.d.ts +0 -19
  167. package/dist/types/src/lib/core/station-linkage.d.ts +0 -41
  168. package/dist/types/src/lib/core/theme.d.ts +0 -11
  169. package/dist/types/src/lib/core/utils.d.ts +0 -28
  170. package/dist/types/src/lib/install.d.ts +0 -11
  171. package/dist/types/src/types/config.d.ts +0 -130
  172. package/dist/types/src/types/index.d.ts +0 -4
  173. package/dist/types/vite.config.d.ts +0 -7
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,UAAMA,IAAQC,GA8BRC,IAAOC,GAePC,IAAYC,EAAA,GACZC,IAAgBD;AAAA,MACpBL,EAAM,WAAW,IAAI,CAACO,OAAS,EAAE,MAAMA,EAAI,MAAM,GAAG,EAAE,IAAA,KAAS,SAAS,KAAAA,IAAM;AAAA,IAAA,GAE1EC,IAAgBH,EAAI,EAAK,GACzBI,IAAaJ,EAAI,CAAC;AAExB,IAAAK;AAAA,MACE,MAAMV,EAAM;AAAA,MACZ,CAACW,MAAQ;AACP,QAAAL,EAAc,QAAQK,EAAI,IAAI,CAACJ,OAAS,EAAE,MAAMA,EAAI,MAAM,GAAG,EAAE,IAAA,KAAS,SAAS,KAAAA,IAAM;AAAA,MACzF;AAAA,IAAA;AAIF,UAAMK,IAAgBC;AAAA,MAAS,MAC7BP,EAAc,MAAM,IAAI,CAACQ,MAAA;;AAAM,eAAAA,EAAE,SAAQC,IAAAD,EAAU,QAAV,gBAAAC,EAAe,QAAO;AAAA,OAAE,EAAE,OAAO,OAAO;AAAA,IAAA,GAI7EC,IAAUH,EAAS,MAAMP,EAAc,MAAM,UAAUN,EAAM,QAAQ,GAErEiB,IAAiBJ,EAAS,MAAM;AACpC,UAAI,CAACb,EAAM,IAAK,QAAO;AACvB,UAAI,eAAe,KAAKA,EAAM,GAAG,UAAUA,EAAM;AACjD,YAAMkB,IAASC,EAAA,EAAkB,QAAQ,aAAa;AACtD,aAAOD,IAAS,GAAGA,EAAO,QAAQ,OAAO,EAAE,CAAC,IAAIlB,EAAM,IAAI,QAAQ,OAAO,EAAE,CAAC,KAAKA,EAAM;AAAA,IACzF,CAAC;AAED,aAASoB,IAAY;AACnB,YAAMC,IAAOf,EAAc,MACxB,IAAI,CAACQ;;AAAM,eAAAA,EAAE,SAAQC,IAAAD,EAAU,QAAV,gBAAAC,EAAe,UAAQO,IAAAR,EAAU,QAAV,gBAAAQ,EAAe,SAAQ;AAAA,OAAE,EACrE,OAAO,OAAO;AACjB,MAAApB,EAAK,qBAAqBmB,CAAI,GAC9BnB,EAAK,UAAUmB,CAAI;AAAA,IACrB;AAEA,UAAME,IAA4C,CAACC,MAC5CA,EAAQ,KAAK,WAAW,QAAQ,IAIjCxB,EAAM,WAAWwB,EAAQ,OAAO,OAAO,OAAOxB,EAAM,WACtDyB,EAAU,MAAM,YAAYzB,EAAM,OAAO,IAAI,GACtC,OAETE,EAAK,aAAa,EAAE,KAAKF,EAAM,KAAK,MAAMwB,GAAS,GAC5C,OARLC,EAAU,MAAM,WAAW,GACpB,KAULC,IAAsC,CAACC,GAAUC,GAAYC,MAAgB;AACjF,YAAMC,IAAMX,EAAA,GACN,EAAE,UAAAY,GAAU,aAAAC,GAAa,UAAAC,EAAA,IAAaH,EAAI,SAAS,OACnDI,IAAOP,KAAA,gBAAAA,EAAWI,IAClBI,IAA2BD,KAAS,QAAQ,OAAO,MAAM,OAAOA,CAAI,CAAC,KAAK,OAAOA,CAAI,KAAKJ,EAAI,SAAS;AAG7G,UADEF,EAAmB,WAAWD,GAC5BQ,MAAMR,KAAA,QAAAA,EAAWM,KAAW;AAC9B,cAAMG,IAAUT,EAASM,CAAQ;AAC/B,QAAAL,EAAmB,MAAMQ,GACvBA,KAAW,OAAOA,KAAY,WAChCR,EAAW,MAAMA,EAAW,OAAOQ,EAAQ,OAAOA,EAAQ,OACjD,OAAOA,KAAY,aAC5BR,EAAW,MAAMQ;AAAA,MAErB;AAEA,MAAID,KACFjC,EAAK,WAAW,EAAE,UAAAyB,GAAU,MAAMC,GAAY,OAAOC,GAAa,GAClE3B,EAAK,cAAc,EAAE,MAAMyB,KAAA,gBAAAA,EAAWM,IAAW,KAAKN,GAAU,GAC5D3B,EAAM,uBAAqBqC,EAAgBrC,EAAM,qBAAqBA,EAAM,MAAM,MAEtFyB,EAAU,OAAME,KAAA,gBAAAA,EAAWK,OAAgB,MAAM,GAEjD1B,EAAc,QAAQA,EAAc,MAAM,OAAO,CAACQ,MAAMA,EAAE,QAAQc,EAAW,GAAG,GAChF1B,EAAK,SAAS,EAAE,UAAAyB,GAAU,MAAMC,GAAY,GAC5C1B,EAAK,WAAW,EAAE,MAAAgC,GAAM,SAASP,KAAA,gBAAAA,EAAWK,IAAc,IAE5D9B,EAAK,YAAY,EAAE,KAAKF,EAAM,KAAK,GACnCoB,EAAA;AAAA,IACF,GAEMkB,IAAkC,CAACC,GAAKX,MAAe;AAC3D,MAAAH,EAAU,MAAM,YAAY,GAC5BnB,EAAc,QAAQA,EAAc,MAAM,OAAO,CAACQ,MAAMA,EAAE,QAAQc,EAAW,GAAG,GAChF1B,EAAK,SAAS,EAAE,OAAOqC,GAAK,MAAMX,GAAY,GAC9C1B,EAAK,gBAAgB,EAAE,OAAOqC,GAAK,SAASA,KAAA,gBAAAA,EAAK,SAAS,GAC1DrC,EAAK,YAAY,EAAE,KAAKF,EAAM,KAAK,OAAOuC,GAAK,GAC/CnB,EAAA;AAAA,IACF,GAEMoB,IAA4C,OAAOZ,MAAe;;AACtE,UAAI;AACF,cAAMa,EAAa,QAAQ,YAAY,MAAM;AAAA,UAC3C,mBAAmB;AAAA,UACnB,kBAAkB;AAAA,UAClB,MAAM;AAAA,QAAA,CACP;AAAA,MACH,QAAQ;AACN,eAAO;AAAA,MACT;AAEA,YAAMC,IAAOd,EAAmB,OAAOA,GACjCe,KAASD,KAAA,gBAAAA,EAAM1C,EAAM,kBAAgBe,IAAAa,EAAW,aAAX,gBAAAb,EAA8Bf,EAAM;AAE/E,UAAIA,EAAM,aAAa2C,MAAW,UAAaA,MAAW,MAAM;AAC9D,QAAAzC,EAAK,aAAa,EAAE,KAAKF,EAAM,WAAW;AAC1C,YAAI;AACF,gBAAM4C,IAAQ,EAAE,CAAC5C,EAAM,UAAU,GAAG2C,EAAA,GAC9BE,IACJ7C,EAAM,iBAAiB,QACnB,MAAM8C,EAAQ,IAAI9C,EAAM,WAAW4C,CAAK,IACxC5C,EAAM,iBAAiB,WACrB,MAAM8C,EAAQ,OAAO9C,EAAM,WAAW4C,CAAK,IAC3C5C,EAAM,iBAAiB,QACrB,MAAM8C,EAAQ,IAAI9C,EAAM,WAAW4C,CAAK,IACxC,MAAME,EAAQ,KAAK9C,EAAM,WAAW4C,CAAK;AACnD,cAAIC,EAAO;AACT,YAAA3C,EAAK,kBAAkB,EAAE,MAAM0B,GAAY,MAAMiB,EAAO,MAAM,GAC9D3C,EAAK,cAAc,EAAE,MAAM2C,EAAO,MAAM,GACpC7C,EAAM,uBAAqBqC,EAAgBrC,EAAM,qBAAqBA,EAAM,MAAM;AAAA;AAEtF,mBAAAE,EAAK,WAAW,EAAE,MAAM2C,EAAO,MAAM,SAASA,EAAO,SAAS,GACvD;AAAA,QAEX,SAASE,GAAY;AACnB,iBAAA7C,EAAK,gBAAgB,EAAE,OAAA6C,GAAO,SAASA,KAAA,gBAAAA,EAAO,SAAS,GAChD;AAAA,QACT,UAAA;AACE,UAAA7C,EAAK,YAAY,EAAE,KAAKF,EAAM,WAAW;AAAA,QAC3C;AAAA,MACF;AACE,QAAAE,EAAK,kBAAkB,EAAE,MAAM0B,EAAA,CAAY;AAE7C,aAAO;AAAA,IACT,GAEMoB,IAAsC,CAACpB,MAAe;AAE1D,UADA1B,EAAK,WAAW,EAAE,MAAM0B,EAAA,CAAY,GAChC,CAAC5B,EAAM,QAAS;AACpB,YAAMiD,IAAMrC,EAAc,MAAM,UAAU,CAACL,MAAA;;AAAQ,eAAAA,OAASqB,EAAW,SAAQb,IAAAa,EAAmB,QAAnB,gBAAAb,EAAwB;AAAA,OAAI;AAC3G,MAAAN,EAAW,QAAQwC,KAAO,IAAIA,IAAM,IAAI,GACxCzC,EAAc,QAAQ;AAAA,IACxB;AAEA,aAAS0C,EAAmBC,GAAe;AACzC,MAAA1C,EAAW,QAAQ0C,IAAQ;AAAA,IAC7B;AAEA,UAAMC,IAAoC,MAAM;AAC9C,MAAA3B,EAAU,QAAQ,QAAQzB,EAAM,QAAQ,MAAM,GAC9CE,EAAK,UAAU,EAAE,UAAUF,EAAM,UAAU;AAAA,IAC7C;AAEA,aAASqD,IAAa;;AACpB,OAAAtC,IAAAX,EAAU,UAAV,QAAAW,EAAiB,cACjBT,EAAc,QAAQ,CAAA,GACtBc,EAAA;AAAA,IACF;AAEA,WAAAkC,EAAa,EAAE,YAAAD,GAAY,WAAAjD,GAAW;;kBA5PpCmD,EA+BM,OAAA;AAAA,QA/BD,OAAKC,EAAA,CAAC,mBAAiB,EAAA,eAA0BxC,EAAA,OAAO,CAAA;AAAA,MAAA;QAC3DyC,EAoBYC,GApBZC,EAoBY;AAAA,mBAnBN;AAAA,UAAJ,KAAIvD;AAAA,UACH,QAAQa,EAAA;AAAA,UACT,aAAU;AAAA,UACT,QAAQhB,EAAA,UAAM;AAAA,UACd,OAAOA,EAAA;AAAA,UACP,UAAUA,EAAA,WAAQ;AAAA,UACX,aAAWK,EAAA;AAAA,sDAAAA,EAAa,QAAAsD;AAAA,UAC/B,iBAAerC;AAAA,UACf,iBAAeiB;AAAA,UACf,cAAYd;AAAA,UACZ,YAAUY;AAAA,UACV,cAAYU;AAAA,UACZ,aAAWI;AAAA,QAAA,GACJS,EAAAA,MAAM,GAAA;AAAA,UAGH,OACT,MAAsD;AAAA,YAA3C5D,EAAA,YAAXsD,EAAsD,OAAtDO,IAAsDC,EAAZ9D,EAAA,GAAG,GAAA,CAAA;;qBAF/C,MAA2B;AAAA,YAA3BwD,EAA2BO,GAAA,MAAA;AAAA,yBAAlB,MAAQ;AAAA,gBAARP,EAAQQ,EAAAC,CAAA,CAAA;AAAA,cAAA;;;;;;QAQXjE,EAAA,WAAWO,EAAA,cADnB2D,EAMEC,GAAA;AAAA;UAJC,YAAUxD,EAAA;AAAA,UACV,iBAAeH,EAAA,QAAU;AAAA,UACzB,gCAAOD,EAAA,QAAa;AAAA,UACpB,UAAQ0C;AAAA,QAAA;;;;;"}
1
+ {"version":3,"file":"ImageUpload-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":"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"}
@@ -0,0 +1,200 @@
1
+ import { defineComponent as Z, getCurrentInstance as ee, computed as d, ref as _, watch as f, onMounted as te, onUnmounted as ne, resolveComponent as S, openBlock as p, createElementBlock as V, createVNode as oe, withCtx as w, Fragment as re, renderList as ie, createBlock as x, normalizeClass as ce, resolveDynamicComponent as ae, createCommentVNode as le, createTextVNode as ue, toDisplayString as se } from "vue";
2
+ import * as me from "@element-plus/icons-vue";
3
+ import { f as de } from "./props-DAytpx7D.mjs";
4
+ import { b as q, g as fe } from "./station-linkage-D54-_iyL.mjs";
5
+ import { _ as pe } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
6
+ const he = { class: "wd-path" }, ve = /* @__PURE__ */ Z({
7
+ name: "WdPath",
8
+ __name: "Path",
9
+ props: {
10
+ ...de,
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
+ /** 标题扫描范围:CSS 选择器或元素;默认最近的 Station 内容区(.wd-station__content),无则整页 */
22
+ container: { type: [String, Object], default: void 0 }
23
+ },
24
+ emits: ["change", "item-click"],
25
+ setup($, { expose: D, emit: j }) {
26
+ const t = $, E = j, c = ee(), F = d(() => {
27
+ var n, o;
28
+ const e = (o = (n = c == null ? void 0 : c.appContext) == null ? void 0 : n.config) == null ? void 0 : o.globalProperties;
29
+ return !!(e != null && e.$router);
30
+ });
31
+ function J() {
32
+ if (!t.items) return [];
33
+ if (typeof t.items == "string")
34
+ try {
35
+ return JSON.parse(t.items);
36
+ } catch (e) {
37
+ return console.error("[WorkDesktop] WdPath items JSON 解析失败,已回退空路径:", e), [];
38
+ }
39
+ return t.items;
40
+ }
41
+ const h = _(null), P = _([]), b = _([]), v = _(-1);
42
+ function A() {
43
+ var o;
44
+ const e = (o = c == null ? void 0 : c.proxy) == null ? void 0 : o.$el;
45
+ if (t.container) {
46
+ if (typeof t.container == "string") {
47
+ const r = document.querySelector(t.container);
48
+ if (r) return r;
49
+ } else if (t.container.nodeType === 1)
50
+ return t.container;
51
+ }
52
+ return (e == null ? void 0 : e.closest(".wd-station__content")) || document.body;
53
+ }
54
+ function z() {
55
+ const e = h.value || document.body, n = [];
56
+ return e.querySelectorAll("h1,h2,h3,h4").forEach((o) => {
57
+ const r = (o.textContent || "").trim();
58
+ r && n.push({ el: o, level: Number(o.tagName.charAt(1)), title: r });
59
+ }), n;
60
+ }
61
+ function U(e, n) {
62
+ const o = [];
63
+ for (let r = 0; r <= n; r++) {
64
+ const l = e[r];
65
+ for (; o.length && o[o.length - 1].level >= l.level; ) o.pop();
66
+ o.push(l);
67
+ }
68
+ return o.map((r) => ({ title: r.title, source: "heading", level: r.level }));
69
+ }
70
+ function I(e) {
71
+ return e === document.body || e === document.documentElement;
72
+ }
73
+ function N() {
74
+ const e = b.value;
75
+ if (!e.length) return -1;
76
+ const n = h.value || document.body, o = n.getBoundingClientRect(), r = I(n) ? window.scrollY || document.documentElement.scrollTop : n.scrollTop;
77
+ let l = e.length - 1;
78
+ for (let i = 0; i < e.length; i++)
79
+ if (e[i].el.getBoundingClientRect().top - o.top + r >= r - 1) {
80
+ l = i;
81
+ break;
82
+ }
83
+ return l;
84
+ }
85
+ function g() {
86
+ P.value = fe(!0, t.filter).map((e) => ({
87
+ ...e,
88
+ source: "menu"
89
+ }));
90
+ }
91
+ function B() {
92
+ b.value = z(), v.value = N();
93
+ }
94
+ function u() {
95
+ if (t.mode !== "auto") {
96
+ C();
97
+ return;
98
+ }
99
+ g(), B(), C();
100
+ }
101
+ const Y = d(() => {
102
+ const e = b.value;
103
+ return e.length ? v.value >= 0 ? U(e, v.value) : [] : [];
104
+ }), y = d(() => t.mode === "auto" ? [...t.showHome ? [{ title: t.home, source: "home" }] : [], ...P.value, ...Y.value] : J().map((e) => ({ ...e, source: e.source || "manual" }))), G = d(
105
+ () => y.value.map((e, n) => ({ ...e, key: `${e.source || "seg"}:${n}:${e.title}` }))
106
+ );
107
+ let R = "";
108
+ function C() {
109
+ const e = y.value.map((n) => `${n.level ?? ""}:${n.title}`).join("|");
110
+ e !== R && (R = e, E("change", y.value));
111
+ }
112
+ f(y, () => C());
113
+ let k = !1;
114
+ function H() {
115
+ t.mode !== "auto" || k || (k = !0, requestAnimationFrame(() => {
116
+ k = !1, t.mode === "auto" && (v.value = N());
117
+ }));
118
+ }
119
+ let s = null, m = null;
120
+ function M(e) {
121
+ O(), h.value = e, m = I(e) ? window : e, m.addEventListener("scroll", H, { passive: !0 }), typeof MutationObserver < "u" && (s = new MutationObserver(() => {
122
+ t.mode === "auto" && B();
123
+ }), s.observe(e, { childList: !0, subtree: !0 }));
124
+ }
125
+ function O() {
126
+ h.value = null, m == null || m.removeEventListener("scroll", H), m = null, s == null || s.disconnect(), s = null;
127
+ }
128
+ function K(e) {
129
+ E("item-click", e);
130
+ }
131
+ function T(e) {
132
+ return e ? typeof e == "string" ? me[e] || null : e : null;
133
+ }
134
+ let a = null;
135
+ function W() {
136
+ t.mode === "auto" && (a = q(t.filter, g), M(A()), u());
137
+ }
138
+ function L() {
139
+ O(), a == null || a(), a = null;
140
+ }
141
+ te(() => {
142
+ W(), u();
143
+ }), f(
144
+ () => t.mode,
145
+ (e) => {
146
+ e === "auto" ? W() : (L(), u());
147
+ }
148
+ ), f(
149
+ () => t.filter,
150
+ () => {
151
+ t.mode === "auto" && (a == null || a(), a = q(t.filter, g), g());
152
+ }
153
+ ), f(
154
+ () => t.container,
155
+ () => {
156
+ t.mode === "auto" && M(A()), u();
157
+ }
158
+ );
159
+ const Q = d(() => {
160
+ var e, n;
161
+ return (n = (e = c == null ? void 0 : c.proxy) == null ? void 0 : e.$route) == null ? void 0 : n.path;
162
+ });
163
+ return f(Q, () => {
164
+ t.mode === "auto" && u();
165
+ }), ne(() => L()), D({ refresh: u }), (e, n) => {
166
+ const o = S("el-icon"), r = S("el-breadcrumb-item"), l = S("el-breadcrumb");
167
+ return p(), V("div", he, [
168
+ oe(l, { separator: $.separator }, {
169
+ default: w(() => [
170
+ (p(!0), V(re, null, ie(G.value, (i) => (p(), x(r, {
171
+ key: i.key,
172
+ class: ce({ "is-heading": i.source === "heading", "is-active": i.source === "heading" || i.source === "home" }),
173
+ to: i.path && F.value ? { path: i.path } : void 0,
174
+ onClick: (X) => K(i)
175
+ }, {
176
+ default: w(() => [
177
+ T(i.icon) ? (p(), x(o, {
178
+ key: 0,
179
+ class: "wd-path__icon"
180
+ }, {
181
+ default: w(() => [
182
+ (p(), x(ae(T(i.icon))))
183
+ ]),
184
+ _: 2
185
+ }, 1024)) : le("", !0),
186
+ ue(" " + se(i.title), 1)
187
+ ]),
188
+ _: 2
189
+ }, 1032, ["class", "to", "onClick"]))), 128))
190
+ ]),
191
+ _: 1
192
+ }, 8, ["separator"])
193
+ ]);
194
+ };
195
+ }
196
+ }), ke = /* @__PURE__ */ pe(ve, [["__scopeId", "data-v-1d53e66a"]]);
197
+ export {
198
+ ke as W
199
+ };
200
+ //# sourceMappingURL=Path-C_oyo6Dg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Path-C_oyo6Dg.mjs","sources":["../../src/components/styles/Path.vue"],"sourcesContent":["<template>\n <div class=\"wd-path\">\n <el-breadcrumb :separator=\"separator\">\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 </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 /** 标题扫描范围: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/** 大纲链:以 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 headings.value = collectHeadings()\n activeIndex.value = computeActiveIndex()\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(() => {\n if (props.mode === 'auto') 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 max-width: 260px;\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</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","buildChain","list","end","stack","i","h","isPageContainer","computeActiveIndex","cRect","scrollTop","active","refreshMenuChain","getStationMenuChain","c","refreshHeadings","refresh","emitChange","displayHeadings","segments","it","segmentViews","s","lastSig","sig","watch","scrollTicking","onScroll","observer","scrollTarget","bindContainer","unbindContainer","onSegmentClick","seg","resolveIcon","icon","ElIcons","unsub","bindAuto","subscribeStationChange","unbindAuto","onMounted","mode","routePath","onUnmounted","__expose","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_component_el_breadcrumb","_Fragment","_renderList","_createBlock","_component_el_breadcrumb_item","_normalizeClass","$event","_component_el_icon","_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":"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"}
@@ -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;;;;"}