workdesktop-ai 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/CHANGELOG.md +155 -61
  2. package/README.md +123 -25
  3. package/dist/api-button/index.mjs +7 -0
  4. package/dist/api-button/index.mjs.map +1 -0
  5. package/dist/assets/Select-CNzSyvlZ.css +1 -0
  6. package/dist/auto-complete/index.mjs +7 -0
  7. package/dist/auto-complete/index.mjs.map +1 -0
  8. package/dist/auto-complete/style.css +1 -0
  9. package/dist/base.css +1 -0
  10. package/dist/checkbox-list/index.mjs +7 -0
  11. package/dist/checkbox-list/index.mjs.map +1 -0
  12. package/dist/checkbox-list/style.css +1 -0
  13. package/dist/chunks/ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.mjs +80 -0
  14. package/dist/chunks/ApiButton.vue_vue_type_script_setup_true_lang-CweWFfDE.mjs.map +1 -0
  15. package/dist/chunks/AutoComplete-B_L169hU.mjs +80 -0
  16. package/dist/chunks/AutoComplete-B_L169hU.mjs.map +1 -0
  17. package/dist/chunks/CheckboxList-bPqpbd8d.mjs +129 -0
  18. package/dist/chunks/CheckboxList-bPqpbd8d.mjs.map +1 -0
  19. package/dist/chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-DpdMPkka.mjs +99 -0
  20. package/dist/chunks/ConfirmButton.vue_vue_type_script_setup_true_lang-DpdMPkka.mjs.map +1 -0
  21. package/dist/chunks/DataForm-C6UW92Ds.mjs +305 -0
  22. package/dist/chunks/DataForm-C6UW92Ds.mjs.map +1 -0
  23. package/dist/chunks/DataGrid-BhgND4G_.mjs +1124 -0
  24. package/dist/chunks/DataGrid-BhgND4G_.mjs.map +1 -0
  25. package/dist/chunks/DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs +117 -0
  26. package/dist/chunks/DialogButton.vue_vue_type_script_setup_true_lang-CTXP79zc.mjs.map +1 -0
  27. package/dist/chunks/Drawer-ucXKUecL.mjs +259 -0
  28. package/dist/chunks/Drawer-ucXKUecL.mjs.map +1 -0
  29. package/dist/chunks/DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs +125 -0
  30. package/dist/chunks/DrawerButton.vue_vue_type_script_setup_true_lang-DUda4p7_.mjs.map +1 -0
  31. package/dist/chunks/EditableGrid-Cx7ScWkW.mjs +1783 -0
  32. package/dist/chunks/EditableGrid-Cx7ScWkW.mjs.map +1 -0
  33. package/dist/chunks/FormItem-C1q0opnk.mjs +79 -0
  34. package/dist/chunks/FormItem-C1q0opnk.mjs.map +1 -0
  35. package/dist/chunks/Iframe-CeSiMnvR.mjs +65 -0
  36. package/dist/chunks/Iframe-CeSiMnvR.mjs.map +1 -0
  37. package/dist/chunks/ImageUpload-D3JGJjVO.mjs +193 -0
  38. package/dist/chunks/ImageUpload-D3JGJjVO.mjs.map +1 -0
  39. package/dist/chunks/Panel-d4chdlTA.mjs +113 -0
  40. package/dist/chunks/Panel-d4chdlTA.mjs.map +1 -0
  41. package/dist/chunks/PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.mjs +118 -0
  42. package/dist/chunks/PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.mjs.map +1 -0
  43. package/dist/chunks/RadioList-DT-8WSN2.mjs +129 -0
  44. package/dist/chunks/RadioList-DT-8WSN2.mjs.map +1 -0
  45. package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-5B1V-53c.mjs +80 -0
  46. package/dist/chunks/Requester.vue_vue_type_script_setup_true_lang-5B1V-53c.mjs.map +1 -0
  47. package/dist/chunks/RouteButton.vue_vue_type_script_setup_true_lang-Da0D3tKA.mjs +73 -0
  48. package/dist/chunks/RouteButton.vue_vue_type_script_setup_true_lang-Da0D3tKA.mjs.map +1 -0
  49. package/dist/chunks/SearchItem-pFO57lEO.mjs +79 -0
  50. package/dist/chunks/SearchItem-pFO57lEO.mjs.map +1 -0
  51. package/dist/chunks/SearchPanel-xQ1hPaNq.mjs +158 -0
  52. package/dist/chunks/SearchPanel-xQ1hPaNq.mjs.map +1 -0
  53. package/dist/chunks/Select-CMw-tWYm.mjs +114 -0
  54. package/dist/chunks/Select-CMw-tWYm.mjs.map +1 -0
  55. package/dist/chunks/Station-BF_QlQ8c.mjs +796 -0
  56. package/dist/chunks/Station-BF_QlQ8c.mjs.map +1 -0
  57. package/dist/chunks/Switch.vue_vue_type_script_setup_true_lang-CCU_d3jW.mjs +71 -0
  58. package/dist/chunks/Switch.vue_vue_type_script_setup_true_lang-CCU_d3jW.mjs.map +1 -0
  59. package/dist/chunks/Tips-IWCZcR1K.mjs +63 -0
  60. package/dist/chunks/Tips-IWCZcR1K.mjs.map +1 -0
  61. package/dist/chunks/TipsButton.vue_vue_type_script_setup_true_lang-DvcpRSV1.mjs +51 -0
  62. package/dist/chunks/TipsButton.vue_vue_type_script_setup_true_lang-DvcpRSV1.mjs.map +1 -0
  63. package/dist/chunks/Upload.vue_vue_type_script_setup_true_lang-CkxGO85H.mjs +200 -0
  64. package/dist/chunks/Upload.vue_vue_type_script_setup_true_lang-CkxGO85H.mjs.map +1 -0
  65. package/dist/chunks/Viewer-COLbtcgF.mjs +381 -0
  66. package/dist/chunks/Viewer-COLbtcgF.mjs.map +1 -0
  67. package/dist/chunks/_plugin-vue_export-helper-CHgC5LLL.mjs +10 -0
  68. package/dist/chunks/_plugin-vue_export-helper-CHgC5LLL.mjs.map +1 -0
  69. package/dist/chunks/containerContext-BgphFDeH.mjs +13 -0
  70. package/dist/chunks/containerContext-BgphFDeH.mjs.map +1 -0
  71. package/dist/chunks/http-DUPsbs2K.mjs +2951 -0
  72. package/dist/chunks/http-DUPsbs2K.mjs.map +1 -0
  73. package/dist/chunks/linkage-FbL1mcz3.mjs +66 -0
  74. package/dist/chunks/linkage-FbL1mcz3.mjs.map +1 -0
  75. package/dist/chunks/props-DAytpx7D.mjs +65 -0
  76. package/dist/chunks/props-DAytpx7D.mjs.map +1 -0
  77. package/dist/chunks/useApiAction-C1CdKGjt.mjs +30 -0
  78. package/dist/chunks/useApiAction-C1CdKGjt.mjs.map +1 -0
  79. package/dist/chunks/useColumnSettings-BDtF5-8R.mjs +216 -0
  80. package/dist/chunks/useColumnSettings-BDtF5-8R.mjs.map +1 -0
  81. package/dist/chunks/useOptionsLoader-D0RTB_ar.mjs +64 -0
  82. package/dist/chunks/useOptionsLoader-D0RTB_ar.mjs.map +1 -0
  83. package/dist/confirm-button/index.mjs +7 -0
  84. package/dist/confirm-button/index.mjs.map +1 -0
  85. package/dist/data-form/index.mjs +7 -0
  86. package/dist/data-form/index.mjs.map +1 -0
  87. package/dist/data-form/style.css +1 -0
  88. package/dist/data-grid/index.mjs +7 -0
  89. package/dist/data-grid/index.mjs.map +1 -0
  90. package/dist/data-grid/style.css +1 -0
  91. package/dist/dialog-button/index.mjs +7 -0
  92. package/dist/dialog-button/index.mjs.map +1 -0
  93. package/dist/drawer/index.mjs +7 -0
  94. package/dist/drawer/index.mjs.map +1 -0
  95. package/dist/drawer/style.css +1 -0
  96. package/dist/drawer-button/index.mjs +7 -0
  97. package/dist/drawer-button/index.mjs.map +1 -0
  98. package/dist/editable-grid/index.mjs +7 -0
  99. package/dist/editable-grid/index.mjs.map +1 -0
  100. package/dist/editable-grid/style.css +1 -0
  101. package/dist/form-item/index.mjs +7 -0
  102. package/dist/form-item/index.mjs.map +1 -0
  103. package/dist/form-item/style.css +1 -0
  104. package/dist/iframe/index.mjs +7 -0
  105. package/dist/iframe/index.mjs.map +1 -0
  106. package/dist/iframe/style.css +1 -0
  107. package/dist/image-upload/index.mjs +7 -0
  108. package/dist/image-upload/index.mjs.map +1 -0
  109. package/dist/image-upload/style.css +1 -0
  110. package/dist/index.esm.js +318 -6474
  111. package/dist/index.esm.js.map +1 -1
  112. package/dist/index.umd.js +20 -9
  113. package/dist/index.umd.js.map +1 -1
  114. package/dist/panel/index.mjs +7 -0
  115. package/dist/panel/index.mjs.map +1 -0
  116. package/dist/panel/style.css +1 -0
  117. package/dist/prompt-button/index.mjs +7 -0
  118. package/dist/prompt-button/index.mjs.map +1 -0
  119. package/dist/radio-list/index.mjs +7 -0
  120. package/dist/radio-list/index.mjs.map +1 -0
  121. package/dist/radio-list/style.css +1 -0
  122. package/dist/requester/index.mjs +7 -0
  123. package/dist/requester/index.mjs.map +1 -0
  124. package/dist/route-button/index.mjs +7 -0
  125. package/dist/route-button/index.mjs.map +1 -0
  126. package/dist/search-item/index.mjs +7 -0
  127. package/dist/search-item/index.mjs.map +1 -0
  128. package/dist/search-item/style.css +1 -0
  129. package/dist/search-panel/index.mjs +7 -0
  130. package/dist/search-panel/index.mjs.map +1 -0
  131. package/dist/search-panel/style.css +1 -0
  132. package/dist/select/index.mjs +7 -0
  133. package/dist/select/index.mjs.map +1 -0
  134. package/dist/station/index.mjs +7 -0
  135. package/dist/station/index.mjs.map +1 -0
  136. package/dist/station/style.css +1 -0
  137. package/dist/style.css +1 -1
  138. package/dist/switch/index.mjs +7 -0
  139. package/dist/switch/index.mjs.map +1 -0
  140. package/dist/tips/index.mjs +7 -0
  141. package/dist/tips/index.mjs.map +1 -0
  142. package/dist/tips/style.css +1 -0
  143. package/dist/tips-button/index.mjs +7 -0
  144. package/dist/tips-button/index.mjs.map +1 -0
  145. package/dist/types/src/components/buttons/ApiButton.vue.d.ts +41 -3
  146. package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +43 -5
  147. package/dist/types/src/components/buttons/DialogButton.vue.d.ts +89 -29
  148. package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +99 -31
  149. package/dist/types/src/components/buttons/PopconfirmButton.vue.d.ts +317 -0
  150. package/dist/types/src/components/buttons/PromptButton.vue.d.ts +51 -11
  151. package/dist/types/src/components/buttons/RouteButton.vue.d.ts +40 -2
  152. package/dist/types/src/components/buttons/TipsButton.vue.d.ts +14 -12
  153. package/dist/types/src/components/common/props.d.ts +37 -0
  154. package/dist/types/src/components/containers/Drawer.vue.d.ts +61 -8
  155. package/dist/types/src/components/containers/Iframe.vue.d.ts +39 -2
  156. package/dist/types/src/components/containers/containerContext.d.ts +1 -1
  157. package/dist/types/src/components/containers/useContainerController.d.ts +5 -0
  158. package/dist/types/src/components/containers/useIframeContainer.d.ts +20 -0
  159. package/dist/types/src/components/core/Requester.vue.d.ts +41 -0
  160. package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +212 -5
  161. package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +14 -0
  162. package/dist/types/src/components/data/editable-grid/EditableGrid.vue.d.ts +586 -0
  163. package/dist/types/src/components/data/viewer/Viewer.vue.d.ts +187 -0
  164. package/dist/types/src/components/form/FormItem.vue.d.ts +62 -0
  165. package/dist/types/src/components/form/SearchItem.vue.d.ts +62 -0
  166. package/dist/types/src/components/{containers → form}/SearchPanel.vue.d.ts +17 -2
  167. package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +6 -6
  168. package/dist/types/src/components/index.d.ts +10 -6
  169. package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +12 -3
  170. package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +28 -3
  171. package/dist/types/src/components/inputs/RadioList.vue.d.ts +28 -3
  172. package/dist/types/src/components/inputs/Select.vue.d.ts +11 -1
  173. package/dist/types/src/components/inputs/Switch.vue.d.ts +2 -2
  174. package/dist/types/src/components/inputs/useOptionsLoader.d.ts +3 -0
  175. package/dist/types/src/components/layout/Station.vue.d.ts +302 -0
  176. package/dist/types/src/components/layout/StationMenuNode.vue.d.ts +20 -0
  177. package/dist/types/src/components/layout/types.d.ts +54 -0
  178. package/dist/types/src/components/styles/Panel.vue.d.ts +47 -5
  179. package/dist/types/src/components/upload/ImageUpload.vue.d.ts +9 -9
  180. package/dist/types/src/components/upload/Upload.vue.d.ts +1 -1
  181. package/dist/types/src/entries/api-button.d.ts +9 -0
  182. package/dist/types/src/entries/auto-complete.d.ts +9 -0
  183. package/dist/types/src/entries/checkbox-list.d.ts +9 -0
  184. package/dist/types/src/entries/components-map.d.ts +8 -0
  185. package/dist/types/src/entries/confirm-button.d.ts +9 -0
  186. package/dist/types/src/entries/data-form.d.ts +9 -0
  187. package/dist/types/src/entries/data-grid.d.ts +9 -0
  188. package/dist/types/src/entries/dialog-button.d.ts +9 -0
  189. package/dist/types/src/entries/drawer-button.d.ts +9 -0
  190. package/dist/types/src/entries/drawer.d.ts +9 -0
  191. package/dist/types/src/entries/editable-grid.d.ts +9 -0
  192. package/dist/types/src/entries/form-item.d.ts +9 -0
  193. package/dist/types/src/entries/iframe.d.ts +9 -0
  194. package/dist/types/src/entries/image-upload.d.ts +9 -0
  195. package/dist/types/src/entries/panel.d.ts +9 -0
  196. package/dist/types/src/entries/prompt-button.d.ts +9 -0
  197. package/dist/types/src/entries/radio-list.d.ts +9 -0
  198. package/dist/types/src/entries/requester.d.ts +9 -0
  199. package/dist/types/src/entries/route-button.d.ts +9 -0
  200. package/dist/types/src/entries/search-item.d.ts +9 -0
  201. package/dist/types/src/entries/search-panel.d.ts +9 -0
  202. package/dist/types/src/entries/select.d.ts +9 -0
  203. package/dist/types/src/entries/station.d.ts +9 -0
  204. package/dist/types/src/entries/switch.d.ts +9 -0
  205. package/dist/types/src/entries/tips-button.d.ts +9 -0
  206. package/dist/types/src/entries/tips.d.ts +9 -0
  207. package/dist/types/src/entries/upload.d.ts +9 -0
  208. package/dist/types/src/entries/viewer.d.ts +9 -0
  209. package/dist/types/src/index.d.ts +2 -1
  210. package/dist/types/src/lib/composables/useConfig.d.ts +1 -1
  211. package/dist/types/src/lib/composables/useDataGrid.d.ts +15 -0
  212. package/dist/types/src/lib/core/http.d.ts +21 -4
  213. package/dist/types/src/lib/core/station-linkage.d.ts +41 -0
  214. package/dist/types/src/types/config.d.ts +21 -4
  215. package/dist/types/vite.config.d.ts +6 -1
  216. package/dist/upload/index.mjs +7 -0
  217. package/dist/upload/index.mjs.map +1 -0
  218. package/dist/viewer/index.mjs +7 -0
  219. package/dist/viewer/index.mjs.map +1 -0
  220. package/dist/viewer/style.css +1 -0
  221. package/package.json +199 -68
  222. package/dist/types/src/components/containers/Dialog.vue.d.ts +0 -112
  223. package/dist/types/src/components/data/editable-table/EditableTable.vue.d.ts +0 -306
  224. package/dist/types/src/components/utils/Viewer.vue.d.ts +0 -131
