@hkyhy/marsun-components-core 0.1.100 → 0.1.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/components/Editor/VariablePicker.js +13 -13
  2. package/dist/components/Editor/VariablePicker.js.map +1 -1
  3. package/dist/components/FormInfo/RichTextField/index.js +46 -69
  4. package/dist/components/FormInfo/RichTextField/index.js.map +1 -1
  5. package/dist/components/FormInfo/VariableMentionInput/index.d.ts +1 -0
  6. package/dist/components/FormInfo/VariableMentionInput/index.js +53 -47
  7. package/dist/components/FormInfo/VariableMentionInput/index.js.map +1 -1
  8. package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js +6 -5
  9. package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js.map +1 -1
  10. package/dist/components/Tools/Inbox/InboxBell/InboxBell.d.ts +3 -0
  11. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js +59 -49
  12. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js.map +1 -1
  13. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js +20 -18
  14. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js.map +1 -1
  15. package/dist/components/Tools/Inbox/index.d.ts +1 -0
  16. package/dist/components/Tools/Inbox/sanitizeInboxHtml.d.ts +5 -0
  17. package/dist/components/Tools/Inbox/sanitizeInboxHtml.js +14 -0
  18. package/dist/components/Tools/Inbox/sanitizeInboxHtml.js.map +1 -0
  19. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/List/columns.d.ts +1 -1
  20. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/List/columns.js +3 -3
  21. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/List/columns.js.map +1 -1
  22. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js +160 -145
  23. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js.map +1 -1
  24. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +100 -99
  25. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
  26. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.d.ts +2 -2
  27. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js +140 -129
  28. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js.map +1 -1
  29. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.d.ts +2 -2
  30. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.js +78 -78
  31. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.js.map +1 -1
  32. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/index.d.ts +2 -2
  33. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.d.ts +26 -0
  34. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.js +47 -19
  35. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.js.map +1 -1
  36. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.d.ts +22 -0
  37. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js +64 -0
  38. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js.map +1 -0
  39. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/index.d.ts +2 -0
  40. package/dist/components/Tools/MessageCenter/index.d.ts +7 -1
  41. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.d.ts +39 -0
  42. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js +94 -0
  43. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js.map +1 -0
  44. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.d.ts +2 -0
  45. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js +18 -0
  46. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js.map +1 -0
  47. package/dist/components/Tools/index.d.ts +3 -2
  48. package/dist/index.js +653 -636
  49. package/dist/index.js.map +1 -1
  50. package/dist/marsun-components-core.css +1 -1
  51. package/dist/node_modules/dompurify/dist/purify.es.js +908 -0
  52. package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
  53. package/dist/node_modules/isomorphic-dompurify/dist/browser.js +17 -0
  54. package/dist/node_modules/isomorphic-dompurify/dist/browser.js.map +1 -0
  55. package/dist/styles/global.css +1 -1
  56. package/package.json +2 -1
