z-crud-table 0.0.24 → 0.0.25

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.
@@ -1,83 +1,83 @@
1
- import { defineComponent as M, ref as $, resolveComponent as c, createBlock as p, openBlock as n, mergeProps as C, withCtx as u, createElementBlock as w, Fragment as A, renderList as j, createCommentVNode as m, createTextVNode as _, toDisplayString as re, computed as P, reactive as W, onMounted as ne, resolveDirective as ie, normalizeClass as se, renderSlot as b, withDirectives as H, createVNode as v, createElementVNode as I, createSlots as ue } from "vue";
2
- import { ElMessage as U } from "element-plus";
1
+ import { defineComponent as G, ref as O, resolveComponent as g, createBlock as f, openBlock as n, mergeProps as D, withCtx as u, createElementBlock as w, Fragment as $, renderList as q, createCommentVNode as c, createTextVNode as C, toDisplayString as re, computed as j, reactive as H, onMounted as ne, resolveDirective as ie, normalizeClass as se, renderSlot as b, withDirectives as M, createVNode as v, createElementVNode as I, createSlots as ue } from "vue";
2
+ import { ElMessage as k } from "element-plus";
3
3
  import de from "axios";
4
- const pe = /* @__PURE__ */ M({
4
+ const pe = /* @__PURE__ */ G({
5
5
  __name: "DynamicForm",
6
6
  props: {
7
7
  modelValue: {},
8
8
  formConfig: {},
9
9
  rules: {}
10
10
  },
11
- setup(g, { expose: k }) {
12
- const z = $(null);
13
- return k({
11
+ setup(y, { expose: B }) {
12
+ const N = O(null);
13
+ return B({
14
14
  validate: () => {
15
15
  var s;
16
- return (s = z.value) == null ? void 0 : s.validate();
16
+ return (s = N.value) == null ? void 0 : s.validate();
17
17
  }
18
18
  }), (s, e) => {
19
- const F = c("el-input"), q = c("el-option"), h = c("el-select"), Q = c("el-radio"), f = c("el-radio-group"), B = c("el-form-item"), V = c("el-form");
20
- return n(), p(V, C({
19
+ const z = g("el-input"), Q = g("el-option"), h = g("el-select"), x = g("el-radio"), m = g("el-radio-group"), V = g("el-form-item"), A = g("el-form");
20
+ return n(), f(A, D({
21
21
  model: s.modelValue,
22
22
  rules: s.rules,
23
23
  ref_key: "formRef",
24
- ref: z
24
+ ref: N
25
25
  }, s.$attrs), {
26
26
  default: u(() => [
27
- (n(!0), w(A, null, j(s.formConfig, (r) => (n(), p(B, {
27
+ (n(!0), w($, null, q(s.formConfig, (r) => (n(), f(V, {
28
28
  key: r.prop,
29
29
  label: r.label,
30
30
  prop: r.prop
31
31
  }, {
32
32
  default: u(() => [
33
- r.type === "input" ? (n(), p(F, C({
33
+ r.type === "input" ? (n(), f(z, D({
34
34
  key: 0,
35
35
  modelValue: s.modelValue[r.prop],
36
36
  "onUpdate:modelValue": (d) => s.modelValue[r.prop] = d
37
- }, { ref_for: !0 }, r.componentProps), null, 16, ["modelValue", "onUpdate:modelValue"])) : m("", !0),
38
- r.type === "textarea" ? (n(), p(F, C({
37
+ }, { ref_for: !0 }, r.componentProps), null, 16, ["modelValue", "onUpdate:modelValue"])) : c("", !0),
38
+ r.type === "textarea" ? (n(), f(z, D({
39
39
  key: 1,
40
40
  type: "textarea",
41
41
  modelValue: s.modelValue[r.prop],
42
42
  "onUpdate:modelValue": (d) => s.modelValue[r.prop] = d
43
- }, { ref_for: !0 }, r.componentProps), null, 16, ["modelValue", "onUpdate:modelValue"])) : m("", !0),
44
- r.type === "select" ? (n(), p(h, C({
43
+ }, { ref_for: !0 }, r.componentProps), null, 16, ["modelValue", "onUpdate:modelValue"])) : c("", !0),
44
+ r.type === "select" ? (n(), f(h, D({
45
45
  key: 2,
46
46
  modelValue: s.modelValue[r.prop],
47
47
  "onUpdate:modelValue": (d) => s.modelValue[r.prop] = d
48
48
  }, { ref_for: !0 }, r.componentProps), {
49
49
  default: u(() => [
50
- (n(!0), w(A, null, j(r.options, (d) => (n(), p(q, {
50
+ (n(!0), w($, null, q(r.options, (d) => (n(), f(Q, {
51
51
  key: d.value,
52
52
  label: d.label,
53
53
  value: d.value
54
54
  }, null, 8, ["label", "value"]))), 128))
55
55
  ]),
56
56
  _: 2
57
- }, 1040, ["modelValue", "onUpdate:modelValue"])) : m("", !0),
58
- r.type === "radio-group" ? (n(), p(f, C({
57
+ }, 1040, ["modelValue", "onUpdate:modelValue"])) : c("", !0),
58
+ r.type === "radio-group" ? (n(), f(m, D({
59
59
  key: 3,
60
60
  modelValue: s.modelValue[r.prop],
61
61
  "onUpdate:modelValue": (d) => s.modelValue[r.prop] = d
62
62
  }, { ref_for: !0 }, r.componentProps), {
63
63
  default: u(() => [
64
- (n(!0), w(A, null, j(r.options, (d) => (n(), p(Q, {
64
+ (n(!0), w($, null, q(r.options, (d) => (n(), f(x, {
65
65
  key: d.value,
66
66
  label: d.value
67
67
  }, {
68
68
  default: u(() => [
69
- _(re(d.label), 1)
69
+ C(re(d.label), 1)
70
70
  ]),
71
71
  _: 2
72
72
  }, 1032, ["label"]))), 128))
73
73
  ]),
74
74
  _: 2
75
- }, 1040, ["modelValue", "onUpdate:modelValue"])) : m("", !0),
76
- r.type === "input-disabled" ? (n(), p(F, C({
75
+ }, 1040, ["modelValue", "onUpdate:modelValue"])) : c("", !0),
76
+ r.type === "input-disabled" ? (n(), f(z, D({
77
77
  key: 4,
78
78
  "model-value": s.modelValue[r.prop],
79
79
  disabled: ""
80
- }, { ref_for: !0 }, r.componentProps), null, 16, ["model-value"])) : m("", !0)
80
+ }, { ref_for: !0 }, r.componentProps), null, 16, ["model-value"])) : c("", !0)
81
81
  ]),
82
82
  _: 2
83
83
  }, 1032, ["label", "prop"]))), 128))
@@ -94,20 +94,20 @@ const pe = /* @__PURE__ */ M({
94
94
  // 请求超时时间
95
95
  });
96
96
  S.interceptors.request.use(
97
- (g) => {
98
- const k = localStorage.getItem("token");
99
- return k && (g.headers.Authorization = "Bearer " + k), g;
97
+ (y) => {
98
+ const B = localStorage.getItem("token");
99
+ return B && (y.headers.Authorization = "Bearer " + B), y;
100
100
  },
101
- (g) => (console.log(g), Promise.reject(g))
101
+ (y) => (console.log(y), Promise.reject(y))
102
102
  );
103
103
  S.interceptors.response.use(
104
- (g) => g.data,
105
- (g) => (console.log("err" + g), U({
104
+ (y) => y.data,
105
+ (y) => (console.log("err" + y), k({
106
106
  message: "接口错误,请刷新接口",
107
107
  // 这里是您要求的统一错误提示
108
108
  type: "error",
109
109
  duration: 5 * 1e3
110
- }), Promise.reject(g))
110
+ }), Promise.reject(y))
111
111
  );
112
112
  const fe = {
113
113
  key: 0,
@@ -118,7 +118,7 @@ const fe = {
118
118
  }, ye = {
119
119
  key: 1,
120
120
  class: "flex justify-end"
121
- }, be = { class: "dialog-footer" }, Se = /* @__PURE__ */ M({
121
+ }, be = { class: "dialog-footer" }, Se = /* @__PURE__ */ G({
122
122
  __name: "CrudTable",
123
123
  props: {
124
124
  /**
@@ -180,163 +180,175 @@ const fe = {
180
180
  submitAsFormData: { type: Boolean, default: !1 }
181
181
  },
182
182
  emits: ["open-dialog", "submit", "delete"],
183
- setup(g, { expose: k, emit: z }) {
184
- const s = z, e = g, F = P(() => ["crud-table-wrapper", `theme-${e.theme}`, e.customClass]), q = P(() => e.theme === "large-screen" ? "large-screen-dialog" : ""), h = (t, o) => t ? !0 : (U.error(`${o} prop is required.`), !1), Q = async (t, o) => {
183
+ setup(y, { expose: B, emit: N }) {
184
+ const s = N, e = y, z = j(() => ["crud-table-wrapper", `theme-${e.theme}`, e.customClass]), Q = j(() => e.theme === "large-screen" ? "large-screen-dialog" : ""), h = (t, o) => t ? !0 : (k.error(`${o} prop is required.`), !1), x = async (t, o) => {
185
185
  try {
186
- let l = { ...o };
187
- if (e.onBeforeSubmit && (l = await e.onBeforeSubmit(l)), a.submitting = !0, t === "add") {
188
- if (!h(e.apiUrlCreate, "apiUrlCreate")) return;
189
- await S.post(e.apiUrlCreate, l), U.success("新增成功");
186
+ let a = { ...o };
187
+ e.onBeforeSubmit && (a = await e.onBeforeSubmit(a));
188
+ let p = a;
189
+ if (e.submitAsFormData) {
190
+ const F = new FormData();
191
+ for (const _ in a)
192
+ if (Object.prototype.hasOwnProperty.call(a, _)) {
193
+ const E = a[_];
194
+ F.append(_, E ?? "");
195
+ }
196
+ p = F;
197
+ }
198
+ if (l.submitting = !0, t === "add") {
199
+ if (!h(e.apiUrlCreate, "apiUrlCreate")) throw new Error("apiUrlCreate is not configured.");
200
+ await S.post(e.apiUrlCreate, p), k.success("新增成功");
190
201
  } else {
191
- if (!h(e.apiUrlUpdate, "apiUrlUpdate")) return;
192
- await S.put(e.apiUrlUpdate, l), U.success("更新成功");
202
+ if (!h(e.apiUrlUpdate, "apiUrlUpdate")) throw new Error("apiUrlUpdate is not configured.");
203
+ await S.put(e.apiUrlUpdate, p), k.success("更新成功");
193
204
  }
194
- return e.onAfterSubmit && e.onAfterSubmit(t, l), s("submit", { mode: t, data: l }), a.visible && (a.visible = !1), D(), Promise.resolve();
195
- } catch (l) {
196
- return console.log("Submit error:", l), Promise.reject(l);
205
+ return e.onAfterSubmit && e.onAfterSubmit(t, a), s("submit", { mode: t, data: a }), l.visible && (l.visible = !1), U(), Promise.resolve();
206
+ } catch (a) {
207
+ return console.error("Submit failed:", a), Promise.reject(a);
197
208
  } finally {
198
- a.submitting = !1;
209
+ l.submitting = !1;
199
210
  }
200
- }, f = W({ pageNum: 1, pageSize: 10, ...e.initialSearchForm }), B = $([]), V = $(0), r = $(!1), d = $([]), a = W({ visible: !1, loading: !1, submitting: !1, mode: "add", data: {}, formRef: null }), G = P(() => a.mode === "add" ? "新增" : "编辑"), J = P(() => {
201
- if (a.mode === "add") return e.dialogFormConfig.filter((o) => o.prop !== "id");
211
+ }, m = H({ pageNum: 1, pageSize: 10, ...e.initialSearchForm }), V = O([]), A = O(0), r = O(!1), d = O([]), l = H({ visible: !1, loading: !1, submitting: !1, mode: "add", data: {}, formRef: null }), J = j(() => l.mode === "add" ? "新增" : "编辑"), K = j(() => {
212
+ if (l.mode === "add") return e.dialogFormConfig.filter((o) => o.prop !== "id");
202
213
  const t = [...e.dialogFormConfig.filter((o) => o.prop !== "id")];
203
214
  return t.some((o) => o.prop === "id") || t.unshift({ type: "input-disabled", prop: "id", label: "用户ID" }), t;
204
- }), D = async () => {
215
+ }), U = async () => {
205
216
  if (h(e.apiUrlQuery, "apiUrlQuery")) {
206
217
  r.value = !0;
207
218
  try {
208
- let t = { ...f };
219
+ let t = { ...m };
209
220
  e.onBeforeQuery && (t = await e.onBeforeQuery(t));
210
221
  const o = await S.get(e.apiUrlQuery, { params: t });
211
222
  if (o && o.data && Array.isArray(o.data.rows) && typeof o.data.total == "number") {
212
- let l = o.data.rows;
213
- e.onAfterQuery && (l = await e.onAfterQuery(l)), B.value = l, V.value = o.data.total;
223
+ let a = o.data.rows;
224
+ e.onAfterQuery && (a = await e.onAfterQuery(a)), V.value = a, A.value = o.data.total;
214
225
  } else
215
- console.warn("API response is not in the expected { data: { rows: [], total: 0 } } format."), B.value = [], V.value = 0;
226
+ console.warn("API response is not in the expected { data: { rows: [], total: 0 } } format."), V.value = [], A.value = 0;
216
227
  } catch (t) {
217
228
  console.error("Fetch data failed:", t);
218
229
  } finally {
219
230
  r.value = !1;
220
231
  }
221
232
  }
222
- }, N = () => {
223
- f.pageNum = 1, D();
224
- }, K = () => {
225
- const { pageNum: t, pageSize: o, ...l } = e.initialSearchForm;
226
- Object.keys(f).forEach((y) => {
227
- y !== "pageNum" && y !== "pageSize" && delete f[y];
228
- }), Object.assign(f, l), N();
229
- }, X = (t) => {
233
+ }, P = () => {
234
+ m.pageNum = 1, U();
235
+ }, X = () => {
236
+ const { pageNum: t, pageSize: o, ...a } = e.initialSearchForm;
237
+ Object.keys(m).forEach((p) => {
238
+ p !== "pageNum" && p !== "pageSize" && delete m[p];
239
+ }), Object.assign(m, a), P();
240
+ }, Y = (t) => {
230
241
  d.value = t;
231
- }, x = async (t, o) => {
232
- let l;
233
- if (t === "add" ? l = o ? { ...o } : { role: "user" } : l = { ...o }, e.onBeforeOpenDialog) {
234
- const y = await e.onBeforeOpenDialog(t, l);
235
- y && (l = y);
242
+ }, R = async (t, o) => {
243
+ let a;
244
+ if (t === "add" ? a = o ? { ...o } : { role: "user" } : a = { ...o }, e.onBeforeOpenDialog) {
245
+ const p = await e.onBeforeOpenDialog(t, a);
246
+ p && (a = p);
236
247
  }
237
- if (a.mode = t, a.visible = !0, t === "edit") {
248
+ if (l.mode = t, l.visible = !0, t === "edit") {
238
249
  if (!h(e.apiUrlDetail, "apiUrlDetail")) return;
239
- a.loading = !0;
250
+ l.loading = !0;
240
251
  try {
241
- const y = await S.get(e.apiUrlDetail + "/" + l.id.toString());
242
- a.data = y.data.data;
252
+ const p = await S.get(e.apiUrlDetail + "/" + a.id.toString());
253
+ l.data = p.data.data;
243
254
  } finally {
244
- a.loading = !1, e.onAfterOpenDialog && e.onAfterOpenDialog(t, a.data), s("open-dialog", { mode: t, data: a.data });
255
+ l.loading = !1, e.onAfterOpenDialog && e.onAfterOpenDialog(t, l.data), s("open-dialog", { mode: t, data: l.data });
245
256
  }
246
257
  } else
247
- a.data = l, e.onAfterOpenDialog && e.onAfterOpenDialog(t, a.data), s("open-dialog", { mode: t, data: a.data });
248
- }, Y = async () => {
258
+ l.data = a, e.onAfterOpenDialog && e.onAfterOpenDialog(t, l.data), s("open-dialog", { mode: t, data: l.data });
259
+ }, Z = async () => {
249
260
  try {
250
- a.formRef && await a.formRef.validate();
251
- let t = { ...a.data };
261
+ l.formRef && await l.formRef.validate();
262
+ let t = { ...l.data };
252
263
  e.onBeforeSubmit && (t = await e.onBeforeSubmit(t));
253
264
  let o = t;
254
265
  if (e.submitAsFormData) {
255
- const l = new FormData();
256
- for (const y in t)
257
- if (Object.prototype.hasOwnProperty.call(t, y)) {
258
- const R = t[y];
259
- l.append(y, R ?? "");
266
+ const a = new FormData();
267
+ for (const p in t)
268
+ if (Object.prototype.hasOwnProperty.call(t, p)) {
269
+ const F = t[p];
270
+ a.append(p, F ?? "");
260
271
  }
261
- o = l;
272
+ o = a;
273
+ debugger;
262
274
  }
263
- if (a.submitting = !0, a.mode === "add") {
275
+ if (l.submitting = !0, l.mode === "add") {
264
276
  if (!h(e.apiUrlCreate, "apiUrlCreate")) return;
265
- await S.post(e.apiUrlCreate, o), U.success("新增成功");
277
+ await S.post(e.apiUrlCreate, o), k.success("新增成功");
266
278
  } else {
267
279
  if (!h(e.apiUrlUpdate, "apiUrlUpdate")) return;
268
- await S.put(e.apiUrlUpdate, o), U.success("更新成功");
280
+ await S.put(e.apiUrlUpdate, o), k.success("更新成功");
269
281
  }
270
- e.onAfterSubmit && e.onAfterSubmit(a.mode, t), s("submit", { mode: a.mode, data: t }), a.visible = !1, D();
282
+ e.onAfterSubmit && e.onAfterSubmit(l.mode, t), s("submit", { mode: l.mode, data: t }), l.visible = !1, U();
271
283
  } catch (t) {
272
284
  console.log("Submit error or validation failed:", t);
273
285
  } finally {
274
- a.submitting = !1;
286
+ l.submitting = !1;
275
287
  }
276
- }, T = async (t) => {
288
+ }, L = async (t) => {
277
289
  if (h(e.apiUrlDelete, "apiUrlDelete"))
278
290
  try {
279
291
  if (e.onBeforeDelete && await e.onBeforeDelete(t) === !1)
280
292
  return;
281
293
  const o = t.join(",");
282
- await S.delete(e.apiUrlDelete + "/" + o.toString()), U.success("删除成功"), e.onAfterDelete && e.onAfterDelete(t), s("delete", t), B.value.length === t.length && f.pageNum > 1 && f.pageNum--, D();
294
+ await S.delete(e.apiUrlDelete + "/" + o.toString()), k.success("删除成功"), e.onAfterDelete && e.onAfterDelete(t), s("delete", t), V.value.length === t.length && m.pageNum > 1 && m.pageNum--, U();
283
295
  } catch (o) {
284
296
  console.error("Delete failed", o);
285
297
  }
286
- }, Z = (t) => {
287
- f.pageSize = t, N();
288
298
  }, ee = (t) => {
289
- f.pageNum = t, D();
299
+ m.pageSize = t, P();
300
+ }, te = (t) => {
301
+ m.pageNum = t, U();
290
302
  };
291
- return ne(D), k({
292
- refresh: D,
303
+ return ne(U), B({
304
+ refresh: U,
293
305
  // 刷新表格
294
- search: N,
306
+ search: P,
295
307
  // 按当前条件搜索
296
- handleDelete: T,
308
+ handleDelete: L,
297
309
  // 手动触发删除
298
- openDialog: x,
310
+ openDialog: R,
299
311
  // 手动打开弹窗
300
- submit: Q
312
+ submit: x
301
313
  // 手动提交
302
314
  }), (t, o) => {
303
- const l = c("el-button"), y = c("el-form-item"), R = c("el-form"), O = c("el-table-column"), te = c("el-popconfirm"), oe = c("el-table"), ae = c("el-pagination"), le = c("el-dialog"), L = ie("loading");
315
+ const a = g("el-button"), p = g("el-form-item"), F = g("el-form"), _ = g("el-table-column"), E = g("el-popconfirm"), oe = g("el-table"), ae = g("el-pagination"), le = g("el-dialog"), W = ie("loading");
304
316
  return n(), w("div", {
305
- class: se(F.value)
317
+ class: se(z.value)
306
318
  }, [
307
319
  b(t.$slots, "header"),
308
320
  e.showSearchSection ? (n(), w("div", fe, [
309
- v(R, {
310
- model: f,
321
+ v(F, {
322
+ model: m,
311
323
  class: "query-form flex flex-nowrap items-center gap-x-4",
312
324
  style: { "overflow-x": "auto", "padding-bottom": "8px" }
313
325
  }, {
314
326
  default: u(() => [
315
- b(t.$slots, "query-conditions", { searchForm: f }),
316
- v(y, { class: "!mr-0 flex-shrink-0" }, {
327
+ b(t.$slots, "query-conditions", { searchForm: m }),
328
+ v(p, { class: "!mr-0 flex-shrink-0" }, {
317
329
  default: u(() => [
318
330
  I("div", me, [
319
331
  b(t.$slots, "query-left"),
320
- e.showSearchActionButtons ? (n(), w(A, { key: 0 }, [
321
- v(l, {
332
+ e.showSearchActionButtons ? (n(), w($, { key: 0 }, [
333
+ v(a, {
322
334
  type: "primary",
323
- onClick: N,
335
+ onClick: P,
324
336
  loading: r.value
325
337
  }, {
326
338
  default: u(() => o[6] || (o[6] = [
327
- _("搜索")
339
+ C("搜索")
328
340
  ])),
329
341
  _: 1,
330
342
  __: [6]
331
343
  }, 8, ["loading"]),
332
- v(l, { onClick: K }, {
344
+ v(a, { onClick: X }, {
333
345
  default: u(() => o[7] || (o[7] = [
334
- _("清空")
346
+ C("清空")
335
347
  ])),
336
348
  _: 1,
337
349
  __: [7]
338
350
  })
339
- ], 64)) : m("", !0),
351
+ ], 64)) : c("", !0),
340
352
  b(t.$slots, "query-right")
341
353
  ])
342
354
  ]),
@@ -348,40 +360,40 @@ const fe = {
348
360
  I("div", ce, [
349
361
  b(t.$slots, "action-left", { selections: d.value }),
350
362
  b(t.$slots, "add-button-content", {}, () => [
351
- e.showNewBtn ? (n(), p(l, {
363
+ e.showNewBtn ? (n(), f(a, {
352
364
  key: 0,
353
365
  type: "success",
354
- onClick: o[0] || (o[0] = (i) => x("add"))
366
+ onClick: o[0] || (o[0] = (i) => R("add"))
355
367
  }, {
356
368
  default: u(() => o[8] || (o[8] = [
357
- _("新增")
369
+ C("新增")
358
370
  ])),
359
371
  _: 1,
360
372
  __: [8]
361
- })) : m("", !0)
373
+ })) : c("", !0)
362
374
  ]),
363
375
  b(t.$slots, "action-right")
364
376
  ])
365
- ])) : m("", !0),
366
- H((n(), p(oe, C({
367
- data: B.value,
368
- onSelectionChange: X
377
+ ])) : c("", !0),
378
+ M((n(), f(oe, D({
379
+ data: V.value,
380
+ onSelectionChange: Y
369
381
  }, t.$attrs, { style: { width: "100%", "margin-bottom": "1.5rem" } }), {
370
382
  default: u(() => [
371
- e.showSelectionColumn ? (n(), p(O, {
383
+ e.showSelectionColumn ? (n(), f(_, {
372
384
  key: 0,
373
385
  type: "selection",
374
386
  width: "55",
375
387
  fixed: ""
376
- })) : m("", !0),
377
- e.showIndexColumn ? (n(), p(O, {
388
+ })) : c("", !0),
389
+ e.showIndexColumn ? (n(), f(_, {
378
390
  key: 1,
379
391
  type: "index",
380
392
  label: "序号",
381
393
  width: "70",
382
394
  fixed: ""
383
- })) : m("", !0),
384
- (n(!0), w(A, null, j(e.columns, (i) => (n(), p(O, C({
395
+ })) : c("", !0),
396
+ (n(!0), w($, null, q(e.columns, (i) => (n(), f(_, D({
385
397
  key: i.prop,
386
398
  prop: i.prop,
387
399
  label: i.label,
@@ -390,119 +402,119 @@ const fe = {
390
402
  }, { ref_for: !0 }, i.attrs), ue({ _: 2 }, [
391
403
  i.slot ? {
392
404
  name: "default",
393
- fn: u((E) => [
405
+ fn: u((T) => [
394
406
  b(t.$slots, i.slot, {
395
- row: E.row
407
+ row: T.row
396
408
  })
397
409
  ]),
398
410
  key: "0"
399
411
  } : void 0
400
412
  ]), 1040, ["prop", "label", "width", "sortable"]))), 128)),
401
- e.showActionsColumn ? (n(), p(O, {
413
+ e.showActionsColumn ? (n(), f(_, {
402
414
  key: 2,
403
415
  label: "操作",
404
- width: g.actionsColumnWidth
416
+ width: y.actionsColumnWidth
405
417
  }, {
406
418
  default: u((i) => [
407
419
  i.row ? (n(), w("div", ge, [
408
420
  t.$slots.actions ? b(t.$slots, "actions", {
409
421
  key: 0,
410
422
  row: i.row
411
- }) : (n(), w(A, { key: 1 }, [
423
+ }) : (n(), w($, { key: 1 }, [
412
424
  b(t.$slots, "action-before-edit", {
413
425
  row: i.row
414
426
  }),
415
- e.showEditButton ? (n(), p(l, {
427
+ e.showEditButton ? (n(), f(a, {
416
428
  key: 0,
417
429
  size: "small",
418
430
  type: "primary",
419
431
  link: "",
420
- onClick: (E) => x("edit", i.row)
432
+ onClick: (T) => R("edit", i.row)
421
433
  }, {
422
434
  default: u(() => o[9] || (o[9] = [
423
- _("编辑 ")
435
+ C("编辑 ")
424
436
  ])),
425
437
  _: 2,
426
438
  __: [9]
427
- }, 1032, ["onClick"])) : m("", !0),
428
- e.showDeleteButton ? (n(), p(te, {
439
+ }, 1032, ["onClick"])) : c("", !0),
440
+ e.showDeleteButton ? (n(), f(E, {
429
441
  key: 1,
430
442
  title: "确定要删除这条数据吗?",
431
- onConfirm: (E) => T([i.row.id]),
443
+ onConfirm: (T) => L([i.row.id]),
432
444
  "confirm-button-text": "确定",
433
445
  "cancel-button-text": "取消",
434
446
  width: "200"
435
447
  }, {
436
448
  reference: u(() => [
437
- v(l, {
449
+ v(a, {
438
450
  size: "small",
439
451
  type: "danger",
440
452
  link: ""
441
453
  }, {
442
454
  default: u(() => o[10] || (o[10] = [
443
- _("删除")
455
+ C("删除")
444
456
  ])),
445
457
  _: 1,
446
458
  __: [10]
447
459
  })
448
460
  ]),
449
461
  _: 2
450
- }, 1032, ["onConfirm"])) : m("", !0),
462
+ }, 1032, ["onConfirm"])) : c("", !0),
451
463
  b(t.$slots, "action-after-delete", {
452
464
  row: i.row
453
465
  })
454
466
  ], 64))
455
- ])) : m("", !0)
467
+ ])) : c("", !0)
456
468
  ]),
457
469
  _: 3
458
- }, 8, ["width"])) : m("", !0)
470
+ }, 8, ["width"])) : c("", !0)
459
471
  ]),
460
472
  _: 3
461
473
  }, 16, ["data"])), [
462
- [L, r.value]
474
+ [W, r.value]
463
475
  ]),
464
- e.showPagination && V.value > 0 ? (n(), w("div", ye, [
476
+ e.showPagination && A.value > 0 ? (n(), w("div", ye, [
465
477
  v(ae, {
466
- "current-page": f.pageNum,
467
- "onUpdate:currentPage": o[1] || (o[1] = (i) => f.pageNum = i),
468
- "page-size": f.pageSize,
469
- "onUpdate:pageSize": o[2] || (o[2] = (i) => f.pageSize = i),
478
+ "current-page": m.pageNum,
479
+ "onUpdate:currentPage": o[1] || (o[1] = (i) => m.pageNum = i),
480
+ "page-size": m.pageSize,
481
+ "onUpdate:pageSize": o[2] || (o[2] = (i) => m.pageSize = i),
470
482
  "page-sizes": e.pageSizes,
471
483
  layout: e.paginationLayout,
472
- total: V.value,
484
+ total: A.value,
473
485
  background: e.paginationBackground,
474
486
  small: e.paginationSmall,
475
487
  "hide-on-single-page": e.paginationHideOnSinglePage,
476
- onSizeChange: Z,
477
- onCurrentChange: ee
488
+ onSizeChange: ee,
489
+ onCurrentChange: te
478
490
  }, null, 8, ["current-page", "page-size", "page-sizes", "layout", "total", "background", "small", "hide-on-single-page"])
479
- ])) : m("", !0),
491
+ ])) : c("", !0),
480
492
  v(le, {
481
- modelValue: a.visible,
482
- "onUpdate:modelValue": o[5] || (o[5] = (i) => a.visible = i),
483
- title: G.value,
493
+ modelValue: l.visible,
494
+ "onUpdate:modelValue": o[5] || (o[5] = (i) => l.visible = i),
495
+ title: J.value,
484
496
  width: e.dialogWidth,
485
497
  "destroy-on-close": !0,
486
- "custom-class": q.value
498
+ "custom-class": Q.value
487
499
  }, {
488
500
  footer: u(() => [
489
501
  I("div", be, [
490
- v(l, {
491
- onClick: o[4] || (o[4] = (i) => a.visible = !1)
502
+ v(a, {
503
+ onClick: o[4] || (o[4] = (i) => l.visible = !1)
492
504
  }, {
493
505
  default: u(() => o[11] || (o[11] = [
494
- _("取消")
506
+ C("取消")
495
507
  ])),
496
508
  _: 1,
497
509
  __: [11]
498
510
  }),
499
- v(l, {
511
+ v(a, {
500
512
  type: "primary",
501
- onClick: Y,
502
- loading: a.submitting
513
+ onClick: Z,
514
+ loading: l.submitting
503
515
  }, {
504
516
  default: u(() => o[12] || (o[12] = [
505
- _("确定")
517
+ C("确定")
506
518
  ])),
507
519
  _: 1,
508
520
  __: [12]
@@ -510,23 +522,23 @@ const fe = {
510
522
  ])
511
523
  ]),
512
524
  default: u(() => [
513
- H((n(), w("div", null, [
525
+ M((n(), w("div", null, [
514
526
  b(t.$slots, "dialog-form-content", {
515
- formData: a.data,
516
- mode: a.mode
527
+ formData: l.data,
528
+ mode: l.mode
517
529
  }, () => [
518
- e.dialogFormConfig.length > 0 ? (n(), p(pe, {
530
+ e.dialogFormConfig.length > 0 ? (n(), f(pe, {
519
531
  key: 0,
520
- "form-config": J.value,
521
- modelValue: a.data,
522
- "onUpdate:modelValue": o[3] || (o[3] = (i) => a.data = i),
523
- ref: (i) => a.formRef = i,
532
+ "form-config": K.value,
533
+ modelValue: l.data,
534
+ "onUpdate:modelValue": o[3] || (o[3] = (i) => l.data = i),
535
+ ref: (i) => l.formRef = i,
524
536
  rules: e.dialogFormRules,
525
537
  "label-width": "80px"
526
- }, null, 8, ["form-config", "modelValue", "rules"])) : m("", !0)
538
+ }, null, 8, ["form-config", "modelValue", "rules"])) : c("", !0)
527
539
  ])
528
540
  ])), [
529
- [L, a.loading]
541
+ [W, l.loading]
530
542
  ])
531
543
  ]),
532
544
  _: 3
@@ -1 +1 @@
1
- (function(f,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("element-plus"),require("axios")):typeof define=="function"&&define.amd?define(["exports","vue","element-plus","axios"],e):(f=typeof globalThis<"u"?globalThis:f||self,e(f.ZCrudTable={},f.Vue,f.ElementPlus,f.axios))})(this,function(f,e,y,E){"use strict";const $=e.defineComponent({__name:"DynamicForm",props:{modelValue:{},formConfig:{},rules:{}},setup(c,{expose:k}){const b=e.ref(null);return k({validate:()=>{var s;return(s=b.value)==null?void 0:s.validate()}}),(s,t)=>{const w=e.resolveComponent("el-input"),_=e.resolveComponent("el-option"),u=e.resolveComponent("el-select"),D=e.resolveComponent("el-radio"),p=e.resolveComponent("el-radio-group"),B=e.resolveComponent("el-form-item"),h=e.resolveComponent("el-form");return e.openBlock(),e.createBlock(h,e.mergeProps({model:s.modelValue,rules:s.rules,ref_key:"formRef",ref:b},s.$attrs),{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.formConfig,n=>(e.openBlock(),e.createBlock(B,{key:n.prop,label:n.label,prop:n.prop},{default:e.withCtx(()=>[n.type==="input"?(e.openBlock(),e.createBlock(w,e.mergeProps({key:0,modelValue:s.modelValue[n.prop],"onUpdate:modelValue":d=>s.modelValue[n.prop]=d},{ref_for:!0},n.componentProps),null,16,["modelValue","onUpdate:modelValue"])):e.createCommentVNode("",!0),n.type==="textarea"?(e.openBlock(),e.createBlock(w,e.mergeProps({key:1,type:"textarea",modelValue:s.modelValue[n.prop],"onUpdate:modelValue":d=>s.modelValue[n.prop]=d},{ref_for:!0},n.componentProps),null,16,["modelValue","onUpdate:modelValue"])):e.createCommentVNode("",!0),n.type==="select"?(e.openBlock(),e.createBlock(u,e.mergeProps({key:2,modelValue:s.modelValue[n.prop],"onUpdate:modelValue":d=>s.modelValue[n.prop]=d},{ref_for:!0},n.componentProps),{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.options,d=>(e.openBlock(),e.createBlock(_,{key:d.value,label:d.label,value:d.value},null,8,["label","value"]))),128))]),_:2},1040,["modelValue","onUpdate:modelValue"])):e.createCommentVNode("",!0),n.type==="radio-group"?(e.openBlock(),e.createBlock(p,e.mergeProps({key:3,modelValue:s.modelValue[n.prop],"onUpdate:modelValue":d=>s.modelValue[n.prop]=d},{ref_for:!0},n.componentProps),{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.options,d=>(e.openBlock(),e.createBlock(D,{key:d.value,label:d.value},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.label),1)]),_:2},1032,["label"]))),128))]),_:2},1040,["modelValue","onUpdate:modelValue"])):e.createCommentVNode("",!0),n.type==="input-disabled"?(e.openBlock(),e.createBlock(w,e.mergeProps({key:4,"model-value":s.modelValue[n.prop],disabled:""},{ref_for:!0},n.componentProps),null,16,["model-value"])):e.createCommentVNode("",!0)]),_:2},1032,["label","prop"]))),128))]),_:1},16,["model","rules"])}}}),g=E.create({baseURL:"",timeout:1e4});g.interceptors.request.use(c=>{const k=localStorage.getItem("token");return k&&(c.headers.Authorization="Bearer "+k),c},c=>(console.log(c),Promise.reject(c))),g.interceptors.response.use(c=>c.data,c=>(console.log("err"+c),y.ElMessage({message:"接口错误,请刷新接口",type:"error",duration:5*1e3}),Promise.reject(c)));const z={key:0,class:"flex flex-wrap items-center justify-between gap-4 mb-6"},P={class:"flex items-center gap-x-2"},O={class:"flex items-center gap-x-3 action-buttons flex-shrink-0"},T={key:0,class:"flex items-center gap-x-2"},j={key:1,class:"flex justify-end"},q={class:"dialog-footer"},Q=e.defineComponent({__name:"CrudTable",props:{theme:{type:String,default:"default"},customClass:{type:String,default:""},apiUrlQuery:{type:String,required:!0},apiUrlDetail:{type:String,required:!0},apiUrlCreate:{type:String,required:!0},apiUrlUpdate:{type:String,required:!0},apiUrlDelete:{type:String,required:!0},showSearchSection:{type:Boolean,default:!0},showSearchActionButtons:{type:Boolean,default:!0},showNewBtn:{type:Boolean,default:!0},columns:{type:Array,default:()=>[]},onBeforeQuery:{type:Function},onAfterQuery:{type:Function},onBeforeOpenDialog:{type:Function},onAfterOpenDialog:{type:Function},onBeforeSubmit:{type:Function},onAfterSubmit:{type:Function},onBeforeDelete:{type:Function},onAfterDelete:{type:Function},showSelectionColumn:{type:Boolean,default:!0},showIndexColumn:{type:Boolean,default:!0},showActionsColumn:{type:Boolean,default:!0},showEditButton:{type:Boolean,default:!0},showDeleteButton:{type:Boolean,default:!0},actionsColumnWidth:{type:[String,Number],default:120},dialogWidth:{type:String,default:"50%"},initialSearchForm:{type:Object,default:()=>({pageNum:1,pageSize:10})},showPagination:{type:Boolean,default:!0},pageSizes:{type:Array,default:()=>[10,20,50,100]},paginationLayout:{type:String,default:"total, sizes, prev, pager, next, jumper"},paginationBackground:{type:Boolean,default:!0},paginationSmall:{type:Boolean,default:!1},paginationHideOnSinglePage:{type:Boolean,default:!1},dialogFormConfig:{type:Array,default:()=>[]},dialogFormRules:{type:Object,default:()=>({})},submitAsFormData:{type:Boolean,default:!1}},emits:["open-dialog","submit","delete"],setup(c,{expose:k,emit:b}){const s=b,t=c,w=e.computed(()=>["crud-table-wrapper",`theme-${t.theme}`,t.customClass]),_=e.computed(()=>t.theme==="large-screen"?"large-screen-dialog":""),u=(o,a)=>o?!0:(y.ElMessage.error(`${a} prop is required.`),!1),D=async(o,a)=>{try{let r={...a};if(t.onBeforeSubmit&&(r=await t.onBeforeSubmit(r)),l.submitting=!0,o==="add"){if(!u(t.apiUrlCreate,"apiUrlCreate"))return;await g.post(t.apiUrlCreate,r),y.ElMessage.success("新增成功")}else{if(!u(t.apiUrlUpdate,"apiUrlUpdate"))return;await g.put(t.apiUrlUpdate,r),y.ElMessage.success("更新成功")}return t.onAfterSubmit&&t.onAfterSubmit(o,r),s("submit",{mode:o,data:r}),l.visible&&(l.visible=!1),C(),Promise.resolve()}catch(r){return console.log("Submit error:",r),Promise.reject(r)}finally{l.submitting=!1}},p=e.reactive({pageNum:1,pageSize:10,...t.initialSearchForm}),B=e.ref([]),h=e.ref(0),n=e.ref(!1),d=e.ref([]),l=e.reactive({visible:!1,loading:!1,submitting:!1,mode:"add",data:{},formRef:null}),M=e.computed(()=>l.mode==="add"?"新增":"编辑"),R=e.computed(()=>{if(l.mode==="add")return t.dialogFormConfig.filter(a=>a.prop!=="id");const o=[...t.dialogFormConfig.filter(a=>a.prop!=="id")];return o.some(a=>a.prop==="id")||o.unshift({type:"input-disabled",prop:"id",label:"用户ID"}),o}),C=async()=>{if(u(t.apiUrlQuery,"apiUrlQuery")){n.value=!0;try{let o={...p};t.onBeforeQuery&&(o=await t.onBeforeQuery(o));const a=await g.get(t.apiUrlQuery,{params:o});if(a&&a.data&&Array.isArray(a.data.rows)&&typeof a.data.total=="number"){let r=a.data.rows;t.onAfterQuery&&(r=await t.onAfterQuery(r)),B.value=r,h.value=a.data.total}else console.warn("API response is not in the expected { data: { rows: [], total: 0 } } format."),B.value=[],h.value=0}catch(o){console.error("Fetch data failed:",o)}finally{n.value=!1}}},S=()=>{p.pageNum=1,C()},L=()=>{const{pageNum:o,pageSize:a,...r}=t.initialSearchForm;Object.keys(p).forEach(m=>{m!=="pageNum"&&m!=="pageSize"&&delete p[m]}),Object.assign(p,r),S()},I=o=>{d.value=o},N=async(o,a)=>{let r;if(o==="add"?r=a?{...a}:{role:"user"}:r={...a},t.onBeforeOpenDialog){const m=await t.onBeforeOpenDialog(o,r);m&&(r=m)}if(l.mode=o,l.visible=!0,o==="edit"){if(!u(t.apiUrlDetail,"apiUrlDetail"))return;l.loading=!0;try{const m=await g.get(t.apiUrlDetail+"/"+r.id.toString());l.data=m.data.data}finally{l.loading=!1,t.onAfterOpenDialog&&t.onAfterOpenDialog(o,l.data),s("open-dialog",{mode:o,data:l.data})}}else l.data=r,t.onAfterOpenDialog&&t.onAfterOpenDialog(o,l.data),s("open-dialog",{mode:o,data:l.data})},W=async()=>{try{l.formRef&&await l.formRef.validate();let o={...l.data};t.onBeforeSubmit&&(o=await t.onBeforeSubmit(o));let a=o;if(t.submitAsFormData){const r=new FormData;for(const m in o)if(Object.prototype.hasOwnProperty.call(o,m)){const U=o[m];r.append(m,U??"")}a=r}if(l.submitting=!0,l.mode==="add"){if(!u(t.apiUrlCreate,"apiUrlCreate"))return;await g.post(t.apiUrlCreate,a),y.ElMessage.success("新增成功")}else{if(!u(t.apiUrlUpdate,"apiUrlUpdate"))return;await g.put(t.apiUrlUpdate,a),y.ElMessage.success("更新成功")}t.onAfterSubmit&&t.onAfterSubmit(l.mode,o),s("submit",{mode:l.mode,data:o}),l.visible=!1,C()}catch(o){console.log("Submit error or validation failed:",o)}finally{l.submitting=!1}},F=async o=>{if(u(t.apiUrlDelete,"apiUrlDelete"))try{if(t.onBeforeDelete&&await t.onBeforeDelete(o)===!1)return;const a=o.join(",");await g.delete(t.apiUrlDelete+"/"+a.toString()),y.ElMessage.success("删除成功"),t.onAfterDelete&&t.onAfterDelete(o),s("delete",o),B.value.length===o.length&&p.pageNum>1&&p.pageNum--,C()}catch(a){console.error("Delete failed",a)}},H=o=>{p.pageSize=o,S()},Z=o=>{p.pageNum=o,C()};return e.onMounted(C),k({refresh:C,search:S,handleDelete:F,openDialog:N,submit:D}),(o,a)=>{const r=e.resolveComponent("el-button"),m=e.resolveComponent("el-form-item"),U=e.resolveComponent("el-form"),V=e.resolveComponent("el-table-column"),G=e.resolveComponent("el-popconfirm"),J=e.resolveComponent("el-table"),K=e.resolveComponent("el-pagination"),X=e.resolveComponent("el-dialog"),A=e.resolveDirective("loading");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(w.value)},[e.renderSlot(o.$slots,"header"),t.showSearchSection?(e.openBlock(),e.createElementBlock("div",z,[e.createVNode(U,{model:p,class:"query-form flex flex-nowrap items-center gap-x-4",style:{"overflow-x":"auto","padding-bottom":"8px"}},{default:e.withCtx(()=>[e.renderSlot(o.$slots,"query-conditions",{searchForm:p}),e.createVNode(m,{class:"!mr-0 flex-shrink-0"},{default:e.withCtx(()=>[e.createElementVNode("div",P,[e.renderSlot(o.$slots,"query-left"),t.showSearchActionButtons?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(r,{type:"primary",onClick:S,loading:n.value},{default:e.withCtx(()=>a[6]||(a[6]=[e.createTextVNode("搜索")])),_:1,__:[6]},8,["loading"]),e.createVNode(r,{onClick:L},{default:e.withCtx(()=>a[7]||(a[7]=[e.createTextVNode("清空")])),_:1,__:[7]})],64)):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"query-right")])]),_:3})]),_:3},8,["model"]),e.createElementVNode("div",O,[e.renderSlot(o.$slots,"action-left",{selections:d.value}),e.renderSlot(o.$slots,"add-button-content",{},()=>[t.showNewBtn?(e.openBlock(),e.createBlock(r,{key:0,type:"success",onClick:a[0]||(a[0]=i=>N("add"))},{default:e.withCtx(()=>a[8]||(a[8]=[e.createTextVNode("新增")])),_:1,__:[8]})):e.createCommentVNode("",!0)]),e.renderSlot(o.$slots,"action-right")])])):e.createCommentVNode("",!0),e.withDirectives((e.openBlock(),e.createBlock(J,e.mergeProps({data:B.value,onSelectionChange:I},o.$attrs,{style:{width:"100%","margin-bottom":"1.5rem"}}),{default:e.withCtx(()=>[t.showSelectionColumn?(e.openBlock(),e.createBlock(V,{key:0,type:"selection",width:"55",fixed:""})):e.createCommentVNode("",!0),t.showIndexColumn?(e.openBlock(),e.createBlock(V,{key:1,type:"index",label:"序号",width:"70",fixed:""})):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,i=>(e.openBlock(),e.createBlock(V,e.mergeProps({key:i.prop,prop:i.prop,label:i.label,width:i.width,sortable:i.sortable||!1},{ref_for:!0},i.attrs),e.createSlots({_:2},[i.slot?{name:"default",fn:e.withCtx(x=>[e.renderSlot(o.$slots,i.slot,{row:x.row})]),key:"0"}:void 0]),1040,["prop","label","width","sortable"]))),128)),t.showActionsColumn?(e.openBlock(),e.createBlock(V,{key:2,label:"操作",width:c.actionsColumnWidth},{default:e.withCtx(i=>[i.row?(e.openBlock(),e.createElementBlock("div",T,[o.$slots.actions?e.renderSlot(o.$slots,"actions",{key:0,row:i.row}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.renderSlot(o.$slots,"action-before-edit",{row:i.row}),t.showEditButton?(e.openBlock(),e.createBlock(r,{key:0,size:"small",type:"primary",link:"",onClick:x=>N("edit",i.row)},{default:e.withCtx(()=>a[9]||(a[9]=[e.createTextVNode("编辑 ")])),_:2,__:[9]},1032,["onClick"])):e.createCommentVNode("",!0),t.showDeleteButton?(e.openBlock(),e.createBlock(G,{key:1,title:"确定要删除这条数据吗?",onConfirm:x=>F([i.row.id]),"confirm-button-text":"确定","cancel-button-text":"取消",width:"200"},{reference:e.withCtx(()=>[e.createVNode(r,{size:"small",type:"danger",link:""},{default:e.withCtx(()=>a[10]||(a[10]=[e.createTextVNode("删除")])),_:1,__:[10]})]),_:2},1032,["onConfirm"])):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"action-after-delete",{row:i.row})],64))])):e.createCommentVNode("",!0)]),_:3},8,["width"])):e.createCommentVNode("",!0)]),_:3},16,["data"])),[[A,n.value]]),t.showPagination&&h.value>0?(e.openBlock(),e.createElementBlock("div",j,[e.createVNode(K,{"current-page":p.pageNum,"onUpdate:currentPage":a[1]||(a[1]=i=>p.pageNum=i),"page-size":p.pageSize,"onUpdate:pageSize":a[2]||(a[2]=i=>p.pageSize=i),"page-sizes":t.pageSizes,layout:t.paginationLayout,total:h.value,background:t.paginationBackground,small:t.paginationSmall,"hide-on-single-page":t.paginationHideOnSinglePage,onSizeChange:H,onCurrentChange:Z},null,8,["current-page","page-size","page-sizes","layout","total","background","small","hide-on-single-page"])])):e.createCommentVNode("",!0),e.createVNode(X,{modelValue:l.visible,"onUpdate:modelValue":a[5]||(a[5]=i=>l.visible=i),title:M.value,width:t.dialogWidth,"destroy-on-close":!0,"custom-class":_.value},{footer:e.withCtx(()=>[e.createElementVNode("div",q,[e.createVNode(r,{onClick:a[4]||(a[4]=i=>l.visible=!1)},{default:e.withCtx(()=>a[11]||(a[11]=[e.createTextVNode("取消")])),_:1,__:[11]}),e.createVNode(r,{type:"primary",onClick:W,loading:l.submitting},{default:e.withCtx(()=>a[12]||(a[12]=[e.createTextVNode("确定")])),_:1,__:[12]},8,["loading"])])]),default:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createElementBlock("div",null,[e.renderSlot(o.$slots,"dialog-form-content",{formData:l.data,mode:l.mode},()=>[t.dialogFormConfig.length>0?(e.openBlock(),e.createBlock($,{key:0,"form-config":R.value,modelValue:l.data,"onUpdate:modelValue":a[3]||(a[3]=i=>l.data=i),ref:i=>l.formRef=i,rules:t.dialogFormRules,"label-width":"80px"},null,8,["form-config","modelValue","rules"])):e.createCommentVNode("",!0)])])),[[A,l.loading]])]),_:3},8,["modelValue","title","width","custom-class"])],2)}}});f.CrudTable=Q,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
1
+ (function(f,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("element-plus"),require("axios")):typeof define=="function"&&define.amd?define(["exports","vue","element-plus","axios"],e):(f=typeof globalThis<"u"?globalThis:f||self,e(f.ZCrudTable={},f.Vue,f.ElementPlus,f.axios))})(this,function(f,e,C,$){"use strict";const z=e.defineComponent({__name:"DynamicForm",props:{modelValue:{},formConfig:{},rules:{}},setup(m,{expose:w}){const V=e.ref(null);return w({validate:()=>{var s;return(s=V.value)==null?void 0:s.validate()}}),(s,t)=>{const S=e.resolveComponent("el-input"),D=e.resolveComponent("el-option"),u=e.resolveComponent("el-select"),U=e.resolveComponent("el-radio"),c=e.resolveComponent("el-radio-group"),B=e.resolveComponent("el-form-item"),h=e.resolveComponent("el-form");return e.openBlock(),e.createBlock(h,e.mergeProps({model:s.modelValue,rules:s.rules,ref_key:"formRef",ref:V},s.$attrs),{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.formConfig,n=>(e.openBlock(),e.createBlock(B,{key:n.prop,label:n.label,prop:n.prop},{default:e.withCtx(()=>[n.type==="input"?(e.openBlock(),e.createBlock(S,e.mergeProps({key:0,modelValue:s.modelValue[n.prop],"onUpdate:modelValue":d=>s.modelValue[n.prop]=d},{ref_for:!0},n.componentProps),null,16,["modelValue","onUpdate:modelValue"])):e.createCommentVNode("",!0),n.type==="textarea"?(e.openBlock(),e.createBlock(S,e.mergeProps({key:1,type:"textarea",modelValue:s.modelValue[n.prop],"onUpdate:modelValue":d=>s.modelValue[n.prop]=d},{ref_for:!0},n.componentProps),null,16,["modelValue","onUpdate:modelValue"])):e.createCommentVNode("",!0),n.type==="select"?(e.openBlock(),e.createBlock(u,e.mergeProps({key:2,modelValue:s.modelValue[n.prop],"onUpdate:modelValue":d=>s.modelValue[n.prop]=d},{ref_for:!0},n.componentProps),{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.options,d=>(e.openBlock(),e.createBlock(D,{key:d.value,label:d.label,value:d.value},null,8,["label","value"]))),128))]),_:2},1040,["modelValue","onUpdate:modelValue"])):e.createCommentVNode("",!0),n.type==="radio-group"?(e.openBlock(),e.createBlock(c,e.mergeProps({key:3,modelValue:s.modelValue[n.prop],"onUpdate:modelValue":d=>s.modelValue[n.prop]=d},{ref_for:!0},n.componentProps),{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.options,d=>(e.openBlock(),e.createBlock(U,{key:d.value,label:d.value},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.label),1)]),_:2},1032,["label"]))),128))]),_:2},1040,["modelValue","onUpdate:modelValue"])):e.createCommentVNode("",!0),n.type==="input-disabled"?(e.openBlock(),e.createBlock(S,e.mergeProps({key:4,"model-value":s.modelValue[n.prop],disabled:""},{ref_for:!0},n.componentProps),null,16,["model-value"])):e.createCommentVNode("",!0)]),_:2},1032,["label","prop"]))),128))]),_:1},16,["model","rules"])}}}),g=$.create({baseURL:"",timeout:1e4});g.interceptors.request.use(m=>{const w=localStorage.getItem("token");return w&&(m.headers.Authorization="Bearer "+w),m},m=>(console.log(m),Promise.reject(m))),g.interceptors.response.use(m=>m.data,m=>(console.log("err"+m),C.ElMessage({message:"接口错误,请刷新接口",type:"error",duration:5*1e3}),Promise.reject(m)));const P={key:0,class:"flex flex-wrap items-center justify-between gap-4 mb-6"},O={class:"flex items-center gap-x-2"},T={class:"flex items-center gap-x-3 action-buttons flex-shrink-0"},j={key:0,class:"flex items-center gap-x-2"},q={key:1,class:"flex justify-end"},Q={class:"dialog-footer"},M=e.defineComponent({__name:"CrudTable",props:{theme:{type:String,default:"default"},customClass:{type:String,default:""},apiUrlQuery:{type:String,required:!0},apiUrlDetail:{type:String,required:!0},apiUrlCreate:{type:String,required:!0},apiUrlUpdate:{type:String,required:!0},apiUrlDelete:{type:String,required:!0},showSearchSection:{type:Boolean,default:!0},showSearchActionButtons:{type:Boolean,default:!0},showNewBtn:{type:Boolean,default:!0},columns:{type:Array,default:()=>[]},onBeforeQuery:{type:Function},onAfterQuery:{type:Function},onBeforeOpenDialog:{type:Function},onAfterOpenDialog:{type:Function},onBeforeSubmit:{type:Function},onAfterSubmit:{type:Function},onBeforeDelete:{type:Function},onAfterDelete:{type:Function},showSelectionColumn:{type:Boolean,default:!0},showIndexColumn:{type:Boolean,default:!0},showActionsColumn:{type:Boolean,default:!0},showEditButton:{type:Boolean,default:!0},showDeleteButton:{type:Boolean,default:!0},actionsColumnWidth:{type:[String,Number],default:120},dialogWidth:{type:String,default:"50%"},initialSearchForm:{type:Object,default:()=>({pageNum:1,pageSize:10})},showPagination:{type:Boolean,default:!0},pageSizes:{type:Array,default:()=>[10,20,50,100]},paginationLayout:{type:String,default:"total, sizes, prev, pager, next, jumper"},paginationBackground:{type:Boolean,default:!0},paginationSmall:{type:Boolean,default:!1},paginationHideOnSinglePage:{type:Boolean,default:!1},dialogFormConfig:{type:Array,default:()=>[]},dialogFormRules:{type:Object,default:()=>({})},submitAsFormData:{type:Boolean,default:!1}},emits:["open-dialog","submit","delete"],setup(m,{expose:w,emit:V}){const s=V,t=m,S=e.computed(()=>["crud-table-wrapper",`theme-${t.theme}`,t.customClass]),D=e.computed(()=>t.theme==="large-screen"?"large-screen-dialog":""),u=(o,a)=>o?!0:(C.ElMessage.error(`${a} prop is required.`),!1),U=async(o,a)=>{try{let l={...a};t.onBeforeSubmit&&(l=await t.onBeforeSubmit(l));let p=l;if(t.submitAsFormData){const b=new FormData;for(const y in l)if(Object.prototype.hasOwnProperty.call(l,y)){const x=l[y];b.append(y,x??"")}p=b}if(r.submitting=!0,o==="add"){if(!u(t.apiUrlCreate,"apiUrlCreate"))throw new Error("apiUrlCreate is not configured.");await g.post(t.apiUrlCreate,p),C.ElMessage.success("新增成功")}else{if(!u(t.apiUrlUpdate,"apiUrlUpdate"))throw new Error("apiUrlUpdate is not configured.");await g.put(t.apiUrlUpdate,p),C.ElMessage.success("更新成功")}return t.onAfterSubmit&&t.onAfterSubmit(o,l),s("submit",{mode:o,data:l}),r.visible&&(r.visible=!1),k(),Promise.resolve()}catch(l){return console.error("Submit failed:",l),Promise.reject(l)}finally{r.submitting=!1}},c=e.reactive({pageNum:1,pageSize:10,...t.initialSearchForm}),B=e.ref([]),h=e.ref(0),n=e.ref(!1),d=e.ref([]),r=e.reactive({visible:!1,loading:!1,submitting:!1,mode:"add",data:{},formRef:null}),R=e.computed(()=>r.mode==="add"?"新增":"编辑"),L=e.computed(()=>{if(r.mode==="add")return t.dialogFormConfig.filter(a=>a.prop!=="id");const o=[...t.dialogFormConfig.filter(a=>a.prop!=="id")];return o.some(a=>a.prop==="id")||o.unshift({type:"input-disabled",prop:"id",label:"用户ID"}),o}),k=async()=>{if(u(t.apiUrlQuery,"apiUrlQuery")){n.value=!0;try{let o={...c};t.onBeforeQuery&&(o=await t.onBeforeQuery(o));const a=await g.get(t.apiUrlQuery,{params:o});if(a&&a.data&&Array.isArray(a.data.rows)&&typeof a.data.total=="number"){let l=a.data.rows;t.onAfterQuery&&(l=await t.onAfterQuery(l)),B.value=l,h.value=a.data.total}else console.warn("API response is not in the expected { data: { rows: [], total: 0 } } format."),B.value=[],h.value=0}catch(o){console.error("Fetch data failed:",o)}finally{n.value=!1}}},_=()=>{c.pageNum=1,k()},I=()=>{const{pageNum:o,pageSize:a,...l}=t.initialSearchForm;Object.keys(c).forEach(p=>{p!=="pageNum"&&p!=="pageSize"&&delete c[p]}),Object.assign(c,l),_()},W=o=>{d.value=o},N=async(o,a)=>{let l;if(o==="add"?l=a?{...a}:{role:"user"}:l={...a},t.onBeforeOpenDialog){const p=await t.onBeforeOpenDialog(o,l);p&&(l=p)}if(r.mode=o,r.visible=!0,o==="edit"){if(!u(t.apiUrlDetail,"apiUrlDetail"))return;r.loading=!0;try{const p=await g.get(t.apiUrlDetail+"/"+l.id.toString());r.data=p.data.data}finally{r.loading=!1,t.onAfterOpenDialog&&t.onAfterOpenDialog(o,r.data),s("open-dialog",{mode:o,data:r.data})}}else r.data=l,t.onAfterOpenDialog&&t.onAfterOpenDialog(o,r.data),s("open-dialog",{mode:o,data:r.data})},H=async()=>{try{r.formRef&&await r.formRef.validate();let o={...r.data};t.onBeforeSubmit&&(o=await t.onBeforeSubmit(o));let a=o;if(t.submitAsFormData){const l=new FormData;for(const p in o)if(Object.prototype.hasOwnProperty.call(o,p)){const b=o[p];l.append(p,b??"")}a=l;debugger}if(r.submitting=!0,r.mode==="add"){if(!u(t.apiUrlCreate,"apiUrlCreate"))return;await g.post(t.apiUrlCreate,a),C.ElMessage.success("新增成功")}else{if(!u(t.apiUrlUpdate,"apiUrlUpdate"))return;await g.put(t.apiUrlUpdate,a),C.ElMessage.success("更新成功")}t.onAfterSubmit&&t.onAfterSubmit(r.mode,o),s("submit",{mode:r.mode,data:o}),r.visible=!1,k()}catch(o){console.log("Submit error or validation failed:",o)}finally{r.submitting=!1}},A=async o=>{if(u(t.apiUrlDelete,"apiUrlDelete"))try{if(t.onBeforeDelete&&await t.onBeforeDelete(o)===!1)return;const a=o.join(",");await g.delete(t.apiUrlDelete+"/"+a.toString()),C.ElMessage.success("删除成功"),t.onAfterDelete&&t.onAfterDelete(o),s("delete",o),B.value.length===o.length&&c.pageNum>1&&c.pageNum--,k()}catch(a){console.error("Delete failed",a)}},Z=o=>{c.pageSize=o,_()},G=o=>{c.pageNum=o,k()};return e.onMounted(k),w({refresh:k,search:_,handleDelete:A,openDialog:N,submit:U}),(o,a)=>{const l=e.resolveComponent("el-button"),p=e.resolveComponent("el-form-item"),b=e.resolveComponent("el-form"),y=e.resolveComponent("el-table-column"),x=e.resolveComponent("el-popconfirm"),J=e.resolveComponent("el-table"),K=e.resolveComponent("el-pagination"),X=e.resolveComponent("el-dialog"),E=e.resolveDirective("loading");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(S.value)},[e.renderSlot(o.$slots,"header"),t.showSearchSection?(e.openBlock(),e.createElementBlock("div",P,[e.createVNode(b,{model:c,class:"query-form flex flex-nowrap items-center gap-x-4",style:{"overflow-x":"auto","padding-bottom":"8px"}},{default:e.withCtx(()=>[e.renderSlot(o.$slots,"query-conditions",{searchForm:c}),e.createVNode(p,{class:"!mr-0 flex-shrink-0"},{default:e.withCtx(()=>[e.createElementVNode("div",O,[e.renderSlot(o.$slots,"query-left"),t.showSearchActionButtons?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(l,{type:"primary",onClick:_,loading:n.value},{default:e.withCtx(()=>a[6]||(a[6]=[e.createTextVNode("搜索")])),_:1,__:[6]},8,["loading"]),e.createVNode(l,{onClick:I},{default:e.withCtx(()=>a[7]||(a[7]=[e.createTextVNode("清空")])),_:1,__:[7]})],64)):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"query-right")])]),_:3})]),_:3},8,["model"]),e.createElementVNode("div",T,[e.renderSlot(o.$slots,"action-left",{selections:d.value}),e.renderSlot(o.$slots,"add-button-content",{},()=>[t.showNewBtn?(e.openBlock(),e.createBlock(l,{key:0,type:"success",onClick:a[0]||(a[0]=i=>N("add"))},{default:e.withCtx(()=>a[8]||(a[8]=[e.createTextVNode("新增")])),_:1,__:[8]})):e.createCommentVNode("",!0)]),e.renderSlot(o.$slots,"action-right")])])):e.createCommentVNode("",!0),e.withDirectives((e.openBlock(),e.createBlock(J,e.mergeProps({data:B.value,onSelectionChange:W},o.$attrs,{style:{width:"100%","margin-bottom":"1.5rem"}}),{default:e.withCtx(()=>[t.showSelectionColumn?(e.openBlock(),e.createBlock(y,{key:0,type:"selection",width:"55",fixed:""})):e.createCommentVNode("",!0),t.showIndexColumn?(e.openBlock(),e.createBlock(y,{key:1,type:"index",label:"序号",width:"70",fixed:""})):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.columns,i=>(e.openBlock(),e.createBlock(y,e.mergeProps({key:i.prop,prop:i.prop,label:i.label,width:i.width,sortable:i.sortable||!1},{ref_for:!0},i.attrs),e.createSlots({_:2},[i.slot?{name:"default",fn:e.withCtx(F=>[e.renderSlot(o.$slots,i.slot,{row:F.row})]),key:"0"}:void 0]),1040,["prop","label","width","sortable"]))),128)),t.showActionsColumn?(e.openBlock(),e.createBlock(y,{key:2,label:"操作",width:m.actionsColumnWidth},{default:e.withCtx(i=>[i.row?(e.openBlock(),e.createElementBlock("div",j,[o.$slots.actions?e.renderSlot(o.$slots,"actions",{key:0,row:i.row}):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.renderSlot(o.$slots,"action-before-edit",{row:i.row}),t.showEditButton?(e.openBlock(),e.createBlock(l,{key:0,size:"small",type:"primary",link:"",onClick:F=>N("edit",i.row)},{default:e.withCtx(()=>a[9]||(a[9]=[e.createTextVNode("编辑 ")])),_:2,__:[9]},1032,["onClick"])):e.createCommentVNode("",!0),t.showDeleteButton?(e.openBlock(),e.createBlock(x,{key:1,title:"确定要删除这条数据吗?",onConfirm:F=>A([i.row.id]),"confirm-button-text":"确定","cancel-button-text":"取消",width:"200"},{reference:e.withCtx(()=>[e.createVNode(l,{size:"small",type:"danger",link:""},{default:e.withCtx(()=>a[10]||(a[10]=[e.createTextVNode("删除")])),_:1,__:[10]})]),_:2},1032,["onConfirm"])):e.createCommentVNode("",!0),e.renderSlot(o.$slots,"action-after-delete",{row:i.row})],64))])):e.createCommentVNode("",!0)]),_:3},8,["width"])):e.createCommentVNode("",!0)]),_:3},16,["data"])),[[E,n.value]]),t.showPagination&&h.value>0?(e.openBlock(),e.createElementBlock("div",q,[e.createVNode(K,{"current-page":c.pageNum,"onUpdate:currentPage":a[1]||(a[1]=i=>c.pageNum=i),"page-size":c.pageSize,"onUpdate:pageSize":a[2]||(a[2]=i=>c.pageSize=i),"page-sizes":t.pageSizes,layout:t.paginationLayout,total:h.value,background:t.paginationBackground,small:t.paginationSmall,"hide-on-single-page":t.paginationHideOnSinglePage,onSizeChange:Z,onCurrentChange:G},null,8,["current-page","page-size","page-sizes","layout","total","background","small","hide-on-single-page"])])):e.createCommentVNode("",!0),e.createVNode(X,{modelValue:r.visible,"onUpdate:modelValue":a[5]||(a[5]=i=>r.visible=i),title:R.value,width:t.dialogWidth,"destroy-on-close":!0,"custom-class":D.value},{footer:e.withCtx(()=>[e.createElementVNode("div",Q,[e.createVNode(l,{onClick:a[4]||(a[4]=i=>r.visible=!1)},{default:e.withCtx(()=>a[11]||(a[11]=[e.createTextVNode("取消")])),_:1,__:[11]}),e.createVNode(l,{type:"primary",onClick:H,loading:r.submitting},{default:e.withCtx(()=>a[12]||(a[12]=[e.createTextVNode("确定")])),_:1,__:[12]},8,["loading"])])]),default:e.withCtx(()=>[e.withDirectives((e.openBlock(),e.createElementBlock("div",null,[e.renderSlot(o.$slots,"dialog-form-content",{formData:r.data,mode:r.mode},()=>[t.dialogFormConfig.length>0?(e.openBlock(),e.createBlock(z,{key:0,"form-config":L.value,modelValue:r.data,"onUpdate:modelValue":a[3]||(a[3]=i=>r.data=i),ref:i=>r.formRef=i,rules:t.dialogFormRules,"label-width":"80px"},null,8,["form-config","modelValue","rules"])):e.createCommentVNode("",!0)])])),[[E,r.loading]])]),_:3},8,["modelValue","title","width","custom-class"])],2)}}});f.CrudTable=M,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "z-crud-table",
3
3
  "private": false,
4
- "version": "0.0.24",
4
+ "version": "0.0.25",
5
5
  "type": "module",
6
6
  "description": "A powerful and flexible CRUD table component for Vue 3 and Element Plus.",
7
7
  "keywords": [