@skyfox2000/webui 1.3.5 → 1.3.6

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 (45) hide show
  1. package/.vscode/settings.json +1 -1
  2. package/lib/assets/modules/{file-upload-C0twqMV5.js → file-upload-DhPgqGdk.js} +50 -50
  3. package/lib/assets/modules/index-02J2AYth.js +377 -0
  4. package/lib/assets/modules/{index-D1XAa1Uo.js → index-C31q4LHC.js} +2 -2
  5. package/lib/assets/modules/{index-C4CryM-R.js → index-CCpTizF9.js} +1 -1
  6. package/lib/assets/modules/{menuTabs-BrYQa4UO.js → menuTabs-DyhSKN9r.js} +2 -2
  7. package/lib/assets/modules/{toolIcon-B-g9pyE4.js → toolIcon-CqM4gBIc.js} +1 -1
  8. package/lib/assets/modules/{uploadList-0f2FA_5s.js → uploadList-DAVjJkqz.js} +127 -127
  9. package/lib/assets/modules/{uploadList-DCWRIxPJ.js → uploadList-ZajZKqaS.js} +4 -4
  10. package/lib/components/common/alert/index.vue.d.ts +13 -0
  11. package/lib/components/common/icon/helper.vue.d.ts +1 -0
  12. package/lib/components/common/index.d.ts +2 -0
  13. package/lib/components/content/form/formItem.vue.d.ts +1 -0
  14. package/lib/components/form/input/index.vue.d.ts +4 -1
  15. package/lib/components/form/select/index.vue.d.ts +2 -0
  16. package/lib/components/form/treeSelect/index.vue.d.ts +11 -2
  17. package/lib/components/index.d.ts +1 -1
  18. package/lib/es/AceEditor/index.js +3 -3
  19. package/lib/es/BasicLayout/index.js +3 -3
  20. package/lib/es/Error403/index.js +1 -1
  21. package/lib/es/Error404/index.js +1 -1
  22. package/lib/es/ExcelForm/index.js +311 -275
  23. package/lib/es/UploadForm/index.js +4 -4
  24. package/lib/index.d.ts +1 -1
  25. package/lib/typings/form.d.ts +2 -2
  26. package/lib/utils/excel-preview.d.ts +24 -0
  27. package/lib/utils/form-excel.d.ts +17 -4
  28. package/lib/webui.css +1 -1
  29. package/lib/webui.es.js +677 -662
  30. package/package.json +1 -1
  31. package/src/components/common/alert/index.vue +76 -0
  32. package/src/components/common/icon/helper.vue +7 -1
  33. package/src/components/common/index.ts +4 -1
  34. package/src/components/content/dialog/excelForm.vue +337 -308
  35. package/src/components/content/form/formItem.vue +6 -2
  36. package/src/components/form/input/index.vue +16 -3
  37. package/src/components/form/select/index.vue +5 -11
  38. package/src/components/form/treeSelect/index.vue +22 -17
  39. package/src/components/index.ts +1 -0
  40. package/src/index.ts +1 -0
  41. package/src/typings/form.d.ts +2 -2
  42. package/src/utils/excel-preview.ts +188 -0
  43. package/src/utils/file-upload.ts +0 -2
  44. package/src/utils/form-excel.ts +132 -126
  45. package/lib/assets/modules/index-CKJIxasX.js +0 -333
@@ -1,52 +1,127 @@
1
- import { defineComponent as Ce, ref as o, computed as G, watch as I, onMounted as Ue, createBlock as Q, openBlock as f, unref as i, withCtx as T, renderSlot as _e, createElementBlock as y, createCommentVNode as L, createElementVNode as x, createVNode as F, createTextVNode as q, toDisplayString as b, normalizeClass as Te, Fragment as re, renderList as te } from "vue";
2
- import { _ as W } from "../../assets/modules/index-C4CryM-R.js";
3
- import { Modal as Fe, Upload as se, Alert as oe, Space as Ee } from "ant-design-vue";
4
- import { httpGet as Se, ResStatus as ie } from "@skyfox2000/fapi";
5
- import { E as ke, a1 as De, a7 as Ve } from "../../assets/modules/uploadList-0f2FA_5s.js";
6
- import { A as Le, p as Re, U as Be } from "../../assets/modules/file-upload-C0twqMV5.js";
1
+ import { defineComponent as we, ref as v, computed as U, watch as W, onMounted as be, createBlock as H, openBlock as f, unref as n, withCtx as T, renderSlot as J, createElementBlock as x, createCommentVNode as K, createElementVNode as g, createVNode as C, createTextVNode as X, toDisplayString as S, normalizeClass as Ce, Fragment as ie, renderList as ne } from "vue";
2
+ import { _ as Y } from "../../assets/modules/index-CCpTizF9.js";
3
+ import { Modal as Fe, Upload as ce, Space as _e } from "ant-design-vue";
4
+ import { httpGet as Ue, ResStatus as fe } from "@skyfox2000/fapi";
5
+ import { E as Te, a1 as Se, a7 as Ee } from "../../assets/modules/uploadList-DAVjJkqz.js";
6
+ import { A as Re, p as De, U as ue } from "../../assets/modules/file-upload-DhPgqGdk.js";
7
7
  import "@skyfox2000/microbase";
