@hkyhy/marsun-components-core 0.1.69 → 0.1.73
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/kneFormInfo.js +6 -6
- package/dist/components/Iam/client.d.ts +42 -0
- package/dist/components/Iam/index.d.ts +10 -0
- package/dist/components/Iam/pages/IamOrgPage.d.ts +8 -0
- package/dist/components/Iam/pages/IamOrgPage.js +45 -0
- package/dist/components/Iam/pages/IamOrgPage.js.map +1 -0
- package/dist/components/Iam/pages/IamRolesPage.d.ts +24 -0
- package/dist/components/Iam/pages/IamRolesPage.js +222 -0
- package/dist/components/Iam/pages/IamRolesPage.js.map +1 -0
- package/dist/components/Iam/pages/IamSharedGroupsPage.d.ts +6 -0
- package/dist/components/Iam/pages/IamSharedGroupsPage.js +207 -0
- package/dist/components/Iam/pages/IamSharedGroupsPage.js.map +1 -0
- package/dist/components/Iam/pages/IamUsersPage.d.ts +10 -0
- package/dist/components/Iam/pages/IamUsersPage.js +314 -0
- package/dist/components/Iam/pages/IamUsersPage.js.map +1 -0
- package/dist/components/Iam/types.d.ts +85 -0
- package/dist/components/Iam/utils/catalogToItems.d.ts +3 -0
- package/dist/components/Iam/utils/catalogToItems.js +17 -0
- package/dist/components/Iam/utils/catalogToItems.js.map +1 -0
- package/dist/components/Iam/utils/draftEffectivePermissions.d.ts +48 -0
- package/dist/components/Iam/utils/draftEffectivePermissions.js +42 -0
- package/dist/components/Iam/utils/draftEffectivePermissions.js.map +1 -0
- package/dist/components/Iam/utils/multiTagSelect.d.ts +15 -0
- package/dist/components/Iam/utils/multiTagSelect.js +21 -0
- package/dist/components/Iam/utils/multiTagSelect.js.map +1 -0
- package/dist/components/Iam/utils/roleDisplay.d.ts +13 -0
- package/dist/components/Iam/utils/roleDisplay.js +17 -0
- package/dist/components/Iam/utils/roleDisplay.js.map +1 -0
- package/dist/components/Layout/AgentAppShell/style.module.scss.js +20 -20
- package/dist/components/Layout/ModulePageShell/index.d.ts +5 -0
- package/dist/components/Layout/ModulePageShell/index.js +52 -29
- package/dist/components/Layout/ModulePageShell/index.js.map +1 -1
- package/dist/components/Layout/ModulePageShell/style.module.scss.js +6 -4
- package/dist/components/Layout/ModulePageShell/style.module.scss.js.map +1 -1
- package/dist/components/Layout/PageSpin/index.d.ts +2 -0
- package/dist/components/Layout/PageSpin/index.js +24 -6
- package/dist/components/Layout/PageSpin/index.js.map +1 -1
- package/dist/components/Layout/PageSpin/style.module.scss.js +2 -1
- package/dist/components/Layout/PageSpin/style.module.scss.js.map +1 -1
- package/dist/components/PermissionBindPanel/PermissionBindPanel.js +110 -98
- package/dist/components/PermissionBindPanel/PermissionBindPanel.js.map +1 -1
- package/dist/iam.d.ts +14 -0
- package/dist/iam.js +23 -0
- package/dist/iam.js.map +1 -0
- package/dist/marsun-components-core.css +1 -1
- package/dist/styles/global.css +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IamSharedGroupsPage.js","sources":["../../../../src/components/Iam/pages/IamSharedGroupsPage.tsx"],"sourcesContent":["import { ModulePageShell } from '@/components/Layout';\nimport { Button, Form, Input, Modal, Select, Space, Table, message } from 'antd';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { IamClient } from '../client';\nimport type { IamRole, IamSharedGroup, IamUser } from '../types';\n\nexport type IamSharedGroupsPageProps = {\n client: IamClient;\n title?: string;\n};\n\nexport default function IamSharedGroupsPage({\n client,\n title = '共享组',\n}: IamSharedGroupsPageProps) {\n const [loading, setLoading] = useState(false);\n const [rows, setRows] = useState<IamSharedGroup[]>([]);\n const [roles, setRoles] = useState<IamRole[]>([]);\n const [users, setUsers] = useState<IamUser[]>([]);\n const [open, setOpen] = useState(false);\n const [editing, setEditing] = useState<IamSharedGroup | null>(null);\n const [memberOpen, setMemberOpen] = useState(false);\n const [active, setActive] = useState<IamSharedGroup | null>(null);\n const [memberIds, setMemberIds] = useState<string[]>([]);\n const [form] = Form.useForm();\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const [g, r, u] = await Promise.all([\n client.listSharedGroups(),\n client.listRoles(),\n client.listUsers({ page: 1, pageSize: 100 }),\n ]);\n setRows(g);\n setRoles(r);\n setUsers(u.pageData.filter((x) => x.isActive));\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载失败');\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const headerActions = useMemo(\n () => [\n {\n children: '新增共享组',\n type: 'primary' as const,\n onClick: () => {\n setEditing(null);\n form.resetFields();\n setOpen(true);\n },\n },\n ],\n [form],\n );\n\n return (\n <ModulePageShell title={title} actions={headerActions} fillHeight={false}>\n <Table\n rowKey=\"id\"\n loading={loading}\n dataSource={rows}\n columns={[\n { title: '名称', dataIndex: 'name' },\n { title: '编码', dataIndex: 'code' },\n { title: '说明', dataIndex: 'description', render: (v: string | null) => v || '—' },\n {\n title: '角色',\n key: 'roles',\n render: (_: unknown, r: IamSharedGroup) =>\n (r.groupRoles || [])\n .map((x) => x.role?.code)\n .filter(Boolean)\n .join(', ') || '—',\n },\n {\n title: '成员数',\n key: 'mc',\n render: (_: unknown, r: IamSharedGroup) => r._count?.userGroups ?? '—',\n },\n {\n title: '操作',\n key: 'ops',\n render: (_: unknown, r: IamSharedGroup) => (\n <Space>\n <Button\n type=\"link\"\n size=\"small\"\n onClick={() => {\n setEditing(r);\n form.setFieldsValue({\n name: r.name,\n description: r.description || '',\n });\n setOpen(true);\n }}\n >\n 编辑\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n onClick={() => {\n setActive(r);\n setMemberIds([]);\n setMemberOpen(true);\n }}\n >\n 成员\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n danger\n onClick={async () => {\n try {\n await client.deleteSharedGroup(r.id);\n message.success('已删除');\n void load();\n } catch (e) {\n message.error(e instanceof Error ? e.message : '删除失败(请先移除成员)');\n }\n }}\n >\n 删除\n </Button>\n </Space>\n ),\n },\n ]}\n />\n\n <Modal\n open={open}\n title={editing ? '编辑共享组' : '新增共享组'}\n onCancel={() => setOpen(false)}\n onOk={async () => {\n const values = await form.validateFields();\n try {\n if (editing) {\n await client.updateSharedGroup(editing.id, {\n name: values.name,\n description: values.description,\n });\n } else {\n await client.createSharedGroup({\n code: values.code,\n name: values.name,\n description: values.description,\n roleIds: values.roleIds,\n });\n }\n message.success('已保存');\n setOpen(false);\n void load();\n } catch (e) {\n message.error(e instanceof Error ? e.message : '失败');\n }\n }}\n >\n <Form form={form} layout=\"vertical\">\n {!editing ? (\n <Form.Item name=\"code\" label=\"编码\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n ) : null}\n <Form.Item name=\"name\" label=\"名称\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item name=\"description\" label=\"说明\">\n <Input.TextArea rows={2} />\n </Form.Item>\n {!editing ? (\n <Form.Item name=\"roleIds\" label=\"聚合角色\">\n <Select\n mode=\"multiple\"\n options={roles.map((r) => ({ value: r.id, label: `${r.code} · ${r.name}` }))}\n />\n </Form.Item>\n ) : null}\n </Form>\n </Modal>\n\n <Modal\n open={memberOpen}\n title={`成员 · ${active?.name || ''}`}\n onCancel={() => setMemberOpen(false)}\n onOk={async () => {\n if (!active || !memberIds.length) return;\n try {\n await client.addSharedGroupMembers(active.id, memberIds);\n message.success('已添加成员');\n setMemberOpen(false);\n void load();\n } catch (e) {\n message.error(e instanceof Error ? e.message : '失败');\n }\n }}\n footer={(_, { OkBtn, CancelBtn }) => (\n <>\n <Button\n danger\n disabled={!memberIds.length || !active}\n onClick={async () => {\n if (!active) return;\n try {\n await client.removeSharedGroupMembers(active.id, memberIds);\n message.success('已移除成员');\n setMemberOpen(false);\n void load();\n } catch (e) {\n message.error(e instanceof Error ? e.message : '失败');\n }\n }}\n >\n 移除所选\n </Button>\n <CancelBtn />\n <OkBtn />\n </>\n )}\n >\n <Select\n mode=\"multiple\"\n style={{ width: '100%' }}\n value={memberIds}\n onChange={setMemberIds}\n options={users.map((u) => ({\n value: u.id,\n label: `${u.displayName} · ${u.employeeId}`,\n }))}\n placeholder=\"选择用户后可添加或移除\"\n />\n </Modal>\n </ModulePageShell>\n );\n}\n"],"names":["IamSharedGroupsPage","client","title","loading","setLoading","useState","rows","setRows","roles","setRoles","users","setUsers","open","setOpen","editing","setEditing","memberOpen","setMemberOpen","active","setActive","memberIds","setMemberIds","form","Form","load","useCallback","g","r","u","x","message","useEffect","headerActions","useMemo","ModulePageShell","jsx","Table","v","_","_a","Space","Button","e","Modal","values","jsxs","Input","Select","OkBtn","CancelBtn","Fragment"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PermissionBindCatalog } from '../../PermissionBindPanel';
|
|
2
|
+
import { IamClient } from '../client';
|
|
3
|
+
export type IamUsersPageProps = {
|
|
4
|
+
client: IamClient;
|
|
5
|
+
catalog: PermissionBindCatalog;
|
|
6
|
+
systemEntryCodes: readonly string[];
|
|
7
|
+
tableName?: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
};
|
|
10
|
+
export default function IamUsersPage({ client, catalog, systemEntryCodes, tableName, title, }: IamUsersPageProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
import { jsxs as b, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { message as y, Space as L, Button as V, Typography as z } from "antd";
|
|
3
|
+
import { useState as n, useMemo as d, useCallback as D, useEffect as de } from "react";
|
|
4
|
+
import { catalogToItems as H } from "../utils/catalogToItems.js";
|
|
5
|
+
import { buildDraftEffectivePermissions as ce } from "../utils/draftEffectivePermissions.js";
|
|
6
|
+
import { multiTagSelectProps as $, MULTI_TAG_SHOW_LENGTH as pe } from "../utils/multiTagSelect.js";
|
|
7
|
+
import { roleSelectOption as ue, roleDisplayName as fe } from "../utils/roleDisplay.js";
|
|
8
|
+
import ye from "../../ReactFilter/getFilterValue.js";
|
|
9
|
+
import "../../ReactFilter/entry.js";
|
|
10
|
+
import ge from "../../Layout/ModulePageShell/index.js";
|
|
11
|
+
import he from "../../ReactFilter/Filter.js";
|
|
12
|
+
import { InputFilterItem as Ce } from "../../ReactFilter/fields/index.js";
|
|
13
|
+
import we from "../../Table/Table.js";
|
|
14
|
+
import Se from "../../Modal/Modal/index.js";
|
|
15
|
+
import Ie from "../../Descriptions/CommonDescriptions.js";
|
|
16
|
+
import { FormModal as ve, FormInfo as be, Select as R } from "../../Form/kneFormInfo.js";
|
|
17
|
+
import Ee from "../../Form/FormDataSync.js";
|
|
18
|
+
import Pe from "../../PermissionBindPanel/PermissionBindPanel.js";
|
|
19
|
+
import Te from "../../Tag/Tags/index.js";
|
|
20
|
+
import { SEMANTIC_COLORS as ke } from "../../Tag/SemanticTag.js";
|
|
21
|
+
const Fe = he, Oe = 420;
|
|
22
|
+
function Re(l) {
|
|
23
|
+
var g, h;
|
|
24
|
+
const c = (g = l.roles) != null && g.length ? /* @__PURE__ */ t(
|
|
25
|
+
Te,
|
|
26
|
+
{
|
|
27
|
+
tags: l.roles.map((u) => fe(u)),
|
|
28
|
+
showLength: pe,
|
|
29
|
+
color: ke.INFO,
|
|
30
|
+
empty: "—"
|
|
31
|
+
}
|
|
32
|
+
) : "—";
|
|
33
|
+
return [
|
|
34
|
+
{ label: "工号", value: l.employeeId || "—" },
|
|
35
|
+
{ label: "姓名", value: l.displayName || "—" },
|
|
36
|
+
{ label: "邮箱", value: l.email || "—" },
|
|
37
|
+
{
|
|
38
|
+
label: "组织",
|
|
39
|
+
value: ((h = l.orgs) == null ? void 0 : h.map((u) => u.name).filter(Boolean).join("、")) || "—",
|
|
40
|
+
span: 2
|
|
41
|
+
},
|
|
42
|
+
{ label: "角色", value: c, span: 2 }
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
function Qe({
|
|
46
|
+
client: l,
|
|
47
|
+
catalog: c,
|
|
48
|
+
systemEntryCodes: g,
|
|
49
|
+
tableName: h = "iam_users",
|
|
50
|
+
title: u = "用户管理"
|
|
51
|
+
}) {
|
|
52
|
+
const [j, x] = n(!1), [Y, K] = n([]), [W, q] = n(0), [E, N] = n(1), [P, J] = n([]), A = d(() => {
|
|
53
|
+
const e = ye(P);
|
|
54
|
+
return String(e.keyword ?? "");
|
|
55
|
+
}, [P]), [f, T] = n(null), [Q, M] = n(!1), [i, k] = n(null), [C, X] = n([]), [w, Z] = n([]), [S, U] = n([]), [I, B] = n([]), [ee, oe] = n(0), _ = d(() => {
|
|
56
|
+
const e = {};
|
|
57
|
+
for (const r of H(c))
|
|
58
|
+
e[r.code] = r.name;
|
|
59
|
+
return e;
|
|
60
|
+
}, [c]), v = d(
|
|
61
|
+
() => ce({
|
|
62
|
+
roleCodes: S,
|
|
63
|
+
groupIds: I,
|
|
64
|
+
roles: C,
|
|
65
|
+
groups: w,
|
|
66
|
+
nameByCode: _
|
|
67
|
+
}),
|
|
68
|
+
[S, I, C, w, _]
|
|
69
|
+
), G = d(() => {
|
|
70
|
+
const e = v.filter((o) => o.layer !== "RESOURCE").map((o) => ({
|
|
71
|
+
id: o.code,
|
|
72
|
+
code: o.code,
|
|
73
|
+
name: o.name || o.code,
|
|
74
|
+
layer: o.layer
|
|
75
|
+
})), r = new Map(e.map((o) => [o.code, o])), a = H(c).map((o) => {
|
|
76
|
+
const m = r.get(o.code);
|
|
77
|
+
return m ? { ...o, name: m.name || o.name, layer: m.layer || o.layer } : o;
|
|
78
|
+
}), s = new Set(a.map((o) => o.code));
|
|
79
|
+
return [...a, ...e.filter((o) => !s.has(o.code))];
|
|
80
|
+
}, [v, c]), re = d(
|
|
81
|
+
() => v.filter((e) => e.layer !== "RESOURCE").map((e) => e.code),
|
|
82
|
+
[v]
|
|
83
|
+
), te = d(() => C.map((e) => ue(e)), [C]), le = d(
|
|
84
|
+
() => w.map((e) => ({
|
|
85
|
+
value: e.id,
|
|
86
|
+
label: e.name || e.code,
|
|
87
|
+
title: e.code ? `编码:${e.code}` : e.name
|
|
88
|
+
})),
|
|
89
|
+
[w]
|
|
90
|
+
), F = D(async () => {
|
|
91
|
+
x(!0);
|
|
92
|
+
try {
|
|
93
|
+
const e = await l.listUsers({ page: E, pageSize: 20, keyword: A || void 0 });
|
|
94
|
+
K(e.pageData), q(e.total);
|
|
95
|
+
} catch (e) {
|
|
96
|
+
y.error(e instanceof Error ? e.message : "加载失败");
|
|
97
|
+
} finally {
|
|
98
|
+
x(!1);
|
|
99
|
+
}
|
|
100
|
+
}, [l, E, A]);
|
|
101
|
+
de(() => {
|
|
102
|
+
F();
|
|
103
|
+
}, [F]);
|
|
104
|
+
const se = async (e) => {
|
|
105
|
+
var r, a;
|
|
106
|
+
T(e), M(!0);
|
|
107
|
+
try {
|
|
108
|
+
const s = await l.getUser(e.id);
|
|
109
|
+
T({
|
|
110
|
+
...e,
|
|
111
|
+
...s,
|
|
112
|
+
orgs: (r = s.orgs) != null && r.length ? s.orgs : e.orgs,
|
|
113
|
+
roles: (a = s.roles) != null && a.length ? s.roles : e.roles
|
|
114
|
+
});
|
|
115
|
+
} catch (s) {
|
|
116
|
+
y.error(s instanceof Error ? s.message : "加载用户详情失败");
|
|
117
|
+
} finally {
|
|
118
|
+
M(!1);
|
|
119
|
+
}
|
|
120
|
+
}, ae = async (e) => {
|
|
121
|
+
var r;
|
|
122
|
+
k(e);
|
|
123
|
+
try {
|
|
124
|
+
const [a, s, o, m] = await Promise.all([
|
|
125
|
+
l.listRoles(),
|
|
126
|
+
l.listSharedGroups(),
|
|
127
|
+
l.listUserSharedGroups(e.id),
|
|
128
|
+
l.getUser(e.id)
|
|
129
|
+
]);
|
|
130
|
+
X(a), Z(s), B(o.map((p) => p.id));
|
|
131
|
+
const O = ((r = m.roles) == null ? void 0 : r.filter((p) => a.some((me) => me.code === p.code)).map((p) => p.code)) || [];
|
|
132
|
+
U(O), oe((p) => p + 1);
|
|
133
|
+
} catch (a) {
|
|
134
|
+
y.error(a instanceof Error ? a.message : "加载权限失败");
|
|
135
|
+
}
|
|
136
|
+
}, ne = D((e) => {
|
|
137
|
+
Array.isArray(e.groupIds) && B(e.groupIds.map(String)), Array.isArray(e.roleCodes) && U(e.roleCodes.map(String));
|
|
138
|
+
}, []), ie = d(() => f ? Re(f) : [], [f]);
|
|
139
|
+
return /* @__PURE__ */ b(ge, { title: u, fillHeight: !1, children: [
|
|
140
|
+
/* @__PURE__ */ t("div", { style: { marginBottom: 12 }, children: /* @__PURE__ */ t(
|
|
141
|
+
Fe,
|
|
142
|
+
{
|
|
143
|
+
value: P,
|
|
144
|
+
onChange: (e) => {
|
|
145
|
+
J(e), N(1);
|
|
146
|
+
},
|
|
147
|
+
list: [
|
|
148
|
+
[
|
|
149
|
+
{
|
|
150
|
+
type: Ce,
|
|
151
|
+
props: {
|
|
152
|
+
name: "keyword",
|
|
153
|
+
label: "工号/姓名",
|
|
154
|
+
placeholder: "工号/姓名"
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
) }),
|
|
161
|
+
/* @__PURE__ */ t(
|
|
162
|
+
we,
|
|
163
|
+
{
|
|
164
|
+
rowKey: "id",
|
|
165
|
+
loading: j,
|
|
166
|
+
dataSource: Y,
|
|
167
|
+
tableName: h,
|
|
168
|
+
pagination: {
|
|
169
|
+
current: E,
|
|
170
|
+
total: W,
|
|
171
|
+
pageSize: 20,
|
|
172
|
+
onChange: N
|
|
173
|
+
},
|
|
174
|
+
columns: [
|
|
175
|
+
{ title: "工号", dataIndex: "employeeId" },
|
|
176
|
+
{ title: "姓名", dataIndex: "displayName" },
|
|
177
|
+
{ title: "邮箱", dataIndex: "email", render: (e) => e || "—" },
|
|
178
|
+
{
|
|
179
|
+
title: "组织",
|
|
180
|
+
key: "org",
|
|
181
|
+
render: (e, r) => {
|
|
182
|
+
var a, s, o, m;
|
|
183
|
+
return ((s = (a = r.orgs) == null ? void 0 : a.find((O) => O.isPrimary)) == null ? void 0 : s.name) || ((m = (o = r.orgs) == null ? void 0 : o[0]) == null ? void 0 : m.name) || "—";
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
title: "操作",
|
|
188
|
+
key: "ops",
|
|
189
|
+
render: (e, r) => /* @__PURE__ */ b(L, { children: [
|
|
190
|
+
/* @__PURE__ */ t(V, { type: "link", size: "small", onClick: () => void se(r), children: "查看" }),
|
|
191
|
+
/* @__PURE__ */ t(V, { type: "link", size: "small", onClick: () => void ae(r), children: "权限管理" })
|
|
192
|
+
] })
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
),
|
|
197
|
+
/* @__PURE__ */ t(
|
|
198
|
+
Se,
|
|
199
|
+
{
|
|
200
|
+
open: !!f,
|
|
201
|
+
title: "查看用户",
|
|
202
|
+
onCancel: () => T(null),
|
|
203
|
+
footer: null,
|
|
204
|
+
size: "M",
|
|
205
|
+
scrollable: !0,
|
|
206
|
+
children: f ? /* @__PURE__ */ t(
|
|
207
|
+
Ie,
|
|
208
|
+
{
|
|
209
|
+
content: ie,
|
|
210
|
+
column: 1,
|
|
211
|
+
bordered: !0,
|
|
212
|
+
size: "small",
|
|
213
|
+
title: Q ? "加载中…" : void 0
|
|
214
|
+
}
|
|
215
|
+
) : null
|
|
216
|
+
}
|
|
217
|
+
),
|
|
218
|
+
/* @__PURE__ */ t(
|
|
219
|
+
ve,
|
|
220
|
+
{
|
|
221
|
+
open: !!i,
|
|
222
|
+
title: `权限管理 · ${(i == null ? void 0 : i.displayName) || ""}`,
|
|
223
|
+
width: 920,
|
|
224
|
+
onCancel: () => k(null),
|
|
225
|
+
okText: "保存",
|
|
226
|
+
cancelText: "取消",
|
|
227
|
+
formProps: {
|
|
228
|
+
data: {
|
|
229
|
+
dataScope: "COMPANY",
|
|
230
|
+
groupIds: I,
|
|
231
|
+
roleCodes: S
|
|
232
|
+
},
|
|
233
|
+
onSubmit: async (e) => {
|
|
234
|
+
if (i)
|
|
235
|
+
try {
|
|
236
|
+
await l.setUserAppRoleCodes(i.id, e.roleCodes ?? S), await l.setUserSharedGroups(i.id, e.groupIds ?? I), y.success("已保存"), k(null), F();
|
|
237
|
+
} catch (r) {
|
|
238
|
+
throw y.error(r instanceof Error ? r.message : "保存失败"), r;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
children: /* @__PURE__ */ b(L, { direction: "vertical", style: { width: "100%" }, size: "middle", children: [
|
|
243
|
+
/* @__PURE__ */ t(
|
|
244
|
+
be,
|
|
245
|
+
{
|
|
246
|
+
column: 2,
|
|
247
|
+
gap: 16,
|
|
248
|
+
list: [
|
|
249
|
+
/* @__PURE__ */ t(
|
|
250
|
+
R,
|
|
251
|
+
{
|
|
252
|
+
name: "dataScope",
|
|
253
|
+
label: "数据权限",
|
|
254
|
+
disabled: !0,
|
|
255
|
+
options: [{ value: "COMPANY", label: "全公司" }]
|
|
256
|
+
},
|
|
257
|
+
"dataScope"
|
|
258
|
+
),
|
|
259
|
+
/* @__PURE__ */ t(
|
|
260
|
+
R,
|
|
261
|
+
{
|
|
262
|
+
name: "groupIds",
|
|
263
|
+
label: "共享组",
|
|
264
|
+
mode: "multiple",
|
|
265
|
+
allowClear: !0,
|
|
266
|
+
options: le,
|
|
267
|
+
placeholder: "请选择共享组(可选)",
|
|
268
|
+
...$
|
|
269
|
+
},
|
|
270
|
+
"groupIds"
|
|
271
|
+
),
|
|
272
|
+
/* @__PURE__ */ t(
|
|
273
|
+
R,
|
|
274
|
+
{
|
|
275
|
+
name: "roleCodes",
|
|
276
|
+
label: "用户角色",
|
|
277
|
+
mode: "multiple",
|
|
278
|
+
allowClear: !0,
|
|
279
|
+
options: te,
|
|
280
|
+
placeholder: "请选择本应用角色(可选)",
|
|
281
|
+
...$
|
|
282
|
+
},
|
|
283
|
+
"roleCodes"
|
|
284
|
+
)
|
|
285
|
+
]
|
|
286
|
+
}
|
|
287
|
+
),
|
|
288
|
+
/* @__PURE__ */ t(Ee, { onChange: ne }),
|
|
289
|
+
/* @__PURE__ */ b("div", { children: [
|
|
290
|
+
/* @__PURE__ */ t(z.Text, { strong: !0, children: "权限点(只读预览)" }),
|
|
291
|
+
G.length === 0 ? /* @__PURE__ */ t(z.Text, { type: "secondary", style: { display: "block", marginTop: 8 }, children: "暂无权限点" }) : /* @__PURE__ */ t("div", { style: { marginTop: 8 }, children: /* @__PURE__ */ t(
|
|
292
|
+
Pe,
|
|
293
|
+
{
|
|
294
|
+
catalog: c,
|
|
295
|
+
permissions: G,
|
|
296
|
+
value: re,
|
|
297
|
+
onChange: () => {
|
|
298
|
+
},
|
|
299
|
+
systemEntryCodes: [...g],
|
|
300
|
+
readOnly: !0,
|
|
301
|
+
height: Oe
|
|
302
|
+
}
|
|
303
|
+
) })
|
|
304
|
+
] })
|
|
305
|
+
] })
|
|
306
|
+
},
|
|
307
|
+
`iam-perm-${(i == null ? void 0 : i.id) || "x"}-${ee}`
|
|
308
|
+
)
|
|
309
|
+
] });
|
|
310
|
+
}
|
|
311
|
+
export {
|
|
312
|
+
Qe as default
|
|
313
|
+
};
|
|
314
|
+
//# sourceMappingURL=IamUsersPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IamUsersPage.js","sources":["../../../../src/components/Iam/pages/IamUsersPage.tsx"],"sourcesContent":["import { ModulePageShell } from '@/components/Layout';\nimport { Modal } from '@/components/Modal';\nimport {\n PermissionBindPanel,\n type PermissionBindCatalog,\n type PermissionBindItem,\n} from '@/components/PermissionBindPanel';\nimport Filter, {\n getFilterValue,\n InputFilterItem as ReactInputFilterItem,\n type FilterValue,\n} from '@/components/ReactFilter';\nimport { Table } from '@/components/Table';\nimport { SEMANTIC_COLORS, Tags } from '@/components/Tag';\nimport { CommonDescriptions, type DescriptionItem } from '@/components/Descriptions';\nimport { FormDataSync, FormInfo, FormModal, Select } from '@/components/Form';\nimport { Button, Space, Typography, message } from 'antd';\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport type { IamClient } from '../client';\nimport type { IamRole, IamSharedGroup, IamUser } from '../types';\nimport { catalogToItems } from '../utils/catalogToItems';\nimport { buildDraftEffectivePermissions } from '../utils/draftEffectivePermissions';\nimport { MULTI_TAG_SHOW_LENGTH, multiTagSelectProps } from '../utils/multiTagSelect';\nimport { roleDisplayName, roleSelectOption } from '../utils/roleDisplay';\n\nconst ReactFilterBar = Filter as ComponentType<{\n value: FilterValue;\n onChange: (next: FilterValue) => void;\n list: unknown;\n}>;\n\nconst EP_PANEL_HEIGHT = 420;\n\nfunction buildViewItems(user: IamUser): DescriptionItem[] {\n const rolesValue: ReactNode = user.roles?.length ? (\n <Tags\n tags={user.roles.map((r) => roleDisplayName(r))}\n showLength={MULTI_TAG_SHOW_LENGTH}\n color={SEMANTIC_COLORS.INFO}\n empty=\"—\"\n />\n ) : (\n '—'\n );\n\n return [\n { label: '工号', value: user.employeeId || '—' },\n { label: '姓名', value: user.displayName || '—' },\n { label: '邮箱', value: user.email || '—' },\n {\n label: '组织',\n value:\n user.orgs\n ?.map((o) => o.name)\n .filter(Boolean)\n .join('、') || '—',\n span: 2,\n },\n { label: '角色', value: rolesValue, span: 2 },\n ];\n}\n\nexport type IamUsersPageProps = {\n client: IamClient;\n catalog: PermissionBindCatalog;\n systemEntryCodes: readonly string[];\n tableName?: string;\n title?: string;\n};\n\nexport default function IamUsersPage({\n client,\n catalog,\n systemEntryCodes,\n tableName = 'iam_users',\n title = '用户管理',\n}: IamUsersPageProps) {\n const [loading, setLoading] = useState(false);\n const [rows, setRows] = useState<IamUser[]>([]);\n const [total, setTotal] = useState(0);\n const [page, setPage] = useState(1);\n const [filterValue, setFilterValue] = useState<FilterValue>([]);\n const keyword = useMemo(() => {\n const flat = getFilterValue(filterValue) as Record<string, unknown>;\n return String(flat.keyword ?? '');\n }, [filterValue]);\n const [viewUser, setViewUser] = useState<IamUser | null>(null);\n const [viewLoading, setViewLoading] = useState(false);\n const [permUser, setPermUser] = useState<IamUser | null>(null);\n const [roles, setRoles] = useState<IamRole[]>([]);\n const [groups, setGroups] = useState<IamSharedGroup[]>([]);\n const [roleCodes, setRoleCodes] = useState<string[]>([]);\n const [groupIds, setGroupIds] = useState<string[]>([]);\n const [permFormEpoch, setPermFormEpoch] = useState(0);\n\n const catalogNameByCode = useMemo(() => {\n const m: Record<string, string> = {};\n for (const item of catalogToItems(catalog)) {\n m[item.code] = item.name;\n }\n return m;\n }, [catalog]);\n\n const draftEp = useMemo(\n () =>\n buildDraftEffectivePermissions({\n roleCodes,\n groupIds,\n roles,\n groups,\n nameByCode: catalogNameByCode,\n }),\n [roleCodes, groupIds, roles, groups, catalogNameByCode],\n );\n\n const panelPermissions = useMemo((): PermissionBindItem[] => {\n const epItems = draftEp\n .filter((p) => p.layer !== 'RESOURCE')\n .map((p) => ({\n id: p.code,\n code: p.code,\n name: p.name || p.code,\n layer: p.layer,\n }));\n const byCode = new Map(epItems.map((p) => [p.code, p]));\n const fromCatalog = catalogToItems(catalog).map((item) => {\n const hit = byCode.get(item.code);\n return hit ? { ...item, name: hit.name || item.name, layer: hit.layer || item.layer } : item;\n });\n const used = new Set(fromCatalog.map((p) => p.code));\n return [...fromCatalog, ...epItems.filter((p) => !used.has(p.code))];\n }, [draftEp, catalog]);\n\n const checkedEpIds = useMemo(\n () => draftEp.filter((p) => p.layer !== 'RESOURCE').map((p) => p.code),\n [draftEp],\n );\n\n const roleOptions = useMemo(() => roles.map((r) => roleSelectOption(r)), [roles]);\n const groupOptions = useMemo(\n () =>\n groups.map((g) => ({\n value: g.id,\n label: g.name || g.code,\n title: g.code ? `编码:${g.code}` : g.name,\n })),\n [groups],\n );\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const data = await client.listUsers({ page, pageSize: 20, keyword: keyword || undefined });\n setRows(data.pageData);\n setTotal(data.total);\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载失败');\n } finally {\n setLoading(false);\n }\n }, [client, page, keyword]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const openView = async (u: IamUser) => {\n setViewUser(u);\n setViewLoading(true);\n try {\n const detail = await client.getUser(u.id);\n setViewUser({\n ...u,\n ...detail,\n orgs: detail.orgs?.length ? detail.orgs : u.orgs,\n roles: detail.roles?.length ? detail.roles : u.roles,\n });\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载用户详情失败');\n } finally {\n setViewLoading(false);\n }\n };\n\n const openPerm = async (u: IamUser) => {\n setPermUser(u);\n try {\n const [r, g, mine, detail] = await Promise.all([\n client.listRoles(),\n client.listSharedGroups(),\n client.listUserSharedGroups(u.id),\n client.getUser(u.id),\n ]);\n setRoles(r);\n setGroups(g);\n setGroupIds(mine.map((x) => x.id));\n const appRoleCodes =\n detail.roles?.filter((x) => r.some((rr) => rr.code === x.code)).map((x) => x.code) || [];\n setRoleCodes(appRoleCodes);\n setPermFormEpoch((n) => n + 1);\n } catch (e) {\n message.error(e instanceof Error ? e.message : '加载权限失败');\n }\n };\n\n const onPermFormSync = useCallback((data: Record<string, unknown>) => {\n if (Array.isArray(data.groupIds)) setGroupIds(data.groupIds.map(String));\n if (Array.isArray(data.roleCodes)) setRoleCodes(data.roleCodes.map(String));\n }, []);\n\n const viewItems = useMemo(() => (viewUser ? buildViewItems(viewUser) : []), [viewUser]);\n\n return (\n <ModulePageShell title={title} fillHeight={false}>\n <div style={{ marginBottom: 12 }}>\n <ReactFilterBar\n value={filterValue}\n onChange={(next) => {\n setFilterValue(next);\n setPage(1);\n }}\n list={[\n [\n {\n type: ReactInputFilterItem,\n props: {\n name: 'keyword',\n label: '工号/姓名',\n placeholder: '工号/姓名',\n },\n },\n ],\n ]}\n />\n </div>\n <Table\n rowKey=\"id\"\n loading={loading}\n dataSource={rows}\n tableName={tableName}\n pagination={{\n current: page,\n total,\n pageSize: 20,\n onChange: setPage,\n }}\n columns={[\n { title: '工号', dataIndex: 'employeeId' },\n { title: '姓名', dataIndex: 'displayName' },\n { title: '邮箱', dataIndex: 'email', render: (v: string | null) => v || '—' },\n {\n title: '组织',\n key: 'org',\n render: (_: unknown, r: IamUser) =>\n r.orgs?.find((o) => o.isPrimary)?.name || r.orgs?.[0]?.name || '—',\n },\n {\n title: '操作',\n key: 'ops',\n render: (_: unknown, r: IamUser) => (\n <Space>\n <Button type=\"link\" size=\"small\" onClick={() => void openView(r)}>\n 查看\n </Button>\n <Button type=\"link\" size=\"small\" onClick={() => void openPerm(r)}>\n 权限管理\n </Button>\n </Space>\n ),\n },\n ]}\n />\n\n <Modal\n open={Boolean(viewUser)}\n title=\"查看用户\"\n onCancel={() => setViewUser(null)}\n footer={null}\n size=\"M\"\n scrollable\n >\n {viewUser ? (\n <CommonDescriptions\n content={viewItems}\n column={1}\n bordered\n size=\"small\"\n title={viewLoading ? '加载中…' : undefined}\n />\n ) : null}\n </Modal>\n\n <FormModal\n key={`iam-perm-${permUser?.id || 'x'}-${permFormEpoch}`}\n open={Boolean(permUser)}\n title={`权限管理 · ${permUser?.displayName || ''}`}\n width={920}\n onCancel={() => setPermUser(null)}\n okText=\"保存\"\n cancelText=\"取消\"\n formProps={{\n data: {\n dataScope: 'COMPANY',\n groupIds,\n roleCodes,\n },\n onSubmit: async (data: { groupIds?: string[]; roleCodes?: string[] }) => {\n if (!permUser) return;\n try {\n await client.setUserAppRoleCodes(permUser.id, data.roleCodes ?? roleCodes);\n await client.setUserSharedGroups(permUser.id, data.groupIds ?? groupIds);\n message.success('已保存');\n setPermUser(null);\n void load();\n } catch (e) {\n message.error(e instanceof Error ? e.message : '保存失败');\n throw e;\n }\n },\n }}\n >\n <Space direction=\"vertical\" style={{ width: '100%' }} size=\"middle\">\n <FormInfo\n column={2}\n gap={16}\n list={[\n <Select\n key=\"dataScope\"\n name=\"dataScope\"\n label=\"数据权限\"\n disabled\n options={[{ value: 'COMPANY', label: '全公司' }]}\n />,\n <Select\n key=\"groupIds\"\n name=\"groupIds\"\n label=\"共享组\"\n mode=\"multiple\"\n allowClear\n options={groupOptions}\n placeholder=\"请选择共享组(可选)\"\n {...multiTagSelectProps}\n />,\n <Select\n key=\"roleCodes\"\n name=\"roleCodes\"\n label=\"用户角色\"\n mode=\"multiple\"\n allowClear\n options={roleOptions}\n placeholder=\"请选择本应用角色(可选)\"\n {...multiTagSelectProps}\n />,\n ]}\n />\n <FormDataSync onChange={onPermFormSync} />\n <div>\n <Typography.Text strong>权限点(只读预览)</Typography.Text>\n {panelPermissions.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ display: 'block', marginTop: 8 }}>\n 暂无权限点\n </Typography.Text>\n ) : (\n <div style={{ marginTop: 8 }}>\n <PermissionBindPanel\n catalog={catalog}\n permissions={panelPermissions}\n value={checkedEpIds}\n onChange={() => undefined}\n systemEntryCodes={[...systemEntryCodes]}\n readOnly\n height={EP_PANEL_HEIGHT}\n />\n </div>\n )}\n </div>\n </Space>\n </FormModal>\n </ModulePageShell>\n );\n}\n"],"names":["ReactFilterBar","Filter","EP_PANEL_HEIGHT","buildViewItems","user","rolesValue","_a","jsx","Tags","r","roleDisplayName","MULTI_TAG_SHOW_LENGTH","SEMANTIC_COLORS","_b","o","IamUsersPage","client","catalog","systemEntryCodes","tableName","title","loading","setLoading","useState","rows","setRows","total","setTotal","page","setPage","filterValue","setFilterValue","keyword","useMemo","flat","getFilterValue","viewUser","setViewUser","viewLoading","setViewLoading","permUser","setPermUser","roles","setRoles","groups","setGroups","roleCodes","setRoleCodes","groupIds","setGroupIds","permFormEpoch","setPermFormEpoch","catalogNameByCode","m","item","catalogToItems","draftEp","buildDraftEffectivePermissions","panelPermissions","epItems","p","byCode","fromCatalog","hit","used","checkedEpIds","roleOptions","roleSelectOption","groupOptions","g","load","useCallback","data","message","useEffect","openView","u","detail","e","openPerm","mine","x","appRoleCodes","rr","n","onPermFormSync","viewItems","jsxs","ModulePageShell","next","ReactInputFilterItem","Table","v","_","_d","_c","Space","Button","Modal","CommonDescriptions","FormModal","FormInfo","Select","multiTagSelectProps","FormDataSync","Typography","PermissionBindPanel"],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** SSO / IAM 页面用类型(无 fetch;由 App 的 IamClient 填充) */
|
|
2
|
+
export type IamUser = {
|
|
3
|
+
id: string;
|
|
4
|
+
employeeId: string;
|
|
5
|
+
displayName: string;
|
|
6
|
+
email?: string | null;
|
|
7
|
+
isActive: boolean;
|
|
8
|
+
roles?: {
|
|
9
|
+
id: string;
|
|
10
|
+
code: string;
|
|
11
|
+
name: string;
|
|
12
|
+
description?: string | null;
|
|
13
|
+
systemAppId?: string | null;
|
|
14
|
+
}[];
|
|
15
|
+
orgs?: {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
isPrimary?: boolean;
|
|
19
|
+
}[];
|
|
20
|
+
};
|
|
21
|
+
export type IamRole = {
|
|
22
|
+
id: string;
|
|
23
|
+
code: string;
|
|
24
|
+
name: string;
|
|
25
|
+
description?: string | null;
|
|
26
|
+
systemAppId?: string | null;
|
|
27
|
+
isBuiltin?: boolean;
|
|
28
|
+
userRoleCount?: number;
|
|
29
|
+
rolePermissions?: {
|
|
30
|
+
permissionId: string;
|
|
31
|
+
permission?: {
|
|
32
|
+
id: string;
|
|
33
|
+
code: string;
|
|
34
|
+
name: string;
|
|
35
|
+
layer?: string;
|
|
36
|
+
};
|
|
37
|
+
}[];
|
|
38
|
+
_count?: {
|
|
39
|
+
userRoles?: number;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export type IamOrgUnit = {
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
parentId?: string | null;
|
|
46
|
+
children?: IamOrgUnit[];
|
|
47
|
+
};
|
|
48
|
+
export type IamPermission = {
|
|
49
|
+
id: string;
|
|
50
|
+
code: string;
|
|
51
|
+
name: string;
|
|
52
|
+
systemAppId?: string | null;
|
|
53
|
+
layer?: string;
|
|
54
|
+
systemApp?: {
|
|
55
|
+
code?: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
export type IamSharedGroup = {
|
|
59
|
+
id: string;
|
|
60
|
+
code: string;
|
|
61
|
+
name: string;
|
|
62
|
+
description?: string | null;
|
|
63
|
+
systemAppId?: string | null;
|
|
64
|
+
memberCount?: number;
|
|
65
|
+
moduleAccess?: {
|
|
66
|
+
moduleKey: string;
|
|
67
|
+
access: 'read' | 'write';
|
|
68
|
+
}[] | null;
|
|
69
|
+
groupRoles?: {
|
|
70
|
+
role?: {
|
|
71
|
+
id: string;
|
|
72
|
+
code: string;
|
|
73
|
+
name: string;
|
|
74
|
+
} | null;
|
|
75
|
+
}[];
|
|
76
|
+
_count?: {
|
|
77
|
+
userGroups?: number;
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
export type IamUsersPageResult = {
|
|
81
|
+
pageData: IamUser[];
|
|
82
|
+
currentPage: number;
|
|
83
|
+
pageSize: number;
|
|
84
|
+
total: number;
|
|
85
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function a(n) {
|
|
2
|
+
const o = /* @__PURE__ */ new Set(), t = [];
|
|
3
|
+
for (const c of n.modules)
|
|
4
|
+
for (const s of c.categories)
|
|
5
|
+
for (const e of s.leaves)
|
|
6
|
+
o.has(e.code) || (o.add(e.code), t.push({
|
|
7
|
+
id: e.code,
|
|
8
|
+
code: e.code,
|
|
9
|
+
name: e.label,
|
|
10
|
+
layer: c.key === "entry" ? "SYSTEM" : "BUSINESS"
|
|
11
|
+
}));
|
|
12
|
+
return t;
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
a as catalogToItems
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=catalogToItems.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalogToItems.js","sources":["../../../../src/components/Iam/utils/catalogToItems.ts"],"sourcesContent":["import type { PermissionBindCatalog, PermissionBindItem } from '@/components/PermissionBindPanel';\n\n/** 按 code 去重;同一权限码可挂在多个菜单模块下展示。 */\nexport function catalogToItems(catalog: PermissionBindCatalog): PermissionBindItem[] {\n const seen = new Set<string>();\n const items: PermissionBindItem[] = [];\n for (const mod of catalog.modules) {\n for (const cat of mod.categories) {\n for (const leaf of cat.leaves) {\n if (seen.has(leaf.code)) continue;\n seen.add(leaf.code);\n items.push({\n id: leaf.code,\n code: leaf.code,\n name: leaf.label,\n layer: mod.key === 'entry' ? 'SYSTEM' : 'BUSINESS',\n });\n }\n }\n }\n return items;\n}\n"],"names":["catalogToItems","catalog","seen","items","mod","cat","leaf"],"mappings":"AAGO,SAASA,EAAeC,GAAsD;AACnF,QAAMC,wBAAW,IAAA,GACXC,IAA8B,CAAA;AACpC,aAAWC,KAAOH,EAAQ;AACxB,eAAWI,KAAOD,EAAI;AACpB,iBAAWE,KAAQD,EAAI;AACrB,QAAIH,EAAK,IAAII,EAAK,IAAI,MACtBJ,EAAK,IAAII,EAAK,IAAI,GAClBH,EAAM,KAAK;AAAA,UACT,IAAIG,EAAK;AAAA,UACT,MAAMA,EAAK;AAAA,UACX,MAAMA,EAAK;AAAA,UACX,OAAOF,EAAI,QAAQ,UAAU,WAAW;AAAA,QAAA,CACzC;AAIP,SAAOD;AACT;"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 用户权限弹层:按「当前勾选」的角色/共享组合并草稿 EP(未保存预览)。
|
|
3
|
+
* 不含岗位/直绑;与 SSO getEffectivePermissions 保存后结果可能略有差异。
|
|
4
|
+
*/
|
|
5
|
+
export type DraftEpPerm = {
|
|
6
|
+
code: string;
|
|
7
|
+
name: string;
|
|
8
|
+
layer?: string;
|
|
9
|
+
};
|
|
10
|
+
type RoleLike = {
|
|
11
|
+
id: string;
|
|
12
|
+
code: string;
|
|
13
|
+
rolePermissions?: {
|
|
14
|
+
permissionId?: string;
|
|
15
|
+
permission?: {
|
|
16
|
+
id?: string;
|
|
17
|
+
code?: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
layer?: string;
|
|
20
|
+
} | null;
|
|
21
|
+
}[];
|
|
22
|
+
};
|
|
23
|
+
type GroupLike = {
|
|
24
|
+
id: string;
|
|
25
|
+
moduleAccess?: {
|
|
26
|
+
moduleKey: string;
|
|
27
|
+
access: 'read' | 'write';
|
|
28
|
+
}[] | null;
|
|
29
|
+
groupRoles?: {
|
|
30
|
+
role?: {
|
|
31
|
+
id?: string;
|
|
32
|
+
code?: string;
|
|
33
|
+
name?: string;
|
|
34
|
+
} | null;
|
|
35
|
+
}[];
|
|
36
|
+
};
|
|
37
|
+
export declare function buildDraftEffectivePermissions(input: {
|
|
38
|
+
roleCodes: string[];
|
|
39
|
+
groupIds: string[];
|
|
40
|
+
roles: RoleLike[];
|
|
41
|
+
groups: GroupLike[];
|
|
42
|
+
expandModuleAccess?: (rows: {
|
|
43
|
+
moduleKey: string;
|
|
44
|
+
access: 'read' | 'write';
|
|
45
|
+
}[]) => string[];
|
|
46
|
+
nameByCode?: Record<string, string>;
|
|
47
|
+
}): DraftEpPerm[];
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
function g(s, n, f, o) {
|
|
2
|
+
const d = (n || "").trim();
|
|
3
|
+
!d || s.has(d) || s.set(d, {
|
|
4
|
+
code: d,
|
|
5
|
+
name: (f || "").trim() || d,
|
|
6
|
+
layer: o || void 0
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
function m(s, n) {
|
|
10
|
+
if (n)
|
|
11
|
+
for (const f of n.rolePermissions || []) {
|
|
12
|
+
const o = f.permission;
|
|
13
|
+
o != null && o.code && g(s, o.code, o.name, o.layer);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function b(s) {
|
|
17
|
+
var d, t, a, l, i;
|
|
18
|
+
const n = new Map(s.roles.map((e) => [e.code, e])), f = new Map(s.roles.map((e) => [e.id, e])), o = /* @__PURE__ */ new Map();
|
|
19
|
+
for (const e of s.roleCodes)
|
|
20
|
+
m(o, n.get(e));
|
|
21
|
+
for (const e of s.groupIds) {
|
|
22
|
+
const r = s.groups.find((c) => c.id === e);
|
|
23
|
+
if (r) {
|
|
24
|
+
for (const c of r.groupRoles || []) {
|
|
25
|
+
const u = ((d = c.role) != null && d.id ? f.get(c.role.id) : void 0) || ((t = c.role) != null && t.code ? n.get(c.role.code) : void 0);
|
|
26
|
+
m(o, u);
|
|
27
|
+
}
|
|
28
|
+
if (s.expandModuleAccess && ((a = r.moduleAccess) != null && a.length))
|
|
29
|
+
for (const c of s.expandModuleAccess(r.moduleAccess))
|
|
30
|
+
g(o, c, (l = s.nameByCode) == null ? void 0 : l[c]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
for (const [e, r] of o) {
|
|
34
|
+
const c = (i = s.nameByCode) == null ? void 0 : i[e];
|
|
35
|
+
c && (!r.name || r.name === e) && o.set(e, { ...r, name: c });
|
|
36
|
+
}
|
|
37
|
+
return [...o.values()].sort((e, r) => e.code.localeCompare(r.code));
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
b as buildDraftEffectivePermissions
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=draftEffectivePermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draftEffectivePermissions.js","sources":["../../../../src/components/Iam/utils/draftEffectivePermissions.ts"],"sourcesContent":["/**\n * 用户权限弹层:按「当前勾选」的角色/共享组合并草稿 EP(未保存预览)。\n * 不含岗位/直绑;与 SSO getEffectivePermissions 保存后结果可能略有差异。\n */\n\nexport type DraftEpPerm = { code: string; name: string; layer?: string };\n\ntype RoleLike = {\n id: string;\n code: string;\n rolePermissions?: {\n permissionId?: string;\n permission?: { id?: string; code?: string; name?: string; layer?: string } | null;\n }[];\n};\n\ntype GroupLike = {\n id: string;\n moduleAccess?: { moduleKey: string; access: 'read' | 'write' }[] | null;\n groupRoles?: { role?: { id?: string; code?: string; name?: string } | null }[];\n};\n\nfunction addPerm(\n map: Map<string, DraftEpPerm>,\n code: string,\n name?: string | null,\n layer?: string | null,\n) {\n const c = (code || '').trim();\n if (!c || map.has(c)) return;\n map.set(c, {\n code: c,\n name: (name || '').trim() || c,\n layer: layer || undefined,\n });\n}\n\nfunction absorbRole(map: Map<string, DraftEpPerm>, role: RoleLike | undefined) {\n if (!role) return;\n for (const rp of role.rolePermissions || []) {\n const p = rp.permission;\n if (p?.code) addPerm(map, p.code, p.name, p.layer);\n }\n}\n\nexport function buildDraftEffectivePermissions(input: {\n roleCodes: string[];\n groupIds: string[];\n roles: RoleLike[];\n groups: GroupLike[];\n expandModuleAccess?: (rows: { moduleKey: string; access: 'read' | 'write' }[]) => string[];\n nameByCode?: Record<string, string>;\n}): DraftEpPerm[] {\n const byCode = new Map(input.roles.map((r) => [r.code, r]));\n const byId = new Map(input.roles.map((r) => [r.id, r]));\n const map = new Map<string, DraftEpPerm>();\n\n for (const code of input.roleCodes) {\n absorbRole(map, byCode.get(code));\n }\n\n for (const gid of input.groupIds) {\n const g = input.groups.find((x) => x.id === gid);\n if (!g) continue;\n for (const gr of g.groupRoles || []) {\n const role =\n (gr.role?.id ? byId.get(gr.role.id) : undefined) ||\n (gr.role?.code ? byCode.get(gr.role.code) : undefined);\n absorbRole(map, role);\n }\n if (input.expandModuleAccess && g.moduleAccess?.length) {\n for (const code of input.expandModuleAccess(g.moduleAccess)) {\n addPerm(map, code, input.nameByCode?.[code]);\n }\n }\n }\n\n for (const [code, row] of map) {\n const labeled = input.nameByCode?.[code];\n if (labeled && (!row.name || row.name === code)) {\n map.set(code, { ...row, name: labeled });\n }\n }\n\n return [...map.values()].sort((a, b) => a.code.localeCompare(b.code));\n}\n"],"names":["addPerm","map","code","name","layer","c","absorbRole","role","rp","p","buildDraftEffectivePermissions","input","_a","_b","_c","_d","_e","byCode","r","byId","gid","g","x","gr","row","labeled","a","b"],"mappings":"AAsBA,SAASA,EACPC,GACAC,GACAC,GACAC,GACA;AACA,QAAMC,KAAKH,KAAQ,IAAI,KAAA;AACvB,EAAI,CAACG,KAAKJ,EAAI,IAAII,CAAC,KACnBJ,EAAI,IAAII,GAAG;AAAA,IACT,MAAMA;AAAA,IACN,OAAOF,KAAQ,IAAI,KAAA,KAAUE;AAAA,IAC7B,OAAOD,KAAS;AAAA,EAAA,CACjB;AACH;AAEA,SAASE,EAAWL,GAA+BM,GAA4B;AAC7E,MAAKA;AACL,eAAWC,KAAMD,EAAK,mBAAmB,CAAA,GAAI;AAC3C,YAAME,IAAID,EAAG;AACb,MAAIC,KAAA,QAAAA,EAAG,QAAMT,EAAQC,GAAKQ,EAAE,MAAMA,EAAE,MAAMA,EAAE,KAAK;AAAA,IACnD;AACF;AAEO,SAASC,EAA+BC,GAO7B;AA9BlB,MAAAC,GAAAC,GAAAC,GAAAC,GAAAC;AA+BE,QAAMC,IAAS,IAAI,IAAIN,EAAM,MAAM,IAAI,CAACO,MAAM,CAACA,EAAE,MAAMA,CAAC,CAAC,CAAC,GACpDC,IAAO,IAAI,IAAIR,EAAM,MAAM,IAAI,CAACO,MAAM,CAACA,EAAE,IAAIA,CAAC,CAAC,CAAC,GAChDjB,wBAAU,IAAA;AAEhB,aAAWC,KAAQS,EAAM;AACvB,IAAAL,EAAWL,GAAKgB,EAAO,IAAIf,CAAI,CAAC;AAGlC,aAAWkB,KAAOT,EAAM,UAAU;AAChC,UAAMU,IAAIV,EAAM,OAAO,KAAK,CAACW,MAAMA,EAAE,OAAOF,CAAG;AAC/C,QAAKC,GACL;AAAA,iBAAWE,KAAMF,EAAE,cAAc,CAAA,GAAI;AACnC,cAAMd,MACHK,IAAAW,EAAG,SAAH,QAAAX,EAAS,KAAKO,EAAK,IAAII,EAAG,KAAK,EAAE,IAAI,aACrCV,IAAAU,EAAG,SAAH,QAAAV,EAAS,OAAOI,EAAO,IAAIM,EAAG,KAAK,IAAI,IAAI;AAC9C,QAAAjB,EAAWL,GAAKM,CAAI;AAAA,MACtB;AACA,UAAII,EAAM,wBAAsBG,IAAAO,EAAE,iBAAF,QAAAP,EAAgB;AAC9C,mBAAWZ,KAAQS,EAAM,mBAAmBU,EAAE,YAAY;AACxD,UAAArB,EAAQC,GAAKC,IAAMa,IAAAJ,EAAM,eAAN,gBAAAI,EAAmBb,EAAK;AAAA;AAAA,EAGjD;AAEA,aAAW,CAACA,GAAMsB,CAAG,KAAKvB,GAAK;AAC7B,UAAMwB,KAAUT,IAAAL,EAAM,eAAN,gBAAAK,EAAmBd;AACnC,IAAIuB,MAAY,CAACD,EAAI,QAAQA,EAAI,SAAStB,MACxCD,EAAI,IAAIC,GAAM,EAAE,GAAGsB,GAAK,MAAMC,GAAS;AAAA,EAE3C;AAEA,SAAO,CAAC,GAAGxB,EAAI,OAAA,CAAQ,EAAE,KAAK,CAACyB,GAAGC,MAAMD,EAAE,KAAK,cAAcC,EAAE,IAAI,CAAC;AACtE;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
/** 与 Assets 文件标签一致:最多展示 2 个,超出 +N */
|
|
3
|
+
export declare const MULTI_TAG_SHOW_LENGTH = 2;
|
|
4
|
+
type TagRenderProps = {
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
closable: boolean;
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
};
|
|
9
|
+
/** Form/antd Select 多选:SemanticTag + maxTagCount 防重叠 */
|
|
10
|
+
export declare const multiTagSelectProps: {
|
|
11
|
+
maxTagCount: number;
|
|
12
|
+
maxTagPlaceholder: (omitted: unknown[]) => string;
|
|
13
|
+
tagRender: ({ label, closable, onClose }: TagRenderProps) => import("react").JSX.Element;
|
|
14
|
+
};
|
|
15
|
+
export {};
|