smart-admin-web 10.12.2 → 10.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +16 -1
- package/dist/api/index.js +48 -33
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +409 -0
- package/dist/assets/icons/ph-subset.json.js +1 -1
- package/dist/composables/useModule.js +35 -27
- package/dist/composables/useModule.js.map +1 -1
- package/dist/index.js +250 -249
- package/dist/layouts/AppHeader.vue.js +1 -1
- package/dist/layouts/AppHeader2.vue.js +306 -292
- package/dist/layouts/AppHeader2.vue.js.map +1 -1
- package/dist/lib/runtime.js +1 -1
- package/dist/locales/en-US.d.ts +37 -0
- package/dist/locales/en-US.js +37 -0
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +37 -0
- package/dist/locales/zh-CN.js +37 -0
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/router/viewRegistry.js +1 -1
- package/dist/router/viewRegistry.js.map +1 -1
- package/dist/stores/user.d.ts +6 -1
- package/dist/stores/user.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/api.d.ts +33 -0
- package/dist/types/api.js.map +1 -1
- package/dist/views/system/tenant/index.vue.d.ts +3 -0
- package/dist/views/system/tenant/index.vue.js +8 -0
- package/dist/views/system/tenant/index.vue.js.map +1 -0
- package/dist/views/system/tenant/index2.vue.js +366 -0
- package/dist/views/system/tenant/index2.vue.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { defineComponent as V, ref as b, reactive as B, resolveDirective as $, openBlock as P, createElementBlock as T, Fragment as S, createVNode as l, unref as e, withCtx as d, withDirectives as F, createBlock as O, createTextVNode as k, toDisplayString as m, createElementVNode as s, normalizeClass as j, createCommentVNode as L, h as f } from "vue";
|
|
2
|
+
import { useMessage as G, NButton as _, NForm as H, NFormItem as r, NInput as c, NSpace as A, NTag as U, NDatePicker as J, NSwitch as K, NPopconfirm as Q } from "naive-ui";
|
|
3
|
+
import { useI18n as W } from "vue-i18n";
|
|
4
|
+
import { SmartTable as X } from "smart-naive-table";
|
|
5
|
+
import Y from "../../../components/AppIcon.vue.js";
|
|
6
|
+
import Z from "../../../components/FormContainer/index.vue.js";
|
|
7
|
+
/* empty css */
|
|
8
|
+
import ee from "../../../components/StatusSwitch/index.vue.js";
|
|
9
|
+
import { useConfirm as te } from "../../../composables/useConfirm.js";
|
|
10
|
+
import { tenantApi as v } from "../../../api/index.js";
|
|
11
|
+
import { useAuthStore as ae } from "../../../stores/auth.js";
|
|
12
|
+
import { translateError as q } from "../../../utils/error.js";
|
|
13
|
+
const ne = { class: "iso-title" }, oe = { class: "iso-desc" }, le = ["title"], ie = { class: "iso-title" }, de = { class: "iso-desc" }, re = { class: "form-section" }, se = { class: "form-section__title" }, _e = /* @__PURE__ */ V({
|
|
14
|
+
__name: "index",
|
|
15
|
+
setup(ue) {
|
|
16
|
+
const { t } = W(), y = G(), { run: C } = te(), w = ae(), g = b(), N = (n) => ({
|
|
17
|
+
code: n.code,
|
|
18
|
+
name: n.name,
|
|
19
|
+
contactName: n.contactName ?? "",
|
|
20
|
+
contactPhone: n.contactPhone ?? "",
|
|
21
|
+
expireTime: n.expireTime,
|
|
22
|
+
isolationMode: n.isolationMode,
|
|
23
|
+
enabled: n.enabled,
|
|
24
|
+
remark: n.remark ?? ""
|
|
25
|
+
}), z = [
|
|
26
|
+
{ type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
|
|
27
|
+
// 编码列不开搜索:后端 TenantPageInput 只支持按 Name 过滤,开了也是个不生效的搜索框。
|
|
28
|
+
{ key: "code", title: () => t("tenant.code") },
|
|
29
|
+
{ key: "name", title: () => t("tenant.name"), search: !0 },
|
|
30
|
+
{
|
|
31
|
+
key: "isolationMode",
|
|
32
|
+
title: () => t("tenant.isolationMode"),
|
|
33
|
+
width: 100,
|
|
34
|
+
render: (n) => f(
|
|
35
|
+
U,
|
|
36
|
+
{ size: "small", type: n.isolationMode === 1 ? "info" : "default" },
|
|
37
|
+
() => n.isolationMode === 1 ? t("tenant.isolationModeShared") : t("tenant.isolationModeStandalone")
|
|
38
|
+
)
|
|
39
|
+
},
|
|
40
|
+
{ key: "contactName", title: () => t("tenant.contactName") },
|
|
41
|
+
{ key: "contactPhone", title: () => t("tenant.contactPhone") },
|
|
42
|
+
{ key: "expireTime", title: () => t("tenant.expireTime"), format: "date" },
|
|
43
|
+
{
|
|
44
|
+
key: "enabled",
|
|
45
|
+
title: () => t("common.status"),
|
|
46
|
+
width: 90,
|
|
47
|
+
render: (n) => f(ee, {
|
|
48
|
+
value: n.enabled,
|
|
49
|
+
disabled: !w.hasPerm("PUT:/api/v1/sys/tenant/{id}"),
|
|
50
|
+
request: (a) => v.update(n.id, { ...N(n), enabled: a }),
|
|
51
|
+
"onUpdate:value": (a) => {
|
|
52
|
+
n.enabled = a;
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
},
|
|
56
|
+
{ key: "createTime", title: () => t("common.createTime"), format: "datetime" },
|
|
57
|
+
{
|
|
58
|
+
key: "op",
|
|
59
|
+
title: () => t("common.operation"),
|
|
60
|
+
width: 120,
|
|
61
|
+
fixed: "right",
|
|
62
|
+
hideInSetting: !0,
|
|
63
|
+
render: (n) => f(A, { size: 4, wrapItem: !1 }, () => [
|
|
64
|
+
w.hasPerm("PUT:/api/v1/sys/tenant/{id}") ? f(
|
|
65
|
+
_,
|
|
66
|
+
{ size: "small", quaternary: !0, type: "primary", onClick: () => D(n) },
|
|
67
|
+
() => t("common.edit")
|
|
68
|
+
) : null,
|
|
69
|
+
w.hasPerm("DELETE:/api/v1/sys/tenant/{id}") ? f(
|
|
70
|
+
Q,
|
|
71
|
+
{
|
|
72
|
+
onPositiveClick: () => C(() => v.remove(n.id), t("tenant.deleted")).then((a) => {
|
|
73
|
+
var p;
|
|
74
|
+
a && ((p = g.value) == null || p.refresh());
|
|
75
|
+
})
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
trigger: () => f(
|
|
79
|
+
_,
|
|
80
|
+
{ size: "small", quaternary: !0, type: "error" },
|
|
81
|
+
() => t("common.delete")
|
|
82
|
+
),
|
|
83
|
+
default: () => t("tenant.deleteConfirm", { name: n.name })
|
|
84
|
+
}
|
|
85
|
+
) : null
|
|
86
|
+
])
|
|
87
|
+
}
|
|
88
|
+
], h = b(!1), M = b(null), u = b(null), E = {
|
|
89
|
+
code: {
|
|
90
|
+
required: !0,
|
|
91
|
+
whitespace: !0,
|
|
92
|
+
message: () => t("tenant.codeRequired"),
|
|
93
|
+
trigger: ["input", "blur"]
|
|
94
|
+
},
|
|
95
|
+
name: {
|
|
96
|
+
required: !0,
|
|
97
|
+
whitespace: !0,
|
|
98
|
+
message: () => t("tenant.nameRequired"),
|
|
99
|
+
trigger: ["input", "blur"]
|
|
100
|
+
},
|
|
101
|
+
adminAccount: {
|
|
102
|
+
required: !0,
|
|
103
|
+
whitespace: !0,
|
|
104
|
+
message: () => t("tenant.adminAccountRequired"),
|
|
105
|
+
trigger: ["input", "blur"]
|
|
106
|
+
},
|
|
107
|
+
adminPassword: {
|
|
108
|
+
required: !0,
|
|
109
|
+
whitespace: !0,
|
|
110
|
+
message: () => t("tenant.adminPasswordRequired"),
|
|
111
|
+
trigger: ["input", "blur"]
|
|
112
|
+
}
|
|
113
|
+
}, x = () => ({
|
|
114
|
+
code: "",
|
|
115
|
+
name: "",
|
|
116
|
+
contactName: "",
|
|
117
|
+
contactPhone: "",
|
|
118
|
+
isolationMode: 1,
|
|
119
|
+
enabled: !0,
|
|
120
|
+
remark: "",
|
|
121
|
+
adminAccount: "",
|
|
122
|
+
adminPassword: ""
|
|
123
|
+
}), o = B(x());
|
|
124
|
+
function R() {
|
|
125
|
+
u.value = null, Object.assign(o, x()), h.value = !0;
|
|
126
|
+
}
|
|
127
|
+
function D(n) {
|
|
128
|
+
u.value = n.id, Object.assign(o, N(n), { adminAccount: "", adminPassword: "" }), h.value = !0;
|
|
129
|
+
}
|
|
130
|
+
async function I() {
|
|
131
|
+
var n, a;
|
|
132
|
+
await ((n = M.value) == null ? void 0 : n.validate());
|
|
133
|
+
try {
|
|
134
|
+
u.value === null ? await v.add({ ...o }) : await v.update(u.value, { ...o }), y.success(t("tenant.saved")), await ((a = g.value) == null ? void 0 : a.refresh());
|
|
135
|
+
} catch (p) {
|
|
136
|
+
return y.error(q(p)), !1;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return (n, a) => {
|
|
140
|
+
const p = $("auth");
|
|
141
|
+
return P(), T(S, null, [
|
|
142
|
+
l(e(X), {
|
|
143
|
+
ref_key: "tableRef",
|
|
144
|
+
ref: g,
|
|
145
|
+
"default-page-size": 100,
|
|
146
|
+
columns: z,
|
|
147
|
+
fetcher: e(v).page,
|
|
148
|
+
"flex-height": "",
|
|
149
|
+
"virtual-scroll": "",
|
|
150
|
+
"storage-key": "sys-tenant",
|
|
151
|
+
onError: a[0] || (a[0] = (i) => e(y).error(e(q)(i)))
|
|
152
|
+
}, {
|
|
153
|
+
toolbar: d(() => [
|
|
154
|
+
F((P(), O(e(_), {
|
|
155
|
+
type: "primary",
|
|
156
|
+
onClick: R
|
|
157
|
+
}, {
|
|
158
|
+
icon: d(() => [
|
|
159
|
+
l(Y, {
|
|
160
|
+
icon: "ph:plus",
|
|
161
|
+
size: 16
|
|
162
|
+
})
|
|
163
|
+
]),
|
|
164
|
+
default: d(() => [
|
|
165
|
+
k(" " + m(e(t)("common.add")), 1)
|
|
166
|
+
]),
|
|
167
|
+
_: 1
|
|
168
|
+
})), [
|
|
169
|
+
[p, "POST:/api/v1/sys/tenant/add"]
|
|
170
|
+
])
|
|
171
|
+
]),
|
|
172
|
+
_: 1
|
|
173
|
+
}, 8, ["fetcher"]),
|
|
174
|
+
l(Z, {
|
|
175
|
+
show: h.value,
|
|
176
|
+
"onUpdate:show": a[11] || (a[11] = (i) => h.value = i),
|
|
177
|
+
title: u.value === null ? e(t)("tenant.addTitle") : e(t)("tenant.editTitle"),
|
|
178
|
+
width: 480,
|
|
179
|
+
"on-confirm": I,
|
|
180
|
+
"confirm-text": e(t)("common.save")
|
|
181
|
+
}, {
|
|
182
|
+
default: d(() => [
|
|
183
|
+
l(e(H), {
|
|
184
|
+
ref_key: "formRef",
|
|
185
|
+
ref: M,
|
|
186
|
+
model: o,
|
|
187
|
+
rules: E,
|
|
188
|
+
"label-placement": "left",
|
|
189
|
+
"label-width": 90
|
|
190
|
+
}, {
|
|
191
|
+
default: d(() => [
|
|
192
|
+
l(e(r), {
|
|
193
|
+
label: e(t)("tenant.code"),
|
|
194
|
+
path: "code"
|
|
195
|
+
}, {
|
|
196
|
+
default: d(() => [
|
|
197
|
+
l(e(c), {
|
|
198
|
+
value: o.code,
|
|
199
|
+
"onUpdate:value": a[1] || (a[1] = (i) => o.code = i),
|
|
200
|
+
disabled: u.value !== null,
|
|
201
|
+
placeholder: e(t)("tenant.codePlaceholder")
|
|
202
|
+
}, null, 8, ["value", "disabled", "placeholder"])
|
|
203
|
+
]),
|
|
204
|
+
_: 1
|
|
205
|
+
}, 8, ["label"]),
|
|
206
|
+
l(e(r), {
|
|
207
|
+
label: e(t)("tenant.name"),
|
|
208
|
+
path: "name"
|
|
209
|
+
}, {
|
|
210
|
+
default: d(() => [
|
|
211
|
+
l(e(c), {
|
|
212
|
+
value: o.name,
|
|
213
|
+
"onUpdate:value": a[2] || (a[2] = (i) => o.name = i),
|
|
214
|
+
placeholder: e(t)("tenant.name")
|
|
215
|
+
}, null, 8, ["value", "placeholder"])
|
|
216
|
+
]),
|
|
217
|
+
_: 1
|
|
218
|
+
}, 8, ["label"]),
|
|
219
|
+
l(e(r), {
|
|
220
|
+
label: e(t)("tenant.isolationMode")
|
|
221
|
+
}, {
|
|
222
|
+
default: d(() => [
|
|
223
|
+
l(e(A), {
|
|
224
|
+
vertical: "",
|
|
225
|
+
style: { width: "100%" }
|
|
226
|
+
}, {
|
|
227
|
+
default: d(() => [
|
|
228
|
+
s("div", {
|
|
229
|
+
class: j(["iso-option", { selected: o.isolationMode === 1 }]),
|
|
230
|
+
onClick: a[3] || (a[3] = (i) => o.isolationMode = 1)
|
|
231
|
+
}, [
|
|
232
|
+
s("div", ne, m(e(t)("tenant.isolationModeShared")), 1),
|
|
233
|
+
s("div", oe, m(e(t)("tenant.isolationModeSharedDesc")), 1)
|
|
234
|
+
], 2),
|
|
235
|
+
s("div", {
|
|
236
|
+
class: "iso-option disabled",
|
|
237
|
+
title: e(t)("tenant.isolationModePhase2")
|
|
238
|
+
}, [
|
|
239
|
+
s("div", ie, [
|
|
240
|
+
k(m(e(t)("tenant.isolationModeStandalone")) + " ", 1),
|
|
241
|
+
l(e(U), {
|
|
242
|
+
size: "tiny",
|
|
243
|
+
type: "warning",
|
|
244
|
+
style: { "margin-left": "6px" }
|
|
245
|
+
}, {
|
|
246
|
+
default: d(() => [
|
|
247
|
+
k(m(e(t)("tenant.isolationModePhase2")), 1)
|
|
248
|
+
]),
|
|
249
|
+
_: 1
|
|
250
|
+
})
|
|
251
|
+
]),
|
|
252
|
+
s("div", de, m(e(t)("tenant.isolationModeStandaloneDesc")), 1)
|
|
253
|
+
], 8, le)
|
|
254
|
+
]),
|
|
255
|
+
_: 1
|
|
256
|
+
})
|
|
257
|
+
]),
|
|
258
|
+
_: 1
|
|
259
|
+
}, 8, ["label"]),
|
|
260
|
+
l(e(r), {
|
|
261
|
+
label: e(t)("tenant.contactName")
|
|
262
|
+
}, {
|
|
263
|
+
default: d(() => [
|
|
264
|
+
l(e(c), {
|
|
265
|
+
value: o.contactName,
|
|
266
|
+
"onUpdate:value": a[4] || (a[4] = (i) => o.contactName = i)
|
|
267
|
+
}, null, 8, ["value"])
|
|
268
|
+
]),
|
|
269
|
+
_: 1
|
|
270
|
+
}, 8, ["label"]),
|
|
271
|
+
l(e(r), {
|
|
272
|
+
label: e(t)("tenant.contactPhone")
|
|
273
|
+
}, {
|
|
274
|
+
default: d(() => [
|
|
275
|
+
l(e(c), {
|
|
276
|
+
value: o.contactPhone,
|
|
277
|
+
"onUpdate:value": a[5] || (a[5] = (i) => o.contactPhone = i)
|
|
278
|
+
}, null, 8, ["value"])
|
|
279
|
+
]),
|
|
280
|
+
_: 1
|
|
281
|
+
}, 8, ["label"]),
|
|
282
|
+
l(e(r), {
|
|
283
|
+
label: e(t)("tenant.expireTime")
|
|
284
|
+
}, {
|
|
285
|
+
default: d(() => [
|
|
286
|
+
l(e(J), {
|
|
287
|
+
"formatted-value": o.expireTime,
|
|
288
|
+
"onUpdate:formattedValue": a[6] || (a[6] = (i) => o.expireTime = i),
|
|
289
|
+
"value-format": "yyyy-MM-dd",
|
|
290
|
+
type: "date",
|
|
291
|
+
style: { width: "100%" }
|
|
292
|
+
}, null, 8, ["formatted-value"])
|
|
293
|
+
]),
|
|
294
|
+
_: 1
|
|
295
|
+
}, 8, ["label"]),
|
|
296
|
+
l(e(r), {
|
|
297
|
+
label: e(t)("common.status")
|
|
298
|
+
}, {
|
|
299
|
+
default: d(() => [
|
|
300
|
+
l(e(K), {
|
|
301
|
+
value: o.enabled,
|
|
302
|
+
"onUpdate:value": a[7] || (a[7] = (i) => o.enabled = i)
|
|
303
|
+
}, null, 8, ["value"])
|
|
304
|
+
]),
|
|
305
|
+
_: 1
|
|
306
|
+
}, 8, ["label"]),
|
|
307
|
+
u.value === null ? (P(), T(S, { key: 0 }, [
|
|
308
|
+
s("div", re, [
|
|
309
|
+
s("div", se, m(e(t)("tenant.initialAdmin")), 1)
|
|
310
|
+
]),
|
|
311
|
+
l(e(r), {
|
|
312
|
+
label: e(t)("tenant.adminAccount"),
|
|
313
|
+
path: "adminAccount"
|
|
314
|
+
}, {
|
|
315
|
+
default: d(() => [
|
|
316
|
+
l(e(c), {
|
|
317
|
+
value: o.adminAccount,
|
|
318
|
+
"onUpdate:value": a[8] || (a[8] = (i) => o.adminAccount = i),
|
|
319
|
+
placeholder: e(t)("tenant.adminAccountPlaceholder")
|
|
320
|
+
}, null, 8, ["value", "placeholder"])
|
|
321
|
+
]),
|
|
322
|
+
_: 1
|
|
323
|
+
}, 8, ["label"]),
|
|
324
|
+
l(e(r), {
|
|
325
|
+
label: e(t)("tenant.adminPassword"),
|
|
326
|
+
path: "adminPassword"
|
|
327
|
+
}, {
|
|
328
|
+
default: d(() => [
|
|
329
|
+
l(e(c), {
|
|
330
|
+
value: o.adminPassword,
|
|
331
|
+
"onUpdate:value": a[9] || (a[9] = (i) => o.adminPassword = i),
|
|
332
|
+
type: "password",
|
|
333
|
+
"show-password-on": "click",
|
|
334
|
+
placeholder: e(t)("tenant.adminPasswordPlaceholder")
|
|
335
|
+
}, null, 8, ["value", "placeholder"])
|
|
336
|
+
]),
|
|
337
|
+
_: 1
|
|
338
|
+
}, 8, ["label"])
|
|
339
|
+
], 64)) : L("", !0),
|
|
340
|
+
l(e(r), {
|
|
341
|
+
label: e(t)("tenant.remark")
|
|
342
|
+
}, {
|
|
343
|
+
default: d(() => [
|
|
344
|
+
l(e(c), {
|
|
345
|
+
value: o.remark,
|
|
346
|
+
"onUpdate:value": a[10] || (a[10] = (i) => o.remark = i),
|
|
347
|
+
type: "textarea",
|
|
348
|
+
rows: 2
|
|
349
|
+
}, null, 8, ["value"])
|
|
350
|
+
]),
|
|
351
|
+
_: 1
|
|
352
|
+
}, 8, ["label"])
|
|
353
|
+
]),
|
|
354
|
+
_: 1
|
|
355
|
+
}, 8, ["model"])
|
|
356
|
+
]),
|
|
357
|
+
_: 1
|
|
358
|
+
}, 8, ["show", "title", "confirm-text"])
|
|
359
|
+
], 64);
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
export {
|
|
364
|
+
_e as default
|
|
365
|
+
};
|
|
366
|
+
//# sourceMappingURL=index2.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/tenant/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 租户管理:标准 SmartTable CRUD + 行内启停,多一个\"隔离模式\"分段控件(一期只有共享库可选)\n// + 创建态才出现的初始管理员两个字段(编辑不改已有租户的管理员)。\nimport { h, reactive, ref } from 'vue'\nimport {\n NButton,\n NSpace,\n NInput,\n NDatePicker,\n NPopconfirm,\n NTag,\n NForm,\n NFormItem,\n NSwitch,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { tenantApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport type { TenantCreateInput, TenantInput, SysTenant } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysTenant>>()\n\n// 可空字段落到 '' 而不是 null/undefined:n-input 的 v-model 才能直接绑,不用逐处 as string(同 role.vue 惯例)。\nconst toInput = (r: SysTenant): TenantInput => ({\n code: r.code,\n name: r.name,\n contactName: r.contactName ?? '',\n contactPhone: r.contactPhone ?? '',\n expireTime: r.expireTime,\n isolationMode: r.isolationMode,\n enabled: r.enabled,\n remark: r.remark ?? '',\n})\n\nconst columns: SmartTableColumn<SysTenant>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n // 编码列不开搜索:后端 TenantPageInput 只支持按 Name 过滤,开了也是个不生效的搜索框。\n { key: 'code', title: () => t('tenant.code') },\n { key: 'name', title: () => t('tenant.name'), search: true },\n {\n key: 'isolationMode',\n title: () => t('tenant.isolationMode'),\n width: 100,\n render: r =>\n h(NTag, { size: 'small', type: r.isolationMode === 1 ? 'info' : 'default' }, () =>\n r.isolationMode === 1\n ? t('tenant.isolationModeShared')\n : t('tenant.isolationModeStandalone'),\n ),\n },\n { key: 'contactName', title: () => t('tenant.contactName') },\n { key: 'contactPhone', title: () => t('tenant.contactPhone') },\n { key: 'expireTime', title: () => t('tenant.expireTime'), format: 'date' },\n {\n key: 'enabled',\n title: () => t('common.status'),\n width: 90,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n disabled: !authStore.hasPerm('PUT:/api/v1/sys/tenant/{id}'),\n request: (next: boolean) => tenantApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n }),\n },\n { key: 'createTime', title: () => t('common.createTime'), format: 'datetime' },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 120,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/tenant/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/tenant/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => tenantApi.remove(r.id), t('tenant.deleted')).then(ok => {\n if (ok) tableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('tenant.deleteConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\n\n// ── 新增/编辑弹窗 ──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst editingId = ref<number | null>(null)\nconst rules: FormRules = {\n code: {\n required: true,\n whitespace: true,\n message: () => t('tenant.codeRequired'),\n trigger: ['input', 'blur'],\n },\n name: {\n required: true,\n whitespace: true,\n message: () => t('tenant.nameRequired'),\n trigger: ['input', 'blur'],\n },\n adminAccount: {\n required: true,\n whitespace: true,\n message: () => t('tenant.adminAccountRequired'),\n trigger: ['input', 'blur'],\n },\n adminPassword: {\n required: true,\n whitespace: true,\n message: () => t('tenant.adminPasswordRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blank = (): TenantCreateInput => ({\n code: '',\n name: '',\n contactName: '',\n contactPhone: '',\n isolationMode: 1,\n enabled: true,\n remark: '',\n adminAccount: '',\n adminPassword: '',\n})\nconst form = reactive<TenantCreateInput>(blank())\n\nfunction openAdd() {\n editingId.value = null\n Object.assign(form, blank())\n show.value = true\n}\nfunction openEdit(r: SysTenant) {\n editingId.value = r.id\n Object.assign(form, toInput(r), { adminAccount: '', adminPassword: '' })\n show.value = true\n}\nasync function save() {\n await formRef.value?.validate()\n try {\n if (editingId.value === null) await tenantApi.add({ ...form })\n else await tenantApi.update(editingId.value, { ...form })\n message.success(t('tenant.saved'))\n await tableRef.value?.refresh()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n\n<template>\n <SmartTable\n ref=\"tableRef\"\n :default-page-size=\"100\"\n :columns=\"columns\"\n :fetcher=\"tenantApi.page\"\n flex-height\n virtual-scroll\n storage-key=\"sys-tenant\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #toolbar>\n <n-button v-auth=\"'POST:/api/v1/sys/tenant/add'\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('tenant.addTitle') : t('tenant.editTitle')\"\n :width=\"480\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form ref=\"formRef\" :model=\"form\" :rules=\"rules\" label-placement=\"left\" :label-width=\"90\">\n <n-form-item :label=\"t('tenant.code')\" path=\"code\">\n <n-input\n v-model:value=\"form.code\"\n :disabled=\"editingId !== null\"\n :placeholder=\"t('tenant.codePlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('tenant.name')\" path=\"name\">\n <n-input v-model:value=\"form.name\" :placeholder=\"t('tenant.name')\" />\n </n-form-item>\n\n <!-- 隔离模式:一期只有\"共享库\"可选,\"独立库\"置灰并标\"二期开放\"——见设计稿的路线图展示 -->\n <n-form-item :label=\"t('tenant.isolationMode')\">\n <n-space vertical style=\"width: 100%\">\n <div\n class=\"iso-option\"\n :class=\"{ selected: form.isolationMode === 1 }\"\n @click=\"form.isolationMode = 1\"\n >\n <div class=\"iso-title\">{{ t('tenant.isolationModeShared') }}</div>\n <div class=\"iso-desc\">{{ t('tenant.isolationModeSharedDesc') }}</div>\n </div>\n <div class=\"iso-option disabled\" :title=\"t('tenant.isolationModePhase2')\">\n <div class=\"iso-title\">\n {{ t('tenant.isolationModeStandalone') }}\n <n-tag size=\"tiny\" type=\"warning\" style=\"margin-left: 6px\">\n {{ t('tenant.isolationModePhase2') }}\n </n-tag>\n </div>\n <div class=\"iso-desc\">{{ t('tenant.isolationModeStandaloneDesc') }}</div>\n </div>\n </n-space>\n </n-form-item>\n\n <n-form-item :label=\"t('tenant.contactName')\">\n <n-input v-model:value=\"form.contactName as string\" />\n </n-form-item>\n <n-form-item :label=\"t('tenant.contactPhone')\">\n <n-input v-model:value=\"form.contactPhone as string\" />\n </n-form-item>\n <n-form-item :label=\"t('tenant.expireTime')\">\n <n-date-picker\n v-model:formatted-value=\"form.expireTime\"\n value-format=\"yyyy-MM-dd\"\n type=\"date\"\n style=\"width: 100%\"\n />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"form.enabled\" />\n </n-form-item>\n\n <!-- 初始管理员账号:只在新增时出现,编辑已有租户不改其管理员 -->\n <template v-if=\"editingId === null\">\n <div class=\"form-section\">\n <div class=\"form-section__title\">{{ t('tenant.initialAdmin') }}</div>\n </div>\n <n-form-item :label=\"t('tenant.adminAccount')\" path=\"adminAccount\">\n <n-input\n v-model:value=\"form.adminAccount\"\n :placeholder=\"t('tenant.adminAccountPlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('tenant.adminPassword')\" path=\"adminPassword\">\n <n-input\n v-model:value=\"form.adminPassword\"\n type=\"password\"\n show-password-on=\"click\"\n :placeholder=\"t('tenant.adminPasswordPlaceholder')\"\n />\n </n-form-item>\n </template>\n\n <n-form-item :label=\"t('tenant.remark')\">\n <n-input v-model:value=\"form.remark as string\" type=\"textarea\" :rows=\"2\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n.iso-option {\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md, 10px);\n padding: 10px 12px;\n cursor: pointer;\n}\n.iso-option.selected {\n border-color: var(--color-primary);\n background: var(--color-primary-light);\n}\n.iso-option.disabled {\n cursor: not-allowed;\n opacity: 0.6;\n background: var(--color-fill);\n}\n.iso-title {\n font-size: 13px;\n font-weight: 600;\n color: var(--color-text-primary);\n display: flex;\n align-items: center;\n}\n.iso-desc {\n font-size: 11.5px;\n color: var(--color-text-tertiary);\n margin-top: 3px;\n line-height: 1.5;\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","toInput","r","columns","h","NTag","StatusSwitch","next","tenantApi","v","NSpace","NButton","openEdit","NPopconfirm","ok","_a","show","formRef","editingId","rules","blank","form","reactive","openAdd","save","_b","e","translateError","_createVNode","_unref","SmartTable","_cache","_createBlock","AppIcon","_createTextVNode","FormContainer","$event","NForm","NFormItem","NInput","_createElementVNode","_normalizeClass","_hoisted_1","_toDisplayString","_hoisted_2","_hoisted_4","_hoisted_5","NDatePicker","NSwitch","_createElementBlock","_Fragment","_hoisted_6","_hoisted_7"],"mappings":"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"}
|