8
- import n from "vue-m-message";
9
- import { _ as Ne, c as ze, p as Pe, v as Ae, a as Me } from "../../assets/modules/index-CKJIxasX.js";
8
+ import c from "vue-m-message";
9
+ import { c as ke, _ as Z, h as Le, p as Ne, i as Ke } from "../../assets/modules/index-02J2AYth.js";
10
10
  import "dayjs";
11
11
  import "vue-draggable-next";
12
- import $e from "@vue-office/excel";
13
- const je = {
12
+ import "async-validator";
13
+ import Ve from "@vue-office/excel";
14
+ const Be = (t) => t.includes(",") || t.includes(`
15
+ `), Me = (t, s) => t === "text/csv" || (s == null ? void 0 : s.toLowerCase().includes(".csv")) || !1, ze = (t, s) => t === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || t === "application/vnd.ms-excel" || (s == null ? void 0 : s.toLowerCase().match(/\.(xlsx|xls)$/)) !== null, ee = async (t, s = "preview.csv") => {
16
+ const e = await ke(t, s);
17
+ if (e.success)
18
+ return {
19
+ success: !0,
20
+ blobUrl: e.blobUrl,
21
+ fileName: e.fileName
22
+ };
23
+ throw new Error(e.error || "CSV格式处理失败");
24
+ }, ae = (t, s, e = "预览文件.xlsx") => ({
25
+ success: !0,
26
+ blobUrl: `data:${s || "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"};base64,${t}`,
27
+ fileName: e
28
+ }), ve = async (t, s = !1) => {
29
+ if (s) {
30
+ if (typeof t == "string")
31
+ return Be(t) ? await ee(t) : ae(t);
32
+ if (t instanceof ArrayBuffer || t instanceof Uint8Array) {
33
+ const e = new Blob([t], {
34
+ type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
35
+ });
36
+ return {
37
+ success: !0,
38
+ blobUrl: URL.createObjectURL(e),
39
+ fileName: "预览文件.xlsx"
40
+ };
41
+ } else
42
+ throw new Error("不支持的原始文件格式");
43
+ }
44
+ if (t.Content && t.Type)
45
+ return Me(t.Type, t.FileName) ? await ee(t.Content, t.FileName || "preview.csv") : ze(t.Type, t.FileName) ? ae(t.Content, t.Type, t.FileName || "预览文件.xlsx") : ae(t.Content);
46
+ if (t.url)
47
+ return {
48
+ success: !0,
49
+ blobUrl: t.url,
50
+ fileName: t.fileName || "预览文件.xlsx"
51
+ };
52
+ if (typeof t == "string")
53
+ return await ee(t);
54
+ throw new Error("不支持的文件格式");
55
+ }, Pe = async (t, s) => {
56
+ if (!t || !s)
57
+ throw new Error("预览URL或Excel控制器未配置");
58
+ try {
59
+ let e = null;
60
+ if (t.method === "GET") {
61
+ const a = {
62
+ ...t,
63
+ method: "GET",
64
+ api: t.api || s.page.api,
65
+ authorize: t.authorize ?? s.page.authorize
66
+ };
67
+ e = await Ue(a);
68
+ } else {
69
+ const a = t.params;
70
+ e = await Te(s, {
71
+ url: t,
72
+ urlKey: "preview",
73
+ params: a,
74
+ hideErrorToast: !0
75
+ });
76
+ }
77
+ if (t.raw)
78
+ return await ve(e, !0);
79
+ if ((e == null ? void 0 : e.status) === fe.SUCCESS && e.data) {
80
+ const a = e.data;
81
+ return await ve(a, !1);
82
+ } else
83
+ throw new Error((e == null ? void 0 : e.msg) || "文件加载失败");
84
+ } catch (e) {
85
+ throw console.error("预览文件加载错误:", e), c.error("文件加载失败:" + ((e == null ? void 0 : e.message) || "未知错误")), e;
86
+ }
87
+ }, $e = {
14
88
  key: 0,
15
89
  class: "mb-4 flex items-center"
16
- }, Oe = {
90
+ }, Ae = {
17
91
  key: 0,
18
92
  class: "ml-3 text-gray-600"
19
- }, Ke = { class: "flex gap-4 relative" }, Ge = {
93
+ }, je = { class: "flex gap-4 relative" }, Oe = {
20
94
  key: 1,
21
95
  class: "w-[22%] flex-grow overflow-hidden flex flex-col"
22
- }, Ie = { class: "bg-gray-50 p-2 rounded border flex-grow flex flex-col" }, Qe = {
96
+ }, Ge = { class: "bg-gray-50 p-2 rounded border flex-grow flex flex-col" }, Ie = {
23
97
  key: 0,
24
98
  class: "text-gray-500"
25
99
  }, qe = {
26
100
  key: 1,
27
101
  class: "flex flex-col"
28
- }, We = { class: "overflow-y-auto" }, He = { class: "text-[13px] text-gray-600" }, Je = { class: "pl-5 mt-1 mb-0" }, Xe = {
102
+ }, Qe = { class: "overflow-y-auto" }, We = { class: "text-[13px] text-gray-600" }, He = { class: "pl-5 mt-1 mb-0" }, Je = {
29
103
  key: 0,
30
104
  class: "mt-3"
31
- }, Ye = { class: "text-[12px] text-gray-600 p-1" }, Ze = { class: "text-[13px] text-gray-600" }, el = { class: "pl-5 mt-1 mb-0" }, ll = { class: "text-[12px] text-gray-600" }, xl = /* @__PURE__ */ Ce({
105
+ }, Xe = { class: "text-[12px] text-gray-600 p-1" }, Ye = { class: "text-[13px] text-gray-600" }, Ze = { class: "pl-5 mt-1 mb-0" }, ea = { class: "text-[12px] text-gray-600" }, ma = /* @__PURE__ */ we({
32
106
  __name: "excelForm",
33
107
  props: {
34
108
  title: {},
35
109
  gridCtrl: {},
36
110
  excelCtrl: {},
111
+ enableUpload: { type: Boolean, default: !0 },
37
112
  uploadParams: {},
38
113
  excelFieldMap: {},
39
114
  fileField: {},
40
- excelBatchField: {},
115
+ excelRecordsKey: {},
116
+ excelRowsKey: {},
41
117
  saveText: {},
42
118
  cancelText: {},
43
119
  previewUrl: {},
44
120
  fileType: {}
45
121
  },
46
- setup(ne) {
47
- var Z, ee, le;
48
- const r = ne, t = r.excelCtrl, h = o(!1), d = o(""), ce = o([]), c = o(""), C = o(!0), P = G(() => !!r.previewUrl), ue = G(() => {
49
- switch (r.fileType || "both") {
122
+ setup(t, { expose: s }) {
123
+ const e = t, a = e.excelCtrl, m = v(!1), w = v(""), le = v([]), y = v(""), P = U(() => !!e.previewUrl), te = U(() => e.enableUpload), de = U(() => {
124
+ switch (e.fileType || "both") {
50
125
  case "excel":
51
126
  return ".xlsx,.xls";
52
127
  case "csv":
@@ -55,8 +130,8 @@ const je = {
55
130
  default:
56
131
  return ".xlsx,.xls,.csv";
57
132
  }
58
- }), ve = G(() => {
59
- switch (r.fileType || "both") {
133
+ }), pe = U(() => {
134
+ switch (e.fileType || "both") {
60
135
  case "excel":
61
136
  return "请选择Excel文件";
62
137
  case "csv":
@@ -65,294 +140,245 @@ const je = {
65
140
  default:
66
141
  return "请选择Excel或CSV文件";
67
142
  }
68
- }), E = o("待验证数据规则"), S = o("warning"), k = o("待验证重复数据"), D = o("warning");
69
- I(
70
- () => t.visible.value,
143
+ }), V = v("待验证数据规则"), E = v("warning"), $ = v("待验证重复数据"), B = v("warning");
144
+ W(
145
+ () => a.visible.value,
71
146
  () => {
72
- h.value = t.visible.value, h.value && (d.value = "", c.value = "", C.value = !0, E.value = "待验证数据规则", S.value = "warning", k.value = "待验证重复数据", D.value = "warning", R.value = !1, B.value = !1, r.previewUrl && j());
147
+ m.value = a.visible.value, m.value && (j(), e.previewUrl && I());
73
148
  }
74
- ), I(
75
- () => h.value,
149
+ ), W(
150
+ () => m.value,
76
151
  () => {
77
- t.visible.value = h.value;
152
+ a.visible.value = m.value, m.value || j();
78
153
  }
79
- ), I(
80
- () => r.previewUrl,
154
+ ), W(
155
+ () => e.previewUrl,
81
156
  () => {
82
- h.value && r.previewUrl && j();
157
+ m.value && e.previewUrl && I();
83
158
  },
84
159
  { deep: !0 }
85
160
  );
86
- const A = o(r.uploadParams), g = o((Z = A.value) == null ? void 0 : Z.uploadUrl), U = o((ee = A.value) == null ? void 0 : ee.duplicateRules), V = o((le = A.value) == null ? void 0 : le.duplicateUrl), j = async () => {
87
- if (!(!r.previewUrl || !t)) {
88
- t.isFormLoading.value = !0;
161
+ const F = v(e.uploadParams), R = U(() => {
162
+ var l;
163
+ return (l = F.value) == null ? void 0 : l.uploadUrl;
164
+ }), M = U(() => {
165
+ var l;
166
+ return (l = F.value) == null ? void 0 : l.duplicateRules;
167
+ }), D = U(() => {
168
+ var l;
169
+ return (l = F.value) == null ? void 0 : l.duplicateUrl;
170
+ }), I = async () => {
171
+ if (!(!e.previewUrl || !a)) {
172
+ a.isFormLoading.value = !0;
89
173
  try {
90
- let e = null;
91
- if (r.previewUrl.method === "GET") {
92
- const l = {
93
- ...r.previewUrl,
94
- method: "GET",
95
- api: r.previewUrl.api || t.page.api,
96
- authorize: r.previewUrl.authorize ?? t.page.authorize
97
- };
98
- e = await Se(l);
99
- } else {
100
- const l = r.previewUrl.params;
101
- e = await ke(t, {
102
- url: r.previewUrl,
103
- urlKey: "preview",
104
- params: l,
105
- hideErrorToast: !0
106
- });
107
- }
108
- if (r.previewUrl.raw)
109
- await H(e);
110
- else if ((e == null ? void 0 : e.status) === ie.SUCCESS && e.data) {
111
- const l = e.data;
112
- await H(l);
113
- } else
114
- throw new Error((e == null ? void 0 : e.msg) || "文件加载失败");
115
- } catch (e) {
116
- console.error("预览文件加载错误:", e), n.error("文件加载失败:" + ((e == null ? void 0 : e.message) || "未知错误"));
174
+ const l = await Pe(e.previewUrl, a);
175
+ l.success && (w.value = l.blobUrl, y.value = l.fileName);
176
+ } catch (l) {
177
+ console.error("预览文件加载错误:", l), c.error("文件加载失败:" + ((l == null ? void 0 : l.message) || "未知错误"));
117
178
  } finally {
118
179
  setTimeout(() => {
119
- t.isFormLoading.value = !1;
180
+ a.isFormLoading.value = !1;
120
181
  }, 1e3);
121
182
  }
122
183
  }
123
- }, O = async (e, l = "preview.csv") => {
124
- const a = await ze(e, l);
125
- if (a.success)
126
- d.value = a.blobUrl, c.value = a.fileName;
127
- else
128
- throw new Error(a.error || "CSV格式处理失败");
129
- }, K = (e, l, a = "预览文件.xlsx") => {
130
- const s = l || "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
131
- d.value = `data:${s};base64,${e}`, c.value = a;
132
- }, pe = (e) => e.includes(",") || e.includes(`
133
- `), fe = (e, l) => e === "text/csv" || (l == null ? void 0 : l.toLowerCase().includes(".csv")), de = (e, l) => e === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || e === "application/vnd.ms-excel" || (l == null ? void 0 : l.toLowerCase().match(/\.(xlsx|xls)$/)), H = async (e) => {
134
- var l;
135
- if ((l = r.previewUrl) != null && l.raw) {
136
- if (typeof e == "string")
137
- pe(e) ? await O(e) : K(e);
138
- else if (e instanceof ArrayBuffer || e instanceof Uint8Array) {
139
- const a = new Blob([e], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
140
- d.value = URL.createObjectURL(a), c.value = "预览文件.xlsx";
141
- } else
142
- throw new Error("不支持的原始文件格式");
143
- return;
144
- }
145
- if (e.Content && e.Type)
146
- fe(e.Type, e.FileName) ? await O(e.Content, e.FileName || "preview.csv") : de(e.Type, e.FileName) ? K(e.Content, e.Type, e.FileName || "预览文件.xlsx") : K(e.Content);
147
- else if (e.url)
148
- d.value = e.url, c.value = e.fileName || "预览文件.xlsx";
149
- else if (typeof e == "string")
150
- await O(e);
151
- else
152
- throw new Error("不支持的文件格式");
153
184
  }, me = async () => {
154
- var l;
155
- const e = g.value;
156
- if (!e) {
157
- n.error("未配置文件上传地址!");
185
+ var i;
186
+ F.value = e.uploadParams;
187
+ const l = R.value;
188
+ if (!l) {
189
+ c.error("未配置文件上传地址!");
158
190
  return;
159
191
  }
160
- if (R.value) {
161
- n.error("表格数据存在验证错误,请修正后再上传!");
192
+ if (_.value) {
193
+ c.error("表格数据存在验证错误,请修正后再上传!");
162
194
  return;
163
195
  }
164
- t.isFormSaving.value = !0;
196
+ a.isFormSaving.value = !0;
165
197
  try {
166
- if (!N.value || !c.value) {
167
- n.warning("请先选择文件!"), t.isFormSaving.value = !1;
198
+ if (!L.value || !y.value) {
199
+ c.warning("请先选择文件!"), a.isFormSaving.value = !1;
168
200
  return;
169
201
  }
170
- const a = new Le(e, 1), s = J.value || "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", m = new File([N.value], c.value, {
171
- type: s
172
- }), u = Re.join(((l = A.value) == null ? void 0 : l.basePath) ?? "", c.value), v = {
202
+ const r = new Re(l, 1), u = q.value || "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", o = new File([L.value], y.value, {
203
+ type: u
204
+ }), d = De.join(((i = F.value) == null ? void 0 : i.basePath) ?? "", y.value), p = {
173
205
  uid: "1",
174
- name: c.value,
175
- originFileObj: m,
176
- status: Be.Uploading,
206
+ name: y.value,
207
+ originFileObj: o,
208
+ status: ue.Uploading,
177
209
  percent: 0,
178
210
  params: {
179
- FileKey: u
211
+ FileKey: d
180
212
  }
181
- }, w = new AbortController();
182
- try {
183
- await a.uploadFile(v, w.signal, (p) => {
184
- v.percent = p;
185
- }), n.success("文件上传成功,开始业务处理!"), xe(v);
186
- } catch (p) {
187
- throw console.error("文件上传错误:", p), n.error((p == null ? void 0 : p.message) || "文件上传失败,请稍后再试!"), p;
188
- }
189
- } catch (a) {
190
- console.error("上传处理错误:", a), n.error("上传处理失败:" + ((a == null ? void 0 : a.message) || "未知错误"));
213
+ }, b = new AbortController();
214
+ (await r.uploadFile(p, b.signal, (h) => {
215
+ p.percent = h;
216
+ })).status === ue.Success && (c.success("文件上传成功,开始业务处理!"), ye(p));
217
+ } catch (r) {
218
+ console.error("上传处理错误:", r), c.error("上传处理失败:" + ((r == null ? void 0 : r.message) || "未知错误"));
191
219
  } finally {
192
- t.isFormSaving.value = !1;
220
+ a.isFormSaving.value = !1;
193
221
  }
194
- }, xe = async (e) => {
195
- if (t.formData.value) {
196
- if (r.excelBatchField) {
197
- const s = await Pe(N.value);
198
- if (!s) return null;
199
- const { excelData: m } = s, u = m.map((v) => {
200
- var p;
201
- const w = {};
202
- for (const _ in v) {
203
- const $ = (p = r.excelFieldMap) == null ? void 0 : p[_];
204
- $ && (w[$] = v[_]);
222
+ }, ye = async (l) => {
223
+ if (a.formData.value) {
224
+ if (e.excelRecordsKey || e.excelRowsKey) {
225
+ const o = await Ne(L.value);
226
+ if (!o) return null;
227
+ const { excelData: d, excelRows: p } = o, b = d.map((N) => {
228
+ var Q;
229
+ const h = {};
230
+ for (const O in N) {
231
+ const G = (Q = e.excelFieldMap) == null ? void 0 : Q[O];
232
+ G && (h[G] = N[O]);
205
233
  }
206
- return w;
234
+ return h;
207
235
  });
208
- t.formData.value[r.excelBatchField] = u;
236
+ e.excelRecordsKey && (a.formData.value[e.excelRecordsKey] = b), e.excelRowsKey && (a.formData.value[e.excelRowsKey] = p);
209
237
  }
210
- const l = r.fileField ?? "FileInfo";
211
- t.formData.value[l] = e, t.beforeSave && t.beforeSave();
212
- const a = {
238
+ const i = e.fileField ?? "FileInfo";
239
+ a.formData.value[i] = l;
240
+ const r = {};
241
+ a.primaryKey && a.formData.value[a.primaryKey] !== void 0 && (r[a.primaryKey] = a.formData.value[a.primaryKey]);
242
+ const u = {
213
243
  Data: {
214
- ...t.formData.value
244
+ ...a.formData.value
215
245
  },
216
- Query: {
217
- [r.excelCtrl.primaryKey]: t.formData.value[r.excelCtrl.primaryKey]
218
- }
246
+ Query: r
219
247
  };
220
- t.isFormSaving.value = !0;
248
+ if (a.beforeSave && a.beforeSave(u) === !1)
249
+ return;
250
+ a.isFormSaving.value = !0;
221
251
  try {
222
- const s = await Ve(r.excelCtrl, {
223
- params: a,
252
+ const o = await Ee(e.excelCtrl, {
253
+ params: u,
224
254
  urlKey: "save",
225
- url: r.excelCtrl.saveUrl
255
+ url: e.excelCtrl.saveUrl
226
256
  });
227
- (s == null ? void 0 : s.status) === ie.SUCCESS ? (n.success("数据保存成功!"), t.afterSave && t.afterSave(), t.visible.value = !1) : n.error("保存失败:" + ((s == null ? void 0 : s.msg) || "未知错误"));
228
- } catch (s) {
229
- console.error("保存错误:", s), n.error("数据保存失败,请稍后再试!");
257
+ (o == null ? void 0 : o.status) === fe.SUCCESS ? (c.success("数据保存成功!"), a.afterSave && a.afterSave(), a.visible.value = !1) : c.error("保存失败:" + ((o == null ? void 0 : o.msg) || "未知错误"));
258
+ } catch (o) {
259
+ console.error("保存错误:", o), c.error("数据保存失败,请稍后再试!");
230
260
  } finally {
231
- t.isFormSaving.value = !1;
261
+ a.isFormSaving.value = !1;
232
262
  }
233
263
  }
234
- }, R = o(!1), B = o(!1), N = o(null), J = o(""), X = async (e) => {
235
- const l = r.gridCtrl;
236
- if (!l) return !1;
237
- const { hasError: a, errBlob: s } = await Ae(e, t.formRules.value);
238
- if (a) {
239
- if (s) {
240
- R.value = !0, C.value = !1, E.value = "数据验证失败", S.value = "error";
241
- const m = URL.createObjectURL(s);
242
- d.value = m;
243
- }
244
- return !1;
245
- } else
246
- E.value = "数据验证成功", S.value = "success";
247
- if (U.value && U.value.length > 0 && V.value)
264
+ }, _ = v(!1), k = v(!1), L = v(null), q = v(""), re = async (l) => {
265
+ const i = e.gridCtrl;
266
+ if (i) {
267
+ F.value = e.uploadParams;
248
268
  try {
249
- V.value.api || (V.value.api = l.page.api), V.value.authorize === void 0 && (V.value.authorize = l.page.authorize);
250
- const { hasError: m, errBlob: u } = await Me(e, U.value, V.value);
251
- if (m) {
269
+ D.value && (D.value.api || (D.value.api = i.page.api), D.value.authorize === void 0 && (D.value.authorize = i.page.authorize));
270
+ const {
271
+ hasError: r,
272
+ errBlob: u,
273
+ validationMsg: o,
274
+ duplicateMsg: d
275
+ } = await Ke(l, a.formRules.value, M.value, D.value);
276
+ if (V.value = o, $.value = d, r) {
252
277
  if (u) {
253
- B.value = !0, k.value = "检测到重复数据", D.value = "error";
254
- const v = URL.createObjectURL(u);
255
- d.value = v;
278
+ _.value = !0, k.value = !0, E.value = "error", B.value = "error";
279
+ const p = URL.createObjectURL(u);
280
+ w.value = p;
256
281
  }
257
- return !1;
258
282
  } else
259
- B.value = !1, k.value = "数据验证通过", D.value = "success";
283
+ _.value = !1, k.value = !1, E.value = "success", B.value = "success";
260
284
  } catch {
261
- return k.value = "重复检测异常", D.value = "error", !1;
285
+ V.value = "验证异常", $.value = "验证异常", E.value = "error", B.value = "error";
262
286
  }
263
- return !0;
264
- }, ye = async (e) => {
265
- if (!r.gridCtrl) {
266
- n.error("未配置表格控制器!");
287
+ }
288
+ }, xe = async (l) => {
289
+ if (!e.gridCtrl) {
290
+ c.error("未配置表格控制器!");
267
291
  return;
268
292
  }
269
- const a = e.type === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || e.type === "application/vnd.ms-excel", s = e.type === "text/csv" || e.name.toLowerCase().endsWith(".csv"), m = r.fileType || "both";
270
- let u = !1, v = "";
271
- switch (m) {
293
+ F.value = e.uploadParams;
294
+ const r = l.type === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || l.type === "application/vnd.ms-excel", u = l.type === "text/csv" || l.name.toLowerCase().endsWith(".csv"), o = e.fileType || "both";
295
+ let d = !1, p = "";
296
+ switch (o) {
272
297
  case "excel":
273
- u = a, v = "只能上传Excel文件!";
298
+ d = r, p = "只能上传Excel文件!";
274
299
  break;
275
300
  case "csv":
276
- u = s, v = "只能上传CSV文件!";
301
+ d = u, p = "只能上传CSV文件!";
277
302
  break;
278
303
  case "both":
279
304
  default:
280
- u = a || s, v = "只能上传Excel文件或CSV文件!";
305
+ d = r || u, p = "只能上传Excel文件或CSV文件!";
281
306
  break;
282
307
  }
283
- if (!u)
284
- return n.error(v), se.LIST_IGNORE;
308
+ if (!d)
309
+ return c.error(p), ce.LIST_IGNORE;
285
310
  try {
286
- if (c.value = e.name, J.value = s ? "text/csv" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", R.value = !1, B.value = !1, C.value = !0, E.value = "待验证数据规则", S.value = "warning", k.value = "待验证重复数据", D.value = "warning", s) {
287
- const _ = await e.arrayBuffer(), we = new TextDecoder("utf-8").decode(_), { csvToExcelView: ge } = await import("../../assets/modules/index-CKJIxasX.js").then((be) => be.h), z = await ge(we, e.name);
311
+ if (j(), y.value = l.name, q.value = u ? "text/csv" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", u) {
312
+ const h = await l.arrayBuffer(), O = new TextDecoder("utf-8").decode(h), { csvToExcelView: G } = await import("../../assets/modules/index-02J2AYth.js").then((he) => he.j), z = await G(O, l.name);
288
313
  if (!z.success)
289
314
  throw new Error(z.error || "CSV文件处理失败");
290
- const ae = await (await fetch(z.blobUrl)).arrayBuffer();
291
- return N.value = ae, await X(ae) && (d.value = z.blobUrl, c.value = z.fileName, C.value = !1), !1;
315
+ const oe = await (await fetch(z.blobUrl)).arrayBuffer();
316
+ return L.value = oe, await re(oe), !_.value && !k.value && (w.value = z.blobUrl), y.value = z.fileName, a.isFormLoading.value = !1, !1;
292
317
  }
293
- const w = await e.arrayBuffer();
294
- N.value = w;
295
- const p = new FileReader();
296
- p.readAsDataURL(e), p.onload = async (_) => {
297
- if (_.target) {
298
- if (!await X(w))
299
- return;
300
- d.value = _.target.result, C.value = !1;
301
- } else
302
- n.error("加载文件失败,请检查文件格式!");
318
+ const b = await l.arrayBuffer();
319
+ L.value = b;
320
+ const N = new FileReader();
321
+ N.readAsDataURL(l), N.onload = async (h) => {
322
+ h.target ? (await re(b), !_.value && !k.value && (w.value = h.target.result), a.isFormLoading.value = !1) : c.error("加载文件失败,请检查文件格式!");
303
323
  };
304
- } catch (w) {
305
- console.error("文件处理错误:", w), n.error("文件处理失败,请检查文件格式!"), C.value = !1, E.value = "文件处理错误", S.value = "error";
324
+ } catch (b) {
325
+ console.error("文件处理错误:", b), c.error("文件处理失败,请检查文件格式!"), a.isFormLoading.value = !1, V.value = "文件处理错误", E.value = "error";
306
326
  }
307
327
  return !1;
308
- }, M = De(t.formRules.value);
309
- Ue(() => {
310
- var l;
311
- const e = (l = r.gridCtrl) == null ? void 0 : l.page;
312
- if (e && !P.value) {
313
- if (g.value = g.value ?? e.urls.upload, !g.value) {
314
- n.error("未配置文件上传地址!");
328
+ }, A = Se(a.formRules.value);
329
+ be(() => {
330
+ var i;
331
+ const l = (i = e.gridCtrl) == null ? void 0 : i.page;
332
+ if (l && !P.value) {
333
+ if (!R.value) {
334
+ c.error("未配置文件上传地址!");
315
335
  return;
316
336
  }
317
- g.value.api || (g.value.api = e.api), g.value.authorize === void 0 && (g.value.authorize = e.authorize);
318
- for (const a in t.formData.value)
319
- r.gridCtrl.rowData.value && (t.formData.value[a] = r.gridCtrl.rowData.value[a]);
337
+ R.value.api || (R.value.api = l.api), R.value.authorize === void 0 && (R.value.authorize = l.authorize);
338
+ for (const r in a.formData.value)
339
+ e.gridCtrl.rowData.value && (a.formData.value[r] = e.gridCtrl.rowData.value[r]);
320
340
  }
321
- h.value = t.visible.value, h.value && r.previewUrl && j();
341
+ m.value = a.visible.value, m.value && e.previewUrl && I();
322
342
  });
323
- const Y = () => {
324
- t.visible.value = !1;
325
- }, he = () => {
326
- console.error("渲染失败");
343
+ const j = () => {
344
+ if (w.value = "", y.value = "", le.value = [], L.value = null, q.value = "", a.isFormLoading.value = !1, V.value = "待验证数据规则", E.value = "warning", $.value = "待验证重复数据", B.value = "warning", _.value = !1, k.value = !1, a.formData.value) {
345
+ const l = e.fileField ?? "FileInfo", i = e.excelRecordsKey, r = e.excelRowsKey;
346
+ delete a.formData.value[l], i && delete a.formData.value[i], r && delete a.formData.value[r];
347
+ }
348
+ }, se = () => {
349
+ a.visible.value = !1;
350
+ }, ge = () => {
327
351
  };
328
- return (e, l) => (f(), Q(i(Fe), {
329
- title: e.title ?? "文件上传",
330
- open: h.value,
331
- "onUpdate:open": l[0] || (l[0] = (a) => h.value = a),
332
- wrapClassName: ["modal", "mx-auto", e.$attrs.width ? "w-[" + e.$attrs.width + "]" : ""].join(" "),
352
+ return s({
353
+ clearAll: j
354
+ }), (l, i) => (f(), H(n(Fe), {
355
+ title: l.title ?? "文件上传",
356
+ open: m.value,
357
+ "onUpdate:open": i[0] || (i[0] = (r) => m.value = r),
358
+ wrapClassName: ["modal", "mx-auto", l.$attrs.width ? "w-[" + l.$attrs.width + "]" : ""].join(" "),
333
359
  width: 940,
334
- onClose: Y
360
+ onClose: se
335
361
  }, {
336
362
  footer: T(() => [
337
- F(i(Ee), null, {
363
+ C(n(_e), null, {
338
364
  default: T(() => {
339
- var a;
365
+ var r;
340
366
  return [
341
- F(i(W), { onClick: Y }, {
367
+ C(n(Y), { onClick: se }, {
342
368
  default: T(() => [
343
- q(b(e.cancelText ?? (P.value ? "关闭" : "取消")), 1)
369
+ X(S(l.cancelText ?? (P.value ? "关闭" : "取消")), 1)
344
370
  ]),
345
371
  _: 1
346
372
  }),
347
- P.value ? L("", !0) : (f(), Q(i(W), {
373
+ P.value ? K("", !0) : (f(), H(n(Y), {
348
374
  key: 0,
349
375
  onClick: me,
350
376
  type: "primary",
351
- loading: ((a = i(t)) == null ? void 0 : a.isFormSaving.value) ?? !1,
352
- disabled: !d.value || R.value || B.value || C.value
377
+ loading: ((r = n(a)) == null ? void 0 : r.isFormSaving.value) ?? !1,
378
+ disabled: !w.value || _.value || k.value || n(a).isFormLoading.value
353
379
  }, {
354
380
  default: T(() => [
355
- q(b(e.saveText ?? "上传文件"), 1)
381
+ X(S(l.saveText ?? "上传文件"), 1)
356
382
  ]),
357
383
  _: 1
358
384
  }, 8, ["loading", "disabled"]))
@@ -362,40 +388,50 @@ const je = {
362
388
  })
363
389
  ]),
364
390
  default: T(() => [
365
- _e(e.$slots, "default"),
366
- P.value ? L("", !0) : (f(), y("div", je, [
367
- F(i(se), {
368
- "file-list": ce.value,
369
- "before-upload": ye,
370
- accept: ue.value,
371
- showUploadList: !0
391
+ J(l.$slots, "default"),
392
+ P.value ? K("", !0) : (f(), x("div", $e, [
393
+ J(l.$slots, "file-before"),
394
+ C(n(ce), {
395
+ "file-list": le.value,
396
+ "before-upload": xe,
397
+ accept: de.value,
398
+ showUploadList: !0,
399
+ disabled: !te.value
372
400
  }, {
373
401
  default: T(() => [
374
- F(i(W), { type: "primary" }, {
402
+ C(n(Y), {
403
+ type: "primary",
404
+ disabled: !te.value
405
+ }, {
375
406
  default: T(() => [
376
- q(b(ve.value), 1)
407
+ X(S(pe.value), 1)
377
408
  ]),
378
409
  _: 1
379
- })
410
+ }, 8, ["disabled"])
380
411
  ]),
381
412
  _: 1
382
- }, 8, ["file-list", "accept"]),
383
- d.value && c.value ? (f(), y("div", Oe, [
384
- x("span", null, b(c.value), 1)
385
- ])) : L("", !0)
413
+ }, 8, ["file-list", "accept", "disabled"]),
414
+ w.value && y.value ? (f(), x("div", Ae, [
415
+ C(n(Z), {
416
+ message: y.value,
417
+ type: "info",
418
+ "show-icon": !1
419
+ }, null, 8, ["message"])
420
+ ])) : K("", !0),
421
+ J(l.$slots, "file-after")
386
422
  ])),
387
- x("div", Ke, [
388
- i(t).isFormLoading.value ? (f(), Q(i(Ne), {
423
+ g("div", je, [
424
+ n(a).isFormLoading.value ? (f(), H(n(Le), {
389
425
  key: 0,
390
426
  size: "large"
391
- })) : L("", !0),
392
- x("div", {
393
- class: Te(["flex-shrink-0 relative border border-gray-200 rounded-md overflow-hidden", [i(M).length === 0 ? "w-[100%]" : "w-[80%]"]]),
427
+ })) : K("", !0),
428
+ g("div", {
429
+ class: Ce(["flex-shrink-0 relative border border-gray-200 rounded-md overflow-hidden", [n(A).length === 0 ? "w-[100%]" : "w-[80%]"]]),
394
430
  style: { height: "430px" }
395
431
  }, [
396
- F(i($e), {
397
- src: d.value,
398
- onError: he,
432
+ C(n(Ve), {
433
+ src: w.value,
434
+ onError: ge,
399
435
  style: { width: "100%", height: "100%" },
400
436
  options: {
401
437
  styles: !0,
@@ -407,46 +443,46 @@ const je = {
407
443
  }
408
444
  }, null, 8, ["src"])
409
445
  ], 2),
410
- i(M).length > 0 ? (f(), y("div", Ge, [
411
- x("div", Ie, [
412
- i(M).length === 0 ? (f(), y("div", Qe, "没有设置验证规则")) : (f(), y("div", qe, [
413
- F(i(oe), {
414
- message: E.value,
415
- type: S.value,
446
+ n(A).length > 0 ? (f(), x("div", Oe, [
447
+ g("div", Ge, [
448
+ n(A).length === 0 ? (f(), x("div", Ie, "没有设置验证规则")) : (f(), x("div", qe, [
449
+ C(n(Z), {
450
+ message: V.value,
451
+ type: E.value,
416
452
  "show-icon": "",
417
453
  class: "mb-2"
418
454
  }, null, 8, ["message", "type"]),
419
- x("div", We, [
420
- (f(!0), y(re, null, te(i(M), (a, s) => (f(), y("div", {
421
- key: s,
455
+ g("div", Qe, [
456
+ (f(!0), x(ie, null, ne(n(A), (r, u) => (f(), x("div", {
457
+ key: u,
422
458
  class: "border-b pb-0"
423
459
  }, [
424
- x("div", He, b(a.field), 1),
425
- x("ul", Je, [
426
- (f(!0), y(re, null, te(a.rules, (m, u) => (f(), y("li", {
427
- key: u,
460
+ g("div", We, S(r.field), 1),
461
+ g("ul", He, [
462
+ (f(!0), x(ie, null, ne(r.rules, (o, d) => (f(), x("li", {
463
+ key: d,
428
464
  class: "text-[12px] text-gray-600"
429
- }, b(m), 1))), 128))
465
+ }, S(o), 1))), 128))
430
466
  ])
431
467
  ]))), 128))
432
468
  ]),
433
- U.value && U.value.length > 0 ? (f(), y("div", Xe, [
434
- F(i(oe), {
435
- message: k.value,
436
- type: D.value,
469
+ M.value && M.value.length > 0 ? (f(), x("div", Je, [
470
+ C(n(Z), {
471
+ message: $.value,
472
+ type: B.value,
437
473
  "show-icon": "",
438
474
  class: "mt-2 mb-2"
439
475
  }, null, 8, ["message", "type"]),
440
- x("div", Ye, [
441
- x("div", Ze, " 以下" + b(U.value.length > 1 ? "组合" : "字段") + "必须唯一 ", 1),
442
- x("ul", el, [
443
- x("li", ll, b(U.value.join(", ")), 1)
476
+ g("div", Xe, [
477
+ g("div", Ye, " 以下" + S(M.value.length > 1 ? "组合" : "字段") + "必须唯一 ", 1),
478
+ g("ul", Ze, [
479
+ g("li", ea, S(M.value.join(", ")), 1)
444
480
  ])
445
481
  ])
446
- ])) : L("", !0)
482
+ ])) : K("", !0)
447
483
  ]))
448
484
  ])
449
- ])) : L("", !0)
485
+ ])) : K("", !0)
450
486
  ])
451
487
  ]),
452
488
  _: 3
@@ -454,5 +490,5 @@ const je = {
454
490
  }
455
491
  });
456
492
  export {
457
- xl as default
493
+ ma as default
458
494
  };