@hkyhy/marsun-components-core 0.1.72 → 0.1.74

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.
@@ -1,7 +1,7 @@
1
1
  import { jsxs as c, jsx as o } from "react/jsx-runtime";
2
2
  import { message as g } from "antd";
3
- import { useState as i, useEffect as u, useMemo as p } from "react";
4
- import h from "../../Layout/ModulePageShell/index.js";
3
+ import { useState as i, useEffect as u, useMemo as h } from "react";
4
+ import p from "../../Layout/ModulePageShell/index.js";
5
5
  import S from "../../Alert/Alert.js";
6
6
  import O from "../../OrgTree/OrgTree.js";
7
7
  function l(r) {
@@ -20,12 +20,12 @@ function v({
20
20
  ssoOrgAdminUrl: e,
21
21
  title: t = "组织架构管理"
22
22
  }) {
23
- const [m, n] = i(!1), [s, d] = i([]);
23
+ const [m, s] = i(!1), [n, f] = i([]);
24
24
  u(() => {
25
- n(!0), r.listOrgUnits().then(d).catch((a) => g.error(a instanceof Error ? a.message : "加载失败")).finally(() => n(!1));
25
+ s(!0), r.listOrgUnits().then(f).catch((a) => g.error(a instanceof Error ? a.message : "加载失败")).finally(() => s(!1));
26
26
  }, [r]);
27
- const f = p(() => l(s), [s]);
28
- return /* @__PURE__ */ c(h, { title: t, children: [
27
+ const d = h(() => l(n), [n]);
28
+ return /* @__PURE__ */ c(p, { title: t, fillHeight: !1, children: [
29
29
  /* @__PURE__ */ o(
30
30
  S,
31
31
  {
@@ -36,7 +36,7 @@ function v({
36
36
  description: /* @__PURE__ */ o("a", { href: e, target: "_blank", rel: "noreferrer", children: "打开 SSO 组织" })
37
37
  }
38
38
  ),
39
- /* @__PURE__ */ o(O, { nodes: f, loading: m, editable: !1 })
39
+ /* @__PURE__ */ o(O, { nodes: d, loading: m, editable: !1 })
40
40
  ] });
41
41
  }
42
42
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"IamOrgPage.js","sources":["../../../../src/components/Iam/pages/IamOrgPage.tsx"],"sourcesContent":["import { Alert } from '@/components/Alert';\nimport { ModulePageShell } from '@/components/Layout';\nimport { OrgTree, type OrgTreeNode } from '@/components/OrgTree';\nimport { message } from 'antd';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { IamClient } from '../client';\nimport type { IamOrgUnit } from '../types';\n\nfunction toNodes(nodes: IamOrgUnit[]): OrgTreeNode[] {\n return nodes.map((n) => ({\n id: n.id,\n name: n.name,\n parentId: n.parentId ?? null,\n children: n.children?.length ? toNodes(n.children) : undefined,\n }));\n}\n\nexport type IamOrgPageProps = {\n client: IamClient;\n /** SSO Admin 组织维护页 URL(由 App 用 AUTH_LOGIN_URL 推导) */\n ssoOrgAdminUrl: string;\n title?: string;\n};\n\nexport default function IamOrgPage({\n client,\n ssoOrgAdminUrl,\n title = '组织架构管理',\n}: IamOrgPageProps) {\n const [loading, setLoading] = useState(false);\n const [tree, setTree] = useState<IamOrgUnit[]>([]);\n\n useEffect(() => {\n setLoading(true);\n void client\n .listOrgUnits()\n .then(setTree)\n .catch((e) => message.error(e instanceof Error ? e.message : '加载失败'))\n .finally(() => setLoading(false));\n }, [client]);\n\n const nodes = useMemo(() => toNodes(tree), [tree]);\n\n return (\n <ModulePageShell title={title}>\n <Alert\n type=\"info\"\n showIcon\n style={{ marginBottom: 16 }}\n message=\"组织架构请在 SSO 维护\"\n description={\n <a href={ssoOrgAdminUrl} target=\"_blank\" rel=\"noreferrer\">\n 打开 SSO 组织\n </a>\n }\n />\n <OrgTree nodes={nodes} loading={loading} editable={false} />\n </ModulePageShell>\n );\n}\n"],"names":["toNodes","nodes","n","_a","IamOrgPage","client","ssoOrgAdminUrl","title","loading","setLoading","useState","tree","setTree","useEffect","e","message","useMemo","jsxs","ModulePageShell","jsx","Alert","OrgTree"],"mappings":";;;;;;AAQA,SAASA,EAAQC,GAAoC;AACnD,SAAOA,EAAM,IAAI,CAACC,MAAA;;AAAO;AAAA,MACvB,IAAIA,EAAE;AAAA,MACN,MAAMA,EAAE;AAAA,MACR,UAAUA,EAAE,YAAY;AAAA,MACxB,WAAUC,IAAAD,EAAE,aAAF,QAAAC,EAAY,SAASH,EAAQE,EAAE,QAAQ,IAAI;AAAA,IAAA;AAAA,GACrD;AACJ;AASA,SAAwBE,EAAW;AAAA,EACjC,QAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC,IAAQ;AACV,GAAoB;AAClB,QAAM,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtC,CAACC,GAAMC,CAAO,IAAIF,EAAuB,CAAA,CAAE;AAEjD,EAAAG,EAAU,MAAM;AACd,IAAAJ,EAAW,EAAI,GACVJ,EACF,eACA,KAAKO,CAAO,EACZ,MAAM,CAACE,MAAMC,EAAQ,MAAMD,aAAa,QAAQA,EAAE,UAAU,MAAM,CAAC,EACnE,QAAQ,MAAML,EAAW,EAAK,CAAC;AAAA,EACpC,GAAG,CAACJ,CAAM,CAAC;AAEX,QAAMJ,IAAQe,EAAQ,MAAMhB,EAAQW,CAAI,GAAG,CAACA,CAAI,CAAC;AAEjD,SACE,gBAAAM,EAACC,KAAgB,OAAAX,GACf,UAAA;AAAA,IAAA,gBAAAY;AAAA,MAACC;AAAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAQ;AAAA,QACR,OAAO,EAAE,cAAc,GAAA;AAAA,QACvB,SAAQ;AAAA,QACR,+BACG,KAAA,EAAE,MAAMd,GAAgB,QAAO,UAAS,KAAI,cAAa,UAAA,YAAA,CAE1D;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJ,gBAAAa,EAACE,GAAA,EAAQ,OAAApB,GAAc,SAAAO,GAAkB,UAAU,GAAA,CAAO;AAAA,EAAA,GAC5D;AAEJ;"}
1
+ {"version":3,"file":"IamOrgPage.js","sources":["../../../../src/components/Iam/pages/IamOrgPage.tsx"],"sourcesContent":["import { Alert } from '@/components/Alert';\nimport { ModulePageShell } from '@/components/Layout';\nimport { OrgTree, type OrgTreeNode } from '@/components/OrgTree';\nimport { message } from 'antd';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { IamClient } from '../client';\nimport type { IamOrgUnit } from '../types';\n\nfunction toNodes(nodes: IamOrgUnit[]): OrgTreeNode[] {\n return nodes.map((n) => ({\n id: n.id,\n name: n.name,\n parentId: n.parentId ?? null,\n children: n.children?.length ? toNodes(n.children) : undefined,\n }));\n}\n\nexport type IamOrgPageProps = {\n client: IamClient;\n /** SSO Admin 组织维护页 URL(由 App 用 AUTH_LOGIN_URL 推导) */\n ssoOrgAdminUrl: string;\n title?: string;\n};\n\nexport default function IamOrgPage({\n client,\n ssoOrgAdminUrl,\n title = '组织架构管理',\n}: IamOrgPageProps) {\n const [loading, setLoading] = useState(false);\n const [tree, setTree] = useState<IamOrgUnit[]>([]);\n\n useEffect(() => {\n setLoading(true);\n void client\n .listOrgUnits()\n .then(setTree)\n .catch((e) => message.error(e instanceof Error ? e.message : '加载失败'))\n .finally(() => setLoading(false));\n }, [client]);\n\n const nodes = useMemo(() => toNodes(tree), [tree]);\n\n return (\n <ModulePageShell title={title} fillHeight={false}>\n <Alert\n type=\"info\"\n showIcon\n style={{ marginBottom: 16 }}\n message=\"组织架构请在 SSO 维护\"\n description={\n <a href={ssoOrgAdminUrl} target=\"_blank\" rel=\"noreferrer\">\n 打开 SSO 组织\n </a>\n }\n />\n <OrgTree nodes={nodes} loading={loading} editable={false} />\n </ModulePageShell>\n );\n}\n"],"names":["toNodes","nodes","n","_a","IamOrgPage","client","ssoOrgAdminUrl","title","loading","setLoading","useState","tree","setTree","useEffect","e","message","useMemo","jsxs","ModulePageShell","jsx","Alert","OrgTree"],"mappings":";;;;;;AAQA,SAASA,EAAQC,GAAoC;AACnD,SAAOA,EAAM,IAAI,CAACC,MAAA;;AAAO;AAAA,MACvB,IAAIA,EAAE;AAAA,MACN,MAAMA,EAAE;AAAA,MACR,UAAUA,EAAE,YAAY;AAAA,MACxB,WAAUC,IAAAD,EAAE,aAAF,QAAAC,EAAY,SAASH,EAAQE,EAAE,QAAQ,IAAI;AAAA,IAAA;AAAA,GACrD;AACJ;AASA,SAAwBE,EAAW;AAAA,EACjC,QAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC,IAAQ;AACV,GAAoB;AAClB,QAAM,CAACC,GAASC,CAAU,IAAIC,EAAS,EAAK,GACtC,CAACC,GAAMC,CAAO,IAAIF,EAAuB,CAAA,CAAE;AAEjD,EAAAG,EAAU,MAAM;AACd,IAAAJ,EAAW,EAAI,GACVJ,EACF,eACA,KAAKO,CAAO,EACZ,MAAM,CAACE,MAAMC,EAAQ,MAAMD,aAAa,QAAQA,EAAE,UAAU,MAAM,CAAC,EACnE,QAAQ,MAAML,EAAW,EAAK,CAAC;AAAA,EACpC,GAAG,CAACJ,CAAM,CAAC;AAEX,QAAMJ,IAAQe,EAAQ,MAAMhB,EAAQW,CAAI,GAAG,CAACA,CAAI,CAAC;AAEjD,SACE,gBAAAM,EAACC,GAAA,EAAgB,OAAAX,GAAc,YAAY,IACzC,UAAA;AAAA,IAAA,gBAAAY;AAAA,MAACC;AAAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAQ;AAAA,QACR,OAAO,EAAE,cAAc,GAAA;AAAA,QACvB,SAAQ;AAAA,QACR,+BACG,KAAA,EAAE,MAAMd,GAAgB,QAAO,UAAS,KAAI,cAAa,UAAA,YAAA,CAE1D;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJ,gBAAAa,EAACE,GAAA,EAAQ,OAAApB,GAAc,SAAAO,GAAkB,UAAU,GAAA,CAAO;AAAA,EAAA,GAC5D;AAEJ;"}
@@ -1,8 +1,8 @@
1
1
  import { jsxs as R, jsx as r } from "react/jsx-runtime";
2
- import { message as d, Typography as T, Empty as V, Form as x, Table as W, Space as Y, Button as B, Modal as G, Input as M } from "antd";
3
- import { useState as a, useRef as H, useEffect as _, useMemo as F, useCallback as j } from "react";
4
- import { useParams as J, useNavigate as U } from "react-router-dom";
5
- import $ from "../../Layout/ModulePageShell/index.js";
2
+ import { message as d, Typography as T, Empty as N, Form as x, Table as V, Space as W, Button as B, Modal as Y, Input as M } from "antd";
3
+ import { useState as a, useRef as G, useEffect as _, useMemo as F, useCallback as j } from "react";
4
+ import { useParams as J, useNavigate as H } from "react-router-dom";
5
+ import U from "../../Layout/ModulePageShell/index.js";
6
6
  import Q from "../../PermissionBindPanel/PermissionBindPanel.js";
7
7
  function z(n) {
8
8
  const m = (n || "").trim();
@@ -14,7 +14,7 @@ function ne({
14
14
  rolePermissionsPath: S,
15
15
  title: k = "角色管理"
16
16
  }) {
17
- const P = U(), f = S ?? ((s) => `${m}/${s}/permissions`), [b, C] = a(!1), [o, E] = a([]), [y, h] = a(!1), [u, w] = a(null), [t] = x.useForm(), p = j(async () => {
17
+ const P = H(), f = S ?? ((s) => `${m}/${s}/permissions`), [b, C] = a(!1), [o, E] = a([]), [y, h] = a(!1), [u, w] = a(null), [t] = x.useForm(), p = j(async () => {
18
18
  C(!0);
19
19
  try {
20
20
  E(await n.listRoles());
@@ -39,9 +39,9 @@ function ne({
39
39
  ],
40
40
  [t]
41
41
  );
42
- return /* @__PURE__ */ R($, { title: k, actions: v, children: [
42
+ return /* @__PURE__ */ R(U, { title: k, actions: v, fillHeight: !1, children: [
43
43
  /* @__PURE__ */ r(
44
- W,
44
+ V,
45
45
  {
46
46
  rowKey: "id",
47
47
  loading: b,
@@ -65,7 +65,7 @@ function ne({
65
65
  {
66
66
  title: "操作",
67
67
  key: "ops",
68
- render: (s, e) => /* @__PURE__ */ R(Y, { children: [
68
+ render: (s, e) => /* @__PURE__ */ R(W, { children: [
69
69
  /* @__PURE__ */ r(B, { type: "link", size: "small", onClick: () => P(f(e.id)), children: "权限管理" }),
70
70
  /* @__PURE__ */ r(
71
71
  B,
@@ -104,7 +104,7 @@ function ne({
104
104
  }
105
105
  ),
106
106
  /* @__PURE__ */ r(
107
- G,
107
+ Y,
108
108
  {
109
109
  open: y,
110
110
  title: u ? "编辑角色" : "新增角色",
@@ -135,20 +135,20 @@ function re({
135
135
  emptyCatalogHint: b = "暂无权限点;请先在 SSO 导入本应用目录。",
136
136
  title: C = "权限管理"
137
137
  }) {
138
- const { id: o } = J(), E = U(), [y, h] = a(null), [u, w] = a([]), [t, p] = a([]), v = H(t);
138
+ const { id: o } = J(), E = H(), [y, h] = a(null), [u, w] = a([]), [t, p] = a([]), v = G(t);
139
139
  v.current = t;
140
140
  const [s, e] = a(!1), [l, O] = a(!1);
141
141
  _(() => {
142
- o && (e(!0), Promise.all([n.listRoles(), n.listPermissions()]).then(([i, L]) => {
142
+ o && (e(!0), Promise.all([n.listRoles(), n.listPermissions()]).then(([i, K]) => {
143
143
  const I = i.find((c) => c.id === o) || null;
144
144
  h(I);
145
- const N = L.filter(
145
+ const L = K.filter(
146
146
  (c) => {
147
147
  var g;
148
148
  return c.layer !== "RESOURCE" && (!c.systemAppId || ((g = c.systemApp) == null ? void 0 : g.code) === k);
149
149
  }
150
150
  );
151
- w(N), p(
151
+ w(L), p(
152
152
  ((I == null ? void 0 : I.rolePermissions) || []).map((c) => {
153
153
  var g;
154
154
  return c.permissionId || ((g = c.permission) == null ? void 0 : g.id) || "";
@@ -156,7 +156,7 @@ function re({
156
156
  );
157
157
  }).catch((i) => d.error(i instanceof Error ? i.message : "加载失败")).finally(() => e(!1)));
158
158
  }, [o, n, k]);
159
- const q = F(
159
+ const $ = F(
160
160
  () => u.map((i) => ({
161
161
  id: i.id,
162
162
  code: i.code,
@@ -164,9 +164,9 @@ function re({
164
164
  layer: i.layer
165
165
  })),
166
166
  [u]
167
- ), D = j((i) => {
167
+ ), q = j((i) => {
168
168
  p(i);
169
- }, []), K = F(
169
+ }, []), D = F(
170
170
  () => [
171
171
  {
172
172
  children: "返回",
@@ -196,19 +196,19 @@ function re({
196
196
  ],
197
197
  [o, E, l, n, P, f]
198
198
  );
199
- return /* @__PURE__ */ R($, { title: C, actions: K, spinning: s, children: [
199
+ return /* @__PURE__ */ R(U, { title: C, actions: D, spinning: s, fillHeight: !1, children: [
200
200
  /* @__PURE__ */ R(T.Paragraph, { style: { marginTop: 0 }, children: [
201
201
  "角色名称:",
202
202
  (y == null ? void 0 : y.name) || "—"
203
203
  ] }),
204
204
  /* @__PURE__ */ r(T.Paragraph, { type: "secondary", children: "按页面模块 → 分类 → 功能点勾选(中文目录来自 bindCatalog)。须先勾选「进入应用」SYSTEM 入口。RESOURCE 不在此绑定。" }),
205
- u.length === 0 && !s ? /* @__PURE__ */ r(V, { description: b }) : /* @__PURE__ */ r(
205
+ u.length === 0 && !s ? /* @__PURE__ */ r(N, { description: b }) : /* @__PURE__ */ r(
206
206
  Q,
207
207
  {
208
208
  catalog: m,
209
- permissions: q,
209
+ permissions: $,
210
210
  value: t,
211
- onChange: D,
211
+ onChange: q,
212
212
  systemEntryCodes: [...S]
213
213
  }
214
214
  )
@@ -1 +1 @@
1
- {"version":3,"file":"IamRolesPage.js","sources":["../../../../src/components/Iam/pages/IamRolesPage.tsx"],"sourcesContent":["import { ModulePageShell } from '@/components/Layout';\nimport { PermissionBindPanel, type PermissionBindCatalog } from '@/components/PermissionBindPanel';\nimport { Button, Empty, Form, Input, Modal, Space, Table, Typography, message } from 'antd';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport type { IamClient } from '../client';\nimport type { IamPermission, IamRole } from '../types';\n\n/** 隐藏矩阵 sync 运维 provenance,不当作用户可读描述 */\nexport function displayRoleDescription(v: string | null | undefined): string {\n const t = (v || '').trim();\n if (!t) return '—';\n if (/^(Synced from .+ role matrix|S3 Wave2 pilot matrix)/i.test(t)) return '—';\n return t;\n}\n\nexport type IamRolesPageProps = {\n client: IamClient;\n /** 角色列表路由,默认 `/config/iam/roles` */\n rolesListPath?: string;\n /** 绑权页路径工厂 */\n rolePermissionsPath?: (roleId: string) => string;\n title?: string;\n};\n\nexport function IamRolesPage({\n client,\n rolesListPath = '/config/iam/roles',\n rolePermissionsPath,\n title = '角色管理',\n}: IamRolesPageProps) {\n const navigate = useNavigate();\n const resolvePermPath =\n rolePermissionsPath ?? ((id: string) => `${rolesListPath}/${id}/permissions`);\n const [loading, setLoading] = useState(false);\n const [rows, setRows] = useState<IamRole[]>([]);\n const [open, setOpen] = useState(false);\n const [editing, setEditing] = useState<IamRole | null>(null);\n const [form] = Form.useForm();\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n setRows(await client.listRoles());\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}>\n <Table\n rowKey=\"id\"\n loading={loading}\n dataSource={rows}\n columns={[\n { title: '角色名称', dataIndex: 'name' },\n { title: '编码', dataIndex: 'code' },\n {\n title: '描述',\n dataIndex: 'description',\n render: (v: string | null) => displayRoleDescription(v),\n },\n {\n title: '用户数',\n key: 'uc',\n render: (_: unknown, r: IamRole) => r._count?.userRoles ?? '—',\n },\n {\n title: '操作',\n key: 'ops',\n render: (_: unknown, r: IamRole) => (\n <Space>\n <Button type=\"link\" size=\"small\" onClick={() => navigate(resolvePermPath(r.id))}>\n 权限管理\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n onClick={() => {\n setEditing(r);\n form.setFieldsValue({\n name: r.name,\n description:\n displayRoleDescription(r.description) === '—' ? '' : r.description || '',\n });\n setOpen(true);\n }}\n >\n 编辑\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n danger\n disabled={Boolean(r.isBuiltin)}\n onClick={async () => {\n try {\n await client.deleteRole(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 <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.updateRole(editing.id, values);\n } else {\n await client.createRole(values);\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 <Form.Item name=\"name\" label=\"角色名称\" rules={[{ required: true }]}>\n <Input placeholder=\"请输入角色名称\" />\n </Form.Item>\n <Form.Item name=\"description\" label=\"角色描述\">\n <Input.TextArea placeholder=\"请输入角色描述\" rows={3} />\n </Form.Item>\n </Form>\n </Modal>\n </ModulePageShell>\n );\n}\n\nexport type IamRolePermissionsPageProps = {\n client: IamClient;\n catalog: PermissionBindCatalog;\n systemEntryCodes: readonly string[];\n systemAppCode: string;\n rolesListPath?: string;\n onAfterSave?: () => void | Promise<void>;\n emptyCatalogHint?: string;\n title?: string;\n};\n\nexport function IamRolePermissionsPage({\n client,\n catalog,\n systemEntryCodes,\n systemAppCode,\n rolesListPath = '/config/iam/roles',\n onAfterSave,\n emptyCatalogHint = '暂无权限点;请先在 SSO 导入本应用目录。',\n title = '权限管理',\n}: IamRolePermissionsPageProps) {\n const { id } = useParams();\n const navigate = useNavigate();\n const [role, setRole] = useState<IamRole | null>(null);\n const [perms, setPerms] = useState<IamPermission[]>([]);\n const [checked, setChecked] = useState<string[]>([]);\n const checkedRef = useRef(checked);\n checkedRef.current = checked;\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n if (!id) return;\n setLoading(true);\n void Promise.all([client.listRoles(), client.listPermissions()])\n .then(([roles, allPerms]) => {\n const r = roles.find((x) => x.id === id) || null;\n setRole(r);\n const appPerms = allPerms.filter(\n (p) => p.layer !== 'RESOURCE' && (!p.systemAppId || p.systemApp?.code === systemAppCode),\n );\n setPerms(appPerms);\n setChecked(\n (r?.rolePermissions || [])\n .map((x) => x.permissionId || x.permission?.id || '')\n .filter(Boolean),\n );\n })\n .catch((e) => message.error(e instanceof Error ? e.message : '加载失败'))\n .finally(() => setLoading(false));\n }, [id, client, systemAppCode]);\n\n const panelPermissions = useMemo(\n () =>\n perms.map((p) => ({\n id: p.id,\n code: p.code,\n name: p.name,\n layer: p.layer,\n })),\n [perms],\n );\n\n const onCheckedChange = useCallback((next: string[]) => {\n setChecked(next);\n }, []);\n\n const headerActions = useMemo(\n () => [\n {\n children: '返回',\n onClick: () => navigate(rolesListPath),\n },\n {\n children: '保存',\n type: 'primary' as const,\n loading: saving,\n onClick: async () => {\n if (!id) return;\n setSaving(true);\n try {\n await client.setRolePermissions(id, checkedRef.current.filter(Boolean));\n message.success('已保存');\n try {\n await onAfterSave?.();\n } catch {\n /* ignore EP refresh */\n }\n } catch (e) {\n message.error(e instanceof Error ? e.message : '保存失败');\n } finally {\n setSaving(false);\n }\n },\n },\n ],\n [id, navigate, saving, client, rolesListPath, onAfterSave],\n );\n\n return (\n <ModulePageShell title={title} actions={headerActions} spinning={loading}>\n <Typography.Paragraph style={{ marginTop: 0 }}>\n 角色名称:{role?.name || '—'}\n </Typography.Paragraph>\n <Typography.Paragraph type=\"secondary\">\n 按页面模块 → 分类 → 功能点勾选(中文目录来自 bindCatalog)。须先勾选「进入应用」SYSTEM\n 入口。RESOURCE 不在此绑定。\n </Typography.Paragraph>\n {perms.length === 0 && !loading ? (\n <Empty description={emptyCatalogHint} />\n ) : (\n <PermissionBindPanel\n catalog={catalog}\n permissions={panelPermissions}\n value={checked}\n onChange={onCheckedChange}\n systemEntryCodes={[...systemEntryCodes]}\n />\n )}\n </ModulePageShell>\n );\n}\n"],"names":["displayRoleDescription","v","t","IamRolesPage","client","rolesListPath","rolePermissionsPath","title","navigate","useNavigate","resolvePermPath","id","loading","setLoading","useState","rows","setRows","open","setOpen","editing","setEditing","form","Form","load","useCallback","e","message","useEffect","headerActions","useMemo","jsxs","ModulePageShell","jsx","Table","_","r","_a","Space","Button","Modal","values","Input","IamRolePermissionsPage","catalog","systemEntryCodes","systemAppCode","onAfterSave","emptyCatalogHint","useParams","role","setRole","perms","setPerms","checked","setChecked","checkedRef","useRef","saving","setSaving","roles","allPerms","x","appPerms","p","panelPermissions","onCheckedChange","next","Typography","Empty","PermissionBindPanel"],"mappings":"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"}
1
+ {"version":3,"file":"IamRolesPage.js","sources":["../../../../src/components/Iam/pages/IamRolesPage.tsx"],"sourcesContent":["import { ModulePageShell } from '@/components/Layout';\nimport { PermissionBindPanel, type PermissionBindCatalog } from '@/components/PermissionBindPanel';\nimport { Button, Empty, Form, Input, Modal, Space, Table, Typography, message } from 'antd';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport type { IamClient } from '../client';\nimport type { IamPermission, IamRole } from '../types';\n\n/** 隐藏矩阵 sync 运维 provenance,不当作用户可读描述 */\nexport function displayRoleDescription(v: string | null | undefined): string {\n const t = (v || '').trim();\n if (!t) return '—';\n if (/^(Synced from .+ role matrix|S3 Wave2 pilot matrix)/i.test(t)) return '—';\n return t;\n}\n\nexport type IamRolesPageProps = {\n client: IamClient;\n /** 角色列表路由,默认 `/config/iam/roles` */\n rolesListPath?: string;\n /** 绑权页路径工厂 */\n rolePermissionsPath?: (roleId: string) => string;\n title?: string;\n};\n\nexport function IamRolesPage({\n client,\n rolesListPath = '/config/iam/roles',\n rolePermissionsPath,\n title = '角色管理',\n}: IamRolesPageProps) {\n const navigate = useNavigate();\n const resolvePermPath =\n rolePermissionsPath ?? ((id: string) => `${rolesListPath}/${id}/permissions`);\n const [loading, setLoading] = useState(false);\n const [rows, setRows] = useState<IamRole[]>([]);\n const [open, setOpen] = useState(false);\n const [editing, setEditing] = useState<IamRole | null>(null);\n const [form] = Form.useForm();\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n setRows(await client.listRoles());\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 {\n title: '描述',\n dataIndex: 'description',\n render: (v: string | null) => displayRoleDescription(v),\n },\n {\n title: '用户数',\n key: 'uc',\n render: (_: unknown, r: IamRole) => r._count?.userRoles ?? '—',\n },\n {\n title: '操作',\n key: 'ops',\n render: (_: unknown, r: IamRole) => (\n <Space>\n <Button type=\"link\" size=\"small\" onClick={() => navigate(resolvePermPath(r.id))}>\n 权限管理\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n onClick={() => {\n setEditing(r);\n form.setFieldsValue({\n name: r.name,\n description:\n displayRoleDescription(r.description) === '—' ? '' : r.description || '',\n });\n setOpen(true);\n }}\n >\n 编辑\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n danger\n disabled={Boolean(r.isBuiltin)}\n onClick={async () => {\n try {\n await client.deleteRole(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 <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.updateRole(editing.id, values);\n } else {\n await client.createRole(values);\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 <Form.Item name=\"name\" label=\"角色名称\" rules={[{ required: true }]}>\n <Input placeholder=\"请输入角色名称\" />\n </Form.Item>\n <Form.Item name=\"description\" label=\"角色描述\">\n <Input.TextArea placeholder=\"请输入角色描述\" rows={3} />\n </Form.Item>\n </Form>\n </Modal>\n </ModulePageShell>\n );\n}\n\nexport type IamRolePermissionsPageProps = {\n client: IamClient;\n catalog: PermissionBindCatalog;\n systemEntryCodes: readonly string[];\n systemAppCode: string;\n rolesListPath?: string;\n onAfterSave?: () => void | Promise<void>;\n emptyCatalogHint?: string;\n title?: string;\n};\n\nexport function IamRolePermissionsPage({\n client,\n catalog,\n systemEntryCodes,\n systemAppCode,\n rolesListPath = '/config/iam/roles',\n onAfterSave,\n emptyCatalogHint = '暂无权限点;请先在 SSO 导入本应用目录。',\n title = '权限管理',\n}: IamRolePermissionsPageProps) {\n const { id } = useParams();\n const navigate = useNavigate();\n const [role, setRole] = useState<IamRole | null>(null);\n const [perms, setPerms] = useState<IamPermission[]>([]);\n const [checked, setChecked] = useState<string[]>([]);\n const checkedRef = useRef(checked);\n checkedRef.current = checked;\n const [loading, setLoading] = useState(false);\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n if (!id) return;\n setLoading(true);\n void Promise.all([client.listRoles(), client.listPermissions()])\n .then(([roles, allPerms]) => {\n const r = roles.find((x) => x.id === id) || null;\n setRole(r);\n const appPerms = allPerms.filter(\n (p) => p.layer !== 'RESOURCE' && (!p.systemAppId || p.systemApp?.code === systemAppCode),\n );\n setPerms(appPerms);\n setChecked(\n (r?.rolePermissions || [])\n .map((x) => x.permissionId || x.permission?.id || '')\n .filter(Boolean),\n );\n })\n .catch((e) => message.error(e instanceof Error ? e.message : '加载失败'))\n .finally(() => setLoading(false));\n }, [id, client, systemAppCode]);\n\n const panelPermissions = useMemo(\n () =>\n perms.map((p) => ({\n id: p.id,\n code: p.code,\n name: p.name,\n layer: p.layer,\n })),\n [perms],\n );\n\n const onCheckedChange = useCallback((next: string[]) => {\n setChecked(next);\n }, []);\n\n const headerActions = useMemo(\n () => [\n {\n children: '返回',\n onClick: () => navigate(rolesListPath),\n },\n {\n children: '保存',\n type: 'primary' as const,\n loading: saving,\n onClick: async () => {\n if (!id) return;\n setSaving(true);\n try {\n await client.setRolePermissions(id, checkedRef.current.filter(Boolean));\n message.success('已保存');\n try {\n await onAfterSave?.();\n } catch {\n /* ignore EP refresh */\n }\n } catch (e) {\n message.error(e instanceof Error ? e.message : '保存失败');\n } finally {\n setSaving(false);\n }\n },\n },\n ],\n [id, navigate, saving, client, rolesListPath, onAfterSave],\n );\n\n return (\n <ModulePageShell title={title} actions={headerActions} spinning={loading} fillHeight={false}>\n <Typography.Paragraph style={{ marginTop: 0 }}>\n 角色名称:{role?.name || '—'}\n </Typography.Paragraph>\n <Typography.Paragraph type=\"secondary\">\n 按页面模块 → 分类 → 功能点勾选(中文目录来自 bindCatalog)。须先勾选「进入应用」SYSTEM\n 入口。RESOURCE 不在此绑定。\n </Typography.Paragraph>\n {perms.length === 0 && !loading ? (\n <Empty description={emptyCatalogHint} />\n ) : (\n <PermissionBindPanel\n catalog={catalog}\n permissions={panelPermissions}\n value={checked}\n onChange={onCheckedChange}\n systemEntryCodes={[...systemEntryCodes]}\n />\n )}\n </ModulePageShell>\n );\n}\n"],"names":["displayRoleDescription","v","t","IamRolesPage","client","rolesListPath","rolePermissionsPath","title","navigate","useNavigate","resolvePermPath","id","loading","setLoading","useState","rows","setRows","open","setOpen","editing","setEditing","form","Form","load","useCallback","e","message","useEffect","headerActions","useMemo","ModulePageShell","jsx","Table","_","r","_a","Space","Button","Modal","values","jsxs","Input","IamRolePermissionsPage","catalog","systemEntryCodes","systemAppCode","onAfterSave","emptyCatalogHint","useParams","role","setRole","perms","setPerms","checked","setChecked","checkedRef","useRef","saving","setSaving","roles","allPerms","x","appPerms","p","panelPermissions","onCheckedChange","next","Typography","Empty","PermissionBindPanel"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { jsxs as y, jsx as r, Fragment as j } from "react/jsx-runtime";
2
- import { Form as c, message as o, Table as P, Space as q, Button as g, Modal as S, Input as b, Select as w } from "antd";
1
+ import { jsxs as g, jsx as r, Fragment as j } from "react/jsx-runtime";
2
+ import { Form as c, message as o, Table as P, Space as q, Button as y, Modal as S, Input as b, Select as w } from "antd";
3
3
  import { useState as l, useCallback as B, useEffect as T, useMemo as U } from "react";
4
4
  import D from "../../Layout/ModulePageShell/index.js";
5
- function H({
5
+ function V({
6
6
  client: t,
7
7
  title: C = "共享组"
8
8
  }) {
@@ -36,7 +36,7 @@ function H({
36
36
  ],
37
37
  [p]
38
38
  );
39
- return /* @__PURE__ */ y(D, { title: C, actions: R, children: [
39
+ return /* @__PURE__ */ g(D, { title: C, actions: R, fillHeight: !1, children: [
40
40
  /* @__PURE__ */ r(
41
41
  P,
42
42
  {
@@ -66,9 +66,9 @@ function H({
66
66
  {
67
67
  title: "操作",
68
68
  key: "ops",
69
- render: (e, s) => /* @__PURE__ */ y(q, { children: [
69
+ render: (e, s) => /* @__PURE__ */ g(q, { children: [
70
70
  /* @__PURE__ */ r(
71
- g,
71
+ y,
72
72
  {
73
73
  type: "link",
74
74
  size: "small",
@@ -82,7 +82,7 @@ function H({
82
82
  }
83
83
  ),
84
84
  /* @__PURE__ */ r(
85
- g,
85
+ y,
86
86
  {
87
87
  type: "link",
88
88
  size: "small",
@@ -93,7 +93,7 @@ function H({
93
93
  }
94
94
  ),
95
95
  /* @__PURE__ */ r(
96
- g,
96
+ y,
97
97
  {
98
98
  type: "link",
99
99
  size: "small",
@@ -135,7 +135,7 @@ function H({
135
135
  o.error(s instanceof Error ? s.message : "失败");
136
136
  }
137
137
  },
138
- children: /* @__PURE__ */ y(c, { form: p, layout: "vertical", children: [
138
+ children: /* @__PURE__ */ g(c, { form: p, layout: "vertical", children: [
139
139
  m ? null : /* @__PURE__ */ r(c.Item, { name: "code", label: "编码", rules: [{ required: !0 }], children: /* @__PURE__ */ r(b, {}) }),
140
140
  /* @__PURE__ */ r(c.Item, { name: "name", label: "名称", rules: [{ required: !0 }], children: /* @__PURE__ */ r(b, {}) }),
141
141
  /* @__PURE__ */ r(c.Item, { name: "description", label: "说明", children: /* @__PURE__ */ r(b.TextArea, { rows: 2 }) }),
@@ -163,9 +163,9 @@ function H({
163
163
  o.error(e instanceof Error ? e.message : "失败");
164
164
  }
165
165
  },
166
- footer: (e, { OkBtn: s, CancelBtn: a }) => /* @__PURE__ */ y(j, { children: [
166
+ footer: (e, { OkBtn: s, CancelBtn: a }) => /* @__PURE__ */ g(j, { children: [
167
167
  /* @__PURE__ */ r(
168
- g,
168
+ y,
169
169
  {
170
170
  danger: !0,
171
171
  disabled: !u.length || !n,
@@ -202,6 +202,6 @@ function H({
202
202
  ] });
203
203
  }
204
204
  export {
205
- H as default
205
+ V as default
206
206
  };
207
207
  //# sourceMappingURL=IamSharedGroupsPage.js.map
@@ -1 +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}>\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","jsxs","ModulePageShell","jsx","Table","v","_","_a","Space","Button","e","Modal","values","Input","Select","OkBtn","CancelBtn","Fragment"],"mappings":"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"}
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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"}
@@ -1,11 +1,11 @@
1
1
  import { jsxs as b, jsx as t } from "react/jsx-runtime";
2
- import { message as f, Space as L, Button as V, Typography as z } from "antd";
2
+ import { message as y, Space as L, Button as V, Typography as z } from "antd";
3
3
  import { useState as n, useMemo as d, useCallback as D, useEffect as de } from "react";
4
4
  import { catalogToItems as H } from "../utils/catalogToItems.js";
5
5
  import { buildDraftEffectivePermissions as ce } from "../utils/draftEffectivePermissions.js";
6
6
  import { multiTagSelectProps as $, MULTI_TAG_SHOW_LENGTH as pe } from "../utils/multiTagSelect.js";
7
- import { roleSelectOption as ue, roleDisplayName as ye } from "../utils/roleDisplay.js";
8
- import fe from "../../ReactFilter/getFilterValue.js";
7
+ import { roleSelectOption as ue, roleDisplayName as fe } from "../utils/roleDisplay.js";
8
+ import ye from "../../ReactFilter/getFilterValue.js";
9
9
  import "../../ReactFilter/entry.js";
10
10
  import ge from "../../Layout/ModulePageShell/index.js";
11
11
  import he from "../../ReactFilter/Filter.js";
@@ -19,40 +19,40 @@ import Pe from "../../PermissionBindPanel/PermissionBindPanel.js";
19
19
  import Te from "../../Tag/Tags/index.js";
20
20
  import { SEMANTIC_COLORS as ke } from "../../Tag/SemanticTag.js";
21
21
  const Fe = he, Oe = 420;
22
- function Re(s) {
22
+ function Re(l) {
23
23
  var g, h;
24
- const c = (g = s.roles) != null && g.length ? /* @__PURE__ */ t(
24
+ const c = (g = l.roles) != null && g.length ? /* @__PURE__ */ t(
25
25
  Te,
26
26
  {
27
- tags: s.roles.map((u) => ye(u)),
27
+ tags: l.roles.map((u) => fe(u)),
28
28
  showLength: pe,
29
29
  color: ke.INFO,
30
30
  empty: "—"
31
31
  }
32
32
  ) : "—";
33
33
  return [
34
- { label: "工号", value: s.employeeId || "—" },
35
- { label: "姓名", value: s.displayName || "—" },
36
- { label: "邮箱", value: s.email || "—" },
34
+ { label: "工号", value: l.employeeId || "—" },
35
+ { label: "姓名", value: l.displayName || "—" },
36
+ { label: "邮箱", value: l.email || "—" },
37
37
  {
38
38
  label: "组织",
39
- value: ((h = s.orgs) == null ? void 0 : h.map((u) => u.name).filter(Boolean).join("、")) || "—",
39
+ value: ((h = l.orgs) == null ? void 0 : h.map((u) => u.name).filter(Boolean).join("、")) || "—",
40
40
  span: 2
41
41
  },
42
42
  { label: "角色", value: c, span: 2 }
43
43
  ];
44
44
  }
45
45
  function Qe({
46
- client: s,
46
+ client: l,
47
47
  catalog: c,
48
48
  systemEntryCodes: g,
49
49
  tableName: h = "iam_users",
50
50
  title: u = "用户管理"
51
51
  }) {
52
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 = fe(P);
53
+ const e = ye(P);
54
54
  return String(e.keyword ?? "");
55
- }, [P]), [y, 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(() => {
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
56
  const e = {};
57
57
  for (const r of H(c))
58
58
  e[r.code] = r.name;
@@ -75,12 +75,12 @@ function Qe({
75
75
  })), r = new Map(e.map((o) => [o.code, o])), a = H(c).map((o) => {
76
76
  const m = r.get(o.code);
77
77
  return m ? { ...o, name: m.name || o.name, layer: m.layer || o.layer } : o;
78
- }), l = new Set(a.map((o) => o.code));
79
- return [...a, ...e.filter((o) => !l.has(o.code))];
78
+ }), s = new Set(a.map((o) => o.code));
79
+ return [...a, ...e.filter((o) => !s.has(o.code))];
80
80
  }, [v, c]), re = d(
81
81
  () => v.filter((e) => e.layer !== "RESOURCE").map((e) => e.code),
82
82
  [v]
83
- ), te = d(() => C.map((e) => ue(e)), [C]), se = d(
83
+ ), te = d(() => C.map((e) => ue(e)), [C]), le = d(
84
84
  () => w.map((e) => ({
85
85
  value: e.id,
86
86
  label: e.name || e.code,
@@ -90,30 +90,30 @@ function Qe({
90
90
  ), F = D(async () => {
91
91
  x(!0);
92
92
  try {
93
- const e = await s.listUsers({ page: E, pageSize: 20, keyword: A || void 0 });
93
+ const e = await l.listUsers({ page: E, pageSize: 20, keyword: A || void 0 });
94
94
  K(e.pageData), q(e.total);
95
95
  } catch (e) {
96
- f.error(e instanceof Error ? e.message : "加载失败");
96
+ y.error(e instanceof Error ? e.message : "加载失败");
97
97
  } finally {
98
98
  x(!1);
99
99
  }
100
- }, [s, E, A]);
100
+ }, [l, E, A]);
101
101
  de(() => {
102
102
  F();
103
103
  }, [F]);
104
- const le = async (e) => {
104
+ const se = async (e) => {
105
105
  var r, a;
106
106
  T(e), M(!0);
107
107
  try {
108
- const l = await s.getUser(e.id);
108
+ const s = await l.getUser(e.id);
109
109
  T({
110
110
  ...e,
111
- ...l,
112
- orgs: (r = l.orgs) != null && r.length ? l.orgs : e.orgs,
113
- roles: (a = l.roles) != null && a.length ? l.roles : e.roles
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
114
  });
115
- } catch (l) {
116
- f.error(l instanceof Error ? l.message : "加载用户详情失败");
115
+ } catch (s) {
116
+ y.error(s instanceof Error ? s.message : "加载用户详情失败");
117
117
  } finally {
118
118
  M(!1);
119
119
  }
@@ -121,22 +121,22 @@ function Qe({
121
121
  var r;
122
122
  k(e);
123
123
  try {
124
- const [a, l, o, m] = await Promise.all([
125
- s.listRoles(),
126
- s.listSharedGroups(),
127
- s.listUserSharedGroups(e.id),
128
- s.getUser(e.id)
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
129
  ]);
130
- X(a), Z(l), B(o.map((p) => p.id));
130
+ X(a), Z(s), B(o.map((p) => p.id));
131
131
  const O = ((r = m.roles) == null ? void 0 : r.filter((p) => a.some((me) => me.code === p.code)).map((p) => p.code)) || [];
132
132
  U(O), oe((p) => p + 1);
133
133
  } catch (a) {
134
- f.error(a instanceof Error ? a.message : "加载权限失败");
134
+ y.error(a instanceof Error ? a.message : "加载权限失败");
135
135
  }
136
136
  }, ne = D((e) => {
137
137
  Array.isArray(e.groupIds) && B(e.groupIds.map(String)), Array.isArray(e.roleCodes) && U(e.roleCodes.map(String));
138
- }, []), ie = d(() => y ? Re(y) : [], [y]);
139
- return /* @__PURE__ */ b(ge, { title: u, children: [
138
+ }, []), ie = d(() => f ? Re(f) : [], [f]);
139
+ return /* @__PURE__ */ b(ge, { title: u, fillHeight: !1, children: [
140
140
  /* @__PURE__ */ t("div", { style: { marginBottom: 12 }, children: /* @__PURE__ */ t(
141
141
  Fe,
142
142
  {
@@ -179,15 +179,15 @@ function Qe({
179
179
  title: "组织",
180
180
  key: "org",
181
181
  render: (e, r) => {
182
- var a, l, o, m;
183
- return ((l = (a = r.orgs) == null ? void 0 : a.find((O) => O.isPrimary)) == null ? void 0 : l.name) || ((m = (o = r.orgs) == null ? void 0 : o[0]) == null ? void 0 : m.name) || "—";
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
184
  }
185
185
  },
186
186
  {
187
187
  title: "操作",
188
188
  key: "ops",
189
189
  render: (e, r) => /* @__PURE__ */ b(L, { children: [
190
- /* @__PURE__ */ t(V, { type: "link", size: "small", onClick: () => void le(r), children: "查看" }),
190
+ /* @__PURE__ */ t(V, { type: "link", size: "small", onClick: () => void se(r), children: "查看" }),
191
191
  /* @__PURE__ */ t(V, { type: "link", size: "small", onClick: () => void ae(r), children: "权限管理" })
192
192
  ] })
193
193
  }
@@ -197,13 +197,13 @@ function Qe({
197
197
  /* @__PURE__ */ t(
198
198
  Se,
199
199
  {
200
- open: !!y,
200
+ open: !!f,
201
201
  title: "查看用户",
202
202
  onCancel: () => T(null),
203
203
  footer: null,
204
204
  size: "M",
205
205
  scrollable: !0,
206
- children: y ? /* @__PURE__ */ t(
206
+ children: f ? /* @__PURE__ */ t(
207
207
  Ie,
208
208
  {
209
209
  content: ie,
@@ -233,9 +233,9 @@ function Qe({
233
233
  onSubmit: async (e) => {
234
234
  if (i)
235
235
  try {
236
- await s.setUserAppRoleCodes(i.id, e.roleCodes ?? S), await s.setUserSharedGroups(i.id, e.groupIds ?? I), f.success("已保存"), k(null), F();
236
+ await l.setUserAppRoleCodes(i.id, e.roleCodes ?? S), await l.setUserSharedGroups(i.id, e.groupIds ?? I), y.success("已保存"), k(null), F();
237
237
  } catch (r) {
238
- throw f.error(r instanceof Error ? r.message : "保存失败"), r;
238
+ throw y.error(r instanceof Error ? r.message : "保存失败"), r;
239
239
  }
240
240
  }
241
241
  },
@@ -263,7 +263,7 @@ function Qe({
263
263
  label: "共享组",
264
264
  mode: "multiple",
265
265
  allowClear: !0,
266
- options: se,
266
+ options: le,
267
267
  placeholder: "请选择共享组(可选)",
268
268
  ...$
269
269
  },