@otwb/ui 2.0.40 → 2.0.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/page.js +302 -298
  2. package/package.json +3 -3
package/dist/page.js CHANGED
@@ -7,12 +7,12 @@ import { until } from "@vueuse/core";
7
7
  import { NButton, NCheckbox, NColorPicker, NDatePicker, NDrawer, NDrawerContent, NFlex, NInput, NInputNumber, NModal, NScrollbar, NSelect, NText, NUpload, useMessage } from "ithinkdt-ui";
8
8
  import { format } from "date-fns";
9
9
  import { useFormItem } from "ithinkdt-ui/es/_mixins";
10
- import { nanoid } from "nanoid";
10
+ import "nanoid";
11
11
  import { useDict, useDictMap } from "@otwb/common/dict";
12
- function _isSlot(r) {
13
- return typeof r == "function" || Object.prototype.toString.call(r) === "[object Object]" && !isVNode(r);
12
+ function _isSlot(i) {
13
+ return typeof i == "function" || Object.prototype.toString.call(i) === "[object Object]" && !isVNode(i);
14
14
  }
15
- var mapProps = (r) => Object.fromEntries(Object.entries(r || {}).map(([r, l]) => [r, unref(l)])), SimpleUpload = /* @__PURE__ */ defineComponent({
15
+ var mapProps = (i) => Object.fromEntries(Object.entries(i || {}).map(([i, c]) => [i, unref(c)])), SimpleUpload = /* @__PURE__ */ defineComponent({
16
16
  name: "SimpleUpload",
17
17
  props: {
18
18
  type: {
@@ -50,470 +50,474 @@ var mapProps = (r) => Object.fromEntries(Object.entries(r || {}).map(([r, l]) =>
50
50
  onUpdateFileList: { type: [Array, Function] },
51
51
  uploadFile: { type: Function }
52
52
  },
53
- setup(l, { slots: u, expose: d }) {
54
- let { t: f } = useI18n();
55
- SimpleUpload.t = f;
56
- let p = useFormItem(l), m = useMessage(), _ = computed(() => l.customRequest || (({ file: r, onProgress: u, onFinish: d, onError: f }) => {
57
- l.uploadFile(r.file, (r) => u({ percent: r })).then((l) => {
58
- r.file.fileId = l, d();
59
- }).catch((r) => {
60
- m.error(r.message), f(r);
53
+ setup(c, { slots: l, expose: u }) {
54
+ let { t: d } = useI18n();
55
+ SimpleUpload.t = d;
56
+ let f = useFormItem(c), p = useMessage(), g = computed(() => c.customRequest || (({ file: i, onProgress: l, onFinish: u, onError: d }) => {
57
+ c.uploadFile(i.file, (i) => l({ percent: i })).then((c) => {
58
+ i.file.fileId = c, u();
59
+ }).catch((i) => {
60
+ p.error(i.message), d(i);
61
61
  });
62
- })), v = ref();
63
- d({ submit() {
64
- return until(v).toBeTruthy().then((r) => r.submit());
62
+ })), _ = ref();
63
+ u({ submit() {
64
+ return until(_).toBeTruthy().then((i) => i.submit());
65
65
  } });
66
- let y = (r) => {
67
- l.onUpdateFileList?.(r), nextTick(() => p.nTriggerFormChange());
66
+ let v = (i) => {
67
+ c.onUpdateFileList?.(i), nextTick(() => f.nTriggerFormChange());
68
68
  };
69
69
  return () => {
70
- let { type: r, onUpdateFileList: d,...m } = l;
71
- return createVNode(NUpload, mergeProps(m, {
72
- ref: v,
73
- customRequest: _.value,
74
- listType: r === "image" ? "image-card" : "text",
75
- accept: m.accept ?? r === "image" ? "image/*" : void 0,
76
- "onUpdate:fileList": y
70
+ let { type: i, onUpdateFileList: u,...p } = c;
71
+ return createVNode(NUpload, mergeProps(p, {
72
+ ref: _,
73
+ customRequest: g.value,
74
+ listType: i === "image" ? "image-card" : "text",
75
+ accept: p.accept ?? i === "image" ? "image/*" : void 0,
76
+ "onUpdate:fileList": v
77
77
  }), {
78
78
  default: () => {
79
- let r;
79
+ let i;
80
80
  return createVNode(NButton, {
81
- disabled: p.mergedDisabledRef.value,
82
- size: p.mergedSizeRef.value
83
- }, _isSlot(r = f("common.page.form.selectFileText")) ? r : { default: () => [r] });
81
+ disabled: f.mergedDisabledRef.value,
82
+ size: f.mergedSizeRef.value
83
+ }, _isSlot(i = d("common.page.form.selectFileText")) ? i : { default: () => [i] });
84
84
  },
85
- ...u
85
+ ...l
86
86
  });
87
87
  };
88
88
  }
89
89
  });
90
- function createPageFormHelper({ getUserGroups: r, getUsersByGroup: f, getDeptsByCode: m, getUsersByDept: g, getUsersByUsername: _, uploadFile: y, getFileInfos: b }) {
90
+ function createPageFormHelper({ getUserGroups: i, getUsersByGroup: d, getDeptsByCode: p, getUsersByDept: m, getUsersByUsername: g, uploadFile: v, getFileInfos: y }) {
91
91
  return {
92
- input: () => ({ slots: r, props: l }, { modelValue: u, "onUpdate:modelValue": d, required: f, readonly: p,...m }) => p ? createVNode(NText, {
92
+ input: () => ({ slots: i, props: c }, { modelValue: l, "onUpdate:modelValue": u, required: d, readonly: f,...p }) => f ? createVNode(NText, {
93
93
  depth: 2,
94
94
  style: "line-height: 1.25"
95
- }, { default: () => [u ?? ""] }) : (l = mapProps(l), h(NInput, {
95
+ }, { default: () => [l ?? ""] }) : (c = mapProps(c), h(NInput, {
96
96
  clearable: !0,
97
- ...l,
98
- ...m,
99
- value: u,
100
- "onUpdate:value": d
101
- }, r)),
102
- number: () => ({ slots: r, props: l }, { modelValue: u, "onUpdate:modelValue": d, required: f, readonly: p,...m }) => p ? createVNode(NText, {
97
+ ...c,
98
+ ...p,
99
+ value: l,
100
+ "onUpdate:value": u
101
+ }, i)),
102
+ number: () => ({ slots: i, props: c }, { modelValue: l, "onUpdate:modelValue": u, required: d, readonly: f,...p }) => f ? createVNode(NText, {
103
103
  depth: 2,
104
104
  style: "line-height: 1.25"
105
- }, { default: () => [u ?? ""] }) : (l = mapProps(l), h(NInputNumber, {
105
+ }, { default: () => [l ?? ""] }) : (c = mapProps(c), h(NInputNumber, {
106
106
  clearable: !0,
107
- ...l,
108
- ...m,
109
- value: u,
110
- "onUpdate:value": d
111
- }, r)),
107
+ ...c,
108
+ ...p,
109
+ value: l,
110
+ "onUpdate:value": u
111
+ }, i)),
112
112
  select: () => {
113
- let r, l;
114
- return ({ slots: u, props: d }, { modelValue: f, "onUpdate:modelValue": p, required: m, readonly: g,..._ }) => {
115
- let { dictType: y, options: b,...x } = mapProps(d);
116
- if (b ? l = b : r !== y && (r = y, !l && r && (l = useDict(r))), g) if (x.multiple) {
117
- let r;
113
+ let i, c;
114
+ return ({ slots: l, props: u }, { modelValue: d, "onUpdate:modelValue": f, required: p, readonly: m,...g }) => {
115
+ let { dictType: v, options: y,...b } = mapProps(u);
116
+ if (y ? c = y : i !== v && (i = v, !c && i && (c = useDict(i))), m) if (b.multiple) {
117
+ let i;
118
118
  return createVNode(NText, {
119
119
  depth: 2,
120
120
  style: "line-height: 1.25"
121
- }, _isSlot(r = (f?.map((r) => l?.find((l) => l[x.valueField || "value"] === r)) ?? []).map((r, l, u) => {
122
- let d = r ? x.renderLabel ? x.renderLabel(r) ?? "" : r[x.labelField || "label"] ?? "" : f[l] ?? "";
123
- return createVNode("span", { key: r ? r[x.valueField || "value"] : f[l] ?? "" }, [d, l < u.length - 1 ? ", " : ""]);
124
- })) ? r : { default: () => [r] });
121
+ }, _isSlot(i = (d?.map((i) => c?.find((c) => c[b.valueField || "value"] === i)) ?? []).map((i, c, l) => {
122
+ let u = i ? b.renderLabel ? b.renderLabel(i) ?? "" : i[b.labelField || "label"] ?? "" : d[c] ?? "";
123
+ return createVNode("span", { key: i ? i[b.valueField || "value"] : d[c] ?? "" }, [u, c < l.length - 1 ? ", " : ""]);
124
+ })) ? i : { default: () => [i] });
125
125
  } else {
126
- let r = l?.find((r) => r[x.valueField || "value"] === f);
126
+ let i = c?.find((i) => i[b.valueField || "value"] === d);
127
127
  return createVNode(NText, {
128
128
  depth: 2,
129
129
  style: "line-height: 1.25"
130
- }, { default: () => [r ? x.renderLabel ? x.renderLabel(r) ?? "" : r[x.labelField || "label"] ?? "" : f ?? ""] });
130
+ }, { default: () => [i ? b.renderLabel ? b.renderLabel(i) ?? "" : i[b.labelField || "label"] ?? "" : d ?? ""] });
131
131
  }
132
132
  return h(NSelect, {
133
133
  clearable: !0,
134
- loading: l?.loading,
135
- ...x,
136
- options: unref(l),
137
- ..._,
138
- value: f,
139
- "onUpdate:value": p
140
- }, u);
134
+ loading: c?.loading,
135
+ ...b,
136
+ options: unref(c),
137
+ ...g,
138
+ value: d,
139
+ "onUpdate:value": f
140
+ }, l);
141
141
  };
142
142
  },
143
- checkbox: () => ({ slots: r, props: l }, { modelValue: u, "onUpdate:modelValue": d, required: f, readonly: p,...m }) => {
144
- if (l = mapProps(l), p) {
145
- let d;
146
- return d = u === (l.checkedValue ?? !0) ? r?.checked ? r.checked() : createVNode(NCheckbox, { checked: !0 }, null) : r?.unchecked ? r.unchecked() : createVNode(NCheckbox, { disabled: !0 }, null), createVNode(NText, {
143
+ checkbox: () => ({ slots: i, props: c }, { modelValue: l, "onUpdate:modelValue": u, required: d, readonly: f,...p }) => {
144
+ if (c = mapProps(c), f) {
145
+ let u;
146
+ return u = l === (c.checkedValue ?? !0) ? i?.checked ? i.checked() : createVNode(NCheckbox, { checked: !0 }, null) : i?.unchecked ? i.unchecked() : createVNode(NCheckbox, { disabled: !0 }, null), createVNode(NText, {
147
147
  depth: 2,
148
148
  style: "line-height: 1.25"
149
- }, _isSlot(d) ? d : { default: () => [d] });
149
+ }, _isSlot(u) ? u : { default: () => [u] });
150
150
  }
151
151
  return h(NCheckbox, {
152
- ...l,
153
- ...m,
154
- checked: u,
155
- "onUpdate:checked": d
156
- }, r);
152
+ ...c,
153
+ ...p,
154
+ checked: l,
155
+ "onUpdate:checked": u
156
+ }, i);
157
157
  },
158
158
  checkboxes: () => {
159
- let r, l;
160
- return ({ props: d }, { modelValue: f, required: p, readonly: m,...g }) => {
161
- let { dictType: _, options: y,...b } = mapProps(d);
162
- if (y ? l = y : r !== _ && (r = _, !l && r && (l = useDict(r))), m) {
163
- let r;
159
+ let i, c;
160
+ return ({ props: u }, { modelValue: d, required: f, readonly: p,...m }) => {
161
+ let { dictType: g, options: v,...y } = mapProps(u);
162
+ if (v ? c = v : i !== g && (i = g, !c && i && (c = useDict(i))), p) {
163
+ let i;
164
164
  return createVNode(NText, {
165
165
  depth: 2,
166
166
  style: "line-height: 2.4"
167
- }, _isSlot(r = (f?.map((r) => l?.find((l) => l[b.valueField || "value"] === r)) ?? []).map((r, l, u) => {
168
- let d = r ? r[b.labelField ?? "label"] ?? "" : f[l] ?? "";
169
- return createVNode("span", { key: r ? r[b.valueField ?? "value"] : f[l] ?? "" }, [d, l < u.length - 1 ? ", " : ""]);
170
- })) ? r : { default: () => [r] });
167
+ }, _isSlot(i = (d?.map((i) => c?.find((c) => c[y.valueField || "value"] === i)) ?? []).map((i, c, l) => {
168
+ let u = i ? i[y.labelField ?? "label"] ?? "" : d[c] ?? "";
169
+ return createVNode("span", { key: i ? i[y.valueField ?? "value"] : d[c] ?? "" }, [u, c < l.length - 1 ? ", " : ""]);
170
+ })) ? i : { default: () => [i] });
171
171
  }
172
172
  return h(NCheckboxes, {
173
- ...b,
174
- ...g,
175
- options: l,
176
- modelValue: f
173
+ ...y,
174
+ ...m,
175
+ options: c,
176
+ modelValue: d
177
177
  });
178
178
  };
179
179
  },
180
180
  radios: () => {
181
- let r, u;
182
- return ({ props: d }, { modelValue: f, required: p, readonly: m,...g }) => {
183
- let { dictType: _, options: y,...b } = mapProps(d);
184
- if (y ? u = y : r !== _ && (r = _, !u && r && (u = useDict(r))), m) {
185
- let r = u?.find((r) => r[b.valueField ?? "value"] === f);
181
+ let i, l;
182
+ return ({ props: u }, { modelValue: d, required: f, readonly: p,...m }) => {
183
+ let { dictType: g, options: v,...y } = mapProps(u);
184
+ if (v ? l = v : i !== g && (i = g, !l && i && (l = useDict(i))), p) {
185
+ let i = l?.find((i) => i[y.valueField ?? "value"] === d);
186
186
  return createVNode(NText, {
187
187
  depth: 2,
188
188
  style: "line-height: 1.25"
189
- }, { default: () => [r ? r[b.labelField ?? "label"] ?? "" : f ?? ""] });
189
+ }, { default: () => [i ? i[y.labelField ?? "label"] ?? "" : d ?? ""] });
190
190
  }
191
191
  return h(NRadios, {
192
- ...b,
193
- ...g,
194
- options: u,
195
- modelValue: f
192
+ ...y,
193
+ ...m,
194
+ options: l,
195
+ modelValue: d
196
196
  });
197
197
  };
198
198
  },
199
- datepicker: () => ({ slots: r, props: l }, { modelValue: u, "onUpdate:modelValue": d, required: f, readonly: p,...m }) => {
200
- let { type: g = "date", format: _ = g.startsWith("datetime") ? "yyyy-MM-dd HH:mm:ss" : "yyyy-MM-dd",...y } = mapProps(l);
201
- return p ? g.endsWith("range") ? createVNode(NText, {
199
+ datepicker: () => ({ slots: i, props: c }, { modelValue: l, "onUpdate:modelValue": u, required: d, readonly: f,...p }) => {
200
+ let { type: m = "date", format: g = m.startsWith("datetime") ? "yyyy-MM-dd HH:mm:ss" : "yyyy-MM-dd",...v } = mapProps(c);
201
+ return f ? m.endsWith("range") ? createVNode(NText, {
202
202
  depth: 2,
203
203
  style: "line-height: 1.25"
204
- }, { default: () => [u ? `${u[0] ? format(u[0], _) : ""} ~ ${u[1] ? format(u[1], _) : ""}` : ""] }) : createVNode(NText, {
204
+ }, { default: () => [l ? `${l[0] ? format(l[0], g) : ""} ~ ${l[1] ? format(l[1], g) : ""}` : ""] }) : createVNode(NText, {
205
205
  depth: 2,
206
206
  style: "line-height: 1.25"
207
- }, { default: () => [u ? format(u, _) : ""] }) : h(NDatePicker, {
207
+ }, { default: () => [l ? format(l, g) : ""] }) : h(NDatePicker, {
208
208
  clearable: !0,
209
- ...y,
210
- ...m,
211
- type: g,
212
- format: _,
213
- value: u,
214
- "onUpdate:value": d
215
- }, r);
209
+ ...v,
210
+ ...p,
211
+ type: m,
212
+ format: g,
213
+ value: l,
214
+ "onUpdate:value": u
215
+ }, i);
216
216
  },
217
- file: () => ({ slots: r, props: l }, { modelValue: u, "onUpdate:modelValue": d, required: f, readonly: p,...m }) => {
218
- if (l = mapProps(l), p) {
219
- let r;
217
+ file: () => ({ slots: i, props: c }, { modelValue: l, "onUpdate:modelValue": u, required: d, readonly: f,...p }) => {
218
+ if (c = mapProps(c), f) {
219
+ let i;
220
220
  return console.warn("[file] 原则上此组建不应该显示在详情中"), fileList.value.length === 0 ? void 0 : createVNode(NFlex, {
221
221
  gap: "8",
222
222
  vertical: !0
223
- }, _isSlot(r = u.map((r) => createVNode("a", {
224
- key: r.id,
225
- href: r.url,
223
+ }, _isSlot(i = l.map((i) => createVNode("a", {
224
+ key: i.id,
225
+ href: i.url,
226
226
  target: "_blank",
227
227
  rel: "noreferrer",
228
228
  style: "max-width: 100px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; display: inline-block"
229
- }, [r.name]))) ? r : { default: () => [r] });
229
+ }, [i.name]))) ? i : { default: () => [i] });
230
230
  }
231
231
  return h(SimpleUpload, {
232
- ...l,
233
- ...m,
232
+ ...c,
233
+ ...p,
234
234
  defaultUpload: !1,
235
- uploadFile: y,
236
- fileList: u,
237
- onUpdateFileList: d
238
- }, r);
235
+ uploadFile: v,
236
+ fileList: l,
237
+ onUpdateFileList: u
238
+ }, i);
239
239
  },
240
240
  upload: () => {
241
- let r = null, l = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map(), d = shallowRef([]), f = 0, p = (r) => {
242
- let l = ++f;
243
- d.value = r.map((r) => u.get(r)).filter(Boolean);
244
- let p = r.filter((r) => !u.has(r));
245
- Promise.resolve(p.length > 0 ? b(p) : []).then((p) => {
246
- if (l === f) {
247
- d.value = r.map((r) => u.get(r) || p.find((l) => l.id === r)), u.clear();
248
- for (let r of d.value) u.set(r.id, r);
241
+ let i = null, c = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map(), u = shallowRef([]), d = 0, f = (i) => {
242
+ let c = ++d;
243
+ u.value = i.map((i) => l.get(i)).filter(Boolean);
244
+ let f = i.filter((i) => !l.has(i));
245
+ Promise.resolve(f.length > 0 ? y(f) : []).then((f) => {
246
+ if (c === d) {
247
+ u.value = i.map((i) => l.get(i) || f.find((c) => c.id === i)), l.clear();
248
+ for (let i of u.value) l.set(i.id, i);
249
249
  }
250
250
  });
251
- }, m;
251
+ }, p;
252
252
  return {
253
- renderer: ({ slots: f, props: g }, { modelValue: _, "onUpdate:modelValue": b, required: x, readonly: S,...w }) => {
254
- let T = mapProps(g);
255
- if (m = T.ref ??= shallowRef(), r !== _ && (r = _, p(_?.split(",") ?? [])), S) {
256
- let r;
257
- return d.value.length === 0 ? void 0 : createVNode(NFlex, {
253
+ renderer: ({ slots: d, props: m }, { modelValue: g, "onUpdate:modelValue": y, required: b, readonly: x,...C }) => {
254
+ let w = mapProps(m);
255
+ if (p = w.ref ??= shallowRef(), i !== g && (i = g, f(g?.split(",") ?? [])), x) {
256
+ let i;
257
+ return u.value.length === 0 ? void 0 : createVNode(NFlex, {
258
258
  gap: "8",
259
259
  vertical: !0,
260
260
  style: "padding: 6px 0"
261
- }, _isSlot(r = d.value.map((r) => createVNode("a", {
262
- key: r.id,
263
- href: r.url,
261
+ }, _isSlot(i = u.value.map((i) => createVNode("a", {
262
+ key: i.id,
263
+ href: i.url,
264
264
  target: "_blank",
265
265
  rel: "noreferrer",
266
- title: r.name,
267
- download: r.name,
266
+ title: i.name,
267
+ download: i.name,
268
268
  style: "max-width: 100%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; display: inline-block"
269
- }, [r.name]))) ? r : { default: () => [r] });
269
+ }, [i.name]))) ? i : { default: () => [i] });
270
270
  }
271
271
  return h(SimpleUpload, {
272
- ...T,
273
272
  ...w,
274
- uploadFile: y,
275
- fileList: d.value,
276
- onUpdateFileList: (r = []) => {
277
- u.clear();
278
- for (let d of r) d.file?.fileId && l.set(d.id, d.file.fileId), d.file?.fileId ? u.set(d.file.fileId, d) : u.set(d.id, d);
279
- d.value = r, b(d.value.map((r) => l.get(r.id) || r.id).join(",") || null);
273
+ ...C,
274
+ uploadFile: v,
275
+ fileList: u.value,
276
+ onUpdateFileList: (i = []) => {
277
+ l.clear();
278
+ for (let u of i) u.file?.fileId && c.set(u.id, u.file.fileId), u.file?.fileId ? l.set(u.file.fileId, u) : l.set(u.id, u);
279
+ u.value = i, y(u.value.map((i) => c.get(i.id) || i.id).join(",") || null);
280
280
  }
281
- }, f);
281
+ }, d);
282
282
  },
283
283
  beforeSubmit: async () => {
284
- if (await m?.value?.submit(), await until(d).toMatch((r) => r.every((r) => !["pending", "uploading"].includes(r.status))), d.value.some((r) => r.status === "error")) return SimpleUpload.t("common.page.form.validate.fileErrorMessage");
284
+ if (await p?.value?.submit(), await until(u).toMatch((i) => i.every((i) => !["pending", "uploading"].includes(i.status))), u.value.some((i) => i.status === "error")) return SimpleUpload.t("common.page.form.validate.fileErrorMessage");
285
285
  }
286
286
  };
287
287
  },
288
288
  user: () => {
289
- let l, u, y;
290
- return ({ slots: b, props: x }, { modelValue: S, "onUpdate:modelValue": w, required: T, readonly: E,...D }) => {
291
- let O = mapProps(x);
292
- return l || (l = shallowRef([]), u = shallowRef([]), y = shallowRef([]), _().then((r) => {
293
- l.value = r;
294
- }), r().then((r) => {
295
- u.value = r;
296
- }), m().then((r) => {
297
- y.value = r;
298
- })), E ? createVNode(DtUserRender, {
299
- value: S,
300
- multiple: O.multiple,
301
- getUsersByUsername: _
289
+ let c, l, v;
290
+ return ({ slots: y, props: b }, { modelValue: x, "onUpdate:modelValue": C, required: w, readonly: T,...E }) => {
291
+ let D = mapProps(b);
292
+ return c || (c = shallowRef([]), l = shallowRef([]), v = shallowRef([]), g().then((i) => {
293
+ c.value = i;
294
+ }), i().then((i) => {
295
+ l.value = i;
296
+ }), p().then((i) => {
297
+ v.value = i;
298
+ })), T ? createVNode(DtUserRender, {
299
+ value: x,
300
+ multiple: D.multiple,
301
+ getUsersByUsername: g
302
302
  }, null) : h(DtUserDept, {
303
303
  type: "user",
304
- users: l.value,
305
- depts: y.value,
306
- groups: u.value,
307
- getUsersByDept: g,
308
- getUsersByGroup: f,
309
- ...O,
304
+ users: c.value,
305
+ depts: v.value,
306
+ groups: l.value,
307
+ getUsersByDept: m,
308
+ getUsersByGroup: d,
310
309
  ...D,
311
- modelValue: S,
312
- "onUpdate:modelValue": w
313
- }, b);
310
+ ...E,
311
+ modelValue: x,
312
+ "onUpdate:modelValue": C
313
+ }, y);
314
314
  };
315
315
  }
316
316
  };
317
317
  }
318
- function createPageTableHelper({ getDeptsByCode: r, getUsersByUsername: l, getFileInfos: u, previewFileUrl: d }) {
319
- let f = (r) => () => (l, u, d, f) => {
320
- if (l != null) return format(l, f.formatter ?? r);
321
- }, g = (r = {}) => createVNode("svg", mergeProps({
318
+ function createPageTableHelper({ getDeptsByCode: i, getUsersByUsername: c, getFileInfos: l, previewFileUrl: u }) {
319
+ let d = (i) => () => (c, l, u, d) => {
320
+ if (c != null) return format(c, d.formatter ?? i);
321
+ }, m = (i = {}) => createVNode("svg", mergeProps({
322
322
  xmlns: "http://www.w3.org/2000/svg",
323
323
  width: "1em",
324
324
  height: "1em",
325
325
  viewBox: "0 0 32 32"
326
- }, r), [createVNode("circle", {
326
+ }, i), [createVNode("circle", {
327
327
  cx: "16",
328
328
  cy: "16",
329
329
  r: "8",
330
330
  fill: "currentColor"
331
331
  }, null)]);
332
332
  return {
333
- date: f("yyyy-MM-dd"),
334
- datetime: f("yyyy-MM-dd HH:mm:ss"),
333
+ date: d("yyyy-MM-dd"),
334
+ datetime: d("yyyy-MM-dd HH:mm:ss"),
335
335
  dict: () => {
336
- let r, l, u;
337
- return (d, f, p, m) => {
338
- if (d == null) return;
339
- let { dictType: _, options: v, multiple: y, statusMap: b } = mapProps(m);
340
- if (v ? l !== v && (l = v, u = new Map(v.map((r) => [r[m.valueField || "value"], r]))) : r !== _ && (r = _, !u && r && (u = useDictMap(r))), !y) {
341
- if (d = d.toString(), b && d in b) {
342
- let r = b[d] ?? "default";
336
+ let i, c, l;
337
+ return (u, d, f, p) => {
338
+ if (u == null) return;
339
+ let { dictType: g, options: _, multiple: v, statusMap: y } = mapProps(p);
340
+ if (_ ? c !== _ && (c = _, l = new Map(_.map((i) => [i[p.valueField || "value"], i]))) : i !== g && (i = g, !l && i && (l = useDictMap(i))), !v) {
341
+ if (u = u.toString(), y && u in y) {
342
+ let i = y[u] ?? "default";
343
343
  return [
344
344
  "primary",
345
345
  "success",
346
346
  "warning",
347
347
  "danger"
348
- ].includes(r) && (r = `var(--color-${r})`), createVNode("span", { style: "position: relative; padding-left: 1.25em" }, [createVNode(g, { style: `color: ${r}; position: absolute;left: 0; top: 1.5px` }, null), createVNode("span", null, [u.get(d?.toString())?.[m.labelField || "label"] ?? ""])]);
348
+ ].includes(i) && (i = `var(--color-${i})`), createVNode("span", { style: "position: relative; padding-left: 1.25em" }, [createVNode(m, { style: `color: ${i}; position: absolute;left: 0; top: 1.5px` }, null), createVNode("span", null, [l.get(u?.toString())?.[p.labelField || "label"] ?? ""])]);
349
349
  }
350
- return u.get(d)?.[m.labelField || "label"] ?? "";
350
+ return l.get(u)?.[p.labelField || "label"] ?? "";
351
351
  }
352
- return d?.map((r) => u.get(r.toString())?.[m.labelField || "label"]) ?? "";
352
+ return u?.map((i) => l.get(i.toString())?.[p.labelField || "label"]) ?? "";
353
353
  };
354
354
  },
355
- number: () => (r, l, u, d) => {
356
- if (r != null) {
357
- switch (d.percent && (r = Number(r) * 100), "number") {
358
- case typeof d.fixed:
359
- r = r.toFixed(d.fixed);
355
+ number: () => (i, c, l, u) => {
356
+ if (i != null) {
357
+ switch (u.percent && (i = Number(i) * 100), "number") {
358
+ case typeof u.fixed:
359
+ i = i.toFixed(u.fixed);
360
360
  break;
361
- case typeof d.round:
362
- r = r.toFixed(d.round).replace(/0+$/, "");
361
+ case typeof u.round:
362
+ i = i.toFixed(u.round).replace(/0+$/, "");
363
363
  break;
364
- case typeof d.precision:
365
- r = r.toPrecision(d.precision);
364
+ case typeof u.precision:
365
+ i = i.toPrecision(u.precision);
366
366
  break;
367
367
  }
368
- return d?.separator ? Number(r).toLocaleString() : r;
368
+ return u?.separator ? Number(i).toLocaleString() : i;
369
369
  }
370
370
  },
371
- email: () => (r) => createVNode("a", { href: `mailto:${r}` }, [r]),
372
- url: () => (r) => createVNode("a", { href: r }, [r]),
373
- color: () => (r) => createVNode(NColorPicker, {
374
- value: r,
371
+ email: () => (i) => createVNode("a", { href: `mailto:${i}` }, [i]),
372
+ url: () => (i) => createVNode("a", { href: i }, [i]),
373
+ color: () => (i) => createVNode(NColorPicker, {
374
+ value: i,
375
375
  disabled: !0,
376
376
  size: "small"
377
377
  }, null),
378
- image: () => (r, l, u, f) => {
379
- let p;
380
- return r ? createVNode(NFlex, {
378
+ image: () => (i, c, l, d) => {
379
+ let f;
380
+ return i ? createVNode(NFlex, {
381
381
  gap: "8",
382
382
  wrap: !0
383
- }, _isSlot(p = (Array.isArray(r) ? r : f?.multiple ? r.split(",") : [r]).map((r) => d(r)).map((r) => createVNode("img", {
384
- key: r,
385
- src: r,
383
+ }, _isSlot(f = (Array.isArray(i) ? i : d?.multiple ? i.split(",") : [i]).map((i) => u(i)).map((i) => createVNode("img", {
384
+ key: i,
385
+ src: i,
386
386
  style: "max-height: 32px; max-width: 100px; object-fit: contain"
387
- }, null))) ? p : { default: () => [p] }) : void 0;
387
+ }, null))) ? f : { default: () => [f] }) : void 0;
388
388
  },
389
389
  file: () => {
390
- let r = nanoid();
391
- return (l, d, f, p) => {
390
+ let i = shallowRef(/* @__PURE__ */ new Map()), c = /* @__PURE__ */ new Set();
391
+ return (u, d, f, p) => {
392
392
  let m;
393
- return l ? (d.__file_urls ??= {}, d.__file_urls[r] || u(Array.isArray(l) ? l : p?.multiple ? l.split(",") : [l]).then((l) => {
394
- d.__file_urls[r] = l;
395
- }), createVNode(NFlex, {
393
+ if (!u) return;
394
+ let g = Array.isArray(u) ? u : p?.multiple ? u.split(",") : [u], _ = g.join(","), v = i.value.get(_);
395
+ return !v && !c.has(_) && (c.add(_), l(g).then((c) => {
396
+ i.value.set(_, c || []), i.value = new Map(i.value);
397
+ }).finally(() => {
398
+ c.delete(_);
399
+ })), v ? createVNode(NFlex, {
396
400
  gap: "8",
397
401
  wrap: !0
398
- }, _isSlot(m = (d.__file_urls[r] || []).map((r) => createVNode("a", {
399
- key: r.id,
400
- href: r.url,
402
+ }, _isSlot(m = v.map((i) => createVNode("a", {
403
+ key: i.id,
404
+ href: i.url,
401
405
  target: "_blank",
402
406
  rel: "noreferrer",
403
407
  style: "max-width: 100px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; display: inline-block"
404
- }, [r.name]))) ? m : { default: () => [m] })) : void 0;
408
+ }, [i.name]))) ? m : { default: () => [m] }) : createVNode("div", null, null);
405
409
  };
406
410
  },
407
- dept: () => (l, u, d, f) => {
408
- if (l) return createVNode(DtDeptRender, {
409
- value: l,
410
- multiple: f?.multiple,
411
- getDeptsByCode: r
411
+ dept: () => (c, l, u, d) => {
412
+ if (c) return createVNode(DtDeptRender, {
413
+ value: c,
414
+ multiple: d?.multiple,
415
+ getDeptsByCode: i
412
416
  }, null);
413
417
  },
414
- user: () => (r, u, d, f) => {
415
- if (r) return createVNode(DtUserRender, {
416
- value: r,
417
- multiple: f?.multiple,
418
- getUsersByUsername: l
418
+ user: () => (i, l, u, d) => {
419
+ if (i) return createVNode(DtUserRender, {
420
+ value: i,
421
+ multiple: d?.multiple,
422
+ getUsersByUsername: c
419
423
  }, null);
420
424
  }
421
425
  };
422
426
  }
423
427
  function createFormHelper() {
424
- return () => ({ items: r, model: l, handleSubmit: u, reset: d, validation: p, readonly: m, inModal: g, showFeedback: _, showColon: v, labelWidth: y, labelAlign: b, labelPlacement: x, showRequireMark: S, requireMarkPlacement: C }) => createVNode(DataForm, {
425
- readonly: m,
426
- model: l,
427
- items: r,
428
- validation: p,
429
- showColon: unref(v) ?? !0,
430
- labelWidth: unref(y),
431
- labelAlign: unref(b),
432
- labelPlacement: unref(x),
433
- showRequireMark: unref(S),
434
- requireMarkPlacement: unref(C),
435
- showFeedback: unref(_) ?? !0,
428
+ return () => ({ items: i, model: c, handleSubmit: l, reset: u, validation: f, readonly: p, inModal: m, showFeedback: g, showColon: _, labelWidth: v, labelAlign: y, labelPlacement: b, showRequireMark: x, requireMarkPlacement: S }) => createVNode(DataForm, {
429
+ readonly: p,
430
+ model: c,
431
+ items: i,
432
+ validation: f,
433
+ showColon: unref(_) ?? !0,
434
+ labelWidth: unref(v),
435
+ labelAlign: unref(y),
436
+ labelPlacement: unref(b),
437
+ showRequireMark: unref(x),
438
+ requireMarkPlacement: unref(S),
439
+ showFeedback: unref(g) ?? !0,
436
440
  showAction: !1,
437
- onSubmit: u,
438
- onRest: d,
439
- style: g ? "padding-right: .5rem" : void 0
441
+ onSubmit: l,
442
+ onRest: u,
443
+ style: m ? "padding-right: .5rem" : void 0
440
444
  }, null);
441
445
  }
442
446
  function createModalHelper() {
443
- let r = (r) => typeof r == "number" ? `${r}px` : r, l = {
447
+ let i = (i) => typeof i == "number" ? `${i}px` : i, c = {
444
448
  maxHeight: "calc(100vh - 130px)",
445
449
  display: "flex",
446
450
  flexDirection: "column"
447
- }, u = { content: !0 };
448
- return () => ({ type: d = "dialog", visible: f, title: p, content: m, footer: g, placement: _, resizable: v, draggable: y, closeOnEsc: x, closable: S, showMask: C, maskClosable: w, width: T, height: D, style: O, onClose: k, onCancel: A, onConfirm: j, onAfterClose: M, onAfterOpen: N, confirmText: P, confirmDisabled: F, confirmLoading: I, cancelText: L, cancelDisabled: R, cancelLoading: z, nativeScrollbar: B,...V }) => {
449
- let H = g ? () => g : g === null ? null : () => createVNode(NFlex, {
451
+ }, l = { content: !0 };
452
+ return () => ({ type: u = "dialog", visible: d, title: f, content: p, footer: m, placement: g, resizable: _, draggable: v, closeOnEsc: b, closable: x, showMask: S, maskClosable: C, width: w, height: E, style: D, onClose: O, onCancel: k, onConfirm: A, onAfterClose: j, onAfterOpen: M, confirmText: N, confirmDisabled: P, confirmLoading: F, cancelText: I, cancelDisabled: L, cancelLoading: R, nativeScrollbar: z,...B }) => {
453
+ let V = m ? () => m : m === null ? null : () => createVNode(NFlex, {
450
454
  justify: "end",
451
455
  gap: "16"
452
- }, { default: () => [L === null ? void 0 : createVNode(NButton, {
453
- onClick: A,
454
- disabled: R,
455
- loading: z,
456
+ }, { default: () => [I === null ? void 0 : createVNode(NButton, {
457
+ onClick: k,
458
+ disabled: L,
459
+ loading: R,
456
460
  style: "min-width: 60px"
457
- }, _isSlot(L) ? L : { default: () => [L] }), P === null ? void 0 : createVNode(NButton, {
461
+ }, _isSlot(I) ? I : { default: () => [I] }), N === null ? void 0 : createVNode(NButton, {
458
462
  type: "primary",
459
- onClick: j,
460
- disabled: F,
461
- loading: I,
463
+ onClick: A,
464
+ disabled: P,
465
+ loading: F,
462
466
  style: "min-width: 60px"
463
- }, _isSlot(P) ? P : { default: () => [P] })] });
464
- if (d === "dialog") {
465
- let { style: d } = mergeProps({ style: {
466
- width: r(T ?? 520),
467
- height: r(D)
468
- } }, { style: O });
467
+ }, _isSlot(N) ? N : { default: () => [N] })] });
468
+ if (u === "dialog") {
469
+ let { style: u } = mergeProps({ style: {
470
+ width: i(w ?? 520),
471
+ height: i(E)
472
+ } }, { style: D });
469
473
  return createVNode(NModal, mergeProps({
470
- show: f,
474
+ show: d,
471
475
  preset: "card",
472
- title: () => p,
473
- maskClosable: w ?? !1,
474
- closeOnEsc: x,
475
- closable: S,
476
- onClose: k,
477
- segmented: u,
476
+ title: () => f,
477
+ maskClosable: C ?? !1,
478
+ closeOnEsc: b,
479
+ closable: x,
480
+ onClose: O,
481
+ segmented: l,
478
482
  size: "small",
479
- onAfterEnter: N,
480
- onAfterLeave: M,
481
- onUpdateShow: k,
482
- draggable: y ?? !0,
483
- style: d,
484
- contentStyle: l
485
- }, V), {
483
+ onAfterEnter: M,
484
+ onAfterLeave: j,
485
+ onUpdateShow: O,
486
+ draggable: v ?? !0,
487
+ style: u,
488
+ contentStyle: c
489
+ }, B), {
486
490
  default: () => createVNode(NScrollbar, {
487
491
  abstract: !0,
488
492
  style: "display: flex; flex-direction: column"
489
- }, _isSlot(m) ? m : { default: () => [m] }),
490
- action: H
493
+ }, _isSlot(p) ? p : { default: () => [p] }),
494
+ action: V
491
495
  });
492
496
  }
493
- let { bodyContentClass: U, bodyContentStyle: W,...G } = V;
497
+ let { bodyContentClass: H, bodyContentStyle: U,...W } = B;
494
498
  return createVNode(NDrawer, mergeProps({
495
- show: f,
499
+ show: d,
496
500
  trapFocus: !1,
497
- closeOnEsc: x,
498
- showMask: C,
499
- maskClosable: w,
500
- resizable: v,
501
- placement: _,
502
- width: T ?? 440,
503
- height: D,
504
- onUpdateShow: k,
505
- onAfterEnter: N,
506
- onAfterLeave: M,
507
- style: O
508
- }, G), { default: () => [createVNode(NDrawerContent, {
509
- closable: S,
510
- nativeScrollbar: B ?? !1,
511
- bodyContentClass: U,
512
- bodyContentStyle: W
501
+ closeOnEsc: b,
502
+ showMask: S,
503
+ maskClosable: C,
504
+ resizable: _,
505
+ placement: g,
506
+ width: w ?? 440,
507
+ height: E,
508
+ onUpdateShow: O,
509
+ onAfterEnter: M,
510
+ onAfterLeave: j,
511
+ style: D
512
+ }, W), { default: () => [createVNode(NDrawerContent, {
513
+ closable: x,
514
+ nativeScrollbar: z ?? !1,
515
+ bodyContentClass: H,
516
+ bodyContentStyle: U
513
517
  }, {
514
- default: () => m,
515
- header: () => p,
516
- footer: H
518
+ default: () => p,
519
+ header: () => f,
520
+ footer: V
517
521
  })] });
518
522
  };
519
523
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otwb/ui",
3
- "version": "2.0.40",
3
+ "version": "2.0.41",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "otwb UI",
@@ -65,8 +65,8 @@
65
65
  "nanoid": "^5.1.6",
66
66
  "sortablejs": "^1.15.6",
67
67
  "vueuc": "^0.4.65",
68
- "@otwb/app": "^2.0.2",
69
- "@otwb/common": "^2.0.7"
68
+ "@otwb/common": "^2.0.7",
69
+ "@otwb/app": "^2.0.2"
70
70
  },
71
71
  "peerDependencies": {
72
72
  "@otwb/page": ">=4.0",