z-crud-table 0.0.21 → 0.0.23

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