@@ -0,0 +1,193 @@
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
+ import { Plus as Y } from "@element-plus/icons-vue";
3
+ import { ElMessage as f, ElMessageBox as Z } from "element-plus";
4
+ import { a as _, r as p } from "./http-DUPsbs2K.mjs";
5
+ import { r as D } from "./linkage-FbL1mcz3.mjs";
6
+ import { h as F, f as ee } from "./props-DAytpx7D.mjs";
7
+ import { _ as te } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
8
+ const ae = {
9
+ key: 0,
10
+ class: "el-upload__tip"
11
+ }, ie = /* @__PURE__ */ L({
12
+ name: "WdImageUpload",
13
+ inheritAttrs: !1,
14
+ __name: "ImageUpload",
15
+ props: {
16
+ ...ee,
17
+ ...F,
18
+ /** 上传地址 */
19
+ api: { type: String, default: "" },
20
+ /** 后端删除地址 */
21
+ deleteApi: { type: String, default: "" },
22
+ /** 删除请求方法 */
23
+ deleteMethod: {
24
+ type: String,
25
+ default: "post"
26
+ },
27
+ /** 删除主键字段 */
28
+ primaryKey: { type: String, default: "id" },
29
+ /** 最大图片数量,超限隐藏加号 */
30
+ maxCount: { type: Number, default: 8 },
31
+ /** 缩略图尺寸(px,兼容属性式字符串写法) */
32
+ thumbnailSize: { type: [Number, String], default: 100 },
33
+ /** 是否点击缩略图大图预览 */
34
+ preview: { type: Boolean, default: !0 },
35
+ /** 接收类型,默认 image/* */
36
+ accept: { type: String, default: "" },
37
+ /** 单图大小限制(MB) */
38
+ maxSize: { type: Number, default: 5 },
39
+ /** 提示文案 */
40
+ tip: { type: String, default: "" },
41
+ /** v-model:已上传图片地址数组 */
42
+ modelValue: { type: Array, default: () => [] }
43
+ },
44
+ emits: [
45
+ "update:modelValue",
46
+ "change",
47
+ "success",
48
+ "error",
49
+ "delete-success",
50
+ "preview",
51
+ "exceed",
52
+ "apiBefore",
53
+ "apiSuccess",
54
+ "apiFail",
55
+ "apiException",
56
+ "apiAfter"
57
+ ],
58
+ setup(s, { expose: E, emit: M }) {
59
+ T((e) => ({
60
+ v77fac144: s.thumbnailSize + "px"
61
+ }));
62
+ const t = s, i = M, g = m(), u = m(
63
+ t.modelValue.map((e) => ({ name: e.split("/").pop() || "image", url: e }))
64
+ ), v = m(!1), y = m(1);
65
+ j(
66
+ () => t.modelValue,
67
+ (e) => {
68
+ u.value = e.map((a) => ({ name: a.split("/").pop() || "image", url: a }));
69
+ }
70
+ );
71
+ const z = w(
72
+ () => u.value.map((e) => {
73
+ var a;
74
+ return e.url || ((a = e.biz) == null ? void 0 : a.url) || "";
75
+ }).filter(Boolean)
76
+ ), P = w(() => u.value.length >= t.maxCount), R = w(() => {
77
+ if (!t.api) return "#";
78
+ if (/^https?:\/\//.test(t.api)) return t.api;
79
+ const e = _().request.urlPrefix || "";
80
+ return e ? `${e.replace(/\/$/, "")}/${t.api.replace(/^\//, "")}` : t.api;
81
+ });
82
+ function x() {
83
+ const e = u.value.map((a) => {
84
+ var r, l;
85
+ return a.url || ((r = a.biz) == null ? void 0 : r.url) || ((l = a.biz) == null ? void 0 : l.path) || "";
86
+ }).filter(Boolean);
87
+ i("update:modelValue", e), i("change", e);
88
+ }
89
+ const k = (e) => e.type.startsWith("image/") ? t.maxSize && e.size / 1024 / 1024 > t.maxSize ? (f.error(`图片大小不能超过 ${t.maxSize}MB`), !1) : (i("apiBefore", { url: t.api, file: e }), !0) : (f.error("仅支持上传图片文件"), !1), $ = (e, a, r) => {
90
+ const l = _(), { codeName: o, messageName: n, dataName: h } = l.response.props, d = e == null ? void 0 : e[o], B = d == null || Number.isNaN(Number(d)) || Number(d) >= l.response.successCode;
91
+ if (a.response = e, B && (e != null && e[h])) {
92
+ const c = e[h];
93
+ a.biz = c, c && typeof c == "object" ? a.url = a.url || c.url || c.path : typeof c == "string" && (a.url = c);
94
+ }
95
+ B ? (i("success", { response: e, file: a, files: r }), i("apiSuccess", { data: e == null ? void 0 : e[h], raw: e }), t.headRefreshDatagrid && D(t.headRefreshDatagrid, t.filter)) : (f.error((e == null ? void 0 : e[n]) || "上传失败"), u.value = u.value.filter((c) => c.uid !== a.uid), i("error", { response: e, file: a }), i("apiFail", { code: d, message: e == null ? void 0 : e[n] })), i("apiAfter", { url: t.api }), x();
96
+ }, I = (e, a) => {
97
+ f.error("上传失败,请稍后重试"), u.value = u.value.filter((r) => r.uid !== a.uid), i("error", { error: e, file: a }), i("apiException", { error: e, message: e == null ? void 0 : e.message }), i("apiAfter", { url: t.api, error: e }), x();
98
+ }, U = async (e) => {
99
+ var l;
100
+ try {
101
+ await Z.confirm("确认删除该图片?", "提示", {
102
+ confirmButtonText: "确定",
103
+ cancelButtonText: "取消",
104
+ type: "warning"
105
+ });
106
+ } catch {
107
+ return !1;
108
+ }
109
+ const a = e.biz || e, r = (a == null ? void 0 : a[t.primaryKey]) ?? ((l = e.response) == null ? void 0 : l[t.primaryKey]);
110
+ if (t.deleteApi && r !== void 0 && r !== null) {
111
+ i("apiBefore", { url: t.deleteApi });
112
+ try {
113
+ const o = { [t.primaryKey]: r }, n = t.deleteMethod === "get" ? await p.get(t.deleteApi, o) : t.deleteMethod === "delete" ? await p.delete(t.deleteApi, o) : t.deleteMethod === "put" ? await p.put(t.deleteApi, o) : await p.post(t.deleteApi, o);
114
+ if (n.success)
115
+ i("delete-success", { file: e, data: n.data }), i("apiSuccess", { data: n.data }), t.headRefreshDatagrid && D(t.headRefreshDatagrid, t.filter);
116
+ else
117
+ return i("apiFail", { code: n.code, message: n.message }), !1;
118
+ } catch (o) {
119
+ return i("apiException", { error: o, message: o == null ? void 0 : o.message }), !1;
120
+ } finally {
121
+ i("apiAfter", { url: t.deleteApi });
122
+ }
123
+ } else
124
+ i("delete-success", { file: e });
125
+ return !0;
126
+ }, K = (e) => {
127
+ if (i("preview", { file: e }), !t.preview) return;
128
+ const a = z.value.findIndex((r) => {
129
+ var l;
130
+ return r === (e.url || ((l = e.biz) == null ? void 0 : l.url));
131
+ });
132
+ y.value = a >= 0 ? a + 1 : 1, v.value = !0;
133
+ };
134
+ function W(e) {
135
+ y.value = e + 1;
136
+ }
137
+ const q = () => {
138
+ f.warning(`最多上传 ${t.maxCount} 张图片`), i("exceed", { maxCount: t.maxCount });
139
+ };
140
+ function G() {
141
+ var e;
142
+ (e = g.value) == null || e.clearFiles(), u.value = [], x();
143
+ }
144
+ return E({ clearFiles: G, uploadRef: g }), (e, a) => {
145
+ const r = b("el-icon"), l = b("el-upload"), o = b("el-image-viewer");
146
+ return S(), N("div", {
147
+ class: H(["wd-image-upload", { "is-hide-add": P.value }])
148
+ }, [
149
+ C(l, J({
150
+ ref_key: "uploadRef",
151
+ ref: g,
152
+ action: R.value,
153
+ "list-type": "picture-card",
154
+ accept: s.accept || "image/*",
155
+ limit: s.maxCount,
156
+ multiple: s.maxCount > 1,
157
+ "file-list": u.value,
158
+ "onUpdate:fileList": a[0] || (a[0] = (n) => u.value = n),
159
+ "before-upload": k,
160
+ "before-remove": U,
161
+ "on-success": $,
162
+ "on-error": I,
163
+ "on-preview": K,
164
+ "on-exceed": q
165
+ }, e.$attrs), {
166
+ tip: A(() => [
167
+ s.tip ? (S(), N("div", ae, Q(s.tip), 1)) : V("", !0)
168
+ ]),
169
+ default: A(() => [
170
+ C(r, null, {
171
+ default: A(() => [
172
+ C(O(Y))
173
+ ]),
174
+ _: 1
175
+ })
176
+ ]),
177
+ _: 1
178
+ }, 16, ["action", "accept", "limit", "multiple", "file-list"]),
179
+ s.preview && v.value ? (S(), X(o, {
180
+ key: 0,
181
+ "url-list": z.value,
182
+ "initial-index": y.value - 1,
183
+ onClose: a[1] || (a[1] = (n) => v.value = !1),
184
+ onSwitch: W
185
+ }, null, 8, ["url-list", "initial-index"])) : V("", !0)
186
+ ], 2);
187
+ };
188
+ }
189
+ }), de = /* @__PURE__ */ te(ie, [["__scopeId", "data-v-74d04a3e"]]);
190
+ export {
191
+ de as W
192
+ };
193
+ //# sourceMappingURL=ImageUpload-D3JGJjVO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageUpload-D3JGJjVO.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,113 @@
1
+ import { defineComponent as y, ref as k, watch as g, computed as C, resolveComponent as $, openBlock as o, createElementBlock as n, normalizeClass as r, withKeys as p, withModifiers as a, createElementVNode as s, renderSlot as u, toDisplayString as h, createCommentVNode as i, createBlock as S, withCtx as B, createVNode as K, unref as x } from "vue";
2
+ import { ArrowDown as N } from "@element-plus/icons-vue";
3
+ import { _ as P } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
4
+ const V = ["aria-expanded", "onKeydown"], W = { class: "wd-panel__header-main" }, D = { class: "wd-panel__title" }, E = {
5
+ key: 0,
6
+ class: "wd-panel__description"
7
+ }, z = { class: "wd-panel__content-inner" }, A = { class: "wd-panel__body" }, H = {
8
+ key: 0,
9
+ class: "wd-panel__footer"
10
+ }, I = /* @__PURE__ */ y({
11
+ name: "WdPanel",
12
+ __name: "Panel",
13
+ props: {
14
+ /** 面板标题 */
15
+ title: { type: String, default: "" },
16
+ /** 标题旁描述 */
17
+ description: { type: String, default: "" },
18
+ /** 是否可折叠(折叠时隐藏主体与底部) */
19
+ collapsible: { type: Boolean, default: !1 },
20
+ /** 展开状态(配合 collapsible 使用,支持 v-model:opened) */
21
+ opened: { type: Boolean, default: !0 },
22
+ /** 阴影策略:always=常驻阴影 / hover=悬停时显示 / never=无阴影 */
23
+ shadow: {
24
+ type: String,
25
+ default: "hover"
26
+ }
27
+ },
28
+ emits: ["update:opened", "change"],
29
+ setup(t, { emit: _ }) {
30
+ const d = t, w = _, v = k(d.opened);
31
+ g(
32
+ () => d.opened,
33
+ (e) => {
34
+ v.value = e;
35
+ }
36
+ );
37
+ const l = C(() => v.value);
38
+ function c() {
39
+ if (!d.collapsible) return;
40
+ const e = !l.value;
41
+ v.value = e, w("update:opened", e), w("change", e);
42
+ }
43
+ function f() {
44
+ d.collapsible && c();
45
+ }
46
+ return (e, m) => {
47
+ const b = $("el-icon");
48
+ return o(), n("div", {
49
+ class: r(["wd-panel", `wd-panel--shadow-${t.shadow}`])
50
+ }, [
51
+ t.title || e.$slots.title ? (o(), n("div", {
52
+ key: 0,
53
+ class: r(["wd-panel__header", { "is-collapsible": t.collapsible }]),
54
+ role: "heading",
55
+ "aria-expanded": t.collapsible ? l.value : void 0,
56
+ onClick: f,
57
+ onKeydown: [
58
+ p(a(f, ["prevent"]), ["enter"]),
59
+ p(a(f, ["prevent"]), ["space"])
60
+ ]
61
+ }, [
62
+ s("div", W, [
63
+ u(e.$slots, "title", {}, () => [
64
+ s("span", D, h(t.title), 1),
65
+ t.description ? (o(), n("span", E, h(t.description), 1)) : i("", !0)
66
+ ], !0)
67
+ ]),
68
+ e.$slots.extra || t.collapsible ? (o(), n("div", {
69
+ key: 0,
70
+ class: "wd-panel__header-extra",
71
+ onClick: m[0] || (m[0] = a(() => {
72
+ }, ["stop"]))
73
+ }, [
74
+ u(e.$slots, "extra", {}, void 0, !0),
75
+ t.collapsible ? (o(), S(b, {
76
+ key: 0,
77
+ class: r(["wd-panel__collapse-icon", { "is-collapsed": !l.value }]),
78
+ role: "button",
79
+ "aria-label": l.value ? "收起" : "展开",
80
+ tabindex: "0",
81
+ onClick: c,
82
+ onKeydown: [
83
+ p(a(c, ["prevent"]), ["enter"]),
84
+ p(a(c, ["prevent"]), ["space"])
85
+ ]
86
+ }, {
87
+ default: B(() => [
88
+ K(x(N))
89
+ ]),
90
+ _: 1
91
+ }, 8, ["class", "aria-label", "onKeydown"])) : i("", !0)
92
+ ])) : i("", !0)
93
+ ], 42, V)) : i("", !0),
94
+ s("div", {
95
+ class: r(["wd-panel__content", { "is-collapsed": t.collapsible && !l.value }])
96
+ }, [
97
+ s("div", z, [
98
+ s("div", A, [
99
+ u(e.$slots, "default", {}, void 0, !0)
100
+ ]),
101
+ e.$slots.footer ? (o(), n("div", H, [
102
+ u(e.$slots, "footer", {}, void 0, !0)
103
+ ])) : i("", !0)
104
+ ])
105
+ ], 2)
106
+ ], 2);
107
+ };
108
+ }
109
+ }), q = /* @__PURE__ */ P(I, [["__scopeId", "data-v-bbfb587b"]]);
110
+ export {
111
+ q as W
112
+ };
113
+ //# sourceMappingURL=Panel-d4chdlTA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Panel-d4chdlTA.mjs","sources":["../../src/components/styles/Panel.vue"],"sourcesContent":["<template>\r\n <div class=\"wd-panel\" :class=\"`wd-panel--shadow-${shadow}`\">\r\n <div\r\n v-if=\"title || $slots.title\"\r\n class=\"wd-panel__header\"\r\n :class=\"{ 'is-collapsible': collapsible }\"\r\n role=\"heading\"\r\n :aria-expanded=\"collapsible ? openedState : undefined\"\r\n @click=\"onHeaderClick\"\r\n @keydown.enter.prevent=\"onHeaderClick\"\r\n @keydown.space.prevent=\"onHeaderClick\"\r\n >\r\n <div class=\"wd-panel__header-main\">\r\n <slot name=\"title\">\r\n <span class=\"wd-panel__title\">{{ title }}</span>\r\n <span v-if=\"description\" class=\"wd-panel__description\">{{ description }}</span>\r\n </slot>\r\n </div>\r\n <div v-if=\"$slots.extra || collapsible\" class=\"wd-panel__header-extra\" @click.stop>\r\n <slot name=\"extra\" />\r\n <el-icon\r\n v-if=\"collapsible\"\r\n class=\"wd-panel__collapse-icon\"\r\n :class=\"{ 'is-collapsed': !openedState }\"\r\n role=\"button\"\r\n :aria-label=\"openedState ? '收起' : '展开'\"\r\n tabindex=\"0\"\r\n @click=\"toggle\"\r\n @keydown.enter.prevent=\"toggle\"\r\n @keydown.space.prevent=\"toggle\"\r\n >\r\n <ArrowDown />\r\n </el-icon>\r\n </div>\r\n </div>\r\n <div class=\"wd-panel__content\" :class=\"{ 'is-collapsed': collapsible && !openedState }\">\r\n <div class=\"wd-panel__content-inner\">\r\n <div class=\"wd-panel__body\">\r\n <slot />\r\n </div>\r\n <div v-if=\"$slots.footer\" class=\"wd-panel__footer\">\r\n <slot name=\"footer\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, watch, type PropType } from 'vue'\r\nimport { ArrowDown } from '@element-plus/icons-vue'\r\n\r\ndefineOptions({ name: 'WdPanel' })\r\n\r\nconst props = defineProps({\r\n /** 面板标题 */\r\n title: { type: String, default: '' },\r\n /** 标题旁描述 */\r\n description: { type: String, default: '' },\r\n /** 是否可折叠(折叠时隐藏主体与底部) */\r\n collapsible: { type: Boolean, default: false },\r\n /** 展开状态(配合 collapsible 使用,支持 v-model:opened) */\r\n opened: { type: Boolean, default: true },\r\n /** 阴影策略:always=常驻阴影 / hover=悬停时显示 / never=无阴影 */\r\n shadow: {\r\n type: String as PropType<'always' | 'hover' | 'never'>,\r\n default: 'hover'\r\n }\r\n})\r\n\r\nconst emit = defineEmits<{\r\n (e: 'update:opened', value: boolean): void\r\n (e: 'change', value: boolean): void\r\n}>()\r\n\r\nconst innerOpened = ref(props.opened)\r\n// 受控(v-model:opened)时跟随外部变化,非受控时使用内部状态\r\nwatch(\r\n () => props.opened,\r\n (v) => {\r\n innerOpened.value = v\r\n }\r\n)\r\nconst openedState = computed(() => innerOpened.value)\r\n\r\nfunction toggle() {\r\n if (!props.collapsible) return\r\n const next = !openedState.value\r\n innerOpened.value = next\r\n emit('update:opened', next)\r\n emit('change', next)\r\n}\r\n\r\nfunction onHeaderClick() {\r\n if (props.collapsible) toggle()\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.wd-panel {\r\n width: 100%;\r\n margin-bottom: var(--wd-spacing-base, 12px);\r\n background: var(--wd-bg-color, #fff);\r\n border: 1px solid var(--wd-border-color-light, #e4e7ed);\r\n border-radius: var(--wd-radius-base, 4px);\r\n box-sizing: border-box;\r\n overflow: hidden;\r\n transition: box-shadow 0.25s ease, border-color 0.25s ease, transform 0.25s ease;\r\n}\r\n\r\n/* 阴影跟随可覆盖变量:在任意祖先/全局定义\r\n --wd-panel-shadow-sm / --wd-panel-shadow-md 即可换肤 */\r\n.wd-panel--shadow-always {\r\n box-shadow: var(\r\n --wd-panel-shadow-sm,\r\n 0 1px 2px rgba(16, 24, 40, 0.04),\r\n 0 1px 6px -1px rgba(16, 24, 40, 0.06)\r\n );\r\n}\r\n.wd-panel--shadow-hover:hover {\r\n border-color: var(--wd-border-color, #dcdfe6);\r\n box-shadow: var(\r\n --wd-panel-shadow-md,\r\n 0 4px 8px -2px rgba(16, 24, 40, 0.08),\r\n 0 12px 24px -4px rgba(16, 24, 40, 0.1)\r\n );\r\n transform: translateY(-1px);\r\n}\r\n\r\n.wd-panel__header {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: 12px 16px 12px 18px;\r\n border-bottom: 1px solid var(--wd-border-color-light, #e4e7ed);\r\n transition: background-color 0.2s ease;\r\n}\r\n/* 品牌色标识条 */\r\n.wd-panel__header::before {\r\n content: '';\r\n position: absolute;\r\n left: 0;\r\n top: 0;\r\n bottom: 0;\r\n width: 3px;\r\n background: var(--wd-color-primary, #409eff);\r\n border-radius: 0 var(--wd-radius-small, 2px) var(--wd-radius-small, 2px) 0;\r\n}\r\n.wd-panel__header.is-collapsible {\r\n cursor: pointer;\r\n}\r\n.wd-panel__header.is-collapsible:hover {\r\n background: var(--wd-bg-color-page, #f5f7fa);\r\n}\r\n.wd-panel__header-main {\r\n display: flex;\r\n align-items: baseline;\r\n gap: 8px;\r\n min-width: 0;\r\n flex: 1;\r\n}\r\n.wd-panel__title {\r\n font-size: var(--wd-font-size-base, 14px);\r\n font-weight: 600;\r\n line-height: 22px;\r\n color: var(--wd-text-color-primary, #303133);\r\n white-space: nowrap;\r\n}\r\n.wd-panel__description {\r\n font-size: var(--wd-font-size-small, 12px);\r\n color: var(--wd-text-color-secondary, #909399);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n.wd-panel__header-extra {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n margin-left: auto;\r\n}\r\n.wd-panel__collapse-icon {\r\n cursor: pointer;\r\n color: var(--wd-text-color-secondary, #909399);\r\n transition: transform 0.25s ease, color 0.2s ease;\r\n}\r\n.wd-panel__collapse-icon:hover {\r\n color: var(--wd-color-primary, #409eff);\r\n}\r\n.wd-panel__collapse-icon.is-collapsed {\r\n transform: rotate(-90deg);\r\n}\r\n\r\n/* 折叠动画:grid 1fr -> 0fr,无需测量高度 */\r\n.wd-panel__content {\r\n display: grid;\r\n grid-template-rows: 1fr;\r\n transition: grid-template-rows 0.28s ease;\r\n}\r\n.wd-panel__content.is-collapsed {\r\n grid-template-rows: 0fr;\r\n}\r\n.wd-panel__content-inner {\r\n overflow: hidden;\r\n min-height: 0;\r\n}\r\n.wd-panel__body {\r\n padding: 16px;\r\n}\r\n.wd-panel__footer {\r\n padding: 10px 16px;\r\n border-top: 1px solid var(--wd-border-color-light, #e4e7ed);\r\n background: var(--wd-bg-color-page, #f5f7fa);\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","innerOpened","ref","watch","v","openedState","computed","toggle","next","onHeaderClick","_createElementBlock","_normalizeClass","$slots","_createElementVNode","_hoisted_2","_renderSlot","_ctx","_hoisted_3","_toDisplayString","_hoisted_4","_createBlock","_component_el_icon","_createVNode","_unref","ArrowDown","_hoisted_5","_hoisted_6","_openBlock","_hoisted_7"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,UAAMA,IAAQC,GAgBRC,IAAOC,GAKPC,IAAcC,EAAIL,EAAM,MAAM;AAEpC,IAAAM;AAAA,MACE,MAAMN,EAAM;AAAA,MACZ,CAACO,MAAM;AACL,QAAAH,EAAY,QAAQG;AAAA,MACtB;AAAA,IAAA;AAEF,UAAMC,IAAcC,EAAS,MAAML,EAAY,KAAK;AAEpD,aAASM,IAAS;AAChB,UAAI,CAACV,EAAM,YAAa;AACxB,YAAMW,IAAO,CAACH,EAAY;AAC1B,MAAAJ,EAAY,QAAQO,GACpBT,EAAK,iBAAiBS,CAAI,GAC1BT,EAAK,UAAUS,CAAI;AAAA,IACrB;AAEA,aAASC,IAAgB;AACvB,MAAIZ,EAAM,eAAaU,EAAA;AAAA,IACzB;;;kBA9FEG,EA4CM,OAAA;AAAA,QA5CD,OAAKC,EAAA,CAAC,YAAU,oBAA6Bb,EAAA,MAAM,EAAA,CAAA;AAAA,MAAA;QAE9CA,EAAA,SAASc,EAAAA,OAAO,cADxBF,EAgCM,OAAA;AAAA;UA9BJ,OAAKC,EAAA,CAAC,oBAAkB,EAAA,kBACIb,EAAA,YAAA,CAAW,CAAA;AAAA,UACvC,MAAK;AAAA,UACJ,iBAAeA,EAAA,cAAcO,EAAA,QAAc;AAAA,UAC3C,SAAOI;AAAA,UACP,WAAO;AAAA,gBAAgBA,GAAa,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,gBACbA,GAAa,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,UAAA;AAAA;UAErCI,EAKM,OALNC,GAKM;AAAA,YAJJC,EAGOC,uBAHP,MAGO;AAAA,cAFLH,EAAgD,QAAhDI,GAAgDC,EAAfpB,EAAA,KAAK,GAAA,CAAA;AAAA,cAC1BA,EAAA,oBAAZY,EAA+E,QAA/ES,GAA+ED,EAArBpB,EAAA,WAAW,GAAA,CAAA;;;UAG9Dc,EAAAA,OAAO,SAASd,EAAA,oBAA3BY,EAeM,OAAA;AAAA;YAfkC,OAAM;AAAA,YAA0B,2BAAD,MAAA;AAAA,YAAA,GAAW,CAAA,MAAA,CAAA;AAAA,UAAA;YAChFK,EAAqBC,EAAA,QAAA,SAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YAEblB,EAAA,oBADRsB,EAYUC,GAAA;AAAA;cAVR,OAAKV,EAAA,CAAC,2BAAyB,EAAA,gBAAA,CACJN,EAAA,MAAA,CAAW,CAAA;AAAA,cACtC,MAAK;AAAA,cACJ,cAAYA,EAAA,QAAW,OAAA;AAAA,cACxB,UAAS;AAAA,cACR,SAAOE;AAAA,cACP,WAAO;AAAA,oBAAgBA,GAAM,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,oBACNA,GAAM,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,cAAA;AAAA;yBAE9B,MAAa;AAAA,gBAAbe,EAAaC,EAAAC,CAAA,CAAA;AAAA,cAAA;;;;;QAInBX,EASM,OAAA;AAAA,UATD,OAAKF,EAAA,CAAC,qBAAmB,EAAA,gBAA2Bb,EAAA,gBAAgBO,EAAA,OAAW,CAAA;AAAA,QAAA;UAClFQ,EAOM,OAPNY,GAOM;AAAA,YANJZ,EAEM,OAFNa,GAEM;AAAA,cADJX,EAAQC,EAAA,QAAA,WAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YAAA;YAECJ,EAAAA,OAAO,UAAlBe,KAAAjB,EAEM,OAFNkB,GAEM;AAAA,cADJb,EAAsBC,EAAA,QAAA,UAAA,CAAA,GAAA,QAAA,EAAA;AAAA,YAAA;;;;;;;"}
@@ -0,0 +1,118 @@
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
+ import { ElMessageBox as n } from "element-plus";
3
+ import { u as w } from "./useApiAction-C1CdKGjt.mjs";
4
+ import { t as D, b as _, a as A, h as R, f as v } from "./props-DAytpx7D.mjs";
5
+ const q = /* @__PURE__ */ S({
6
+ name: "WdPromptButton",
7
+ inheritAttrs: !1,
8
+ __name: "PromptButton",
9
+ props: {
10
+ ...v,
11
+ ...R,
12
+ ...A,
13
+ ..._,
14
+ ...D,
15
+ /** 输入框标题 */
16
+ promptTitle: { type: String, default: "请输入" },
17
+ /** 输入框占位文本(默认输入框模式有效) */
18
+ promptPlaceholder: { type: String, default: "请输入内容" },
19
+ /** 输入值并入 apiParam 的字段名(默认输入框模式有效) */
20
+ paramKey: { type: String, default: "value" },
21
+ /** 输入框默认值(默认输入框模式有效) */
22
+ promptDefault: { type: String, default: "" },
23
+ buttonLoading: { type: Boolean, default: !0 },
24
+ pageLoading: { type: Boolean, default: !1 }
25
+ },
26
+ emits: [
27
+ "click",
28
+ "prompt",
29
+ "cancel",
30
+ "confirm",
31
+ "apiBefore",
32
+ "apiSuccess",
33
+ "apiFail",
34
+ "apiException",
35
+ "apiAfter"
36
+ ],
37
+ setup(T, { emit: B }) {
38
+ const t = T, o = B, b = k(), { loading: i, doRequest: s } = w({
39
+ getApi: () => t.api,
40
+ getMethod: () => t.apiMethod,
41
+ getParam: () => t.apiParam,
42
+ getFilter: () => t.filter,
43
+ getHeadRefresh: () => t.headRefreshDatagrid,
44
+ emit: o,
45
+ buttonLoading: () => t.buttonLoading,
46
+ getReqOptions: () => ({ showLoading: t.pageLoading })
47
+ });
48
+ async function c(e) {
49
+ if (o("click", e), b.content) {
50
+ try {
51
+ await n.prompt(t.promptTitle, t.promptTitle, {
52
+ confirmButtonText: "确定",
53
+ cancelButtonText: "取消",
54
+ inputPlaceholder: t.promptPlaceholder,
55
+ inputValue: t.promptDefault,
56
+ // 允许自定义内容:message 设为空,插槽内容会被保留
57
+ dangerouslyUseHTMLString: !0,
58
+ message: ""
59
+ }), o("confirm"), await s({}) && n.close();
60
+ } catch {
61
+ o("cancel");
62
+ }
63
+ return;
64
+ }
65
+ let a;
66
+ try {
67
+ a = (await n.prompt(t.promptTitle, t.promptTitle, {
68
+ confirmButtonText: "确定",
69
+ cancelButtonText: "取消",
70
+ inputPlaceholder: t.promptPlaceholder,
71
+ inputValue: t.promptDefault
72
+ })).value;
73
+ } catch {
74
+ o("cancel");
75
+ return;
76
+ }
77
+ o("prompt", a), await s({ [t.paramKey]: a }) && n.close();
78
+ }
79
+ return (e, a) => {
80
+ const p = u("el-button"), r = u("el-tooltip");
81
+ return e.tips ? (m(), f(r, {
82
+ key: 0,
83
+ content: e.tips,
84
+ effect: e.tipsType,
85
+ placement: e.placement
86
+ }, {
87
+ default: l(() => [
88
+ L(p, d(e.$attrs, {
89
+ loading: g(i),
90
+ onClick: c
91
+ }), {
92
+ default: l(() => [
93
+ h(e.$slots, "default", {}, () => [
94
+ y(P(e.label), 1)
95
+ ])
96
+ ]),
97
+ _: 3
98
+ }, 16, ["loading"])
99
+ ]),
100
+ _: 3
101
+ }, 8, ["content", "effect", "placement"])) : (m(), f(p, d({ key: 1 }, e.$attrs, {
102
+ loading: g(i),
103
+ onClick: c
104
+ }), {
105
+ default: l(() => [
106
+ h(e.$slots, "default", {}, () => [
107
+ y(P(e.label), 1)
108
+ ])
109
+ ]),
110
+ _: 3
111
+ }, 16, ["loading"]));
112
+ };
113
+ }
114
+ });
115
+ export {
116
+ q as _
117
+ };
118
+ //# sourceMappingURL=PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptButton.vue_vue_type_script_setup_true_lang-BqoNAUoo.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;;;;;;;"}
@@ -0,0 +1,129 @@
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-D0RTB_ar.mjs";
3
+ import { o as E } from "./props-DAytpx7D.mjs";
4
+ import { _ as F } from "./_plugin-vue_export-helper-CHgC5LLL.mjs";
5
+ const M = { class: "wd-option-text" }, I = { class: "wd-option-text" }, O = /* @__PURE__ */ B({
6
+ name: "WdRadioList",
7
+ inheritAttrs: !1,
8
+ __name: "RadioList",
9
+ props: {
10
+ ...E,
11
+ modelValue: { type: [String, Number, Boolean], default: void 0 },
12
+ /** 按钮样式 */
13
+ buttonStyle: { type: Boolean, default: !1 }
14
+ },
15
+ emits: ["update:modelValue", "change", "apiBefore", "apiSuccess", "apiFail", "apiAfter"],
16
+ setup(p, { emit: k }) {
17
+ const c = p, d = k, t = L(c), { options: w, loading: y } = A({
18
+ api: t.api,
19
+ apiMethod: t.apiMethod,
20
+ apiParam: t.apiParam,
21
+ active: t.active,
22
+ dataSource: t.dataSource,
23
+ textProp: t.textProp,
24
+ valueProp: t.valueProp,
25
+ tipsProp: t.tipsProp,
26
+ addData: t.addData,
27
+ appendData: t.appendData,
28
+ emit: d
29
+ }), m = $({
30
+ get: () => c.modelValue,
31
+ set: (a) => d("update:modelValue", a)
32
+ });
33
+ function P(a) {
34
+ d("change", a);
35
+ }
36
+ return (a, f) => {
37
+ const v = i("el-tooltip"), S = i("el-radio-button"), V = i("el-radio"), D = i("el-radio-group"), b = C("loading");
38
+ return R((o(), n(D, N({
39
+ modelValue: m.value,
40
+ "onUpdate:modelValue": f[0] || (f[0] = (e) => m.value = e)
41
+ }, a.$attrs, { onChange: P }), {
42
+ default: l(() => [
43
+ (o(!0), _(x, null, W(g(w), (e) => (o(), _(x, {
44
+ key: String(e.value)
45
+ }, [
46
+ p.buttonStyle ? (o(), n(S, {
47
+ key: 0,
48
+ value: e.value
49
+ }, {
50
+ default: l(() => [
51
+ e.tips ? (o(), n(v, {
52
+ key: 0,
53
+ content: e.tips,
54
+ placement: "top",
55
+ effect: "dark",
56
+ "show-after": 200
57
+ }, {
58
+ default: l(() => [
59
+ h("span", M, [
60
+ s(a.$slots, "default", {
61
+ option: e.raw,
62
+ text: e.text,
63
+ value: e.value,
64
+ tips: e.tips
65
+ }, () => [
66
+ r(u(e.text), 1)
67
+ ], !0)
68
+ ])
69
+ ]),
70
+ _: 2
71
+ }, 1032, ["content"])) : s(a.$slots, "default", {
72
+ option: e.raw,
73
+ text: e.text,
74
+ value: e.value,
75
+ tips: e.tips
76
+ }, () => [
77
+ r(u(e.text), 1)
78
+ ], !0, 1)
79
+ ]),
80
+ _: 2
81
+ }, 1032, ["value"])) : (o(), n(V, {
82
+ key: 1,
83
+ value: e.value
84
+ }, {
85
+ default: l(() => [
86
+ e.tips ? (o(), n(v, {
87
+ key: 0,
88
+ content: e.tips,
89
+ placement: "top",
90
+ effect: "dark",
91
+ "show-after": 200
92
+ }, {
93
+ default: l(() => [
94
+ h("span", I, [
95
+ s(a.$slots, "default", {
96
+ option: e.raw,
97
+ text: e.text,
98
+ value: e.value,
99
+ tips: e.tips
100
+ }, () => [
101
+ r(u(e.text), 1)
102
+ ], !0)
103
+ ])
104
+ ]),
105
+ _: 2
106
+ }, 1032, ["content"])) : s(a.$slots, "default", {
107
+ option: e.raw,
108
+ text: e.text,
109
+ value: e.value,
110
+ tips: e.tips
111
+ }, () => [
112
+ r(u(e.text), 1)
113
+ ], !0, 1)
114
+ ]),
115
+ _: 2
116
+ }, 1032, ["value"]))
117
+ ], 64))), 128))
118
+ ]),
119
+ _: 3
120
+ }, 16, ["modelValue"])), [
121
+ [b, g(y)]
122
+ ]);
123
+ };
124
+ }
125
+ }), z = /* @__PURE__ */ F(O, [["__scopeId", "data-v-85ba2452"]]);
126
+ export {
127
+ z as W
128
+ };
129
+ //# sourceMappingURL=RadioList-DT-8WSN2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RadioList-DT-8WSN2.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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"}