@hkyhy/marsun-components-core 0.1.46 → 0.1.47
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/components/Form/index.d.ts +1 -1
- package/dist/components/Form/kneFormInfo.d.ts +2 -0
- package/dist/components/Form/kneFormInfo.js +18 -17
- package/dist/components/Form/kneFormInfo.js.map +1 -1
- package/dist/components/OrgTree/OrgTree.js +52 -43
- package/dist/components/OrgTree/OrgTree.js.map +1 -1
- package/dist/components/OrgTree/style.module.scss.js +5 -5
- package/dist/components/PermissionBindPanel/PermissionBindPanel.d.ts +4 -1
- package/dist/components/PermissionBindPanel/PermissionBindPanel.js +121 -117
- package/dist/components/PermissionBindPanel/PermissionBindPanel.js.map +1 -1
- package/dist/components/Stat/StatCard/index.d.ts +4 -0
- package/dist/components/Stat/StatCard/index.js +45 -29
- package/dist/components/Stat/StatCard/index.js.map +1 -1
- package/dist/components/Stat/StatCardList.d.ts +0 -2
- package/dist/components/Stat/StatCardList.js.map +1 -1
- package/dist/components/TooltipInfo/TooltipInfo.js +14 -8
- package/dist/components/TooltipInfo/TooltipInfo.js.map +1 -1
- package/dist/components/Upload/index.d.ts +6 -23
- package/dist/components/Upload/index.js +254 -141
- package/dist/components/Upload/index.js.map +1 -1
- package/dist/components/Upload/style.module.scss.js +22 -15
- package/dist/components/Upload/style.module.scss.js.map +1 -1
- package/dist/components/index.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +132 -131
- package/dist/marsun-components-core.css +1 -1
- package/dist/styles/global.css +1 -1
- package/package.json +1 -1
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { jsx as m, jsxs as y, Fragment as
|
|
2
|
-
import { Empty as
|
|
3
|
-
import { useMemo as
|
|
4
|
-
function
|
|
5
|
-
const r = /* @__PURE__ */ new Set(), l = [],
|
|
1
|
+
import { jsx as m, jsxs as y, Fragment as j } from "react/jsx-runtime";
|
|
2
|
+
import { Empty as A, Row as F, Col as G, Typography as I, Checkbox as M } from "antd";
|
|
3
|
+
import { useMemo as v, useEffect as L, useState as H } from "react";
|
|
4
|
+
function U(d, f) {
|
|
5
|
+
const r = /* @__PURE__ */ new Set(), l = [], n = [];
|
|
6
6
|
for (const t of d.modules) {
|
|
7
|
-
const s = [],
|
|
8
|
-
for (const
|
|
9
|
-
const
|
|
10
|
-
for (const
|
|
11
|
-
r.add(
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
code:
|
|
15
|
-
label:
|
|
7
|
+
const s = [], c = [], g = [];
|
|
8
|
+
for (const a of t.categories) {
|
|
9
|
+
const k = [];
|
|
10
|
+
for (const i of a.leaves) {
|
|
11
|
+
r.add(i.code);
|
|
12
|
+
const p = f.get(i.code), b = !!i.defaultGranted;
|
|
13
|
+
k.push({
|
|
14
|
+
code: i.code,
|
|
15
|
+
label: i.label,
|
|
16
16
|
defaultGranted: b,
|
|
17
|
-
perm:
|
|
18
|
-
}),
|
|
17
|
+
perm: p
|
|
18
|
+
}), p && (c.push(p), b && (l.push(p.id), g.push(p.id)));
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
k.length && s.push({ key: a.key, label: a.label, leaves: k });
|
|
21
21
|
}
|
|
22
|
-
s.length &&
|
|
22
|
+
s.length && n.push({
|
|
23
23
|
key: t.key,
|
|
24
24
|
label: t.label,
|
|
25
25
|
requiresSystemEntry: !!t.requiresSystemEntry,
|
|
26
26
|
categories: s,
|
|
27
|
-
perms:
|
|
28
|
-
lockedPermIds:
|
|
27
|
+
perms: c,
|
|
28
|
+
lockedPermIds: g
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
|
-
return { modules:
|
|
31
|
+
return { modules: n, usedCodes: r, lockedIds: l };
|
|
32
32
|
}
|
|
33
|
-
function
|
|
34
|
-
const
|
|
33
|
+
function D(d) {
|
|
34
|
+
const f = /* @__PURE__ */ new Map();
|
|
35
35
|
for (const r of d) {
|
|
36
|
-
const l = r.code.includes(":") ? r.code.split(":")[0] : "_other",
|
|
37
|
-
|
|
36
|
+
const l = r.code.includes(":") ? r.code.split(":")[0] : "_other", n = f.get(l) || [];
|
|
37
|
+
n.push(r), f.set(l, n);
|
|
38
38
|
}
|
|
39
|
-
return [...
|
|
40
|
-
const
|
|
39
|
+
return [...f.entries()].map(([r, l]) => {
|
|
40
|
+
const n = [...l].sort((t, s) => t.code.localeCompare(s.code));
|
|
41
41
|
return {
|
|
42
42
|
key: r,
|
|
43
43
|
label: r,
|
|
44
|
-
requiresSystemEntry:
|
|
44
|
+
requiresSystemEntry: n.every((t) => t.layer === "BUSINESS"),
|
|
45
45
|
categories: [
|
|
46
46
|
{
|
|
47
47
|
key: "all",
|
|
48
48
|
label: "功能点",
|
|
49
|
-
leaves:
|
|
49
|
+
leaves: n.map((t) => ({
|
|
50
50
|
code: t.code,
|
|
51
51
|
label: t.name || t.code,
|
|
52
52
|
defaultGranted: !1,
|
|
@@ -54,15 +54,15 @@ function U(d) {
|
|
|
54
54
|
}))
|
|
55
55
|
}
|
|
56
56
|
],
|
|
57
|
-
perms:
|
|
57
|
+
perms: n,
|
|
58
58
|
lockedPermIds: []
|
|
59
59
|
};
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
|
-
function
|
|
63
|
-
const l =
|
|
62
|
+
function W(d, f, r) {
|
|
63
|
+
const l = f.filter((t) => !r.has(t.code));
|
|
64
64
|
if (!l.length) return d;
|
|
65
|
-
const
|
|
65
|
+
const n = [...l].sort((t, s) => t.code.localeCompare(s.code));
|
|
66
66
|
return [
|
|
67
67
|
...d,
|
|
68
68
|
{
|
|
@@ -73,7 +73,7 @@ function D(d, c, r) {
|
|
|
73
73
|
{
|
|
74
74
|
key: "orphan",
|
|
75
75
|
label: "未归入目录的权限点",
|
|
76
|
-
leaves:
|
|
76
|
+
leaves: n.map((t) => ({
|
|
77
77
|
code: t.code,
|
|
78
78
|
label: t.name || t.code,
|
|
79
79
|
defaultGranted: !1,
|
|
@@ -81,82 +81,84 @@ function D(d, c, r) {
|
|
|
81
81
|
}))
|
|
82
82
|
}
|
|
83
83
|
],
|
|
84
|
-
perms:
|
|
84
|
+
perms: n,
|
|
85
85
|
lockedPermIds: []
|
|
86
86
|
}
|
|
87
87
|
];
|
|
88
88
|
}
|
|
89
|
-
function
|
|
89
|
+
function N({
|
|
90
90
|
catalog: d,
|
|
91
|
-
permissions:
|
|
91
|
+
permissions: f,
|
|
92
92
|
value: r,
|
|
93
93
|
onChange: l,
|
|
94
|
-
systemEntryCodes:
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
systemEntryCodes: n = [],
|
|
95
|
+
readOnly: t = !1,
|
|
96
|
+
className: s,
|
|
97
|
+
style: c,
|
|
97
98
|
height: g = 420
|
|
98
99
|
}) {
|
|
99
|
-
const a =
|
|
100
|
+
const a = v(() => f.filter((e) => e.layer !== "RESOURCE"), [f]), k = v(() => {
|
|
100
101
|
const e = /* @__PURE__ */ new Map();
|
|
101
|
-
for (const
|
|
102
|
+
for (const o of a) e.set(o.code, o);
|
|
102
103
|
return e;
|
|
103
|
-
}, [a]), { modules:
|
|
104
|
+
}, [a]), { modules: i, lockedIds: p } = v(() => {
|
|
104
105
|
var e;
|
|
105
106
|
if ((e = d == null ? void 0 : d.modules) != null && e.length) {
|
|
106
|
-
const
|
|
107
|
+
const o = U(d, k);
|
|
107
108
|
return {
|
|
108
|
-
modules:
|
|
109
|
-
lockedIds:
|
|
109
|
+
modules: W(o.modules, a, o.usedCodes),
|
|
110
|
+
lockedIds: o.lockedIds
|
|
110
111
|
};
|
|
111
112
|
}
|
|
112
|
-
return { modules:
|
|
113
|
-
}, [d, k, a]),
|
|
114
|
-
if (!
|
|
115
|
-
const e = a.filter((
|
|
116
|
-
return e.length ? e.some((
|
|
117
|
-
}, [
|
|
118
|
-
|
|
119
|
-
if (!
|
|
120
|
-
|
|
121
|
-
}, [
|
|
122
|
-
const [
|
|
123
|
-
|
|
124
|
-
if (!
|
|
125
|
-
|
|
113
|
+
return { modules: D(a), lockedIds: [] };
|
|
114
|
+
}, [d, k, a]), b = v(() => new Set(p), [p]), w = v(() => {
|
|
115
|
+
if (t || !n.length) return !0;
|
|
116
|
+
const e = a.filter((o) => n.includes(o.code)).map((o) => o.id);
|
|
117
|
+
return e.length ? e.some((o) => r.includes(o)) : !0;
|
|
118
|
+
}, [t, n, a, r]), P = (e) => w ? [.../* @__PURE__ */ new Set([...e, ...p])] : e;
|
|
119
|
+
L(() => {
|
|
120
|
+
if (t || !w || !p.length) return;
|
|
121
|
+
p.filter((o) => !r.includes(o)).length && l(P(r));
|
|
122
|
+
}, [p.join("|"), w, t]);
|
|
123
|
+
const [T, C] = H("");
|
|
124
|
+
L(() => {
|
|
125
|
+
if (!i.length) {
|
|
126
|
+
C("");
|
|
126
127
|
return;
|
|
127
128
|
}
|
|
128
|
-
|
|
129
|
-
}, [
|
|
130
|
-
const
|
|
131
|
-
l(
|
|
132
|
-
},
|
|
133
|
-
|
|
134
|
-
},
|
|
135
|
-
|
|
136
|
-
|
|
129
|
+
i.some((e) => e.key === T) || C(i[0].key);
|
|
130
|
+
}, [i, T]);
|
|
131
|
+
const u = i.find((e) => e.key === T) || i[0], q = (e) => !!(e != null && e.requiresSystemEntry && !w), E = (e) => {
|
|
132
|
+
t || l(P(e));
|
|
133
|
+
}, z = (e, o) => {
|
|
134
|
+
t || w && b.has(e) || E(o ? [...r, e] : r.filter((x) => x !== e));
|
|
135
|
+
}, R = (e, o) => {
|
|
136
|
+
if (t) return;
|
|
137
|
+
const x = e.perms.filter((h) => !b.has(h.id)).map((h) => h.id);
|
|
138
|
+
if (o) E([...r, ...x]);
|
|
137
139
|
else {
|
|
138
140
|
const h = new Set(x);
|
|
139
|
-
|
|
141
|
+
E(r.filter((S) => !h.has(S)));
|
|
140
142
|
}
|
|
141
143
|
};
|
|
142
|
-
if (!
|
|
143
|
-
return /* @__PURE__ */ m(
|
|
144
|
-
const
|
|
144
|
+
if (!i.length)
|
|
145
|
+
return /* @__PURE__ */ m(A, { description: "暂无权限点", className: s, style: c });
|
|
146
|
+
const B = q(u);
|
|
145
147
|
return /* @__PURE__ */ y(
|
|
146
|
-
|
|
148
|
+
F,
|
|
147
149
|
{
|
|
148
150
|
gutter: 0,
|
|
149
|
-
className:
|
|
151
|
+
className: s,
|
|
150
152
|
style: {
|
|
151
153
|
border: "1px solid var(--ant-color-border, #d9d9d9)",
|
|
152
154
|
borderRadius: 8,
|
|
153
155
|
minHeight: g,
|
|
154
156
|
overflow: "hidden",
|
|
155
|
-
...
|
|
157
|
+
...c
|
|
156
158
|
},
|
|
157
159
|
children: [
|
|
158
160
|
/* @__PURE__ */ m(
|
|
159
|
-
|
|
161
|
+
G,
|
|
160
162
|
{
|
|
161
163
|
span: 7,
|
|
162
164
|
style: {
|
|
@@ -165,16 +167,16 @@ function _({
|
|
|
165
167
|
maxHeight: g,
|
|
166
168
|
overflow: "auto"
|
|
167
169
|
},
|
|
168
|
-
children:
|
|
169
|
-
const
|
|
170
|
+
children: i.map((e) => {
|
|
171
|
+
const o = e.perms.filter((S) => r.includes(S.id)).length, x = e.perms.length, h = e.key === ((u == null ? void 0 : u.key) || "");
|
|
170
172
|
return /* @__PURE__ */ y(
|
|
171
173
|
"div",
|
|
172
174
|
{
|
|
173
175
|
role: "button",
|
|
174
176
|
tabIndex: 0,
|
|
175
|
-
onClick: () =>
|
|
177
|
+
onClick: () => C(e.key),
|
|
176
178
|
onKeyDown: (S) => {
|
|
177
|
-
(S.key === "Enter" || S.key === " ") &&
|
|
179
|
+
(S.key === "Enter" || S.key === " ") && C(e.key);
|
|
178
180
|
},
|
|
179
181
|
style: {
|
|
180
182
|
padding: "10px 12px",
|
|
@@ -182,12 +184,12 @@ function _({
|
|
|
182
184
|
background: h ? "var(--ant-color-primary-bg, #e6f4ff)" : "transparent",
|
|
183
185
|
fontWeight: h ? 600 : 400,
|
|
184
186
|
borderLeft: h ? "3px solid var(--ant-color-primary, #1677ff)" : "3px solid transparent",
|
|
185
|
-
opacity:
|
|
187
|
+
opacity: q(e) && o === 0 ? 0.75 : 1
|
|
186
188
|
},
|
|
187
189
|
children: [
|
|
188
190
|
/* @__PURE__ */ m("div", { children: e.label }),
|
|
189
191
|
/* @__PURE__ */ y(I.Text, { type: "secondary", style: { fontSize: 12 }, children: [
|
|
190
|
-
|
|
192
|
+
o,
|
|
191
193
|
"/",
|
|
192
194
|
x
|
|
193
195
|
] })
|
|
@@ -198,7 +200,7 @@ function _({
|
|
|
198
200
|
})
|
|
199
201
|
}
|
|
200
202
|
),
|
|
201
|
-
/* @__PURE__ */ m(
|
|
203
|
+
/* @__PURE__ */ m(G, { span: 17, style: { padding: 16, maxHeight: g, overflow: "auto" }, children: u ? /* @__PURE__ */ y(j, { children: [
|
|
202
204
|
/* @__PURE__ */ y(
|
|
203
205
|
"div",
|
|
204
206
|
{
|
|
@@ -209,43 +211,45 @@ function _({
|
|
|
209
211
|
alignItems: "center"
|
|
210
212
|
},
|
|
211
213
|
children: [
|
|
212
|
-
/* @__PURE__ */ m(I.Text, { strong: !0, children:
|
|
213
|
-
/* @__PURE__ */ m(
|
|
214
|
-
|
|
214
|
+
/* @__PURE__ */ m(I.Text, { strong: !0, children: u.label }),
|
|
215
|
+
t ? null : /* @__PURE__ */ m(
|
|
216
|
+
M,
|
|
215
217
|
{
|
|
216
|
-
disabled:
|
|
217
|
-
checked:
|
|
218
|
-
indeterminate:
|
|
219
|
-
onChange: (e) =>
|
|
218
|
+
disabled: B || u.perms.every((e) => b.has(e.id)),
|
|
219
|
+
checked: u.perms.length > 0 && u.perms.every((e) => r.includes(e.id)),
|
|
220
|
+
indeterminate: u.perms.some((e) => r.includes(e.id)) && !u.perms.every((e) => r.includes(e.id)),
|
|
221
|
+
onChange: (e) => R(u, e.target.checked),
|
|
220
222
|
children: "全选本模块"
|
|
221
223
|
}
|
|
222
224
|
)
|
|
223
225
|
]
|
|
224
226
|
}
|
|
225
227
|
),
|
|
226
|
-
|
|
227
|
-
|
|
228
|
+
u.categories.map((e) => /* @__PURE__ */ m(
|
|
229
|
+
K,
|
|
228
230
|
{
|
|
229
231
|
category: e,
|
|
230
232
|
value: r,
|
|
231
|
-
moduleDisabled:
|
|
232
|
-
lockedIdSet:
|
|
233
|
-
|
|
233
|
+
moduleDisabled: B,
|
|
234
|
+
lockedIdSet: b,
|
|
235
|
+
readOnly: t,
|
|
236
|
+
onToggle: z
|
|
234
237
|
},
|
|
235
238
|
e.key
|
|
236
239
|
)),
|
|
237
|
-
|
|
240
|
+
!t && B ? /* @__PURE__ */ m(I.Text, { type: "warning", style: { display: "block", marginTop: 12 }, children: "请先勾选 SYSTEM 入口权,再勾选业务权限。基线权限仍保持勾选。" }) : null
|
|
238
241
|
] }) : null })
|
|
239
242
|
]
|
|
240
243
|
}
|
|
241
244
|
);
|
|
242
245
|
}
|
|
243
|
-
function
|
|
246
|
+
function K({
|
|
244
247
|
category: d,
|
|
245
|
-
value:
|
|
248
|
+
value: f,
|
|
246
249
|
moduleDisabled: r,
|
|
247
250
|
lockedIdSet: l,
|
|
248
|
-
|
|
251
|
+
readOnly: n,
|
|
252
|
+
onToggle: t
|
|
249
253
|
}) {
|
|
250
254
|
return /* @__PURE__ */ y("div", { style: { marginBottom: 16 }, children: [
|
|
251
255
|
/* @__PURE__ */ m(
|
|
@@ -264,32 +268,32 @@ function O({
|
|
|
264
268
|
gridTemplateColumns: "repeat(2, minmax(0, 1fr))",
|
|
265
269
|
gap: "8px 16px"
|
|
266
270
|
},
|
|
267
|
-
children: d.leaves.map((
|
|
268
|
-
const
|
|
269
|
-
if (!
|
|
270
|
-
return /* @__PURE__ */ y(
|
|
271
|
-
|
|
271
|
+
children: d.leaves.map((s) => {
|
|
272
|
+
const c = s.perm;
|
|
273
|
+
if (!c)
|
|
274
|
+
return /* @__PURE__ */ y(M, { disabled: !0, children: [
|
|
275
|
+
s.label,
|
|
272
276
|
/* @__PURE__ */ y(I.Text, { type: "secondary", style: { marginLeft: 6, fontSize: 12 }, children: [
|
|
273
|
-
|
|
277
|
+
s.code,
|
|
274
278
|
"(未注册)"
|
|
275
279
|
] })
|
|
276
|
-
] },
|
|
277
|
-
const g =
|
|
280
|
+
] }, s.code);
|
|
281
|
+
const g = s.defaultGranted || l.has(c.id);
|
|
278
282
|
return /* @__PURE__ */ y(
|
|
279
|
-
|
|
283
|
+
M,
|
|
280
284
|
{
|
|
281
|
-
disabled: g || r,
|
|
282
|
-
checked:
|
|
283
|
-
onChange: (a) =>
|
|
285
|
+
disabled: n || g || r,
|
|
286
|
+
checked: f.includes(c.id),
|
|
287
|
+
onChange: (a) => t(c.id, a.target.checked),
|
|
284
288
|
children: [
|
|
285
|
-
|
|
289
|
+
s.label || c.name,
|
|
286
290
|
/* @__PURE__ */ y(I.Text, { type: "secondary", style: { marginLeft: 6, fontSize: 12 }, children: [
|
|
287
|
-
|
|
288
|
-
|
|
291
|
+
c.code,
|
|
292
|
+
s.defaultGranted ? " · 基线" : ""
|
|
289
293
|
] })
|
|
290
294
|
]
|
|
291
295
|
},
|
|
292
|
-
|
|
296
|
+
c.id
|
|
293
297
|
);
|
|
294
298
|
})
|
|
295
299
|
}
|
|
@@ -297,6 +301,6 @@ function O({
|
|
|
297
301
|
] });
|
|
298
302
|
}
|
|
299
303
|
export {
|
|
300
|
-
|
|
304
|
+
N as default
|
|
301
305
|
};
|
|
302
306
|
//# sourceMappingURL=PermissionBindPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionBindPanel.js","sources":["../../../src/components/PermissionBindPanel/PermissionBindPanel.tsx"],"sourcesContent":["import { Checkbox, Col, Empty, Row, Typography } from 'antd';\nimport { useEffect, useMemo, useState, type CSSProperties } from 'react';\nimport type { PermissionBindCatalog, PermissionBindItem } from './types';\n\nexport type PermissionBindPanelProps = {\n /** 三栏目录;缺省时按 code 前缀扁平分组 */\n catalog?: PermissionBindCatalog | null;\n permissions: PermissionBindItem[];\n /** 已选 permissionId */\n value: string[];\n onChange: (nextIds: string[]) => void;\n /** SYSTEM 入口码;未勾时禁用 requiresSystemEntry 模块 */\n systemEntryCodes?: string[];\n className?: string;\n style?: CSSProperties;\n height?: number;\n};\n\ntype ResolvedLeaf = {\n code: string;\n label: string;\n defaultGranted: boolean;\n perm?: PermissionBindItem;\n};\n\ntype ResolvedCategory = {\n key: string;\n label: string;\n leaves: ResolvedLeaf[];\n};\n\ntype ResolvedModule = {\n key: string;\n label: string;\n requiresSystemEntry: boolean;\n categories: ResolvedCategory[];\n perms: PermissionBindItem[];\n lockedPermIds: string[];\n};\n\nfunction buildFromCatalog(\n catalog: PermissionBindCatalog,\n byCode: Map<string, PermissionBindItem>,\n): { modules: ResolvedModule[]; usedCodes: Set<string>; lockedIds: string[] } {\n const usedCodes = new Set<string>();\n const lockedIds: string[] = [];\n const modules: ResolvedModule[] = [];\n\n for (const mod of catalog.modules) {\n const categories: ResolvedCategory[] = [];\n const perms: PermissionBindItem[] = [];\n const modLocked: string[] = [];\n for (const cat of mod.categories) {\n const leaves: ResolvedLeaf[] = [];\n for (const leaf of cat.leaves) {\n usedCodes.add(leaf.code);\n const perm = byCode.get(leaf.code);\n const defaultGranted = Boolean(leaf.defaultGranted);\n leaves.push({\n code: leaf.code,\n label: leaf.label,\n defaultGranted,\n perm,\n });\n if (perm) {\n perms.push(perm);\n if (defaultGranted) {\n lockedIds.push(perm.id);\n modLocked.push(perm.id);\n }\n }\n }\n if (leaves.length) {\n categories.push({ key: cat.key, label: cat.label, leaves });\n }\n }\n if (categories.length) {\n modules.push({\n key: mod.key,\n label: mod.label,\n requiresSystemEntry: Boolean(mod.requiresSystemEntry),\n categories,\n perms,\n lockedPermIds: modLocked,\n });\n }\n }\n\n return { modules, usedCodes, lockedIds };\n}\n\nfunction buildPrefixFallback(permissions: PermissionBindItem[]): ResolvedModule[] {\n const byPrefix = new Map<string, PermissionBindItem[]>();\n for (const p of permissions) {\n const prefix = p.code.includes(':') ? p.code.split(':')[0]! : '_other';\n const arr = byPrefix.get(prefix) || [];\n arr.push(p);\n byPrefix.set(prefix, arr);\n }\n return [...byPrefix.entries()].map(([key, perms]) => {\n const sorted = [...perms].sort((a, b) => a.code.localeCompare(b.code));\n return {\n key,\n label: key,\n requiresSystemEntry: sorted.every((p) => p.layer === 'BUSINESS'),\n categories: [\n {\n key: 'all',\n label: '功能点',\n leaves: sorted.map((p) => ({\n code: p.code,\n label: p.name || p.code,\n defaultGranted: false,\n perm: p,\n })),\n },\n ],\n perms: sorted,\n lockedPermIds: [],\n };\n });\n}\n\nfunction appendUncategorized(\n modules: ResolvedModule[],\n permissions: PermissionBindItem[],\n usedCodes: Set<string>,\n): ResolvedModule[] {\n const orphans = permissions.filter((p) => !usedCodes.has(p.code));\n if (!orphans.length) return modules;\n const sorted = [...orphans].sort((a, b) => a.code.localeCompare(b.code));\n return [\n ...modules,\n {\n key: 'uncategorized',\n label: '未分类',\n requiresSystemEntry: true,\n categories: [\n {\n key: 'orphan',\n label: '未归入目录的权限点',\n leaves: sorted.map((p) => ({\n code: p.code,\n label: p.name || p.code,\n defaultGranted: false,\n perm: p,\n })),\n },\n ],\n perms: sorted,\n lockedPermIds: [],\n },\n ];\n}\n\n/**\n * 角色绑权三栏信息架构:左页面模块 · 主区按业务功能点分类分组勾选。\n * defaultGranted 叶子勾选且不可取消。\n */\nexport default function PermissionBindPanel({\n catalog,\n permissions,\n value,\n onChange,\n systemEntryCodes = [],\n className,\n style,\n height = 420,\n}: PermissionBindPanelProps) {\n const bindable = useMemo(() => permissions.filter((p) => p.layer !== 'RESOURCE'), [permissions]);\n\n const byCode = useMemo(() => {\n const m = new Map<string, PermissionBindItem>();\n for (const p of bindable) m.set(p.code, p);\n return m;\n }, [bindable]);\n\n const { modules, lockedIds } = useMemo(() => {\n if (catalog?.modules?.length) {\n const built = buildFromCatalog(catalog, byCode);\n return {\n modules: appendUncategorized(built.modules, bindable, built.usedCodes),\n lockedIds: built.lockedIds,\n };\n }\n return { modules: buildPrefixFallback(bindable), lockedIds: [] as string[] };\n }, [catalog, byCode, bindable]);\n\n const lockedIdSet = useMemo(() => new Set(lockedIds), [lockedIds]);\n\n const systemEntryOpen = useMemo(() => {\n if (!systemEntryCodes.length) return true;\n const entryIds = bindable.filter((p) => systemEntryCodes.includes(p.code)).map((p) => p.id);\n if (!entryIds.length) return true;\n return entryIds.some((id) => value.includes(id));\n }, [systemEntryCodes, bindable, value]);\n\n /** SYSTEM 入口打开时才强制基线;关掉入口时允许 strip 业务码 */\n const mergeLocked = (ids: string[]) =>\n systemEntryOpen ? [...new Set([...ids, ...lockedIds])] : ids;\n\n useEffect(() => {\n if (!systemEntryOpen || !lockedIds.length) return;\n const missing = lockedIds.filter((id) => !value.includes(id));\n if (missing.length) onChange(mergeLocked(value));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lockedIds.join('|'), systemEntryOpen]);\n\n const [activeModule, setActiveModule] = useState('');\n\n useEffect(() => {\n if (!modules.length) {\n setActiveModule('');\n return;\n }\n if (!modules.some((m) => m.key === activeModule)) {\n setActiveModule(modules[0]!.key);\n }\n }, [modules, activeModule]);\n\n const active = modules.find((m) => m.key === activeModule) || modules[0];\n\n const moduleLocked = (mod: ResolvedModule | undefined) =>\n Boolean(mod?.requiresSystemEntry && !systemEntryOpen);\n\n const setIds = (next: string[]) => {\n onChange(mergeLocked(next));\n };\n\n const toggleId = (id: string, on: boolean) => {\n if (systemEntryOpen && lockedIdSet.has(id)) return;\n if (on) setIds([...value, id]);\n else setIds(value.filter((x) => x !== id));\n };\n\n const toggleAllInModule = (mod: ResolvedModule, on: boolean) => {\n const optionalIds = mod.perms.filter((p) => !lockedIdSet.has(p.id)).map((p) => p.id);\n if (on) setIds([...value, ...optionalIds]);\n else {\n const drop = new Set(optionalIds);\n setIds(value.filter((id) => !drop.has(id)));\n }\n };\n\n if (!modules.length) {\n return <Empty description=\"暂无权限点\" className={className} style={style} />;\n }\n\n const locked = moduleLocked(active);\n\n return (\n <Row\n gutter={0}\n className={className}\n style={{\n border: '1px solid var(--ant-color-border, #d9d9d9)',\n borderRadius: 8,\n minHeight: height,\n overflow: 'hidden',\n ...style,\n }}\n >\n <Col\n span={7}\n style={{\n borderRight: '1px solid var(--ant-color-border, #d9d9d9)',\n background: 'var(--ant-color-fill-quaternary, #fafafa)',\n maxHeight: height,\n overflow: 'auto',\n }}\n >\n {modules.map((m) => {\n const selected = m.perms.filter((p) => value.includes(p.id)).length;\n const total = m.perms.length;\n const isActive = m.key === (active?.key || '');\n return (\n <div\n key={m.key}\n role=\"button\"\n tabIndex={0}\n onClick={() => setActiveModule(m.key)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') setActiveModule(m.key);\n }}\n style={{\n padding: '10px 12px',\n cursor: 'pointer',\n background: isActive ? 'var(--ant-color-primary-bg, #e6f4ff)' : 'transparent',\n fontWeight: isActive ? 600 : 400,\n borderLeft: isActive\n ? '3px solid var(--ant-color-primary, #1677ff)'\n : '3px solid transparent',\n opacity: moduleLocked(m) && selected === 0 ? 0.75 : 1,\n }}\n >\n <div>{m.label}</div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {selected}/{total}\n </Typography.Text>\n </div>\n );\n })}\n </Col>\n <Col span={17} style={{ padding: 16, maxHeight: height, overflow: 'auto' }}>\n {active ? (\n <>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: 12,\n alignItems: 'center',\n }}\n >\n <Typography.Text strong>{active.label}</Typography.Text>\n <Checkbox\n disabled={locked || active.perms.every((p) => lockedIdSet.has(p.id))}\n checked={active.perms.length > 0 && active.perms.every((p) => value.includes(p.id))}\n indeterminate={\n active.perms.some((p) => value.includes(p.id)) &&\n !active.perms.every((p) => value.includes(p.id))\n }\n onChange={(e) => toggleAllInModule(active, e.target.checked)}\n >\n 全选本模块\n </Checkbox>\n </div>\n\n {active.categories.map((cat) => (\n <CategoryBlock\n key={cat.key}\n category={cat}\n value={value}\n moduleDisabled={locked}\n lockedIdSet={lockedIdSet}\n onToggle={toggleId}\n />\n ))}\n\n {locked ? (\n <Typography.Text type=\"warning\" style={{ display: 'block', marginTop: 12 }}>\n 请先勾选 SYSTEM 入口权,再勾选业务权限。基线权限仍保持勾选。\n </Typography.Text>\n ) : null}\n </>\n ) : null}\n </Col>\n </Row>\n );\n}\n\nfunction CategoryBlock({\n category,\n value,\n moduleDisabled,\n lockedIdSet,\n onToggle,\n}: {\n category: ResolvedCategory;\n value: string[];\n moduleDisabled: boolean;\n lockedIdSet: Set<string>;\n onToggle: (id: string, on: boolean) => void;\n}) {\n return (\n <div style={{ marginBottom: 16 }}>\n <Typography.Text\n type=\"secondary\"\n style={{ display: 'block', marginBottom: 8, fontWeight: 500 }}\n >\n {category.label}\n </Typography.Text>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',\n gap: '8px 16px',\n }}\n >\n {category.leaves.map((leaf) => {\n const perm = leaf.perm;\n if (!perm) {\n return (\n <Checkbox key={leaf.code} disabled>\n {leaf.label}\n <Typography.Text type=\"secondary\" style={{ marginLeft: 6, fontSize: 12 }}>\n {leaf.code}(未注册)\n </Typography.Text>\n </Checkbox>\n );\n }\n const isBaseline = leaf.defaultGranted || lockedIdSet.has(perm.id);\n return (\n <Checkbox\n key={perm.id}\n disabled={isBaseline || moduleDisabled}\n checked={value.includes(perm.id)}\n onChange={(e) => onToggle(perm.id, e.target.checked)}\n >\n {leaf.label || perm.name}\n <Typography.Text type=\"secondary\" style={{ marginLeft: 6, fontSize: 12 }}>\n {perm.code}\n {leaf.defaultGranted ? ' · 基线' : ''}\n </Typography.Text>\n </Checkbox>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":["buildFromCatalog","catalog","byCode","usedCodes","lockedIds","modules","mod","categories","perms","modLocked","cat","leaves","leaf","perm","defaultGranted","buildPrefixFallback","permissions","byPrefix","p","prefix","arr","key","sorted","a","b","appendUncategorized","orphans","PermissionBindPanel","value","onChange","systemEntryCodes","className","style","height","bindable","useMemo","m","_a","built","lockedIdSet","systemEntryOpen","entryIds","id","mergeLocked","ids","useEffect","activeModule","setActiveModule","useState","active","moduleLocked","setIds","next","toggleId","on","toggleAllInModule","optionalIds","drop","jsx","Empty","locked","jsxs","Row","Col","selected","total","isActive","e","Typography","Fragment","Checkbox","CategoryBlock","category","moduleDisabled","onToggle","isBaseline"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PermissionBindPanel.js","sources":["../../../src/components/PermissionBindPanel/PermissionBindPanel.tsx"],"sourcesContent":["import { Checkbox, Col, Empty, Row, Typography } from 'antd';\nimport { useEffect, useMemo, useState, type CSSProperties } from 'react';\nimport type { PermissionBindCatalog, PermissionBindItem } from './types';\n\nexport type PermissionBindPanelProps = {\n /** 三栏目录;缺省时按 code 前缀扁平分组 */\n catalog?: PermissionBindCatalog | null;\n permissions: PermissionBindItem[];\n /** 已选 permissionId */\n value: string[];\n onChange: (nextIds: string[]) => void;\n /** SYSTEM 入口码;未勾时禁用 requiresSystemEntry 模块 */\n systemEntryCodes?: string[];\n /** 只读预览(如用户有效权限):勾选态展示、禁止改、左右栏仍受 height 约束 */\n readOnly?: boolean;\n className?: string;\n style?: CSSProperties;\n /** 左右栏最大高度(默认 420) */\n height?: number;\n};\n\ntype ResolvedLeaf = {\n code: string;\n label: string;\n defaultGranted: boolean;\n perm?: PermissionBindItem;\n};\n\ntype ResolvedCategory = {\n key: string;\n label: string;\n leaves: ResolvedLeaf[];\n};\n\ntype ResolvedModule = {\n key: string;\n label: string;\n requiresSystemEntry: boolean;\n categories: ResolvedCategory[];\n perms: PermissionBindItem[];\n lockedPermIds: string[];\n};\n\nfunction buildFromCatalog(\n catalog: PermissionBindCatalog,\n byCode: Map<string, PermissionBindItem>,\n): { modules: ResolvedModule[]; usedCodes: Set<string>; lockedIds: string[] } {\n const usedCodes = new Set<string>();\n const lockedIds: string[] = [];\n const modules: ResolvedModule[] = [];\n\n for (const mod of catalog.modules) {\n const categories: ResolvedCategory[] = [];\n const perms: PermissionBindItem[] = [];\n const modLocked: string[] = [];\n for (const cat of mod.categories) {\n const leaves: ResolvedLeaf[] = [];\n for (const leaf of cat.leaves) {\n usedCodes.add(leaf.code);\n const perm = byCode.get(leaf.code);\n const defaultGranted = Boolean(leaf.defaultGranted);\n leaves.push({\n code: leaf.code,\n label: leaf.label,\n defaultGranted,\n perm,\n });\n if (perm) {\n perms.push(perm);\n if (defaultGranted) {\n lockedIds.push(perm.id);\n modLocked.push(perm.id);\n }\n }\n }\n if (leaves.length) {\n categories.push({ key: cat.key, label: cat.label, leaves });\n }\n }\n if (categories.length) {\n modules.push({\n key: mod.key,\n label: mod.label,\n requiresSystemEntry: Boolean(mod.requiresSystemEntry),\n categories,\n perms,\n lockedPermIds: modLocked,\n });\n }\n }\n\n return { modules, usedCodes, lockedIds };\n}\n\nfunction buildPrefixFallback(permissions: PermissionBindItem[]): ResolvedModule[] {\n const byPrefix = new Map<string, PermissionBindItem[]>();\n for (const p of permissions) {\n const prefix = p.code.includes(':') ? p.code.split(':')[0]! : '_other';\n const arr = byPrefix.get(prefix) || [];\n arr.push(p);\n byPrefix.set(prefix, arr);\n }\n return [...byPrefix.entries()].map(([key, perms]) => {\n const sorted = [...perms].sort((a, b) => a.code.localeCompare(b.code));\n return {\n key,\n label: key,\n requiresSystemEntry: sorted.every((p) => p.layer === 'BUSINESS'),\n categories: [\n {\n key: 'all',\n label: '功能点',\n leaves: sorted.map((p) => ({\n code: p.code,\n label: p.name || p.code,\n defaultGranted: false,\n perm: p,\n })),\n },\n ],\n perms: sorted,\n lockedPermIds: [],\n };\n });\n}\n\nfunction appendUncategorized(\n modules: ResolvedModule[],\n permissions: PermissionBindItem[],\n usedCodes: Set<string>,\n): ResolvedModule[] {\n const orphans = permissions.filter((p) => !usedCodes.has(p.code));\n if (!orphans.length) return modules;\n const sorted = [...orphans].sort((a, b) => a.code.localeCompare(b.code));\n return [\n ...modules,\n {\n key: 'uncategorized',\n label: '未分类',\n requiresSystemEntry: true,\n categories: [\n {\n key: 'orphan',\n label: '未归入目录的权限点',\n leaves: sorted.map((p) => ({\n code: p.code,\n label: p.name || p.code,\n defaultGranted: false,\n perm: p,\n })),\n },\n ],\n perms: sorted,\n lockedPermIds: [],\n },\n ];\n}\n\n/**\n * 角色绑权三栏信息架构:左页面模块 · 主区按业务功能点分类分组勾选。\n * defaultGranted 叶子勾选且不可取消。\n */\nexport default function PermissionBindPanel({\n catalog,\n permissions,\n value,\n onChange,\n systemEntryCodes = [],\n readOnly = false,\n className,\n style,\n height = 420,\n}: PermissionBindPanelProps) {\n const bindable = useMemo(() => permissions.filter((p) => p.layer !== 'RESOURCE'), [permissions]);\n\n const byCode = useMemo(() => {\n const m = new Map<string, PermissionBindItem>();\n for (const p of bindable) m.set(p.code, p);\n return m;\n }, [bindable]);\n\n const { modules, lockedIds } = useMemo(() => {\n if (catalog?.modules?.length) {\n const built = buildFromCatalog(catalog, byCode);\n return {\n modules: appendUncategorized(built.modules, bindable, built.usedCodes),\n lockedIds: built.lockedIds,\n };\n }\n return { modules: buildPrefixFallback(bindable), lockedIds: [] as string[] };\n }, [catalog, byCode, bindable]);\n\n const lockedIdSet = useMemo(() => new Set(lockedIds), [lockedIds]);\n\n const systemEntryOpen = useMemo(() => {\n if (readOnly) return true;\n if (!systemEntryCodes.length) return true;\n const entryIds = bindable.filter((p) => systemEntryCodes.includes(p.code)).map((p) => p.id);\n if (!entryIds.length) return true;\n return entryIds.some((id) => value.includes(id));\n }, [readOnly, systemEntryCodes, bindable, value]);\n\n /** SYSTEM 入口打开时才强制基线;关掉入口时允许 strip 业务码 */\n const mergeLocked = (ids: string[]) =>\n systemEntryOpen ? [...new Set([...ids, ...lockedIds])] : ids;\n\n useEffect(() => {\n if (readOnly) return;\n if (!systemEntryOpen || !lockedIds.length) return;\n const missing = lockedIds.filter((id) => !value.includes(id));\n if (missing.length) onChange(mergeLocked(value));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lockedIds.join('|'), systemEntryOpen, readOnly]);\n\n const [activeModule, setActiveModule] = useState('');\n\n useEffect(() => {\n if (!modules.length) {\n setActiveModule('');\n return;\n }\n if (!modules.some((m) => m.key === activeModule)) {\n setActiveModule(modules[0]!.key);\n }\n }, [modules, activeModule]);\n\n const active = modules.find((m) => m.key === activeModule) || modules[0];\n\n const moduleLocked = (mod: ResolvedModule | undefined) =>\n Boolean(mod?.requiresSystemEntry && !systemEntryOpen);\n\n const setIds = (next: string[]) => {\n if (readOnly) return;\n onChange(mergeLocked(next));\n };\n\n const toggleId = (id: string, on: boolean) => {\n if (readOnly) return;\n if (systemEntryOpen && lockedIdSet.has(id)) return;\n if (on) setIds([...value, id]);\n else setIds(value.filter((x) => x !== id));\n };\n\n const toggleAllInModule = (mod: ResolvedModule, on: boolean) => {\n if (readOnly) return;\n const optionalIds = mod.perms.filter((p) => !lockedIdSet.has(p.id)).map((p) => p.id);\n if (on) setIds([...value, ...optionalIds]);\n else {\n const drop = new Set(optionalIds);\n setIds(value.filter((id) => !drop.has(id)));\n }\n };\n\n if (!modules.length) {\n return <Empty description=\"暂无权限点\" className={className} style={style} />;\n }\n\n const locked = moduleLocked(active);\n\n return (\n <Row\n gutter={0}\n className={className}\n style={{\n border: '1px solid var(--ant-color-border, #d9d9d9)',\n borderRadius: 8,\n minHeight: height,\n overflow: 'hidden',\n ...style,\n }}\n >\n <Col\n span={7}\n style={{\n borderRight: '1px solid var(--ant-color-border, #d9d9d9)',\n background: 'var(--ant-color-fill-quaternary, #fafafa)',\n maxHeight: height,\n overflow: 'auto',\n }}\n >\n {modules.map((m) => {\n const selected = m.perms.filter((p) => value.includes(p.id)).length;\n const total = m.perms.length;\n const isActive = m.key === (active?.key || '');\n return (\n <div\n key={m.key}\n role=\"button\"\n tabIndex={0}\n onClick={() => setActiveModule(m.key)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') setActiveModule(m.key);\n }}\n style={{\n padding: '10px 12px',\n cursor: 'pointer',\n background: isActive ? 'var(--ant-color-primary-bg, #e6f4ff)' : 'transparent',\n fontWeight: isActive ? 600 : 400,\n borderLeft: isActive\n ? '3px solid var(--ant-color-primary, #1677ff)'\n : '3px solid transparent',\n opacity: moduleLocked(m) && selected === 0 ? 0.75 : 1,\n }}\n >\n <div>{m.label}</div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {selected}/{total}\n </Typography.Text>\n </div>\n );\n })}\n </Col>\n <Col span={17} style={{ padding: 16, maxHeight: height, overflow: 'auto' }}>\n {active ? (\n <>\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: 12,\n alignItems: 'center',\n }}\n >\n <Typography.Text strong>{active.label}</Typography.Text>\n {readOnly ? null : (\n <Checkbox\n disabled={locked || active.perms.every((p) => lockedIdSet.has(p.id))}\n checked={\n active.perms.length > 0 && active.perms.every((p) => value.includes(p.id))\n }\n indeterminate={\n active.perms.some((p) => value.includes(p.id)) &&\n !active.perms.every((p) => value.includes(p.id))\n }\n onChange={(e) => toggleAllInModule(active, e.target.checked)}\n >\n 全选本模块\n </Checkbox>\n )}\n </div>\n\n {active.categories.map((cat) => (\n <CategoryBlock\n key={cat.key}\n category={cat}\n value={value}\n moduleDisabled={locked}\n lockedIdSet={lockedIdSet}\n readOnly={readOnly}\n onToggle={toggleId}\n />\n ))}\n\n {!readOnly && locked ? (\n <Typography.Text type=\"warning\" style={{ display: 'block', marginTop: 12 }}>\n 请先勾选 SYSTEM 入口权,再勾选业务权限。基线权限仍保持勾选。\n </Typography.Text>\n ) : null}\n </>\n ) : null}\n </Col>\n </Row>\n );\n}\n\nfunction CategoryBlock({\n category,\n value,\n moduleDisabled,\n lockedIdSet,\n readOnly,\n onToggle,\n}: {\n category: ResolvedCategory;\n value: string[];\n moduleDisabled: boolean;\n lockedIdSet: Set<string>;\n readOnly: boolean;\n onToggle: (id: string, on: boolean) => void;\n}) {\n return (\n <div style={{ marginBottom: 16 }}>\n <Typography.Text\n type=\"secondary\"\n style={{ display: 'block', marginBottom: 8, fontWeight: 500 }}\n >\n {category.label}\n </Typography.Text>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, minmax(0, 1fr))',\n gap: '8px 16px',\n }}\n >\n {category.leaves.map((leaf) => {\n const perm = leaf.perm;\n if (!perm) {\n return (\n <Checkbox key={leaf.code} disabled>\n {leaf.label}\n <Typography.Text type=\"secondary\" style={{ marginLeft: 6, fontSize: 12 }}>\n {leaf.code}(未注册)\n </Typography.Text>\n </Checkbox>\n );\n }\n const isBaseline = leaf.defaultGranted || lockedIdSet.has(perm.id);\n return (\n <Checkbox\n key={perm.id}\n disabled={readOnly || isBaseline || moduleDisabled}\n checked={value.includes(perm.id)}\n onChange={(e) => onToggle(perm.id, e.target.checked)}\n >\n {leaf.label || perm.name}\n <Typography.Text type=\"secondary\" style={{ marginLeft: 6, fontSize: 12 }}>\n {perm.code}\n {leaf.defaultGranted ? ' · 基线' : ''}\n </Typography.Text>\n </Checkbox>\n );\n })}\n </div>\n </div>\n );\n}\n"],"names":["buildFromCatalog","catalog","byCode","usedCodes","lockedIds","modules","mod","categories","perms","modLocked","cat","leaves","leaf","perm","defaultGranted","buildPrefixFallback","permissions","byPrefix","p","prefix","arr","key","sorted","a","b","appendUncategorized","orphans","PermissionBindPanel","value","onChange","systemEntryCodes","readOnly","className","style","height","bindable","useMemo","m","_a","built","lockedIdSet","systemEntryOpen","entryIds","id","mergeLocked","ids","useEffect","activeModule","setActiveModule","useState","active","moduleLocked","setIds","next","toggleId","on","toggleAllInModule","optionalIds","drop","jsx","Empty","locked","jsxs","Row","Col","selected","total","isActive","e","Typography","Fragment","Checkbox","CategoryBlock","category","moduleDisabled","onToggle","isBaseline"],"mappings":"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"}
|
|
@@ -1,34 +1,50 @@
|
|
|
1
1
|
import { jsx as t } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
const
|
|
6
|
-
title:
|
|
7
|
-
value:
|
|
8
|
-
prefix:
|
|
9
|
-
|
|
2
|
+
import { Card as v, Statistic as u } from "antd";
|
|
3
|
+
import e from "./style.module.scss.js";
|
|
4
|
+
import l from "classnames";
|
|
5
|
+
const j = ({
|
|
6
|
+
title: i,
|
|
7
|
+
value: d,
|
|
8
|
+
prefix: m,
|
|
9
|
+
suffix: o,
|
|
10
|
+
precision: f,
|
|
11
|
+
color: b = "#1677ff",
|
|
10
12
|
onClick: a,
|
|
11
|
-
inline:
|
|
12
|
-
fontSize:
|
|
13
|
-
style:
|
|
14
|
-
}) =>
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
13
|
+
inline: p = !1,
|
|
14
|
+
fontSize: r,
|
|
15
|
+
style: s
|
|
16
|
+
}) => {
|
|
17
|
+
const c = /* @__PURE__ */ t(
|
|
18
|
+
u,
|
|
19
|
+
{
|
|
20
|
+
title: i,
|
|
21
|
+
value: d,
|
|
22
|
+
prefix: m,
|
|
23
|
+
suffix: o,
|
|
24
|
+
precision: f,
|
|
25
|
+
valueStyle: { color: b, ...r ? { fontSize: r } : {} }
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
return p ? /* @__PURE__ */ t(
|
|
29
|
+
"div",
|
|
30
|
+
{
|
|
31
|
+
className: a ? l("stat-card-clickable", e["stat-card-clickable"]) : void 0,
|
|
32
|
+
onClick: a,
|
|
33
|
+
style: s,
|
|
34
|
+
children: c
|
|
35
|
+
}
|
|
36
|
+
) : /* @__PURE__ */ t(
|
|
37
|
+
v,
|
|
38
|
+
{
|
|
39
|
+
hoverable: !!a,
|
|
40
|
+
onClick: a,
|
|
41
|
+
className: a ? l("stat-card-clickable", e["stat-card-clickable"]) : void 0,
|
|
42
|
+
style: s,
|
|
43
|
+
children: c
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
};
|
|
31
47
|
export {
|
|
32
|
-
|
|
48
|
+
j as default
|
|
33
49
|
};
|
|
34
50
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/Stat/StatCard/index.tsx"],"sourcesContent":["import { Card, Statistic } from 'antd';\nimport React from 'react';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nexport interface StatCardProps {\n /** 标题 */\n title: string;\n /** 数值 */\n value: number;\n /** 前缀图标 */\n prefix?: React.ReactNode;\n /** 数值颜色 */\n color?: string;\n /** 点击回调 */\n onClick?: () => void;\n /** 是否内联模式(不使用 Card 包裹) */\n inline?: boolean;\n /** 内联模式下的字体大小 */\n fontSize?: number;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\n/** 可点击的统计卡片 */\nconst StatCard: React.FC<StatCardProps> = ({\n title,\n value,\n prefix,\n color = '#1677ff',\n onClick,\n inline = false,\n fontSize,\n style,\n}) => {\n if (inline) {\n return (\n <div
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/Stat/StatCard/index.tsx"],"sourcesContent":["import { Card, Statistic } from 'antd';\nimport React from 'react';\nimport styles from './style.module.scss';\nimport classNames from 'classnames';\n\nexport interface StatCardProps {\n /** 标题 */\n title: string;\n /** 数值 */\n value: number;\n /** 前缀图标 */\n prefix?: React.ReactNode;\n /** 后缀(如 %、单位) */\n suffix?: React.ReactNode;\n /** 小数精度 */\n precision?: number;\n /** 数值颜色 */\n color?: string;\n /** 点击回调 */\n onClick?: () => void;\n /** 是否内联模式(不使用 Card 包裹) */\n inline?: boolean;\n /** 内联模式下的字体大小 */\n fontSize?: number;\n /** 自定义样式 */\n style?: React.CSSProperties;\n}\n\n/** 可点击的统计卡片 */\nconst StatCard: React.FC<StatCardProps> = ({\n title,\n value,\n prefix,\n suffix,\n precision,\n color = '#1677ff',\n onClick,\n inline = false,\n fontSize,\n style,\n}) => {\n const statistic = (\n <Statistic\n title={title}\n value={value}\n prefix={prefix}\n suffix={suffix}\n precision={precision}\n valueStyle={{ color, ...(fontSize ? { fontSize } : {}) }}\n />\n );\n\n if (inline) {\n return (\n <div\n className={\n onClick ? classNames('stat-card-clickable', styles['stat-card-clickable']) : undefined\n }\n onClick={onClick}\n style={style}\n >\n {statistic}\n </div>\n );\n }\n\n return (\n <Card\n hoverable={!!onClick}\n onClick={onClick}\n className={\n onClick ? classNames('stat-card-clickable', styles['stat-card-clickable']) : undefined\n }\n style={style}\n >\n {statistic}\n </Card>\n );\n};\n\nexport default StatCard;\n"],"names":["StatCard","title","value","prefix","suffix","precision","color","onClick","inline","fontSize","style","statistic","jsx","Statistic","classNames","styles","Card"],"mappings":";;;;AA6BA,MAAMA,IAAoC,CAAC;AAAA,EACzC,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,SAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,OAAAC;AACF,MAAM;AACJ,QAAMC,IACJ,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAAZ;AAAA,MACA,OAAAC;AAAA,MACA,QAAAC;AAAA,MACA,QAAAC;AAAA,MACA,WAAAC;AAAA,MACA,YAAY,EAAE,OAAAC,GAAO,GAAIG,IAAW,EAAE,UAAAA,EAAA,IAAa,CAAA,EAAC;AAAA,IAAG;AAAA,EAAA;AAI3D,SAAID,IAEA,gBAAAI;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WACEL,IAAUO,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,IAAI;AAAA,MAE/E,SAAAR;AAAA,MACA,OAAAG;AAAA,MAEC,UAAAC;AAAA,IAAA;AAAA,EAAA,IAML,gBAAAC;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,WAAW,CAAC,CAACT;AAAA,MACb,SAAAA;AAAA,MACA,WACEA,IAAUO,EAAW,uBAAuBC,EAAO,qBAAqB,CAAC,IAAI;AAAA,MAE/E,OAAAL;AAAA,MAEC,UAAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|