@@ -1,68 +1,68 @@
1
- import { jsx as s, jsxs as x } from "react/jsx-runtime";
2
- import { message as i, Tag as M, Space as T, Button as C } from "antd";
3
- import { useState as m, useCallback as A, useEffect as v, useMemo as y } from "react";
4
- import { canDeleteTenantVariable as P } from "../../utils/adminGuards.js";
5
- import R from "../style.module.scss.js";
6
- import j from "../../../../Alert/Alert.js";
7
- import D from "../../../../Layout/PageSpin/index.js";
8
- import _ from "../../../../Empty/Empty.js";
9
- import K from "../../../../Table/Table.js";
10
- import L from "../../../../FormInfo/FormModal.js";
11
- import N from "../../../../FormInfo/FormInfo.js";
12
- import { Input as Q, Select as q } from "../../../../FormInfo/fields.js";
13
- const G = q, z = Q, se = ({
14
- canWrite: l,
15
- fetchVariables: u,
16
- saveVariable: p,
17
- deleteVariable: a,
18
- createNonce: f = 0
1
+ import { jsx as a, jsxs as F } from "react/jsx-runtime";
2
+ import { message as i, Tag as j, Space as _, Button as B } from "antd";
3
+ import { useState as c, useCallback as K, useEffect as M, useMemo as f } from "react";
4
+ import { canDeleteTenantVariable as L } from "../../utils/adminGuards.js";
5
+ import N from "../style.module.scss.js";
6
+ import Q from "../../../../Alert/Alert.js";
7
+ import U from "../../../../Layout/PageSpin/index.js";
8
+ import R from "../../../../Empty/Empty.js";
9
+ import W from "../../../../Table/Table.js";
10
+ import q from "../../../../FormInfo/FormModal.js";
11
+ import G from "../../../../FormInfo/FormInfo.js";
12
+ import { Input as H, Select as J } from "../../../../FormInfo/fields.js";
13
+ const O = J, T = H, le = ({
14
+ crud: m,
15
+ fetchVariables: k,
16
+ saveVariable: b,
17
+ deleteVariable: l,
18
+ createNonce: g = 0
19
19
  }) => {
20
- const [d, k] = m([]), [g, b] = m(!1), [h, w] = m(""), [e, c] = m(null), [S, E] = m(!1), n = A(async () => {
21
- b(!0), w("");
20
+ const y = m.create, p = m.update, h = m.delete, A = m.read, u = (t) => t ? y : p, [w, S] = c([]), [E, C] = c(!1), [I, x] = c(""), [e, d] = c(null), [r, v] = c(!1), o = K(async () => {
21
+ C(!0), x("");
22
22
  try {
23
- const t = await u();
24
- k(Array.isArray(t) ? t : []);
23
+ const t = await k();
24
+ S(Array.isArray(t) ? t : []);
25
25
  } catch (t) {
26
- w(t instanceof Error ? t.message : String(t)), k([]);
26
+ x(t instanceof Error ? t.message : String(t)), S([]);
27
27
  } finally {
28
- b(!1);
28
+ C(!1);
29
29
  }
30
- }, [u]);
31
- v(() => {
32
- n();
33
- }, [n]), v(() => {
34
- !f || !l || (E(!0), c({ key: "", label: "", type: "string", source: "tenant" }));
35
- }, [f, l]);
36
- const I = y(
30
+ }, [k]);
31
+ M(() => {
32
+ o();
33
+ }, [o]), M(() => {
34
+ !g || !y || (v(!0), d({ key: "", label: "", type: "string", source: "tenant" }));
35
+ }, [g, y]);
36
+ const z = f(
37
37
  () => ({
38
38
  key: e == null ? void 0 : e.key,
39
39
  label: e == null ? void 0 : e.label,
40
40
  type: (e == null ? void 0 : e.type) || "string"
41
41
  }),
42
42
  [e]
43
- ), F = y(
43
+ ), D = f(
44
44
  () => ({
45
- data: I,
45
+ data: z,
46
46
  onSubmit: async (t) => {
47
- if (!l || !e) return !1;
48
- const r = String(t.key || e.key || "").trim();
49
- if (!r)
47
+ if (!u(r) || !e) return !1;
48
+ const n = String(t.key || e.key || "").trim();
49
+ if (!n)
50
50
  return i.warning("请填写变量 key"), !1;
51
51
  try {
52
- await p({
52
+ await b({
53
53
  ...e,
54
- key: r,
54
+ key: n,
55
55
  label: String(t.label || "").trim(),
56
56
  type: String(t.type || "string"),
57
57
  source: "tenant"
58
- }), i.success("已保存"), c(null), await n();
59
- } catch (o) {
60
- return i.error(o instanceof Error ? o.message : String(o)), !1;
58
+ }), i.success("已保存"), d(null), await o();
59
+ } catch (s) {
60
+ return i.error(s instanceof Error ? s.message : String(s)), !1;
61
61
  }
62
62
  }
63
63
  }),
64
- [l, e, I, n, p]
65
- ), B = y(
64
+ [y, p, e, z, r, o, b]
65
+ ), P = f(
66
66
  () => [
67
67
  { title: "key", dataIndex: "key", key: "key", width: 140 },
68
68
  { title: "中文", dataIndex: "label", key: "label", ellipsis: !0 },
@@ -72,38 +72,38 @@ const G = q, z = Q, se = ({
72
72
  dataIndex: "source",
73
73
  key: "source",
74
74
  width: 100,
75
- render: (t, r) => /* @__PURE__ */ s(M, { children: r.source === "tenant" ? r.baseline ? "覆盖基线" : "租户" : "基线" })
75
+ render: (t, n) => /* @__PURE__ */ a(j, { children: n.source === "tenant" ? n.baseline ? "覆盖基线" : "租户" : "基线" })
76
76
  },
77
77
  {
78
78
  title: "操作",
79
79
  key: "actions",
80
80
  width: 140,
81
- render: (t, r) => /* @__PURE__ */ x(T, { size: 4, children: [
82
- /* @__PURE__ */ s(
83
- C,
81
+ render: (t, n) => /* @__PURE__ */ F(_, { size: 4, children: [
82
+ /* @__PURE__ */ a(
83
+ B,
84
84
  {
85
85
  type: "link",
86
86
  size: "small",
87
- disabled: !l,
87
+ disabled: !p,
88
88
  onClick: () => {
89
- E(!1), c({ ...r });
89
+ v(!1), d({ ...n });
90
90
  },
91
91
  children: "编辑"
92
92
  }
93
93
  ),
94
- /* @__PURE__ */ s(
95
- C,
94
+ /* @__PURE__ */ a(
95
+ B,
96
96
  {
97
97
  type: "link",
98
98
  size: "small",
99
99
  danger: !0,
100
- disabled: !l || !a || !P(r),
100
+ disabled: !h || !l || !L(n),
101
101
  onClick: () => {
102
102
  (async () => {
103
103
  try {
104
- await (a == null ? void 0 : a(r)), i.success("已删除"), await n();
105
- } catch (o) {
106
- i.error(o instanceof Error ? o.message : String(o));
104
+ await (l == null ? void 0 : l(n)), i.success("已删除"), await o();
105
+ } catch (s) {
106
+ i.error(s instanceof Error ? s.message : String(s));
107
107
  }
108
108
  })();
109
109
  },
@@ -113,56 +113,56 @@ const G = q, z = Q, se = ({
113
113
  ] })
114
114
  }
115
115
  ],
116
- [l, a, n]
116
+ [p, h, l, o]
117
117
  );
118
- return /* @__PURE__ */ x("div", { className: R.pane, children: [
119
- h ? /* @__PURE__ */ s(j, { type: "error", showIcon: !0, message: h, style: { marginBottom: 12 } }) : null,
120
- /* @__PURE__ */ s(D, { spinning: g, children: d.length === 0 && !g ? /* @__PURE__ */ s(_, { description: "暂无变量。基线来自 catalog;可新建租户变量。catalog 为空时模板「插入变量」不可用。" }) : /* @__PURE__ */ s(
121
- K,
118
+ return /* @__PURE__ */ F("div", { className: N.pane, children: [
119
+ I ? /* @__PURE__ */ a(Q, { type: "error", showIcon: !0, message: I, style: { marginBottom: 12 } }) : null,
120
+ /* @__PURE__ */ a(U, { spinning: E, children: A ? w.length === 0 && !E ? /* @__PURE__ */ a(R, { description: "暂无变量。基线来自 catalog;可新建租户变量。catalog 为空时模板「插入变量」不可用。" }) : /* @__PURE__ */ a(
121
+ W,
122
122
  {
123
123
  rowKey: (t) => t.key,
124
124
  tableName: "msg-center-variables",
125
125
  columnConfigEnabled: !1,
126
126
  columnResizeEnabled: !1,
127
- columns: B,
128
- dataSource: d,
127
+ columns: P,
128
+ dataSource: w,
129
129
  pagination: !1,
130
130
  size: "small"
131
131
  }
132
- ) }),
133
- /* @__PURE__ */ s(
134
- L,
132
+ ) : /* @__PURE__ */ a(R, { description: "无消息变量读取权限" }) }),
133
+ /* @__PURE__ */ a(
134
+ q,
135
135
  {
136
- title: S ? "新建变量" : "编辑变量",
136
+ title: r ? "新建变量" : "编辑变量",
137
137
  open: !!e,
138
- onCancel: () => c(null),
138
+ onCancel: () => d(null),
139
139
  width: 480,
140
140
  okText: "保存",
141
141
  autoClose: !1,
142
- formProps: F,
143
- children: /* @__PURE__ */ s(
144
- N,
142
+ formProps: D,
143
+ children: /* @__PURE__ */ a(
144
+ G,
145
145
  {
146
146
  column: 1,
147
147
  list: [
148
- /* @__PURE__ */ s(
149
- z,
148
+ /* @__PURE__ */ a(
149
+ T,
150
150
  {
151
151
  name: "key",
152
152
  label: "key",
153
153
  rule: "REQ",
154
- disabled: !l || !S && !!(e != null && e.key),
154
+ disabled: !u(r) || !r && !!(e != null && e.key),
155
155
  placeholder: "如 customField"
156
156
  },
157
157
  "key"
158
158
  ),
159
- /* @__PURE__ */ s(z, { name: "label", label: "中文名", disabled: !l }, "label"),
160
- /* @__PURE__ */ s(
161
- G,
159
+ /* @__PURE__ */ a(T, { name: "label", label: "中文名", disabled: !u(r) }, "label"),
160
+ /* @__PURE__ */ a(
161
+ O,
162
162
  {
163
163
  name: "type",
164
164
  label: "类型",
165
- disabled: !l,
165
+ disabled: !u(r),
166
166
  options: [
167
167
  { value: "string", label: "string" },
168
168
  { value: "number", label: "number" }
@@ -178,6 +178,6 @@ const G = q, z = Q, se = ({
178
178
  ] });
179
179
  };
180
180
  export {
181
- se as VariablesPanel
181
+ le as VariablesPanel
182
182
  };
183
183
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.tsx"],"sourcesContent":["import { FormInfo, FormModal, Input, Select } from '@/components/FormInfo';\nimport { Alert } from '@/components/Alert';\nimport { Empty } from '@/components/Empty';\nimport { PageSpin } from '@/components/Layout';\nimport { Table } from '@/components/Table';\nimport { Button, Space, Tag, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { MessageTemplateVariableAdmin } from '../types';\nimport { canDeleteTenantVariable } from '../../utils/adminGuards';\nimport styles from '../style.module.scss';\n\n/** CI tsc:kne Field 重载误匹配 FormItem children */\nconst FiSelect = Select as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInput = Input as unknown as React.ComponentType<Record<string, unknown>>;\n\nexport type VariablesPanelProps = {\n canWrite: boolean;\n fetchVariables: () => Promise<MessageTemplateVariableAdmin[]>;\n saveVariable: (item: MessageTemplateVariableAdmin) => Promise<void>;\n deleteVariable?: (item: MessageTemplateVariableAdmin) => Promise<void>;\n createNonce?: number;\n};\n\ntype FormShape = { key?: string; label?: string; type?: string };\n\n/**\n * 租户变量管理:可增改;基线 key 不可删(source=catalog 或 baseline)。\n */\nexport const VariablesPanel: React.FC<VariablesPanelProps> = ({\n canWrite,\n fetchVariables,\n saveVariable,\n deleteVariable,\n createNonce = 0,\n}) => {\n const [rows, setRows] = useState<MessageTemplateVariableAdmin[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [editing, setEditing] = useState<MessageTemplateVariableAdmin | null>(null);\n const [isCreate, setIsCreate] = useState(false);\n\n const reload = useCallback(async () => {\n setLoading(true);\n setError('');\n try {\n const list = await fetchVariables();\n setRows(Array.isArray(list) ? list : []);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setRows([]);\n } finally {\n setLoading(false);\n }\n }, [fetchVariables]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n if (!createNonce || !canWrite) return;\n setIsCreate(true);\n setEditing({ key: '', label: '', type: 'string', source: 'tenant' });\n }, [createNonce, canWrite]);\n\n const formData = useMemo(\n () => ({\n key: editing?.key,\n label: editing?.label,\n type: editing?.type || 'string',\n }),\n [editing],\n );\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!canWrite || !editing) return false;\n const key = String(data.key || editing.key || '').trim();\n if (!key) {\n message.warning('请填写变量 key');\n return false;\n }\n try {\n await saveVariable({\n ...editing,\n key,\n label: String(data.label || '').trim(),\n type: String(data.type || 'string'),\n source: 'tenant',\n });\n message.success('已保存');\n setEditing(null);\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n return false;\n }\n },\n }),\n [canWrite, editing, formData, reload, saveVariable],\n );\n\n const columns = useMemo(\n () => [\n { title: 'key', dataIndex: 'key', key: 'key', width: 140 },\n { title: '中文', dataIndex: 'label', key: 'label', ellipsis: true },\n { title: '类型', dataIndex: 'type', key: 'type', width: 90 },\n {\n title: '来源',\n dataIndex: 'source',\n key: 'source',\n width: 100,\n render: (_: unknown, r: MessageTemplateVariableAdmin) => (\n <Tag>{r.source === 'tenant' ? (r.baseline ? '覆盖基线' : '租户') : '基线'}</Tag>\n ),\n },\n {\n title: '操作',\n key: 'actions',\n width: 140,\n render: (_: unknown, r: MessageTemplateVariableAdmin) => (\n <Space size={4}>\n <Button\n type=\"link\"\n size=\"small\"\n disabled={!canWrite}\n onClick={() => {\n setIsCreate(false);\n setEditing({ ...r });\n }}\n >\n 编辑\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n danger\n disabled={!canWrite || !deleteVariable || !canDeleteTenantVariable(r)}\n onClick={() => {\n void (async () => {\n try {\n await deleteVariable?.(r);\n message.success('已删除');\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n })();\n }}\n >\n 删除\n </Button>\n </Space>\n ),\n },\n ],\n [canWrite, deleteVariable, reload],\n );\n\n return (\n <div className={styles.pane}>\n {error ? <Alert type=\"error\" showIcon message={error} style={{ marginBottom: 12 }} /> : null}\n <PageSpin spinning={loading}>\n {rows.length === 0 && !loading ? (\n <Empty description=\"暂无变量。基线来自 catalog;可新建租户变量。catalog 为空时模板「插入变量」不可用。\" />\n ) : (\n <Table<MessageTemplateVariableAdmin>\n rowKey={(r) => r.key}\n tableName=\"msg-center-variables\"\n columnConfigEnabled={false}\n columnResizeEnabled={false}\n columns={columns}\n dataSource={rows}\n pagination={false}\n size=\"small\"\n />\n )}\n </PageSpin>\n <FormModal\n title={isCreate ? '新建变量' : '编辑变量'}\n open={Boolean(editing)}\n onCancel={() => setEditing(null)}\n width={480}\n okText=\"保存\"\n autoClose={false}\n formProps={formProps}\n >\n <FormInfo\n column={1}\n list={[\n <FiInput\n key=\"key\"\n name=\"key\"\n label=\"key\"\n rule=\"REQ\"\n disabled={!canWrite || (!isCreate && Boolean(editing?.key))}\n placeholder=\"如 customField\"\n />,\n <FiInput key=\"label\" name=\"label\" label=\"中文名\" disabled={!canWrite} />,\n <FiSelect\n key=\"type\"\n name=\"type\"\n label=\"类型\"\n disabled={!canWrite}\n options={[\n { value: 'string', label: 'string' },\n { value: 'number', label: 'number' },\n ]}\n />,\n ]}\n />\n </FormModal>\n </div>\n );\n};\n\nexport default VariablesPanel;\n"],"names":["FiSelect","Select","FiInput","Input","VariablesPanel","canWrite","fetchVariables","saveVariable","deleteVariable","createNonce","rows","setRows","useState","loading","setLoading","error","setError","editing","setEditing","isCreate","setIsCreate","reload","useCallback","list","e","useEffect","formData","useMemo","formProps","data","key","message","columns","_","jsx","Tag","jsxs","Space","Button","canDeleteTenantVariable","styles","Alert","PageSpin","Empty","Table","r","FormModal","FormInfo"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.tsx"],"sourcesContent":["import { FormInfo, FormModal, Input, Select } from '@/components/FormInfo';\nimport { Alert } from '@/components/Alert';\nimport { Empty } from '@/components/Empty';\nimport { PageSpin } from '@/components/Layout';\nimport { Table } from '@/components/Table';\nimport { Button, Space, Tag, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { MessageCrudFlags, MessageTemplateVariableAdmin } from '../types';\nimport { canDeleteTenantVariable } from '../../utils/adminGuards';\nimport styles from '../style.module.scss';\n\n/** CI tsc:kne Field 重载误匹配 FormItem children */\nconst FiSelect = Select as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInput = Input as unknown as React.ComponentType<Record<string, unknown>>;\n\nexport type VariablesPanelProps = {\n crud: MessageCrudFlags;\n fetchVariables: () => Promise<MessageTemplateVariableAdmin[]>;\n saveVariable: (item: MessageTemplateVariableAdmin) => Promise<void>;\n deleteVariable?: (item: MessageTemplateVariableAdmin) => Promise<void>;\n createNonce?: number;\n};\n\ntype FormShape = { key?: string; label?: string; type?: string };\n\n/**\n * 租户变量管理:可增改;基线 key 不可删(source=catalog 或 baseline)。\n */\nexport const VariablesPanel: React.FC<VariablesPanelProps> = ({\n crud,\n fetchVariables,\n saveVariable,\n deleteVariable,\n createNonce = 0,\n}) => {\n const canCreate = crud.create;\n const canUpdate = crud.update;\n const canDelete = crud.delete;\n const canRead = crud.read;\n const formWritable = (creating: boolean) => (creating ? canCreate : canUpdate);\n\n const [rows, setRows] = useState<MessageTemplateVariableAdmin[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [editing, setEditing] = useState<MessageTemplateVariableAdmin | null>(null);\n const [isCreate, setIsCreate] = useState(false);\n\n const reload = useCallback(async () => {\n setLoading(true);\n setError('');\n try {\n const list = await fetchVariables();\n setRows(Array.isArray(list) ? list : []);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setRows([]);\n } finally {\n setLoading(false);\n }\n }, [fetchVariables]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n if (!createNonce || !canCreate) return;\n setIsCreate(true);\n setEditing({ key: '', label: '', type: 'string', source: 'tenant' });\n }, [createNonce, canCreate]);\n\n const formData = useMemo(\n () => ({\n key: editing?.key,\n label: editing?.label,\n type: editing?.type || 'string',\n }),\n [editing],\n );\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!formWritable(isCreate) || !editing) return false;\n const key = String(data.key || editing.key || '').trim();\n if (!key) {\n message.warning('请填写变量 key');\n return false;\n }\n try {\n await saveVariable({\n ...editing,\n key,\n label: String(data.label || '').trim(),\n type: String(data.type || 'string'),\n source: 'tenant',\n });\n message.success('已保存');\n setEditing(null);\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n return false;\n }\n },\n }),\n [canCreate, canUpdate, editing, formData, isCreate, reload, saveVariable],\n );\n\n const columns = useMemo(\n () => [\n { title: 'key', dataIndex: 'key', key: 'key', width: 140 },\n { title: '中文', dataIndex: 'label', key: 'label', ellipsis: true },\n { title: '类型', dataIndex: 'type', key: 'type', width: 90 },\n {\n title: '来源',\n dataIndex: 'source',\n key: 'source',\n width: 100,\n render: (_: unknown, r: MessageTemplateVariableAdmin) => (\n <Tag>{r.source === 'tenant' ? (r.baseline ? '覆盖基线' : '租户') : '基线'}</Tag>\n ),\n },\n {\n title: '操作',\n key: 'actions',\n width: 140,\n render: (_: unknown, r: MessageTemplateVariableAdmin) => (\n <Space size={4}>\n <Button\n type=\"link\"\n size=\"small\"\n disabled={!canUpdate}\n onClick={() => {\n setIsCreate(false);\n setEditing({ ...r });\n }}\n >\n 编辑\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n danger\n disabled={!canDelete || !deleteVariable || !canDeleteTenantVariable(r)}\n onClick={() => {\n void (async () => {\n try {\n await deleteVariable?.(r);\n message.success('已删除');\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n })();\n }}\n >\n 删除\n </Button>\n </Space>\n ),\n },\n ],\n [canUpdate, canDelete, deleteVariable, reload],\n );\n\n return (\n <div className={styles.pane}>\n {error ? <Alert type=\"error\" showIcon message={error} style={{ marginBottom: 12 }} /> : null}\n <PageSpin spinning={loading}>\n {!canRead ? (\n <Empty description=\"无消息变量读取权限\" />\n ) : rows.length === 0 && !loading ? (\n <Empty description=\"暂无变量。基线来自 catalog;可新建租户变量。catalog 为空时模板「插入变量」不可用。\" />\n ) : (\n <Table<MessageTemplateVariableAdmin>\n rowKey={(r) => r.key}\n tableName=\"msg-center-variables\"\n columnConfigEnabled={false}\n columnResizeEnabled={false}\n columns={columns}\n dataSource={rows}\n pagination={false}\n size=\"small\"\n />\n )}\n </PageSpin>\n <FormModal\n title={isCreate ? '新建变量' : '编辑变量'}\n open={Boolean(editing)}\n onCancel={() => setEditing(null)}\n width={480}\n okText=\"保存\"\n autoClose={false}\n formProps={formProps}\n >\n <FormInfo\n column={1}\n list={[\n <FiInput\n key=\"key\"\n name=\"key\"\n label=\"key\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate) || (!isCreate && Boolean(editing?.key))}\n placeholder=\"如 customField\"\n />,\n <FiInput key=\"label\" name=\"label\" label=\"中文名\" disabled={!formWritable(isCreate)} />,\n <FiSelect\n key=\"type\"\n name=\"type\"\n label=\"类型\"\n disabled={!formWritable(isCreate)}\n options={[\n { value: 'string', label: 'string' },\n { value: 'number', label: 'number' },\n ]}\n />,\n ]}\n />\n </FormModal>\n </div>\n );\n};\n\nexport default VariablesPanel;\n"],"names":["FiSelect","Select","FiInput","Input","VariablesPanel","crud","fetchVariables","saveVariable","deleteVariable","createNonce","canCreate","canUpdate","canDelete","canRead","formWritable","creating","rows","setRows","useState","loading","setLoading","error","setError","editing","setEditing","isCreate","setIsCreate","reload","useCallback","list","e","useEffect","formData","useMemo","formProps","data","key","message","columns","_","r","jsx","Tag","jsxs","Space","Button","canDeleteTenantVariable","styles","Alert","PageSpin","Empty","Table","FormModal","FormInfo"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export { MessageTemplateAdmin } from './MessageTemplateAdmin';
2
- export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, } from './types';
3
- export { variablesFromCatalog, previewVarsFromVariables } from './types';
2
+ export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './types';
3
+ export { variablesFromCatalog, previewVarsFromVariables, resolveMessageAdminPermissions, } from './types';
@@ -1,4 +1,21 @@
1
1
  import { ReactNode } from 'react';
2
+ export type MessageCrudFlags = {
3
+ create: boolean;
4
+ read: boolean;
5
+ update: boolean;
6
+ delete: boolean;
7
+ };
8
+ export type MessageAdminPermissions = {
9
+ template?: Partial<MessageCrudFlags>;
10
+ push?: Partial<MessageCrudFlags>;
11
+ variable?: Partial<MessageCrudFlags>;
12
+ };
13
+ /** 解析 Admin 门禁:有 permissions 用细粒度;否则 canWrite 作 Showcase 全开/全关。 */
14
+ export declare function resolveMessageAdminPermissions(permissions: MessageAdminPermissions | undefined, canWrite: boolean | undefined): {
15
+ template: MessageCrudFlags;
16
+ push: MessageCrudFlags;
17
+ variable: MessageCrudFlags;
18
+ };
2
19
  export type MessageTemplateAdminItem = {
3
20
  id?: string;
4
21
  code?: string;
@@ -79,7 +96,16 @@ export type MessageTemplateAdminProps = {
79
96
  templateVariables?: MessageTemplateVariable[];
80
97
  /** 预览用示例值;未传则按 variables 生成 */
81
98
  previewVars?: Record<string, string>;
99
+ /**
100
+ * Showcase 快捷:true→十二项全开,false→全关。
101
+ * 业务仓须传 permissions,禁止只靠 canWrite 当真门禁。
102
+ */
82
103
  canWrite?: boolean;
104
+ /**
105
+ * 细粒度 CRUD 门禁(模板 / 推送 / 变量 × create|read|update|delete)。
106
+ * 传入后优先于 canWrite。
107
+ */
108
+ permissions?: MessageAdminPermissions;
83
109
  renderAudienceField?: (ctx: {
84
110
  roles: string[];
85
111
  onChange: (roles: string[]) => void;
@@ -1,28 +1,56 @@
1
- function i(t) {
2
- if (!t) return [];
3
- if (Array.isArray(t.variables) && t.variables.length)
4
- return t.variables.map((e) => ({
5
- key: String(e.key || "").trim(),
6
- label: e.label,
7
- type: e.type,
8
- source: e.source,
9
- baseline: e.baseline
10
- })).filter((e) => e.key);
11
- const r = t.contextSchema;
12
- return !r || typeof r != "object" ? [] : Object.entries(r).map(([e, n]) => typeof n == "string" ? { key: e, type: n } : n && typeof n == "object" ? {
13
- key: e,
1
+ const u = {
2
+ create: !1,
3
+ read: !1,
4
+ update: !1,
5
+ delete: !1
6
+ }, c = {
7
+ create: !0,
8
+ read: !0,
9
+ update: !0,
10
+ delete: !0
11
+ };
12
+ function s(e, r) {
13
+ return {
14
+ create: (e == null ? void 0 : e.create) ?? r.create,
15
+ read: (e == null ? void 0 : e.read) ?? r.read,
16
+ update: (e == null ? void 0 : e.update) ?? r.update,
17
+ delete: (e == null ? void 0 : e.delete) ?? r.delete
18
+ };
19
+ }
20
+ function o(e, r) {
21
+ const t = r ? c : u;
22
+ return e ? {
23
+ template: s(e.template, u),
24
+ push: s(e.push, u),
25
+ variable: s(e.variable, u)
26
+ } : { template: t, push: t, variable: t };
27
+ }
28
+ function f(e) {
29
+ if (!e) return [];
30
+ if (Array.isArray(e.variables) && e.variables.length)
31
+ return e.variables.map((t) => ({
32
+ key: String(t.key || "").trim(),
33
+ label: t.label,
34
+ type: t.type,
35
+ source: t.source,
36
+ baseline: t.baseline
37
+ })).filter((t) => t.key);
38
+ const r = e.contextSchema;
39
+ return !r || typeof r != "object" ? [] : Object.entries(r).map(([t, n]) => typeof n == "string" ? { key: t, type: n } : n && typeof n == "object" ? {
40
+ key: t,
14
41
  type: n.type || "string",
15
42
  label: n.label
16
- } : { key: e }).filter((e) => e.key);
43
+ } : { key: t }).filter((t) => t.key);
17
44
  }
18
- function s(t) {
45
+ function b(e) {
19
46
  const r = {};
20
- for (const e of t)
21
- r[e.key] = e.type === "number" ? "1" : e.label || e.key;
47
+ for (const t of e)
48
+ r[t.key] = t.type === "number" ? "1" : t.label || t.key;
22
49
  return r;
23
50
  }
24
51
  export {
25
- s as previewVarsFromVariables,
26
- i as variablesFromCatalog
52
+ b as previewVarsFromVariables,
53
+ o as resolveMessageAdminPermissions,
54
+ f as variablesFromCatalog
27
55
  };
28
56
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/types.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type MessageTemplateAdminItem = {\n id?: string;\n code?: string;\n eventKey?: string;\n scenario?: string;\n label?: string;\n messageType?: string;\n titleTemplate?: string;\n titlePreview?: string;\n bodyTemplate?: string;\n audienceRoles?: string[];\n roles?: string[];\n enabled?: boolean;\n channel?: string;\n};\n\nexport type MessageEventCatalogItem = {\n eventKey: string;\n label: string;\n messageType?: string;\n};\n\n/** catalog API 完整载荷(含变量 SSOT) */\nexport type MessageEventCatalogPayload = {\n events: MessageEventCatalogItem[];\n /** 原始 schema;优先用 variables */\n contextSchema?: Record<string, string | { type?: string; label?: string }>;\n variables?: MessageTemplateVariable[];\n};\n\nexport type MessageAudienceRoleOption = {\n /** 写入模板的角色码 */\n code: string;\n /** 展示名(来自 SSO / fixture) */\n name: string;\n};\n\nexport type MessageTemplateVariable = {\n key: string;\n /** 可选中文说明;无则下拉只显示 code */\n label?: string;\n type?: string;\n source?: 'catalog' | 'tenant';\n baseline?: boolean;\n};\n\n/** 变量管理行 */\nexport type MessageTemplateVariableAdmin = MessageTemplateVariable;\n\nexport type PushRuleAdminItem = {\n id?: string;\n code?: string;\n label?: string;\n eventKey?: string;\n levels?: string[];\n templateCode?: string;\n audienceRoles?: string[];\n audienceUserIds?: string[];\n channels?: string[];\n slaHours?: number;\n scanLookbackDays?: number;\n enabled?: boolean;\n};\n\nexport type MessageTemplateAdminProps = {\n fetchTemplates: () => Promise<MessageTemplateAdminItem[]>;\n saveTemplate?: (item: MessageTemplateAdminItem) => Promise<void>;\n /**\n * 事件目录。可返回数组(仅 events)或完整 payload(含 variables / contextSchema)。\n * 变量优先取 payload.variables,否则从 contextSchema 推导;**禁止** FE 平行 DEFAULT_VARS。\n */\n fetchEventCatalog?: () => Promise<MessageEventCatalogItem[] | MessageEventCatalogPayload>;\n /** 列表行切换启用(不经新建表单) */\n setTemplateEnabled?: (item: MessageTemplateAdminItem, enabled: boolean) => Promise<void>;\n /**\n * 受众角色选项(SSO 本系统角色)。未传且无 renderAudienceField 时用空 Select(禁 tags 手输码)。\n */\n fetchAudienceRoles?: () => Promise<MessageAudienceRoleOption[]>;\n /**\n * @deprecated 变量须来自 catalog;仅联调 fixture 可传。业务页勿硬编码平行表。\n */\n templateVariables?: MessageTemplateVariable[];\n /** 预览用示例值;未传则按 variables 生成 */\n previewVars?: Record<string, string>;\n canWrite?: boolean;\n renderAudienceField?: (ctx: {\n roles: string[];\n onChange: (roles: string[]) => void;\n }) => ReactNode;\n /** @deprecated 优先传 fetchPushRules */\n pushRulesSlot?: ReactNode;\n fetchPushRules?: () => Promise<PushRuleAdminItem[]>;\n savePushRule?: (item: PushRuleAdminItem) => Promise<void>;\n setPushRuleEnabled?: (item: PushRuleAdminItem, enabled: boolean) => Promise<void>;\n deletePushRule?: (item: PushRuleAdminItem) => Promise<void>;\n fetchVariables?: () => Promise<MessageTemplateVariableAdmin[]>;\n saveVariable?: (item: MessageTemplateVariableAdmin) => Promise<void>;\n deleteVariable?: (item: MessageTemplateVariableAdmin) => Promise<void>;\n emptyText?: string;\n className?: string;\n /** 自动编号前缀,默认 MEQ */\n codePrefix?: string;\n};\n\nexport function variablesFromCatalog(\n payload: MessageEventCatalogPayload | null | undefined,\n): MessageTemplateVariable[] {\n if (!payload) return [];\n if (Array.isArray(payload.variables) && payload.variables.length) {\n return payload.variables\n .map((v) => ({\n key: String(v.key || '').trim(),\n label: v.label,\n type: v.type,\n source: v.source,\n baseline: v.baseline,\n }))\n .filter((v) => v.key);\n }\n const schema = payload.contextSchema;\n if (!schema || typeof schema !== 'object') return [];\n return Object.entries(schema)\n .map(([key, raw]) => {\n if (typeof raw === 'string') return { key, type: raw };\n if (raw && typeof raw === 'object') {\n return {\n key,\n type: raw.type || 'string',\n label: raw.label,\n };\n }\n return { key };\n })\n .filter((v) => v.key);\n}\n\nexport function previewVarsFromVariables(vars: MessageTemplateVariable[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const v of vars) {\n out[v.key] = v.type === 'number' ? '1' : v.label || v.key;\n }\n return out;\n}\n"],"names":["variablesFromCatalog","payload","v","schema","key","raw","previewVarsFromVariables","vars","out"],"mappings":"AA0GO,SAASA,EACdC,GAC2B;AAC3B,MAAI,CAACA,EAAS,QAAO,CAAA;AACrB,MAAI,MAAM,QAAQA,EAAQ,SAAS,KAAKA,EAAQ,UAAU;AACxD,WAAOA,EAAQ,UACZ,IAAI,CAACC,OAAO;AAAA,MACX,KAAK,OAAOA,EAAE,OAAO,EAAE,EAAE,KAAA;AAAA,MACzB,OAAOA,EAAE;AAAA,MACT,MAAMA,EAAE;AAAA,MACR,QAAQA,EAAE;AAAA,MACV,UAAUA,EAAE;AAAA,IAAA,EACZ,EACD,OAAO,CAACA,MAAMA,EAAE,GAAG;AAExB,QAAMC,IAASF,EAAQ;AACvB,SAAI,CAACE,KAAU,OAAOA,KAAW,WAAiB,CAAA,IAC3C,OAAO,QAAQA,CAAM,EACzB,IAAI,CAAC,CAACC,GAAKC,CAAG,MACT,OAAOA,KAAQ,WAAiB,EAAE,KAAAD,GAAK,MAAMC,EAAA,IAC7CA,KAAO,OAAOA,KAAQ,WACjB;AAAA,IACL,KAAAD;AAAA,IACA,MAAMC,EAAI,QAAQ;AAAA,IAClB,OAAOA,EAAI;AAAA,EAAA,IAGR,EAAE,KAAAD,EAAA,CACV,EACA,OAAO,CAACF,MAAMA,EAAE,GAAG;AACxB;AAEO,SAASI,EAAyBC,GAAyD;AAChG,QAAMC,IAA8B,CAAA;AACpC,aAAWN,KAAKK;AACd,IAAAC,EAAIN,EAAE,GAAG,IAAIA,EAAE,SAAS,WAAW,MAAMA,EAAE,SAASA,EAAE;AAExD,SAAOM;AACT;"}
1
+ {"version":3,"file":"types.js","sources":["../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/types.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport type MessageCrudFlags = {\n create: boolean;\n read: boolean;\n update: boolean;\n delete: boolean;\n};\n\nexport type MessageAdminPermissions = {\n template?: Partial<MessageCrudFlags>;\n push?: Partial<MessageCrudFlags>;\n variable?: Partial<MessageCrudFlags>;\n};\n\nconst ALL_CRUD_OFF: MessageCrudFlags = {\n create: false,\n read: false,\n update: false,\n delete: false,\n};\n\nconst ALL_CRUD_ON: MessageCrudFlags = {\n create: true,\n read: true,\n update: true,\n delete: true,\n};\n\nfunction mergeCrud(\n partial: Partial<MessageCrudFlags> | undefined,\n fallback: MessageCrudFlags,\n): MessageCrudFlags {\n return {\n create: partial?.create ?? fallback.create,\n read: partial?.read ?? fallback.read,\n update: partial?.update ?? fallback.update,\n delete: partial?.delete ?? fallback.delete,\n };\n}\n\n/** 解析 Admin 门禁:有 permissions 用细粒度;否则 canWrite 作 Showcase 全开/全关。 */\nexport function resolveMessageAdminPermissions(\n permissions: MessageAdminPermissions | undefined,\n canWrite: boolean | undefined,\n): { template: MessageCrudFlags; push: MessageCrudFlags; variable: MessageCrudFlags } {\n const fallback = canWrite ? ALL_CRUD_ON : ALL_CRUD_OFF;\n if (!permissions) {\n return { template: fallback, push: fallback, variable: fallback };\n }\n return {\n template: mergeCrud(permissions.template, ALL_CRUD_OFF),\n push: mergeCrud(permissions.push, ALL_CRUD_OFF),\n variable: mergeCrud(permissions.variable, ALL_CRUD_OFF),\n };\n}\n\nexport type MessageTemplateAdminItem = {\n id?: string;\n code?: string;\n eventKey?: string;\n scenario?: string;\n label?: string;\n messageType?: string;\n titleTemplate?: string;\n titlePreview?: string;\n bodyTemplate?: string;\n audienceRoles?: string[];\n roles?: string[];\n enabled?: boolean;\n channel?: string;\n};\n\nexport type MessageEventCatalogItem = {\n eventKey: string;\n label: string;\n messageType?: string;\n};\n\n/** catalog API 完整载荷(含变量 SSOT) */\nexport type MessageEventCatalogPayload = {\n events: MessageEventCatalogItem[];\n /** 原始 schema;优先用 variables */\n contextSchema?: Record<string, string | { type?: string; label?: string }>;\n variables?: MessageTemplateVariable[];\n};\n\nexport type MessageAudienceRoleOption = {\n /** 写入模板的角色码 */\n code: string;\n /** 展示名(来自 SSO / fixture) */\n name: string;\n};\n\nexport type MessageTemplateVariable = {\n key: string;\n /** 可选中文说明;无则下拉只显示 code */\n label?: string;\n type?: string;\n source?: 'catalog' | 'tenant';\n baseline?: boolean;\n};\n\n/** 变量管理行 */\nexport type MessageTemplateVariableAdmin = MessageTemplateVariable;\n\nexport type PushRuleAdminItem = {\n id?: string;\n code?: string;\n label?: string;\n eventKey?: string;\n levels?: string[];\n templateCode?: string;\n audienceRoles?: string[];\n audienceUserIds?: string[];\n channels?: string[];\n slaHours?: number;\n scanLookbackDays?: number;\n enabled?: boolean;\n};\n\nexport type MessageTemplateAdminProps = {\n fetchTemplates: () => Promise<MessageTemplateAdminItem[]>;\n saveTemplate?: (item: MessageTemplateAdminItem) => Promise<void>;\n /**\n * 事件目录。可返回数组(仅 events)或完整 payload(含 variables / contextSchema)。\n * 变量优先取 payload.variables,否则从 contextSchema 推导;**禁止** FE 平行 DEFAULT_VARS。\n */\n fetchEventCatalog?: () => Promise<MessageEventCatalogItem[] | MessageEventCatalogPayload>;\n /** 列表行切换启用(不经新建表单) */\n setTemplateEnabled?: (item: MessageTemplateAdminItem, enabled: boolean) => Promise<void>;\n /**\n * 受众角色选项(SSO 本系统角色)。未传且无 renderAudienceField 时用空 Select(禁 tags 手输码)。\n */\n fetchAudienceRoles?: () => Promise<MessageAudienceRoleOption[]>;\n /**\n * @deprecated 变量须来自 catalog;仅联调 fixture 可传。业务页勿硬编码平行表。\n */\n templateVariables?: MessageTemplateVariable[];\n /** 预览用示例值;未传则按 variables 生成 */\n previewVars?: Record<string, string>;\n /**\n * Showcase 快捷:true→十二项全开,false→全关。\n * 业务仓须传 permissions,禁止只靠 canWrite 当真门禁。\n */\n canWrite?: boolean;\n /**\n * 细粒度 CRUD 门禁(模板 / 推送 / 变量 × create|read|update|delete)。\n * 传入后优先于 canWrite。\n */\n permissions?: MessageAdminPermissions;\n renderAudienceField?: (ctx: {\n roles: string[];\n onChange: (roles: string[]) => void;\n }) => ReactNode;\n /** @deprecated 优先传 fetchPushRules */\n pushRulesSlot?: ReactNode;\n fetchPushRules?: () => Promise<PushRuleAdminItem[]>;\n savePushRule?: (item: PushRuleAdminItem) => Promise<void>;\n setPushRuleEnabled?: (item: PushRuleAdminItem, enabled: boolean) => Promise<void>;\n deletePushRule?: (item: PushRuleAdminItem) => Promise<void>;\n fetchVariables?: () => Promise<MessageTemplateVariableAdmin[]>;\n saveVariable?: (item: MessageTemplateVariableAdmin) => Promise<void>;\n deleteVariable?: (item: MessageTemplateVariableAdmin) => Promise<void>;\n emptyText?: string;\n className?: string;\n /** 自动编号前缀,默认 MEQ */\n codePrefix?: string;\n};\n\nexport function variablesFromCatalog(\n payload: MessageEventCatalogPayload | null | undefined,\n): MessageTemplateVariable[] {\n if (!payload) return [];\n if (Array.isArray(payload.variables) && payload.variables.length) {\n return payload.variables\n .map((v) => ({\n key: String(v.key || '').trim(),\n label: v.label,\n type: v.type,\n source: v.source,\n baseline: v.baseline,\n }))\n .filter((v) => v.key);\n }\n const schema = payload.contextSchema;\n if (!schema || typeof schema !== 'object') return [];\n return Object.entries(schema)\n .map(([key, raw]) => {\n if (typeof raw === 'string') return { key, type: raw };\n if (raw && typeof raw === 'object') {\n return {\n key,\n type: raw.type || 'string',\n label: raw.label,\n };\n }\n return { key };\n })\n .filter((v) => v.key);\n}\n\nexport function previewVarsFromVariables(vars: MessageTemplateVariable[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const v of vars) {\n out[v.key] = v.type === 'number' ? '1' : v.label || v.key;\n }\n return out;\n}\n"],"names":["ALL_CRUD_OFF","ALL_CRUD_ON","mergeCrud","partial","fallback","resolveMessageAdminPermissions","permissions","canWrite","variablesFromCatalog","payload","v","schema","key","raw","previewVarsFromVariables","vars","out"],"mappings":"AAeA,MAAMA,IAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AACV,GAEMC,IAAgC;AAAA,EACpC,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,SAASC,EACPC,GACAC,GACkB;AAClB,SAAO;AAAA,IACL,SAAQD,KAAA,gBAAAA,EAAS,WAAUC,EAAS;AAAA,IACpC,OAAMD,KAAA,gBAAAA,EAAS,SAAQC,EAAS;AAAA,IAChC,SAAQD,KAAA,gBAAAA,EAAS,WAAUC,EAAS;AAAA,IACpC,SAAQD,KAAA,gBAAAA,EAAS,WAAUC,EAAS;AAAA,EAAA;AAExC;AAGO,SAASC,EACdC,GACAC,GACoF;AACpF,QAAMH,IAAWG,IAAWN,IAAcD;AAC1C,SAAKM,IAGE;AAAA,IACL,UAAUJ,EAAUI,EAAY,UAAUN,CAAY;AAAA,IACtD,MAAME,EAAUI,EAAY,MAAMN,CAAY;AAAA,IAC9C,UAAUE,EAAUI,EAAY,UAAUN,CAAY;AAAA,EAAA,IAL/C,EAAE,UAAUI,GAAU,MAAMA,GAAU,UAAUA,EAAA;AAO3D;AAmHO,SAASI,EACdC,GAC2B;AAC3B,MAAI,CAACA,EAAS,QAAO,CAAA;AACrB,MAAI,MAAM,QAAQA,EAAQ,SAAS,KAAKA,EAAQ,UAAU;AACxD,WAAOA,EAAQ,UACZ,IAAI,CAACC,OAAO;AAAA,MACX,KAAK,OAAOA,EAAE,OAAO,EAAE,EAAE,KAAA;AAAA,MACzB,OAAOA,EAAE;AAAA,MACT,MAAMA,EAAE;AAAA,MACR,QAAQA,EAAE;AAAA,MACV,UAAUA,EAAE;AAAA,IAAA,EACZ,EACD,OAAO,CAACA,MAAMA,EAAE,GAAG;AAExB,QAAMC,IAASF,EAAQ;AACvB,SAAI,CAACE,KAAU,OAAOA,KAAW,WAAiB,CAAA,IAC3C,OAAO,QAAQA,CAAM,EACzB,IAAI,CAAC,CAACC,GAAKC,CAAG,MACT,OAAOA,KAAQ,WAAiB,EAAE,KAAAD,GAAK,MAAMC,EAAA,IAC7CA,KAAO,OAAOA,KAAQ,WACjB;AAAA,IACL,KAAAD;AAAA,IACA,MAAMC,EAAI,QAAQ;AAAA,IAClB,OAAOA,EAAI;AAAA,EAAA,IAGR,EAAE,KAAAD,EAAA,CACV,EACA,OAAO,CAACF,MAAMA,EAAE,GAAG;AACxB;AAEO,SAASI,EAAyBC,GAAyD;AAChG,QAAMC,IAA8B,CAAA;AACpC,aAAWN,KAAKK;AACd,IAAAC,EAAIN,EAAE,GAAG,IAAIA,EAAE,SAAS,WAAW,MAAMA,EAAE,SAASA,EAAE;AAExD,SAAOM;AACT;"}
@@ -0,0 +1,22 @@
1
+ import { default as React } from 'react';
2
+ export type MsgCenterAppSwitcherProps = {
3
+ /**
4
+ * 返回当前用户**有权进入**的 SystemApp(须调用方用 EP 过滤;本组件再收窄到可切换 appKey)。
5
+ * 禁止传入全量 Agent 目录。
6
+ */
7
+ listAuthorizedSystemApps: () => Promise<Array<{
8
+ code: string;
9
+ name: string;
10
+ }>>;
11
+ /** 本壳默认 appKey(无 session 时) */
12
+ fallbackAppKey: string;
13
+ className?: string;
14
+ style?: React.CSSProperties;
15
+ /** 切换成功回调(铃铛/Admin 另订阅 store) */
16
+ onAppKeyChange?: (appKey: string) => void;
17
+ };
18
+ /**
19
+ * AgentHub 消息中心 App 切换器:仅有权 + 本期可切换对;展示名取 SSO name。
20
+ */
21
+ declare const MsgCenterAppSwitcher: React.FC<MsgCenterAppSwitcherProps>;
22
+ export default MsgCenterAppSwitcher;
@@ -0,0 +1,64 @@
1
+ import { jsxs as x, jsx as E } from "react/jsx-runtime";
2
+ import { Typography as j, Select as v } from "antd";
3
+ import { useState as o, useCallback as K, useEffect as M, useMemo as T } from "react";
4
+ import { getMsgCenterAppKey as h, filterMsgCenterSwitchableApps as F, resolveMsgCenterSwitchState as L, setMsgCenterAppKey as w, subscribeMsgCenterAppKey as P } from "../msgCenterAppSwitch.js";
5
+ const D = ({
6
+ listAuthorizedSystemApps: l,
7
+ fallbackAppKey: s,
8
+ className: p,
9
+ style: c,
10
+ onAppKeyChange: a
11
+ }) => {
12
+ const [n, u] = o([]), [f, m] = o(!1), [g, d] = o(null), [S, i] = o(() => h(s)), y = K(async () => {
13
+ m(!0), d(null);
14
+ try {
15
+ const e = await l(), t = F(e || []);
16
+ u(t);
17
+ const r = L(t, s);
18
+ i(r.currentAppKey), h(s) !== r.currentAppKey && t.length && w(
19
+ r.currentAppKey,
20
+ t.map((b) => b.appKey)
21
+ );
22
+ } catch (e) {
23
+ d(e instanceof Error ? e.message : String(e)), u([]);
24
+ } finally {
25
+ m(!1);
26
+ }
27
+ }, [s, l]);
28
+ M(() => {
29
+ y();
30
+ }, [y]), M(() => P((e) => {
31
+ e && i(e);
32
+ }), []);
33
+ const C = T(
34
+ () => n.map((e) => ({
35
+ value: e.appKey,
36
+ label: e.name
37
+ })),
38
+ [n]
39
+ );
40
+ return g ? /* @__PURE__ */ x(j.Text, { type: "danger", className: p, style: c, children: [
41
+ "应用列表不可用:",
42
+ g
43
+ ] }) : !f && n.length <= 1 ? null : /* @__PURE__ */ E(
44
+ v,
45
+ {
46
+ className: p,
47
+ style: { minWidth: 180, ...c },
48
+ loading: f,
49
+ value: S,
50
+ options: C,
51
+ optionFilterProp: "label",
52
+ placeholder: "消息应用",
53
+ "aria-label": "消息中心应用切换",
54
+ onChange: (e) => {
55
+ const t = n.map((r) => r.appKey);
56
+ w(e, t), i(e), a == null || a(e);
57
+ }
58
+ }
59
+ );
60
+ };
61
+ export {
62
+ D as default
63
+ };
64
+ //# sourceMappingURL=MsgCenterAppSwitcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MsgCenterAppSwitcher.js","sources":["../../../../../src/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.tsx"],"sourcesContent":["import { Select, Typography } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n filterMsgCenterSwitchableApps,\n getMsgCenterAppKey,\n resolveMsgCenterSwitchState,\n setMsgCenterAppKey,\n subscribeMsgCenterAppKey,\n type MsgCenterSwitchableApp,\n} from '../msgCenterAppSwitch';\n\nexport type MsgCenterAppSwitcherProps = {\n /**\n * 返回当前用户**有权进入**的 SystemApp(须调用方用 EP 过滤;本组件再收窄到可切换 appKey)。\n * 禁止传入全量 Agent 目录。\n */\n listAuthorizedSystemApps: () => Promise<Array<{ code: string; name: string }>>;\n /** 本壳默认 appKey(无 session 时) */\n fallbackAppKey: string;\n className?: string;\n style?: React.CSSProperties;\n /** 切换成功回调(铃铛/Admin 另订阅 store) */\n onAppKeyChange?: (appKey: string) => void;\n};\n\n/**\n * AgentHub 消息中心 App 切换器:仅有权 + 本期可切换对;展示名取 SSO name。\n */\nconst MsgCenterAppSwitcher: React.FC<MsgCenterAppSwitcherProps> = ({\n listAuthorizedSystemApps,\n fallbackAppKey,\n className,\n style,\n onAppKeyChange,\n}) => {\n const [apps, setApps] = useState<MsgCenterSwitchableApp[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [current, setCurrent] = useState(() => getMsgCenterAppKey(fallbackAppKey));\n\n const reload = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const raw = await listAuthorizedSystemApps();\n const filtered = filterMsgCenterSwitchableApps(raw || []);\n setApps(filtered);\n const state = resolveMsgCenterSwitchState(filtered, fallbackAppKey);\n setCurrent(state.currentAppKey);\n if (getMsgCenterAppKey(fallbackAppKey) !== state.currentAppKey && filtered.length) {\n setMsgCenterAppKey(\n state.currentAppKey,\n filtered.map((a) => a.appKey),\n );\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setApps([]);\n } finally {\n setLoading(false);\n }\n }, [fallbackAppKey, listAuthorizedSystemApps]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n return subscribeMsgCenterAppKey((next) => {\n if (next) setCurrent(next);\n });\n }, []);\n\n const options = useMemo(\n () =>\n apps.map((a) => ({\n value: a.appKey,\n label: a.name,\n })),\n [apps],\n );\n\n if (error) {\n return (\n <Typography.Text type=\"danger\" className={className} style={style}>\n 应用列表不可用:{error}\n </Typography.Text>\n );\n }\n\n if (!loading && apps.length <= 1) {\n // 单权或无可切换:不展示切换器(PB-01:无第二项)\n return null;\n }\n\n return (\n <Select\n className={className}\n style={{ minWidth: 180, ...style }}\n loading={loading}\n value={current}\n options={options}\n optionFilterProp=\"label\"\n placeholder=\"消息应用\"\n aria-label=\"消息中心应用切换\"\n onChange={(value: string) => {\n const allowed = apps.map((a) => a.appKey);\n setMsgCenterAppKey(value, allowed);\n setCurrent(value);\n onAppKeyChange?.(value);\n }}\n />\n );\n};\n\nexport default MsgCenterAppSwitcher;\n"],"names":["MsgCenterAppSwitcher","listAuthorizedSystemApps","fallbackAppKey","className","style","onAppKeyChange","apps","setApps","useState","loading","setLoading","error","setError","current","setCurrent","getMsgCenterAppKey","reload","useCallback","raw","filtered","filterMsgCenterSwitchableApps","state","resolveMsgCenterSwitchState","setMsgCenterAppKey","a","useEffect","subscribeMsgCenterAppKey","next","options","useMemo","Typography","jsx","Select","value","allowed"],"mappings":";;;;AA4BA,MAAMA,IAA4D,CAAC;AAAA,EACjE,0BAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,gBAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAmC,CAAA,CAAE,GACvD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAChD,CAACK,GAASC,CAAU,IAAIN,EAAS,MAAMO,EAAmBb,CAAc,CAAC,GAEzEc,IAASC,EAAY,YAAY;AACrC,IAAAP,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,QAAI;AACF,YAAMM,IAAM,MAAMjB,EAAA,GACZkB,IAAWC,EAA8BF,KAAO,EAAE;AACxD,MAAAX,EAAQY,CAAQ;AAChB,YAAME,IAAQC,EAA4BH,GAAUjB,CAAc;AAClE,MAAAY,EAAWO,EAAM,aAAa,GAC1BN,EAAmBb,CAAc,MAAMmB,EAAM,iBAAiBF,EAAS,UACzEI;AAAA,QACEF,EAAM;AAAA,QACNF,EAAS,IAAI,CAACK,MAAMA,EAAE,MAAM;AAAA,MAAA;AAAA,IAGlC,SAAS,GAAG;AACV,MAAAZ,EAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,GACnDL,EAAQ,CAAA,CAAE;AAAA,IACZ,UAAA;AACE,MAAAG,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACR,GAAgBD,CAAwB,CAAC;AAE7C,EAAAwB,EAAU,MAAM;AACd,IAAKT,EAAA;AAAA,EACP,GAAG,CAACA,CAAM,CAAC,GAEXS,EAAU,MACDC,EAAyB,CAACC,MAAS;AACxC,IAAIA,OAAiBA,CAAI;AAAA,EAC3B,CAAC,GACA,CAAA,CAAE;AAEL,QAAMC,IAAUC;AAAA,IACd,MACEvB,EAAK,IAAI,CAACkB,OAAO;AAAA,MACf,OAAOA,EAAE;AAAA,MACT,OAAOA,EAAE;AAAA,IAAA,EACT;AAAA,IACJ,CAAClB,CAAI;AAAA,EAAA;AAGP,SAAIK,sBAECmB,EAAW,MAAX,EAAgB,MAAK,UAAS,WAAA3B,GAAsB,OAAAC,GAAc,UAAA;AAAA,IAAA;AAAA,IACxDO;AAAA,EAAA,GACX,IAIA,CAACF,KAAWH,EAAK,UAAU,IAEtB,OAIP,gBAAAyB;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAA7B;AAAA,MACA,OAAO,EAAE,UAAU,KAAK,GAAGC,EAAA;AAAA,MAC3B,SAAAK;AAAA,MACA,OAAOI;AAAA,MACP,SAAAe;AAAA,MACA,kBAAiB;AAAA,MACjB,aAAY;AAAA,MACZ,cAAW;AAAA,MACX,UAAU,CAACK,MAAkB;AAC3B,cAAMC,IAAU5B,EAAK,IAAI,CAACkB,MAAMA,EAAE,MAAM;AACxC,QAAAD,EAAmBU,GAAOC,CAAO,GACjCpB,EAAWmB,CAAK,GAChB5B,KAAA,QAAAA,EAAiB4B;AAAA,MACnB;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,2 @@
1
+ export { default as MsgCenterAppSwitcher } from './MsgCenterAppSwitcher';
2
+ export type { MsgCenterAppSwitcherProps } from './MsgCenterAppSwitcher';
@@ -1,3 +1,9 @@
1
1
  export { MessageTemplateAdmin } from './MessageTemplateAdmin';
2
- export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, } from './MessageTemplateAdmin';
2
+ export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './MessageTemplateAdmin';
3
3
  export { generateTemplateCode, normalizeTemplatePlaceholders, applyTemplateVars, stripHtmlToText, } from './utils/templateCode';
4
+ export { resolveMessageAdminPermissions } from './MessageTemplateAdmin';
5
+ export { MSG_CENTER_APP_SWITCH_STORAGE_KEY, SYSTEM_APP_TO_MSG_CENTER_APP_KEY, MSG_CENTER_SWITCHABLE_APP_KEYS, msgCenterAppKeyFromSystemAppCode, filterMsgCenterSwitchableApps, getMsgCenterAppKey, setMsgCenterAppKey, subscribeMsgCenterAppKey, bindMsgCenterAppKeyStorageSync, resolveMsgCenterSwitchState, } from './msgCenterAppSwitch';
6
+ export type { MsgCenterAppSwitchState, MsgCenterSwitchableApp, MsgCenterSwitchableAppKey, } from './msgCenterAppSwitch';
7
+ export { useMsgCenterAppKey } from './useMsgCenterAppKey';
8
+ export { MsgCenterAppSwitcher } from './MsgCenterAppSwitcher';
9
+ export type { MsgCenterAppSwitcherProps } from './MsgCenterAppSwitcher';