@hkyhy/marsun-components-core 0.1.135 → 0.1.136

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -136,6 +136,7 @@ node scripts/version-check.mjs --apply # → 0.1.99
136
136
 
137
137
  也可在 Actions 中手动运行 **Publish npm**,填写已有 tag 重新发布。
138
138
 
139
+ - 2026-10-21:`v0.1.136` — MessageCenter 推送规则级别改为业务 DI `levelOptions`(禁写死 L1/L2/L3;S3 可注入 L2+)
139
140
  - 2026-10-16:`v0.1.135` — 新建跟踪任务分配人/执行人必填星与任务类型同为 `is-req`(去掉 `marsun-form-info-is-req`)
140
141
  - 2026-10-14:`v0.1.134` — InboxBell Drawer「清空未读」可选 `markAllRead`;Demo/vitest
141
142
  - 2026-10-12:`v0.1.133` — DispositionBar 短徽章;模板来源 Tag;ActionList 去壳/铃铛摘要色;执行门禁 SSOT;vite external 子路径防双 React(feat 分支曾误标 0.1.135 未进 main,顺号回正)
@@ -1,26 +1,26 @@
1
1
  import { jsxs as V, jsx as n } from "react/jsx-runtime";
2
2
  import { message as p } from "antd";
3
- import { useMemo as c, useState as a, useCallback as ee, useEffect as Re } from "react";
4
- import { generateTemplateCode as Oe } from "../utils/templateCode.js";
5
- import { buildTemplateColumns as ze } from "./List/columns.js";
6
- import { TemplateFormModal as Fe } from "./Modal/TemplateFormModal.js";
7
- import { PushRulesPanel as Ue } from "./PushRulesPanel/index.js";
8
- import { VariablesPanel as $e } from "./VariablesPanel/index.js";
9
- import { resolveMessageAdminPermissions as je, previewVarsFromVariables as xe, variablesFromCatalog as De } from "./types.js";
3
+ import { useMemo as c, useState as a, useCallback as ee, useEffect as Fe } from "react";
4
+ import { generateTemplateCode as Ue } from "../utils/templateCode.js";
5
+ import { buildTemplateColumns as $e } from "./List/columns.js";
6
+ import { TemplateFormModal as je } from "./Modal/TemplateFormModal.js";
7
+ import { PushRulesPanel as xe } from "./PushRulesPanel/index.js";
8
+ import { VariablesPanel as De } from "./VariablesPanel/index.js";
9
+ import { resolveMessageAdminPermissions as Le, previewVarsFromVariables as Qe, variablesFromCatalog as _e } from "./types.js";
10
10
  import N from "./style.module.scss.js";
11
11
  import re from "../../../Alert/Alert.js";
12
- import Le from "../../../Layout/PageSpin/index.js";
12
+ import qe from "../../../Layout/PageSpin/index.js";
13
13
  import te from "../../../Empty/Empty.js";
14
- import Qe from "../../../Table/Table.js";
15
- import _e from "../../../StateBar/StateBar.js";
16
- import qe from "../../../InteractiveBlock/InteractiveBlock.js";
17
- function Ge(s) {
14
+ import Ge from "../../../Table/Table.js";
15
+ import He from "../../../StateBar/StateBar.js";
16
+ import Je from "../../../InteractiveBlock/InteractiveBlock.js";
17
+ function We(s) {
18
18
  return s ? Array.isArray(s) ? { events: s, variables: [] } : {
19
19
  events: Array.isArray(s.events) ? s.events : [],
20
- variables: De(s)
20
+ variables: _e(s)
21
21
  } : { events: [], variables: [] };
22
22
  }
23
- const cr = ({
23
+ const pr = ({
24
24
  fetchTemplates: s,
25
25
  saveTemplate: B,
26
26
  fetchEventCatalog: v,
@@ -37,18 +37,21 @@ const cr = ({
37
37
  savePushRule: z,
38
38
  setPushRuleEnabled: ne,
39
39
  deletePushRule: se,
40
+ levelOptions: le,
41
+ defaultLevels: ie,
42
+ levelFieldTips: ce,
40
43
  fetchVariables: F,
41
44
  saveVariable: U,
42
- deleteVariable: le,
43
- emptyText: ie = "暂无消息模板",
45
+ deleteVariable: me,
46
+ emptyText: ue = "暂无消息模板",
44
47
  className: $,
45
48
  codePrefix: j = "MEQ"
46
49
  }) => {
47
50
  const E = c(
48
- () => je(R, K),
51
+ () => Le(R, K),
49
52
  [R, K]
50
- ), t = E.template, h = E.push, w = E.variable, [C, x] = a([]), [i, D] = a([]), [k, L] = a([]), [Q, ce] = a([]), [me, ue] = a([]), [pe, de] = a(""), [ge, be] = a(""), [_, q] = a(!1), [G, H] = a(""), [S, J] = a(""), [W, d] = a(null), [X, Y] = a(!1), [u, ve] = a("template"), [fe, ye] = a(0), [Ee, he] = a(0), P = c(() => k.length ? k : m != null && m.length ? m : [], [k, m]), we = c(
51
- () => M || xe(P),
53
+ ), t = E.template, h = E.push, w = E.variable, [C, x] = a([]), [i, D] = a([]), [k, L] = a([]), [Q, pe] = a([]), [de, ge] = a([]), [be, ve] = a(""), [fe, ye] = a(""), [_, q] = a(!1), [G, H] = a(""), [S, J] = a(""), [W, d] = a(null), [X, Y] = a(!1), [u, Ee] = a("template"), [he, we] = a(0), [Ce, ke] = a(0), P = c(() => k.length ? k : m != null && m.length ? m : [], [k, m]), Se = c(
54
+ () => M || Qe(P),
52
55
  [M, P]
53
56
  ), g = ee(async () => {
54
57
  q(!0), H(""), J("");
@@ -79,20 +82,20 @@ const cr = ({
79
82
  })
80
83
  ]);
81
84
  if (x(Array.isArray(e) ? e : []), o.ok) {
82
- const r = Ge(
85
+ const r = We(
83
86
  o.raw
84
87
  );
85
88
  D(r.events), L(r.variables);
86
89
  } else
87
90
  D([]), L([]), J(o.error);
88
- ce(l.raw), de(l.ok ? "" : l.error), ue(A.raw), be(A.ok ? "" : A.error);
91
+ pe(l.raw), ve(l.ok ? "" : l.error), ge(A.raw), ye(A.ok ? "" : A.error);
89
92
  } catch (e) {
90
93
  H(e instanceof Error ? e.message : String(e)), x([]);
91
94
  } finally {
92
95
  q(!1);
93
96
  }
94
97
  }, [s, v, f, y]);
95
- Re(() => {
98
+ Fe(() => {
96
99
  g();
97
100
  }, [g]);
98
101
  const Z = ee(
@@ -101,11 +104,11 @@ const cr = ({
101
104
  return ((o = i.find((l) => l.eventKey === e)) == null ? void 0 : o.label) || e || "—";
102
105
  },
103
106
  [i]
104
- ), Ce = () => {
107
+ ), Pe = () => {
105
108
  if (!t.create) return;
106
109
  const e = i[0];
107
110
  Y(!0), d({
108
- code: Oe(j),
111
+ code: Ue(j),
109
112
  eventKey: e == null ? void 0 : e.eventKey,
110
113
  scenario: e == null ? void 0 : e.label,
111
114
  label: e == null ? void 0 : e.label,
@@ -116,15 +119,15 @@ const cr = ({
116
119
  enabled: !1,
117
120
  channel: "in_app"
118
121
  });
119
- }, ke = (e) => {
122
+ }, Te = (e) => {
120
123
  t.update && (Y(!1), d({ ...e }));
121
- }, Se = async (e) => {
124
+ }, Ae = async (e) => {
122
125
  if (!B) {
123
126
  p.warning("未配置保存接口");
124
127
  return;
125
128
  }
126
129
  await B(e), p.success("已保存"), d(null), await g();
127
- }, Pe = async (e, o) => {
130
+ }, Ne = async (e, o) => {
128
131
  if (!I) {
129
132
  p.warning("未配置启用接口");
130
133
  return;
@@ -134,48 +137,51 @@ const cr = ({
134
137
  } catch (l) {
135
138
  p.error(l instanceof Error ? l.message : String(l));
136
139
  }
137
- }, Te = c(
138
- () => ze({
140
+ }, Be = c(
141
+ () => $e({
139
142
  canUpdate: t.update,
140
143
  eventLabel: Z,
141
- onEdit: ke,
142
- onToggleEnabled: (e, o) => void Pe(e, o)
144
+ onEdit: Te,
145
+ onToggleEnabled: (e, o) => void Ne(e, o)
143
146
  }),
144
147
  [t.update, Z]
145
- ), T = !!(O && z), b = !!(F && U), Ae = T ? /* @__PURE__ */ n(
146
- Ue,
148
+ ), T = !!(O && z), b = !!(F && U), Ie = T ? /* @__PURE__ */ n(
149
+ xe,
147
150
  {
148
151
  crud: h,
149
152
  catalog: i,
150
153
  templates: C,
151
154
  roleOptions: Q,
152
- userOptions: me,
153
- audienceRolesError: pe,
154
- audienceUsersError: ge,
155
+ userOptions: de,
156
+ audienceRolesError: be,
157
+ audienceUsersError: fe,
158
+ levelOptions: le,
159
+ defaultLevels: ie,
160
+ levelFieldTips: ce,
155
161
  fetchPushRules: O,
156
162
  savePushRule: z,
157
163
  setPushRuleEnabled: ne,
158
164
  deletePushRule: se,
159
- createNonce: fe
165
+ createNonce: he
160
166
  }
161
167
  ) : oe ?? /* @__PURE__ */ n(
162
- qe,
168
+ Je,
163
169
  {
164
170
  title: "消息推送",
165
171
  info: [{ label: "说明", value: "未接线 fetchPushRules:请业务注入推送规则 API。" }],
166
172
  description: "推送规则 CRUD 须由业务 DI 提供。",
167
173
  surface: "inset"
168
174
  }
169
- ), Ne = b ? /* @__PURE__ */ n(
170
- $e,
175
+ ), Me = b ? /* @__PURE__ */ n(
176
+ De,
171
177
  {
172
178
  crud: w,
173
179
  fetchVariables: F,
174
180
  saveVariable: U,
175
- deleteVariable: le,
176
- createNonce: Ee
181
+ deleteVariable: me,
182
+ createNonce: Ce
177
183
  }
178
- ) : null, Be = /* @__PURE__ */ V("div", { className: N.pane, children: [
184
+ ) : null, Ke = /* @__PURE__ */ V("div", { className: N.pane, children: [
179
185
  G ? /* @__PURE__ */ n(re, { type: "error", showIcon: !0, message: G, style: { marginBottom: 12 } }) : null,
180
186
  S ? /* @__PURE__ */ n(
181
187
  re,
@@ -186,20 +192,20 @@ const cr = ({
186
192
  style: { marginBottom: 12 }
187
193
  }
188
194
  ) : null,
189
- /* @__PURE__ */ n(Le, { spinning: _, children: t.read ? C.length === 0 && !_ ? /* @__PURE__ */ n(te, { description: ie }) : /* @__PURE__ */ n(
190
- Qe,
195
+ /* @__PURE__ */ n(qe, { spinning: _, children: t.read ? C.length === 0 && !_ ? /* @__PURE__ */ n(te, { description: ue }) : /* @__PURE__ */ n(
196
+ Ge,
191
197
  {
192
198
  rowKey: (e) => e.id || e.code || String(e.eventKey),
193
199
  tableName: "msg-center-message-templates",
194
200
  columnConfigEnabled: !1,
195
201
  columnResizeEnabled: !1,
196
- columns: Te,
202
+ columns: Be,
197
203
  dataSource: C,
198
204
  pagination: !1,
199
205
  size: "small"
200
206
  }
201
207
  ) : /* @__PURE__ */ n(te, { description: "无消息模板读取权限" }) })
202
- ] }), Ie = c(
208
+ ] }), Re = c(
203
209
  () => [
204
210
  {
205
211
  label: "编号",
@@ -217,24 +223,24 @@ const cr = ({
217
223
  ...t.read ? [] : [{ label: "读取", value: "无消息模板读取权限。" }]
218
224
  ],
219
225
  [t.create, t.update, t.read]
220
- ), Me = c(() => u === "push" && T ? {
226
+ ), Oe = c(() => u === "push" && T ? {
221
227
  variant: "button",
222
228
  buttonType: "primary",
223
229
  label: "新建推送规则",
224
230
  disabled: !h.create,
225
- onClick: () => ye((e) => e + 1)
231
+ onClick: () => we((e) => e + 1)
226
232
  } : u === "variables" && b ? {
227
233
  variant: "button",
228
234
  buttonType: "primary",
229
235
  label: "新建变量",
230
236
  disabled: !w.create,
231
- onClick: () => he((e) => e + 1)
237
+ onClick: () => ke((e) => e + 1)
232
238
  } : {
233
239
  variant: "button",
234
240
  buttonType: "primary",
235
241
  label: "新建模板",
236
242
  disabled: !t.create || u !== "template",
237
- onClick: () => Ce()
243
+ onClick: () => Pe()
238
244
  }, [
239
245
  u,
240
246
  T,
@@ -244,39 +250,39 @@ const cr = ({
244
250
  t.create,
245
251
  i,
246
252
  j
247
- ]), Ke = [
253
+ ]), ze = [
248
254
  {
249
255
  key: "template",
250
256
  label: "消息模板",
251
- info: Ie,
252
- children: Be
257
+ info: Re,
258
+ children: Ke
253
259
  },
254
260
  {
255
261
  key: "push",
256
262
  label: "消息推送",
257
- children: Ae
263
+ children: Ie
258
264
  },
259
265
  ...b ? [
260
266
  {
261
267
  key: "variables",
262
268
  label: "变量",
263
- children: Ne
269
+ children: Me
264
270
  }
265
271
  ] : []
266
272
  ];
267
273
  return /* @__PURE__ */ V("div", { className: $ ? `${N.root} ${$}` : N.root, children: [
268
274
  /* @__PURE__ */ n(
269
- _e,
275
+ He,
270
276
  {
271
277
  type: "tab",
272
278
  activeKey: u,
273
- onChange: (e) => ve(String(e)),
274
- actions: [Me],
275
- stateOption: Ke
279
+ onChange: (e) => Ee(String(e)),
280
+ actions: [Oe],
281
+ stateOption: ze
276
282
  }
277
283
  ),
278
284
  /* @__PURE__ */ n(
279
- Fe,
285
+ je,
280
286
  {
281
287
  open: !!W,
282
288
  isCreate: X,
@@ -285,16 +291,16 @@ const cr = ({
285
291
  roleOptions: Q,
286
292
  variables: P,
287
293
  catalogError: S,
288
- previewVars: we,
294
+ previewVars: Se,
289
295
  canWrite: X ? t.create : t.update,
290
296
  onCancel: () => d(null),
291
- onSubmit: Se,
297
+ onSubmit: Ae,
292
298
  renderAudienceField: ae
293
299
  }
294
300
  )
295
301
  ] });
296
302
  };
297
303
  export {
298
- cr as MessageTemplateAdmin
304
+ pr as MessageTemplateAdmin
299
305
  };
300
306
  //# sourceMappingURL=MessageTemplateAdmin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageTemplateAdmin.js","sources":["../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.tsx"],"sourcesContent":["import { Alert } from '@/components/Alert';\nimport { InteractiveBlock } from '@/components/InteractiveBlock';\nimport { Empty } from '@/components/Empty';\nimport { PageSpin } from '@/components/Layout';\nimport { StateBar } from '@/components/StateBar';\nimport { Table } from '@/components/Table';\nimport { message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { generateTemplateCode } from '../utils/templateCode';\nimport { buildTemplateColumns } from './List/columns';\nimport { TemplateFormModal } from './Modal/TemplateFormModal';\nimport { PushRulesPanel } from './PushRulesPanel';\nimport { VariablesPanel } from './VariablesPanel';\nimport type {\n MessageAudienceRoleOption,\n MessageAudienceUserOption,\n MessageEventCatalogItem,\n MessageEventCatalogPayload,\n MessageTemplateAdminItem,\n MessageTemplateAdminProps,\n MessageTemplateVariable,\n} from './types';\nimport {\n previewVarsFromVariables,\n resolveMessageAdminPermissions,\n variablesFromCatalog,\n} from './types';\nimport styles from './style.module.scss';\n\nfunction normalizeCatalogResult(\n raw: MessageEventCatalogItem[] | MessageEventCatalogPayload | undefined,\n): { events: MessageEventCatalogItem[]; variables: MessageTemplateVariable[] } {\n if (!raw) return { events: [], variables: [] };\n if (Array.isArray(raw)) return { events: raw, variables: [] };\n return {\n events: Array.isArray(raw.events) ? raw.events : [],\n variables: variablesFromCatalog(raw),\n };\n}\n\n/**\n * 消息模板配置壳。权限码 / SSO / HTTP 由业务 DI。\n * 列表:core Table;表单:FormInfo FormModal;正文:L2 Editor 懒加载。\n */\nexport const MessageTemplateAdmin: React.FC<MessageTemplateAdminProps> = ({\n fetchTemplates,\n saveTemplate,\n fetchEventCatalog,\n setTemplateEnabled,\n fetchAudienceRoles,\n fetchAudienceUsers,\n templateVariables,\n previewVars: previewVarsProp,\n canWrite = false,\n permissions,\n renderAudienceField,\n pushRulesSlot,\n fetchPushRules,\n savePushRule,\n setPushRuleEnabled,\n deletePushRule,\n fetchVariables,\n saveVariable,\n deleteVariable,\n emptyText = '暂无消息模板',\n className,\n codePrefix = 'MEQ',\n}) => {\n const perms = useMemo(\n () => resolveMessageAdminPermissions(permissions, canWrite),\n [permissions, canWrite],\n );\n const tpl = perms.template;\n const pushPerm = perms.push;\n const varPerm = perms.variable;\n\n const [rows, setRows] = useState<MessageTemplateAdminItem[]>([]);\n const [catalog, setCatalog] = useState<MessageEventCatalogItem[]>([]);\n const [catalogVars, setCatalogVars] = useState<MessageTemplateVariable[]>([]);\n const [roleOptions, setRoleOptions] = useState<MessageAudienceRoleOption[]>([]);\n const [userOptions, setUserOptions] = useState<MessageAudienceUserOption[]>([]);\n const [audienceRolesError, setAudienceRolesError] = useState('');\n const [audienceUsersError, setAudienceUsersError] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [catalogError, setCatalogError] = useState('');\n const [editing, setEditing] = useState<MessageTemplateAdminItem | null>(null);\n const [isCreate, setIsCreate] = useState(false);\n const [tab, setTab] = useState('template');\n const [pushCreateNonce, setPushCreateNonce] = useState(0);\n const [varCreateNonce, setVarCreateNonce] = useState(0);\n\n const variables = useMemo(() => {\n if (catalogVars.length) return catalogVars;\n if (templateVariables?.length) return templateVariables;\n return [];\n }, [catalogVars, templateVariables]);\n\n const previewVars = useMemo(\n () => previewVarsProp || previewVarsFromVariables(variables),\n [previewVarsProp, variables],\n );\n\n const reload = useCallback(async () => {\n setLoading(true);\n setError('');\n setCatalogError('');\n try {\n const [list, catSettled, rolesSettled, usersSettled] = await Promise.all([\n fetchTemplates(),\n fetchEventCatalog\n ? fetchEventCatalog()\n .then((raw) => ({ ok: true as const, raw }))\n .catch((e: unknown) => ({\n ok: false as const,\n error: e instanceof Error ? e.message : String(e),\n }))\n : Promise.resolve({ ok: true as const, raw: { events: [], variables: [] } }),\n fetchAudienceRoles\n ? fetchAudienceRoles()\n .then((r) => ({ ok: true as const, raw: r, error: '' }))\n .catch((e: unknown) => ({\n ok: false as const,\n raw: [] as MessageAudienceRoleOption[],\n error: e instanceof Error ? e.message : String(e),\n }))\n : Promise.resolve({\n ok: true as const,\n raw: [] as MessageAudienceRoleOption[],\n error: '',\n }),\n fetchAudienceUsers\n ? fetchAudienceUsers()\n .then((r) => ({ ok: true as const, raw: r, error: '' }))\n .catch((e: unknown) => ({\n ok: false as const,\n raw: [] as MessageAudienceUserOption[],\n error: e instanceof Error ? e.message : String(e),\n }))\n : Promise.resolve({\n ok: true as const,\n raw: [] as MessageAudienceUserOption[],\n error: '',\n }),\n ]);\n setRows(Array.isArray(list) ? list : []);\n if (catSettled.ok) {\n const normalized = normalizeCatalogResult(\n catSettled.raw as MessageEventCatalogItem[] | MessageEventCatalogPayload,\n );\n setCatalog(normalized.events);\n setCatalogVars(normalized.variables);\n } else {\n setCatalog([]);\n setCatalogVars([]);\n setCatalogError(catSettled.error);\n }\n setRoleOptions(rolesSettled.raw);\n setAudienceRolesError(rolesSettled.ok ? '' : rolesSettled.error);\n setUserOptions(usersSettled.raw);\n setAudienceUsersError(usersSettled.ok ? '' : usersSettled.error);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setRows([]);\n } finally {\n setLoading(false);\n }\n }, [fetchTemplates, fetchEventCatalog, fetchAudienceRoles, fetchAudienceUsers]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n const eventLabel = useCallback(\n (ek?: string) => catalog.find((c) => c.eventKey === ek)?.label || ek || '—',\n [catalog],\n );\n\n const openCreate = () => {\n if (!tpl.create) return;\n const first = catalog[0];\n setIsCreate(true);\n setEditing({\n code: generateTemplateCode(codePrefix),\n eventKey: first?.eventKey,\n scenario: first?.label,\n label: first?.label,\n messageType: first?.messageType || 'alert',\n titleTemplate: '',\n bodyTemplate: '',\n audienceRoles: [],\n enabled: false,\n channel: 'in_app',\n });\n };\n\n const openEdit = (item: MessageTemplateAdminItem) => {\n if (!tpl.update) return;\n setIsCreate(false);\n setEditing({ ...item });\n };\n\n const onSave = async (item: MessageTemplateAdminItem) => {\n if (!saveTemplate) {\n message.warning('未配置保存接口');\n return;\n }\n await saveTemplate(item);\n message.success('已保存');\n setEditing(null);\n await reload();\n };\n\n const onToggleEnabled = async (item: MessageTemplateAdminItem, enabled: boolean) => {\n if (!setTemplateEnabled) {\n message.warning('未配置启用接口');\n return;\n }\n try {\n await setTemplateEnabled(item, enabled);\n message.success(enabled ? '已启用' : '已停用');\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n };\n\n const columns = useMemo(\n () =>\n buildTemplateColumns({\n canUpdate: tpl.update,\n eventLabel,\n onEdit: openEdit,\n onToggleEnabled: (r, enabled) => void onToggleEnabled(r, enabled),\n }),\n [tpl.update, eventLabel],\n );\n\n const pushEnabled = Boolean(fetchPushRules && savePushRule);\n const varsEnabled = Boolean(fetchVariables && saveVariable);\n\n const pushPane = pushEnabled ? (\n <PushRulesPanel\n crud={pushPerm}\n catalog={catalog}\n templates={rows}\n roleOptions={roleOptions}\n userOptions={userOptions}\n audienceRolesError={audienceRolesError}\n audienceUsersError={audienceUsersError}\n fetchPushRules={fetchPushRules!}\n savePushRule={savePushRule!}\n setPushRuleEnabled={setPushRuleEnabled}\n deletePushRule={deletePushRule}\n createNonce={pushCreateNonce}\n />\n ) : (\n (pushRulesSlot ?? (\n <InteractiveBlock\n title=\"消息推送\"\n info={[{ label: '说明', value: '未接线 fetchPushRules:请业务注入推送规则 API。' }]}\n description=\"推送规则 CRUD 须由业务 DI 提供。\"\n surface=\"inset\"\n />\n ))\n );\n\n const variablesPane = varsEnabled ? (\n <VariablesPanel\n crud={varPerm}\n fetchVariables={fetchVariables!}\n saveVariable={saveVariable!}\n deleteVariable={deleteVariable}\n createNonce={varCreateNonce}\n />\n ) : null;\n\n const templatePane = (\n <div className={styles.pane}>\n {error ? <Alert type=\"error\" showIcon message={error} style={{ marginBottom: 12 }} /> : null}\n {catalogError ? (\n <Alert\n type=\"warning\"\n showIcon\n message={`事件目录加载失败:${catalogError}`}\n style={{ marginBottom: 12 }}\n />\n ) : null}\n <PageSpin spinning={loading}>\n {!tpl.read ? (\n <Empty description=\"无消息模板读取权限\" />\n ) : rows.length === 0 && !loading ? (\n <Empty description={emptyText} />\n ) : (\n <Table<MessageTemplateAdminItem>\n rowKey={(r) => r.id || r.code || String(r.eventKey)}\n tableName=\"msg-center-message-templates\"\n columnConfigEnabled={false}\n columnResizeEnabled={false}\n columns={columns}\n dataSource={rows}\n pagination={false}\n size=\"small\"\n />\n )}\n </PageSpin>\n </div>\n );\n\n const templateTabInfo = useMemo(\n () => [\n {\n label: '编号',\n value: '新建时自动生成模板编号。',\n },\n {\n label: '默认停用',\n value: '新建默认停用;保存后可在列表中开启「启用」。',\n },\n {\n label: '变量',\n value:\n '点「插入变量」从 catalog 选择(中文+code)。标题为明文可手改;正文为原子色块(不可改字、整颗删)。禁止 FE 平行变量表。',\n },\n ...(!tpl.create && !tpl.update\n ? [{ label: '权限', value: '当前只读:无新建/编辑权限。' }]\n : []),\n ...(!tpl.read ? [{ label: '读取', value: '无消息模板读取权限。' }] : []),\n ],\n [tpl.create, tpl.update, tpl.read],\n );\n\n const primaryAction = useMemo(() => {\n if (tab === 'push' && pushEnabled) {\n return {\n variant: 'button' as const,\n buttonType: 'primary' as const,\n label: '新建推送规则',\n disabled: !pushPerm.create,\n onClick: () => setPushCreateNonce((n) => n + 1),\n };\n }\n if (tab === 'variables' && varsEnabled) {\n return {\n variant: 'button' as const,\n buttonType: 'primary' as const,\n label: '新建变量',\n disabled: !varPerm.create,\n onClick: () => setVarCreateNonce((n) => n + 1),\n };\n }\n return {\n variant: 'button' as const,\n buttonType: 'primary' as const,\n label: '新建模板',\n disabled: !tpl.create || tab !== 'template',\n onClick: () => openCreate(),\n };\n }, [\n tab,\n pushEnabled,\n varsEnabled,\n pushPerm.create,\n varPerm.create,\n tpl.create,\n catalog,\n codePrefix,\n ]);\n\n const stateOption = [\n {\n key: 'template',\n label: '消息模板',\n info: templateTabInfo,\n children: templatePane,\n },\n {\n key: 'push',\n label: '消息推送',\n children: pushPane,\n },\n ...(varsEnabled\n ? [\n {\n key: 'variables',\n label: '变量',\n children: variablesPane,\n },\n ]\n : []),\n ];\n\n return (\n <div className={className ? `${styles.root} ${className}` : styles.root}>\n <StateBar\n type=\"tab\"\n activeKey={tab}\n onChange={(k) => setTab(String(k))}\n actions={[primaryAction]}\n stateOption={stateOption}\n />\n <TemplateFormModal\n open={Boolean(editing)}\n isCreate={isCreate}\n initial={editing}\n catalog={catalog}\n roleOptions={roleOptions}\n variables={variables}\n catalogError={catalogError}\n previewVars={previewVars}\n canWrite={isCreate ? tpl.create : tpl.update}\n onCancel={() => setEditing(null)}\n onSubmit={onSave}\n renderAudienceField={renderAudienceField}\n />\n </div>\n );\n};\n\nexport default MessageTemplateAdmin;\n"],"names":["normalizeCatalogResult","raw","variablesFromCatalog","MessageTemplateAdmin","fetchTemplates","saveTemplate","fetchEventCatalog","setTemplateEnabled","fetchAudienceRoles","fetchAudienceUsers","templateVariables","previewVarsProp","canWrite","permissions","renderAudienceField","pushRulesSlot","fetchPushRules","savePushRule","setPushRuleEnabled","deletePushRule","fetchVariables","saveVariable","deleteVariable","emptyText","className","codePrefix","perms","useMemo","resolveMessageAdminPermissions","tpl","pushPerm","varPerm","rows","setRows","useState","catalog","setCatalog","catalogVars","setCatalogVars","roleOptions","setRoleOptions","userOptions","setUserOptions","audienceRolesError","setAudienceRolesError","audienceUsersError","setAudienceUsersError","loading","setLoading","error","setError","catalogError","setCatalogError","editing","setEditing","isCreate","setIsCreate","tab","setTab","pushCreateNonce","setPushCreateNonce","varCreateNonce","setVarCreateNonce","variables","previewVars","previewVarsFromVariables","reload","useCallback","list","catSettled","rolesSettled","usersSettled","e","normalized","useEffect","eventLabel","ek","_a","c","openCreate","first","generateTemplateCode","openEdit","item","onSave","message","onToggleEnabled","enabled","columns","buildTemplateColumns","r","pushEnabled","varsEnabled","pushPane","jsx","PushRulesPanel","InteractiveBlock","variablesPane","VariablesPanel","templatePane","jsxs","styles","Alert","PageSpin","Empty","Table","templateTabInfo","primaryAction","n","stateOption","StateBar","k","TemplateFormModal"],"mappings":";;;;;;;;;;;;;;;;AA6BA,SAASA,GACPC,GAC6E;AAC7E,SAAKA,IACD,MAAM,QAAQA,CAAG,IAAU,EAAE,QAAQA,GAAK,WAAW,GAAC,IACnD;AAAA,IACL,QAAQ,MAAM,QAAQA,EAAI,MAAM,IAAIA,EAAI,SAAS,CAAA;AAAA,IACjD,WAAWC,GAAqBD,CAAG;AAAA,EAAA,IAJpB,EAAE,QAAQ,CAAA,GAAI,WAAW,GAAC;AAM7C;AAMO,MAAME,KAA4D,CAAC;AAAA,EACxE,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,aAAaC;AAAA,EACb,UAAAC,IAAW;AAAA,EACX,aAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,WAAAC,KAAY;AAAA,EACZ,WAAAC;AAAA,EACA,YAAAC,IAAa;AACf,MAAM;AACJ,QAAMC,IAAQC;AAAA,IACZ,MAAMC,GAA+Bf,GAAaD,CAAQ;AAAA,IAC1D,CAACC,GAAaD,CAAQ;AAAA,EAAA,GAElBiB,IAAMH,EAAM,UACZI,IAAWJ,EAAM,MACjBK,IAAUL,EAAM,UAEhB,CAACM,GAAMC,CAAO,IAAIC,EAAqC,CAAA,CAAE,GACzD,CAACC,GAASC,CAAU,IAAIF,EAAoC,CAAA,CAAE,GAC9D,CAACG,GAAaC,CAAc,IAAIJ,EAAoC,CAAA,CAAE,GACtE,CAACK,GAAaC,EAAc,IAAIN,EAAsC,CAAA,CAAE,GACxE,CAACO,IAAaC,EAAc,IAAIR,EAAsC,CAAA,CAAE,GACxE,CAACS,IAAoBC,EAAqB,IAAIV,EAAS,EAAE,GACzD,CAACW,IAAoBC,EAAqB,IAAIZ,EAAS,EAAE,GACzD,CAACa,GAASC,CAAU,IAAId,EAAS,EAAK,GACtC,CAACe,GAAOC,CAAQ,IAAIhB,EAAS,EAAE,GAC/B,CAACiB,GAAcC,CAAe,IAAIlB,EAAS,EAAE,GAC7C,CAACmB,GAASC,CAAU,IAAIpB,EAA0C,IAAI,GACtE,CAACqB,GAAUC,CAAW,IAAItB,EAAS,EAAK,GACxC,CAACuB,GAAKC,EAAM,IAAIxB,EAAS,UAAU,GACnC,CAACyB,IAAiBC,EAAkB,IAAI1B,EAAS,CAAC,GAClD,CAAC2B,IAAgBC,EAAiB,IAAI5B,EAAS,CAAC,GAEhD6B,IAAYpC,EAAQ,MACpBU,EAAY,SAAeA,IAC3B3B,KAAA,QAAAA,EAAmB,SAAeA,IAC/B,CAAA,GACN,CAAC2B,GAAa3B,CAAiB,CAAC,GAE7BsD,KAAcrC;AAAA,IAClB,MAAMhB,KAAmBsD,GAAyBF,CAAS;AAAA,IAC3D,CAACpD,GAAiBoD,CAAS;AAAA,EAAA,GAGvBG,IAASC,GAAY,YAAY;AACrC,IAAAnB,EAAW,EAAI,GACfE,EAAS,EAAE,GACXE,EAAgB,EAAE;AAClB,QAAI;AACF,YAAM,CAACgB,GAAMC,GAAYC,GAAcC,CAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,QACvEnE,EAAA;AAAA,QACAE,IACIA,EAAA,EACG,KAAK,CAACL,OAAS,EAAE,IAAI,IAAe,KAAAA,EAAA,EAAM,EAC1C,MAAM,CAACuE,OAAgB;AAAA,UACtB,IAAI;AAAA,UACJ,OAAOA,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC;AAAA,QAAA,EAChD,IACJ,QAAQ,QAAQ,EAAE,IAAI,IAAe,KAAK,EAAE,QAAQ,CAAA,GAAI,WAAW,CAAA,EAAC,GAAK;AAAA,QAC7EhE,IACIA,EAAA,EACG,KAAK,CAAC,OAAO,EAAE,IAAI,IAAe,KAAK,GAAG,OAAO,GAAA,EAAK,EACtD,MAAM,CAACgE,OAAgB;AAAA,UACtB,IAAI;AAAA,UACJ,KAAK,CAAA;AAAA,UACL,OAAOA,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC;AAAA,QAAA,EAChD,IACJ,QAAQ,QAAQ;AAAA,UACd,IAAI;AAAA,UACJ,KAAK,CAAA;AAAA,UACL,OAAO;AAAA,QAAA,CACR;AAAA,QACL/D,IACIA,EAAA,EACG,KAAK,CAAC,OAAO,EAAE,IAAI,IAAe,KAAK,GAAG,OAAO,GAAA,EAAK,EACtD,MAAM,CAAC+D,OAAgB;AAAA,UACtB,IAAI;AAAA,UACJ,KAAK,CAAA;AAAA,UACL,OAAOA,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC;AAAA,QAAA,EAChD,IACJ,QAAQ,QAAQ;AAAA,UACd,IAAI;AAAA,UACJ,KAAK,CAAA;AAAA,UACL,OAAO;AAAA,QAAA,CACR;AAAA,MAAA,CACN;AAED,UADAvC,EAAQ,MAAM,QAAQmC,CAAI,IAAIA,IAAO,CAAA,CAAE,GACnCC,EAAW,IAAI;AACjB,cAAMI,IAAazE;AAAA,UACjBqE,EAAW;AAAA,QAAA;AAEb,QAAAjC,EAAWqC,EAAW,MAAM,GAC5BnC,EAAemC,EAAW,SAAS;AAAA,MACrC;AACE,QAAArC,EAAW,CAAA,CAAE,GACbE,EAAe,CAAA,CAAE,GACjBc,EAAgBiB,EAAW,KAAK;AAElC,MAAA7B,GAAe8B,EAAa,GAAG,GAC/B1B,GAAsB0B,EAAa,KAAK,KAAKA,EAAa,KAAK,GAC/D5B,GAAe6B,EAAa,GAAG,GAC/BzB,GAAsByB,EAAa,KAAK,KAAKA,EAAa,KAAK;AAAA,IACjE,SAAS,GAAG;AACV,MAAArB,EAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,GACnDjB,EAAQ,CAAA,CAAE;AAAA,IACZ,UAAA;AACE,MAAAe,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC5C,GAAgBE,GAAmBE,GAAoBC,CAAkB,CAAC;AAE9E,EAAAiE,GAAU,MAAM;AACd,IAAKR,EAAA;AAAA,EACP,GAAG,CAACA,CAAM,CAAC;AAEX,QAAMS,IAAaR;AAAA,IACjB,CAACS,MAAA;;AAAgB,eAAAC,IAAA1C,EAAQ,KAAK,CAAC2C,MAAMA,EAAE,aAAaF,CAAE,MAArC,gBAAAC,EAAwC,UAASD,KAAM;AAAA;AAAA,IACxE,CAACzC,CAAO;AAAA,EAAA,GAGJ4C,KAAa,MAAM;AACvB,QAAI,CAAClD,EAAI,OAAQ;AACjB,UAAMmD,IAAQ7C,EAAQ,CAAC;AACvB,IAAAqB,EAAY,EAAI,GAChBF,EAAW;AAAA,MACT,MAAM2B,GAAqBxD,CAAU;AAAA,MACrC,UAAUuD,KAAA,gBAAAA,EAAO;AAAA,MACjB,UAAUA,KAAA,gBAAAA,EAAO;AAAA,MACjB,OAAOA,KAAA,gBAAAA,EAAO;AAAA,MACd,cAAaA,KAAA,gBAAAA,EAAO,gBAAe;AAAA,MACnC,eAAe;AAAA,MACf,cAAc;AAAA,MACd,eAAe,CAAA;AAAA,MACf,SAAS;AAAA,MACT,SAAS;AAAA,IAAA,CACV;AAAA,EACH,GAEME,KAAW,CAACC,MAAmC;AACnD,IAAKtD,EAAI,WACT2B,EAAY,EAAK,GACjBF,EAAW,EAAE,GAAG6B,GAAM;AAAA,EACxB,GAEMC,KAAS,OAAOD,MAAmC;AACvD,QAAI,CAAC9E,GAAc;AACjB,MAAAgF,EAAQ,QAAQ,SAAS;AACzB;AAAA,IACF;AACA,UAAMhF,EAAa8E,CAAI,GACvBE,EAAQ,QAAQ,KAAK,GACrB/B,EAAW,IAAI,GACf,MAAMY,EAAA;AAAA,EACR,GAEMoB,KAAkB,OAAOH,GAAgCI,MAAqB;AAClF,QAAI,CAAChF,GAAoB;AACvB,MAAA8E,EAAQ,QAAQ,SAAS;AACzB;AAAA,IACF;AACA,QAAI;AACF,YAAM9E,EAAmB4E,GAAMI,CAAO,GACtCF,EAAQ,QAAQE,IAAU,QAAQ,KAAK,GACvC,MAAMrB,EAAA;AAAA,IACR,SAASM,GAAG;AACV,MAAAa,EAAQ,MAAMb,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF,GAEMgB,KAAU7D;AAAA,IACd,MACE8D,GAAqB;AAAA,MACnB,WAAW5D,EAAI;AAAA,MACf,YAAA8C;AAAA,MACA,QAAQO;AAAA,MACR,iBAAiB,CAACQ,GAAGH,MAAY,KAAKD,GAAgBI,GAAGH,CAAO;AAAA,IAAA,CACjE;AAAA,IACH,CAAC1D,EAAI,QAAQ8C,CAAU;AAAA,EAAA,GAGnBgB,IAAc,GAAQ3E,KAAkBC,IACxC2E,IAAc,GAAQxE,KAAkBC,IAExCwE,KAAWF,IACf,gBAAAG;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,MAAMjE;AAAA,MACN,SAAAK;AAAA,MACA,WAAWH;AAAA,MACX,aAAAO;AAAA,MACA,aAAAE;AAAA,MACA,oBAAAE;AAAA,MACA,oBAAAE;AAAA,MACA,gBAAA7B;AAAA,MACA,cAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,aAAawC;AAAA,IAAA;AAAA,EAAA,IAGd5C,MACC,gBAAA+E;AAAA,IAACE;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,MAAM,CAAC,EAAE,OAAO,MAAM,OAAO,qCAAqC;AAAA,MAClE,aAAY;AAAA,MACZ,SAAQ;AAAA,IAAA;AAAA,EAAA,GAKRC,KAAgBL,IACpB,gBAAAE;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,MAAMnE;AAAA,MACN,gBAAAX;AAAA,MACA,cAAAC;AAAA,MACA,gBAAAC;AAAA,MACA,aAAauC;AAAA,IAAA;AAAA,EAAA,IAEb,MAEEsC,KACJ,gBAAAC,EAAC,OAAA,EAAI,WAAWC,EAAO,MACpB,UAAA;AAAA,IAAApD,IAAQ,gBAAA6C,EAACQ,IAAA,EAAM,MAAK,SAAQ,UAAQ,IAAC,SAASrD,GAAO,OAAO,EAAE,cAAc,GAAA,GAAM,IAAK;AAAA,IACvFE,IACC,gBAAA2C;AAAA,MAACQ;AAAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,UAAQ;AAAA,QACR,SAAS,YAAYnD,CAAY;AAAA,QACjC,OAAO,EAAE,cAAc,GAAA;AAAA,MAAG;AAAA,IAAA,IAE1B;AAAA,IACJ,gBAAA2C,EAACS,MAAS,UAAUxD,GACjB,UAAClB,EAAI,OAEFG,EAAK,WAAW,KAAK,CAACe,IACxB,gBAAA+C,EAACU,IAAA,EAAM,aAAajF,GAAA,CAAW,IAE/B,gBAAAuE;AAAA,MAACW;AAAA,MAAA;AAAA,QACC,QAAQ,CAACf,MAAMA,EAAE,MAAMA,EAAE,QAAQ,OAAOA,EAAE,QAAQ;AAAA,QAClD,WAAU;AAAA,QACV,qBAAqB;AAAA,QACrB,qBAAqB;AAAA,QACrB,SAAAF;AAAA,QACA,YAAYxD;AAAA,QACZ,YAAY;AAAA,QACZ,MAAK;AAAA,MAAA;AAAA,IAAA,sBAZNwE,IAAA,EAAM,aAAY,aAAY,EAa/B,CAEJ;AAAA,EAAA,GACF,GAGIE,KAAkB/E;AAAA,IACtB,MAAM;AAAA,MACJ;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,MAET;AAAA,QACE,OAAO;AAAA,QACP,OACE;AAAA,MAAA;AAAA,MAEJ,GAAI,CAACE,EAAI,UAAU,CAACA,EAAI,SACpB,CAAC,EAAE,OAAO,MAAM,OAAO,iBAAA,CAAkB,IACzC,CAAA;AAAA,MACJ,GAAKA,EAAI,OAAgD,CAAA,IAAzC,CAAC,EAAE,OAAO,MAAM,OAAO,aAAA,CAAc;AAAA,IAAK;AAAA,IAE5D,CAACA,EAAI,QAAQA,EAAI,QAAQA,EAAI,IAAI;AAAA,EAAA,GAG7B8E,KAAgBhF,EAAQ,MACxB8B,MAAQ,UAAUkC,IACb;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU,CAAC7D,EAAS;AAAA,IACpB,SAAS,MAAM8B,GAAmB,CAACgD,MAAMA,IAAI,CAAC;AAAA,EAAA,IAG9CnD,MAAQ,eAAemC,IAClB;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU,CAAC7D,EAAQ;AAAA,IACnB,SAAS,MAAM+B,GAAkB,CAAC8C,MAAMA,IAAI,CAAC;AAAA,EAAA,IAG1C;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU,CAAC/E,EAAI,UAAU4B,MAAQ;AAAA,IACjC,SAAS,MAAMsB,GAAA;AAAA,EAAW,GAE3B;AAAA,IACDtB;AAAA,IACAkC;AAAA,IACAC;AAAA,IACA9D,EAAS;AAAA,IACTC,EAAQ;AAAA,IACRF,EAAI;AAAA,IACJM;AAAA,IACAV;AAAA,EAAA,CACD,GAEKoF,KAAc;AAAA,IAClB;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAMH;AAAA,MACN,UAAUP;AAAA,IAAA;AAAA,IAEZ;AAAA,MACE,KAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAUN;AAAA,IAAA;AAAA,IAEZ,GAAID,IACA;AAAA,MACE;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAUK;AAAA,MAAA;AAAA,IACZ,IAEF,CAAA;AAAA,EAAC;AAGP,SACE,gBAAAG,EAAC,OAAA,EAAI,WAAW5E,IAAY,GAAG6E,EAAO,IAAI,IAAI7E,CAAS,KAAK6E,EAAO,MACjE,UAAA;AAAA,IAAA,gBAAAP;AAAA,MAACgB;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWrD;AAAA,QACX,UAAU,CAACsD,MAAMrD,GAAO,OAAOqD,CAAC,CAAC;AAAA,QACjC,SAAS,CAACJ,EAAa;AAAA,QACvB,aAAAE;AAAA,MAAA;AAAA,IAAA;AAAA,IAEF,gBAAAf;AAAA,MAACkB;AAAA,MAAA;AAAA,QACC,MAAM,EAAQ3D;AAAA,QACd,UAAAE;AAAA,QACA,SAASF;AAAA,QACT,SAAAlB;AAAA,QACA,aAAAI;AAAA,QACA,WAAAwB;AAAA,QACA,cAAAZ;AAAA,QACA,aAAAa;AAAA,QACA,UAAUT,IAAW1B,EAAI,SAASA,EAAI;AAAA,QACtC,UAAU,MAAMyB,EAAW,IAAI;AAAA,QAC/B,UAAU8B;AAAA,QACV,qBAAAtE;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
1
+ {"version":3,"file":"MessageTemplateAdmin.js","sources":["../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.tsx"],"sourcesContent":["import { Alert } from '@/components/Alert';\nimport { InteractiveBlock } from '@/components/InteractiveBlock';\nimport { Empty } from '@/components/Empty';\nimport { PageSpin } from '@/components/Layout';\nimport { StateBar } from '@/components/StateBar';\nimport { Table } from '@/components/Table';\nimport { message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { generateTemplateCode } from '../utils/templateCode';\nimport { buildTemplateColumns } from './List/columns';\nimport { TemplateFormModal } from './Modal/TemplateFormModal';\nimport { PushRulesPanel } from './PushRulesPanel';\nimport { VariablesPanel } from './VariablesPanel';\nimport type {\n MessageAudienceRoleOption,\n MessageAudienceUserOption,\n MessageEventCatalogItem,\n MessageEventCatalogPayload,\n MessageTemplateAdminItem,\n MessageTemplateAdminProps,\n MessageTemplateVariable,\n} from './types';\nimport {\n previewVarsFromVariables,\n resolveMessageAdminPermissions,\n variablesFromCatalog,\n} from './types';\nimport styles from './style.module.scss';\n\nfunction normalizeCatalogResult(\n raw: MessageEventCatalogItem[] | MessageEventCatalogPayload | undefined,\n): { events: MessageEventCatalogItem[]; variables: MessageTemplateVariable[] } {\n if (!raw) return { events: [], variables: [] };\n if (Array.isArray(raw)) return { events: raw, variables: [] };\n return {\n events: Array.isArray(raw.events) ? raw.events : [],\n variables: variablesFromCatalog(raw),\n };\n}\n\n/**\n * 消息模板配置壳。权限码 / SSO / HTTP 由业务 DI。\n * 列表:core Table;表单:FormInfo FormModal;正文:L2 Editor 懒加载。\n */\nexport const MessageTemplateAdmin: React.FC<MessageTemplateAdminProps> = ({\n fetchTemplates,\n saveTemplate,\n fetchEventCatalog,\n setTemplateEnabled,\n fetchAudienceRoles,\n fetchAudienceUsers,\n templateVariables,\n previewVars: previewVarsProp,\n canWrite = false,\n permissions,\n renderAudienceField,\n pushRulesSlot,\n fetchPushRules,\n savePushRule,\n setPushRuleEnabled,\n deletePushRule,\n levelOptions,\n defaultLevels,\n levelFieldTips,\n fetchVariables,\n saveVariable,\n deleteVariable,\n emptyText = '暂无消息模板',\n className,\n codePrefix = 'MEQ',\n}) => {\n const perms = useMemo(\n () => resolveMessageAdminPermissions(permissions, canWrite),\n [permissions, canWrite],\n );\n const tpl = perms.template;\n const pushPerm = perms.push;\n const varPerm = perms.variable;\n\n const [rows, setRows] = useState<MessageTemplateAdminItem[]>([]);\n const [catalog, setCatalog] = useState<MessageEventCatalogItem[]>([]);\n const [catalogVars, setCatalogVars] = useState<MessageTemplateVariable[]>([]);\n const [roleOptions, setRoleOptions] = useState<MessageAudienceRoleOption[]>([]);\n const [userOptions, setUserOptions] = useState<MessageAudienceUserOption[]>([]);\n const [audienceRolesError, setAudienceRolesError] = useState('');\n const [audienceUsersError, setAudienceUsersError] = useState('');\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [catalogError, setCatalogError] = useState('');\n const [editing, setEditing] = useState<MessageTemplateAdminItem | null>(null);\n const [isCreate, setIsCreate] = useState(false);\n const [tab, setTab] = useState('template');\n const [pushCreateNonce, setPushCreateNonce] = useState(0);\n const [varCreateNonce, setVarCreateNonce] = useState(0);\n\n const variables = useMemo(() => {\n if (catalogVars.length) return catalogVars;\n if (templateVariables?.length) return templateVariables;\n return [];\n }, [catalogVars, templateVariables]);\n\n const previewVars = useMemo(\n () => previewVarsProp || previewVarsFromVariables(variables),\n [previewVarsProp, variables],\n );\n\n const reload = useCallback(async () => {\n setLoading(true);\n setError('');\n setCatalogError('');\n try {\n const [list, catSettled, rolesSettled, usersSettled] = await Promise.all([\n fetchTemplates(),\n fetchEventCatalog\n ? fetchEventCatalog()\n .then((raw) => ({ ok: true as const, raw }))\n .catch((e: unknown) => ({\n ok: false as const,\n error: e instanceof Error ? e.message : String(e),\n }))\n : Promise.resolve({ ok: true as const, raw: { events: [], variables: [] } }),\n fetchAudienceRoles\n ? fetchAudienceRoles()\n .then((r) => ({ ok: true as const, raw: r, error: '' }))\n .catch((e: unknown) => ({\n ok: false as const,\n raw: [] as MessageAudienceRoleOption[],\n error: e instanceof Error ? e.message : String(e),\n }))\n : Promise.resolve({\n ok: true as const,\n raw: [] as MessageAudienceRoleOption[],\n error: '',\n }),\n fetchAudienceUsers\n ? fetchAudienceUsers()\n .then((r) => ({ ok: true as const, raw: r, error: '' }))\n .catch((e: unknown) => ({\n ok: false as const,\n raw: [] as MessageAudienceUserOption[],\n error: e instanceof Error ? e.message : String(e),\n }))\n : Promise.resolve({\n ok: true as const,\n raw: [] as MessageAudienceUserOption[],\n error: '',\n }),\n ]);\n setRows(Array.isArray(list) ? list : []);\n if (catSettled.ok) {\n const normalized = normalizeCatalogResult(\n catSettled.raw as MessageEventCatalogItem[] | MessageEventCatalogPayload,\n );\n setCatalog(normalized.events);\n setCatalogVars(normalized.variables);\n } else {\n setCatalog([]);\n setCatalogVars([]);\n setCatalogError(catSettled.error);\n }\n setRoleOptions(rolesSettled.raw);\n setAudienceRolesError(rolesSettled.ok ? '' : rolesSettled.error);\n setUserOptions(usersSettled.raw);\n setAudienceUsersError(usersSettled.ok ? '' : usersSettled.error);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setRows([]);\n } finally {\n setLoading(false);\n }\n }, [fetchTemplates, fetchEventCatalog, fetchAudienceRoles, fetchAudienceUsers]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n const eventLabel = useCallback(\n (ek?: string) => catalog.find((c) => c.eventKey === ek)?.label || ek || '—',\n [catalog],\n );\n\n const openCreate = () => {\n if (!tpl.create) return;\n const first = catalog[0];\n setIsCreate(true);\n setEditing({\n code: generateTemplateCode(codePrefix),\n eventKey: first?.eventKey,\n scenario: first?.label,\n label: first?.label,\n messageType: first?.messageType || 'alert',\n titleTemplate: '',\n bodyTemplate: '',\n audienceRoles: [],\n enabled: false,\n channel: 'in_app',\n });\n };\n\n const openEdit = (item: MessageTemplateAdminItem) => {\n if (!tpl.update) return;\n setIsCreate(false);\n setEditing({ ...item });\n };\n\n const onSave = async (item: MessageTemplateAdminItem) => {\n if (!saveTemplate) {\n message.warning('未配置保存接口');\n return;\n }\n await saveTemplate(item);\n message.success('已保存');\n setEditing(null);\n await reload();\n };\n\n const onToggleEnabled = async (item: MessageTemplateAdminItem, enabled: boolean) => {\n if (!setTemplateEnabled) {\n message.warning('未配置启用接口');\n return;\n }\n try {\n await setTemplateEnabled(item, enabled);\n message.success(enabled ? '已启用' : '已停用');\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n };\n\n const columns = useMemo(\n () =>\n buildTemplateColumns({\n canUpdate: tpl.update,\n eventLabel,\n onEdit: openEdit,\n onToggleEnabled: (r, enabled) => void onToggleEnabled(r, enabled),\n }),\n [tpl.update, eventLabel],\n );\n\n const pushEnabled = Boolean(fetchPushRules && savePushRule);\n const varsEnabled = Boolean(fetchVariables && saveVariable);\n\n const pushPane = pushEnabled ? (\n <PushRulesPanel\n crud={pushPerm}\n catalog={catalog}\n templates={rows}\n roleOptions={roleOptions}\n userOptions={userOptions}\n audienceRolesError={audienceRolesError}\n audienceUsersError={audienceUsersError}\n levelOptions={levelOptions}\n defaultLevels={defaultLevels}\n levelFieldTips={levelFieldTips}\n fetchPushRules={fetchPushRules!}\n savePushRule={savePushRule!}\n setPushRuleEnabled={setPushRuleEnabled}\n deletePushRule={deletePushRule}\n createNonce={pushCreateNonce}\n />\n ) : (\n (pushRulesSlot ?? (\n <InteractiveBlock\n title=\"消息推送\"\n info={[{ label: '说明', value: '未接线 fetchPushRules:请业务注入推送规则 API。' }]}\n description=\"推送规则 CRUD 须由业务 DI 提供。\"\n surface=\"inset\"\n />\n ))\n );\n\n const variablesPane = varsEnabled ? (\n <VariablesPanel\n crud={varPerm}\n fetchVariables={fetchVariables!}\n saveVariable={saveVariable!}\n deleteVariable={deleteVariable}\n createNonce={varCreateNonce}\n />\n ) : null;\n\n const templatePane = (\n <div className={styles.pane}>\n {error ? <Alert type=\"error\" showIcon message={error} style={{ marginBottom: 12 }} /> : null}\n {catalogError ? (\n <Alert\n type=\"warning\"\n showIcon\n message={`事件目录加载失败:${catalogError}`}\n style={{ marginBottom: 12 }}\n />\n ) : null}\n <PageSpin spinning={loading}>\n {!tpl.read ? (\n <Empty description=\"无消息模板读取权限\" />\n ) : rows.length === 0 && !loading ? (\n <Empty description={emptyText} />\n ) : (\n <Table<MessageTemplateAdminItem>\n rowKey={(r) => r.id || r.code || String(r.eventKey)}\n tableName=\"msg-center-message-templates\"\n columnConfigEnabled={false}\n columnResizeEnabled={false}\n columns={columns}\n dataSource={rows}\n pagination={false}\n size=\"small\"\n />\n )}\n </PageSpin>\n </div>\n );\n\n const templateTabInfo = useMemo(\n () => [\n {\n label: '编号',\n value: '新建时自动生成模板编号。',\n },\n {\n label: '默认停用',\n value: '新建默认停用;保存后可在列表中开启「启用」。',\n },\n {\n label: '变量',\n value:\n '点「插入变量」从 catalog 选择(中文+code)。标题为明文可手改;正文为原子色块(不可改字、整颗删)。禁止 FE 平行变量表。',\n },\n ...(!tpl.create && !tpl.update\n ? [{ label: '权限', value: '当前只读:无新建/编辑权限。' }]\n : []),\n ...(!tpl.read ? [{ label: '读取', value: '无消息模板读取权限。' }] : []),\n ],\n [tpl.create, tpl.update, tpl.read],\n );\n\n const primaryAction = useMemo(() => {\n if (tab === 'push' && pushEnabled) {\n return {\n variant: 'button' as const,\n buttonType: 'primary' as const,\n label: '新建推送规则',\n disabled: !pushPerm.create,\n onClick: () => setPushCreateNonce((n) => n + 1),\n };\n }\n if (tab === 'variables' && varsEnabled) {\n return {\n variant: 'button' as const,\n buttonType: 'primary' as const,\n label: '新建变量',\n disabled: !varPerm.create,\n onClick: () => setVarCreateNonce((n) => n + 1),\n };\n }\n return {\n variant: 'button' as const,\n buttonType: 'primary' as const,\n label: '新建模板',\n disabled: !tpl.create || tab !== 'template',\n onClick: () => openCreate(),\n };\n }, [\n tab,\n pushEnabled,\n varsEnabled,\n pushPerm.create,\n varPerm.create,\n tpl.create,\n catalog,\n codePrefix,\n ]);\n\n const stateOption = [\n {\n key: 'template',\n label: '消息模板',\n info: templateTabInfo,\n children: templatePane,\n },\n {\n key: 'push',\n label: '消息推送',\n children: pushPane,\n },\n ...(varsEnabled\n ? [\n {\n key: 'variables',\n label: '变量',\n children: variablesPane,\n },\n ]\n : []),\n ];\n\n return (\n <div className={className ? `${styles.root} ${className}` : styles.root}>\n <StateBar\n type=\"tab\"\n activeKey={tab}\n onChange={(k) => setTab(String(k))}\n actions={[primaryAction]}\n stateOption={stateOption}\n />\n <TemplateFormModal\n open={Boolean(editing)}\n isCreate={isCreate}\n initial={editing}\n catalog={catalog}\n roleOptions={roleOptions}\n variables={variables}\n catalogError={catalogError}\n previewVars={previewVars}\n canWrite={isCreate ? tpl.create : tpl.update}\n onCancel={() => setEditing(null)}\n onSubmit={onSave}\n renderAudienceField={renderAudienceField}\n />\n </div>\n );\n};\n\nexport default MessageTemplateAdmin;\n"],"names":["normalizeCatalogResult","raw","variablesFromCatalog","MessageTemplateAdmin","fetchTemplates","saveTemplate","fetchEventCatalog","setTemplateEnabled","fetchAudienceRoles","fetchAudienceUsers","templateVariables","previewVarsProp","canWrite","permissions","renderAudienceField","pushRulesSlot","fetchPushRules","savePushRule","setPushRuleEnabled","deletePushRule","levelOptions","defaultLevels","levelFieldTips","fetchVariables","saveVariable","deleteVariable","emptyText","className","codePrefix","perms","useMemo","resolveMessageAdminPermissions","tpl","pushPerm","varPerm","rows","setRows","useState","catalog","setCatalog","catalogVars","setCatalogVars","roleOptions","setRoleOptions","userOptions","setUserOptions","audienceRolesError","setAudienceRolesError","audienceUsersError","setAudienceUsersError","loading","setLoading","error","setError","catalogError","setCatalogError","editing","setEditing","isCreate","setIsCreate","tab","setTab","pushCreateNonce","setPushCreateNonce","varCreateNonce","setVarCreateNonce","variables","previewVars","previewVarsFromVariables","reload","useCallback","list","catSettled","rolesSettled","usersSettled","e","normalized","useEffect","eventLabel","ek","_a","c","openCreate","first","generateTemplateCode","openEdit","item","onSave","message","onToggleEnabled","enabled","columns","buildTemplateColumns","r","pushEnabled","varsEnabled","pushPane","jsx","PushRulesPanel","InteractiveBlock","variablesPane","VariablesPanel","templatePane","jsxs","styles","Alert","PageSpin","Empty","Table","templateTabInfo","primaryAction","n","stateOption","StateBar","k","TemplateFormModal"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { default as React } from 'react';
2
- import { MessageAudienceRoleOption, MessageAudienceUserOption, MessageCrudFlags, MessageEventCatalogItem, MessageTemplateAdminItem, PushRuleAdminItem } from '../types';
2
+ import { MessageAudienceRoleOption, MessageAudienceUserOption, MessageCrudFlags, MessageEventCatalogItem, MessageLevelOption, MessageTemplateAdminItem, PushRuleAdminItem } from '../types';
3
3
  export type PushRulesPanelProps = {
4
4
  crud: MessageCrudFlags;
5
5
  catalog: MessageEventCatalogItem[];
@@ -10,6 +10,14 @@ export type PushRulesPanelProps = {
10
10
  audienceRolesError?: string;
11
11
  /** 例外抄送(静态 userIds)options 加载失败短文案 */
12
12
  audienceUsersError?: string;
13
+ /**
14
+ * 级别多选 options(业务注入)。未传 / 空 → 下拉无选项;禁 core 写死业务档位。
15
+ */
16
+ levelOptions?: readonly MessageLevelOption[];
17
+ /** 新建规则 levels 初值;未传则 `[]` */
18
+ defaultLevels?: readonly string[];
19
+ /** 级别字段 tip;未传用中性说明 */
20
+ levelFieldTips?: string;
13
21
  fetchPushRules: () => Promise<PushRuleAdminItem[]>;
14
22
  savePushRule: (item: PushRuleAdminItem) => Promise<void>;
15
23
  setPushRuleEnabled?: (item: PushRuleAdminItem, enabled: boolean) => Promise<void>;
@@ -1,55 +1,58 @@
1
- import { jsx as t, jsxs as x } from "react/jsx-runtime";
2
- import { message as r, Modal as te, Switch as ae, Space as oe, Button as q } from "antd";
3
- import { useState as k, useCallback as W, useEffect as J, useMemo as p } from "react";
4
- import { normalizeAudienceSlots as se, hasAudienceSelection as re, ORG_TENANT_SLOT as ie, AUDIENCE_SLOT_OPTIONS as ce } from "../audienceSlots.js";
5
- import { resolveTemplateCodeAfterEventChange as de } from "../../utils/adminGuards.js";
6
- import { buildAudienceUserSelectGroups as me } from "../../utils/audienceUserSelectOptions.js";
7
- import ue from "../style.module.scss.js";
8
- import F from "../../../../Alert/Alert.js";
9
- import pe from "../../../../Layout/PageSpin/index.js";
10
- import V from "../../../../Empty/Empty.js";
11
- import be from "../../../../Table/Table.js";
12
- import ye from "../../../../FormInfo/FormModal.js";
13
- import fe from "../../../../FormInfo/FormInfo.js";
14
- import { Select as ve, Input as he, InputNumber as Se } from "../../../../FormInfo/fields.js";
15
- const b = ve, Ce = he, X = Se, y = {
1
+ import { jsx as t, jsxs as F } from "react/jsx-runtime";
2
+ import { message as r, Modal as se, Switch as re, Space as ie, Button as W } from "antd";
3
+ import { useState as k, useCallback as J, useEffect as X, useMemo as p } from "react";
4
+ import { normalizeAudienceSlots as ce, hasAudienceSelection as de, ORG_TENANT_SLOT as me, AUDIENCE_SLOT_OPTIONS as ue } from "../audienceSlots.js";
5
+ import { resolveTemplateCodeAfterEventChange as pe } from "../../utils/adminGuards.js";
6
+ import { buildAudienceUserSelectGroups as be } from "../../utils/audienceUserSelectOptions.js";
7
+ import ye from "../style.module.scss.js";
8
+ import L from "../../../../Alert/Alert.js";
9
+ import fe from "../../../../Layout/PageSpin/index.js";
10
+ import Y from "../../../../Empty/Empty.js";
11
+ import ve from "../../../../Table/Table.js";
12
+ import he from "../../../../FormInfo/FormModal.js";
13
+ import Se from "../../../../FormInfo/FormInfo.js";
14
+ import { Select as Ce, Input as we, InputNumber as ke } from "../../../../FormInfo/fields.js";
15
+ const b = Ce, Ie = we, Z = ke, y = {
16
16
  getPopupContainer: () => document.body,
17
17
  styles: { popup: { root: { zIndex: 2e3 } } }
18
- }, Be = ({
18
+ }, Ke = "规则匹配 emit 时带 level 会对齐所选档;选项由业务注入(各系统档位不同)。", $e = ({
19
19
  crud: I,
20
20
  catalog: i,
21
21
  templates: K,
22
- roleOptions: N,
23
- userOptions: z = [],
22
+ roleOptions: z,
23
+ userOptions: A = [],
24
24
  audienceRolesError: f = "",
25
25
  audienceUsersError: v = "",
26
- fetchPushRules: A,
27
- savePushRule: U,
26
+ levelOptions: D = [],
27
+ defaultLevels: N = [],
28
+ levelFieldTips: ee = Ke,
29
+ fetchPushRules: U,
30
+ savePushRule: B,
28
31
  setPushRuleEnabled: h,
29
- deletePushRule: D,
30
- createNonce: B = 0
32
+ deletePushRule: _,
33
+ createNonce: E = 0
31
34
  }) => {
32
- const T = I.create, c = I.update, H = I.delete, Y = I.read, m = (e) => e ? T : c, [_, $] = k([]), [M, O] = k(!1), [P, E] = k(""), [l, S] = k(null), [s, R] = k(!1), u = W(async () => {
33
- O(!0), E("");
35
+ const T = I.create, c = I.update, H = I.delete, le = I.read, m = (e) => e ? T : c, [$, P] = k([]), [M, O] = k(!1), [R, j] = k(""), [l, S] = k(null), [s, G] = k(!1), u = J(async () => {
36
+ O(!0), j("");
34
37
  try {
35
- const e = await A();
36
- $(Array.isArray(e) ? e : []);
38
+ const e = await U();
39
+ P(Array.isArray(e) ? e : []);
37
40
  } catch (e) {
38
- E(e instanceof Error ? e.message : String(e)), $([]);
41
+ j(e instanceof Error ? e.message : String(e)), P([]);
39
42
  } finally {
40
43
  O(!1);
41
44
  }
42
- }, [A]);
43
- J(() => {
45
+ }, [U]);
46
+ X(() => {
44
47
  u();
45
- }, [u]), J(() => {
46
- if (!B || !T) return;
48
+ }, [u]), X(() => {
49
+ if (!E || !T) return;
47
50
  const e = i[0], n = K.find((a) => a.eventKey === (e == null ? void 0 : e.eventKey));
48
- R(!0), S({
51
+ G(!0), S({
49
52
  label: (e == null ? void 0 : e.label) || "新建推送规则",
50
53
  eventKey: (e == null ? void 0 : e.eventKey) || "",
51
54
  templateCode: (n == null ? void 0 : n.code) || "",
52
- levels: ["L2"],
55
+ levels: Array.isArray(N) ? [...N] : [],
53
56
  audienceRoles: [],
54
57
  audienceUserIds: [],
55
58
  audienceSlots: [],
@@ -58,24 +61,24 @@ const b = ve, Ce = he, X = Se, y = {
58
61
  scanLookbackDays: 7,
59
62
  enabled: !0
60
63
  });
61
- }, [B, T, i, K]);
62
- const C = W(
64
+ }, [E, T, i, K]);
65
+ const C = J(
63
66
  (e) => K.filter((n) => !e || n.eventKey === e).map((n) => ({
64
67
  value: String(n.code || ""),
65
68
  label: `${n.label || n.code || ""}(${n.code || ""})`
66
69
  })).filter((n) => n.value),
67
70
  [K]
68
- ), j = p(
71
+ ), Q = p(
69
72
  () => C(l == null ? void 0 : l.eventKey),
70
73
  [C, l == null ? void 0 : l.eventKey]
71
- ), Z = p(() => {
74
+ ), ne = p(() => {
72
75
  var n;
73
76
  const e = l == null ? void 0 : l.eventKey;
74
77
  return ((n = i.find((a) => a.eventKey === e)) == null ? void 0 : n.label) || e || "当前场景";
75
- }, [i, l == null ? void 0 : l.eventKey]), g = !!l && j.length === 0, ee = p(
76
- () => me(z),
77
- [z]
78
- ), G = p(
78
+ }, [i, l == null ? void 0 : l.eventKey]), g = !!l && Q.length === 0, te = p(
79
+ () => be(A),
80
+ [A]
81
+ ), q = p(
79
82
  () => ({
80
83
  label: l == null ? void 0 : l.label,
81
84
  eventKey: l == null ? void 0 : l.eventKey,
@@ -88,9 +91,9 @@ const b = ve, Ce = he, X = Se, y = {
88
91
  scanLookbackDays: (l == null ? void 0 : l.scanLookbackDays) ?? 0
89
92
  }),
90
93
  [l]
91
- ), le = p(
94
+ ), ae = p(
92
95
  () => ({
93
- data: G,
96
+ data: q,
94
97
  onSubmit: async (e) => {
95
98
  if (!m(s) || !l)
96
99
  return r.warning("当前为只读"), !1;
@@ -101,26 +104,26 @@ const b = ve, Ce = he, X = Se, y = {
101
104
  return r.warning("请关联模板编号"), !1;
102
105
  if (C(n).length === 0)
103
106
  return r.warning("该场景暂无消息模板,请先到「消息模板」新建后再关联"), !1;
104
- const o = e.audienceRoles || [], d = e.audienceUserIds || [], w = se(e.audienceSlots || []);
105
- if (!re({
107
+ const o = e.audienceRoles || [], d = e.audienceUserIds || [], w = ce(e.audienceSlots || []);
108
+ if (!de({
106
109
  roles: o,
107
110
  slots: w,
108
111
  userIds: d
109
112
  }))
110
113
  return r.warning("请选择受众角色、通知范围或例外抄送(至少一个)"), !1;
111
- if (w.includes(ie) && !await new Promise((Q) => {
112
- te.confirm({
114
+ if (w.includes(me) && !await new Promise((V) => {
115
+ se.confirm({
113
116
  title: "确认通知本租户全员?",
114
117
  content: "已选「本租户(全公司)」:将向当前租户内用户展开(≠跨租户)。emit 时按页拉取,可能人数较多。确认保存?",
115
118
  okText: "确认保存",
116
119
  cancelText: "取消",
117
- onOk: () => Q(!0),
118
- onCancel: () => Q(!1)
120
+ onOk: () => V(!0),
121
+ onCancel: () => V(!1)
119
122
  });
120
123
  }))
121
124
  return !1;
122
125
  try {
123
- await U({
126
+ await B({
124
127
  ...l,
125
128
  label: String(e.label || l.label || "").trim() || n,
126
129
  eventKey: n,
@@ -134,13 +137,13 @@ const b = ve, Ce = he, X = Se, y = {
134
137
  scanLookbackDays: Number(e.scanLookbackDays ?? 0),
135
138
  enabled: s ? !0 : l.enabled !== !1
136
139
  }), r.success("已保存"), S(null), await u();
137
- } catch (L) {
138
- return r.error(L instanceof Error ? L.message : String(L)), !1;
140
+ } catch (x) {
141
+ return r.error(x instanceof Error ? x.message : String(x)), !1;
139
142
  }
140
143
  }
141
144
  }),
142
- [T, c, l, G, s, u, U, C]
143
- ), ne = p(
145
+ [T, c, l, q, s, u, B, C]
146
+ ), oe = p(
144
147
  () => [
145
148
  { title: "名称", dataIndex: "label", key: "label", ellipsis: !0 },
146
149
  {
@@ -166,7 +169,7 @@ const b = ve, Ce = he, X = Se, y = {
166
169
  key: "enabled",
167
170
  width: 80,
168
171
  render: (e, n) => /* @__PURE__ */ t(
169
- ae,
172
+ re,
170
173
  {
171
174
  size: "small",
172
175
  checked: n.enabled !== !1,
@@ -187,15 +190,15 @@ const b = ve, Ce = he, X = Se, y = {
187
190
  title: "操作",
188
191
  key: "actions",
189
192
  width: 140,
190
- render: (e, n) => /* @__PURE__ */ x(oe, { size: "small", children: [
193
+ render: (e, n) => /* @__PURE__ */ F(ie, { size: "small", children: [
191
194
  /* @__PURE__ */ t(
192
- q,
195
+ W,
193
196
  {
194
197
  type: "link",
195
198
  size: "small",
196
199
  disabled: !c,
197
200
  onClick: () => {
198
- R(!1), S({
201
+ G(!1), S({
199
202
  ...n,
200
203
  audienceRoles: n.audienceRoles || [],
201
204
  audienceUserIds: n.audienceUserIds || [],
@@ -205,8 +208,8 @@ const b = ve, Ce = he, X = Se, y = {
205
208
  children: "编辑"
206
209
  }
207
210
  ),
208
- H && D ? /* @__PURE__ */ t(
209
- q,
211
+ H && _ ? /* @__PURE__ */ t(
212
+ W,
210
213
  {
211
214
  type: "link",
212
215
  size: "small",
@@ -214,7 +217,7 @@ const b = ve, Ce = he, X = Se, y = {
214
217
  onClick: () => {
215
218
  (async () => {
216
219
  try {
217
- await D(n), r.success("已删除"), await u();
220
+ await _(n), r.success("已删除"), await u();
218
221
  } catch (a) {
219
222
  r.error(a instanceof Error ? a.message : String(a));
220
223
  }
@@ -226,25 +229,25 @@ const b = ve, Ce = he, X = Se, y = {
226
229
  ] })
227
230
  }
228
231
  ],
229
- [c, H, i, D, u, h]
232
+ [c, H, i, _, u, h]
230
233
  );
231
- return /* @__PURE__ */ x("div", { className: ue.pane, children: [
232
- P ? /* @__PURE__ */ t(F, { type: "error", showIcon: !0, message: P, style: { marginBottom: 12 } }) : null,
233
- /* @__PURE__ */ t(pe, { spinning: M, children: Y ? _.length === 0 && !M ? /* @__PURE__ */ t(V, { description: "暂无推送规则" }) : /* @__PURE__ */ t(
234
- be,
234
+ return /* @__PURE__ */ F("div", { className: ye.pane, children: [
235
+ R ? /* @__PURE__ */ t(L, { type: "error", showIcon: !0, message: R, style: { marginBottom: 12 } }) : null,
236
+ /* @__PURE__ */ t(fe, { spinning: M, children: le ? $.length === 0 && !M ? /* @__PURE__ */ t(Y, { description: "暂无推送规则" }) : /* @__PURE__ */ t(
237
+ ve,
235
238
  {
236
239
  rowKey: (e) => e.id || e.code || String(e.eventKey),
237
240
  tableName: "msg-center-push-rules",
238
241
  columnConfigEnabled: !1,
239
242
  columnResizeEnabled: !1,
240
- columns: ne,
241
- dataSource: _,
243
+ columns: oe,
244
+ dataSource: $,
242
245
  pagination: !1,
243
246
  size: "small"
244
247
  }
245
- ) : /* @__PURE__ */ t(V, { description: "无消息推送读取权限" }) }),
246
- /* @__PURE__ */ x(
247
- ye,
248
+ ) : /* @__PURE__ */ t(Y, { description: "无消息推送读取权限" }) }),
249
+ /* @__PURE__ */ F(
250
+ he,
248
251
  {
249
252
  title: s ? "新建推送规则" : "编辑推送规则",
250
253
  open: !!l,
@@ -255,20 +258,20 @@ const b = ve, Ce = he, X = Se, y = {
255
258
  okText: "保存",
256
259
  okButtonProps: { disabled: g || !m(s) },
257
260
  autoClose: !1,
258
- formProps: le,
261
+ formProps: ae,
259
262
  children: [
260
263
  g ? /* @__PURE__ */ t(
261
- F,
264
+ L,
262
265
  {
263
266
  type: "warning",
264
267
  showIcon: !0,
265
268
  style: { marginBottom: 12 },
266
- message: `「${Z}」暂无消息模板`,
269
+ message: `「${ne}」暂无消息模板`,
267
270
  description: "请先到「消息模板」Tab 为该场景新建模板,再回来关联。当前无法保存推送规则。"
268
271
  }
269
272
  ) : null,
270
273
  f ? /* @__PURE__ */ t(
271
- F,
274
+ L,
272
275
  {
273
276
  type: "warning",
274
277
  showIcon: !0,
@@ -277,7 +280,7 @@ const b = ve, Ce = he, X = Se, y = {
277
280
  }
278
281
  ) : null,
279
282
  v ? /* @__PURE__ */ t(
280
- F,
283
+ L,
281
284
  {
282
285
  type: "warning",
283
286
  showIcon: !0,
@@ -286,7 +289,7 @@ const b = ve, Ce = he, X = Se, y = {
286
289
  }
287
290
  ) : null,
288
291
  /* @__PURE__ */ t(
289
- fe,
292
+ Se,
290
293
  {
291
294
  column: 1,
292
295
  list: [
@@ -312,7 +315,7 @@ const b = ve, Ce = he, X = Se, y = {
312
315
  return o && {
313
316
  ...o,
314
317
  eventKey: n,
315
- templateCode: de(o.templateCode, a),
318
+ templateCode: pe(o.templateCode, a),
316
319
  label: ((d = i.find((w) => w.eventKey === n)) == null ? void 0 : d.label) || o.label
317
320
  };
318
321
  }
@@ -323,7 +326,7 @@ const b = ve, Ce = he, X = Se, y = {
323
326
  "eventKey"
324
327
  ),
325
328
  /* @__PURE__ */ t(
326
- Ce,
329
+ Ie,
327
330
  {
328
331
  name: "label",
329
332
  label: "名称",
@@ -339,7 +342,7 @@ const b = ve, Ce = he, X = Se, y = {
339
342
  label: "关联模板",
340
343
  rule: "REQ",
341
344
  disabled: !c && !s || g,
342
- options: j,
345
+ options: Q,
343
346
  optionFilterProp: "label",
344
347
  placeholder: g ? "该场景暂无模板,请先新建消息模板" : "点击下拉选择本场景已有模板",
345
348
  notFoundContent: "该场景暂无模板",
@@ -355,10 +358,10 @@ const b = ve, Ce = he, X = Se, y = {
355
358
  label: "级别",
356
359
  mode: "multiple",
357
360
  disabled: !c && !s,
358
- options: ["L1", "L2", "L3"].map((e) => ({ value: e, label: e })),
359
- placeholder: "点击下拉选择级别(可多选)",
360
- notFoundContent: "无级别选项",
361
- labelTips: "告警/任务级别档:L1 最高、L2 中、L3 较低。规则匹配 emit 时带 level 会对齐这些档。",
361
+ options: D,
362
+ placeholder: D.length ? "点击下拉选择级别(可多选)" : "未配置级别选项(请业务注入 levelOptions)",
363
+ notFoundContent: D.length ? "无级别选项" : "未注入 levelOptions(业务档位,勿在 core 写死)",
364
+ labelTips: ee,
362
365
  ...y
363
366
  },
364
367
  "levels"
@@ -370,9 +373,9 @@ const b = ve, Ce = he, X = Se, y = {
370
373
  label: "受众角色",
371
374
  mode: "multiple",
372
375
  disabled: !m(s),
373
- options: N.map((e) => ({ value: e.code, label: e.name || e.code })),
376
+ options: z.map((e) => ({ value: e.code, label: e.name || e.code })),
374
377
  optionFilterProp: "label",
375
- placeholder: f ? "角色加载失败" : N.length ? "点击下拉选择角色(可多选)" : "暂无角色(请确认本系统已配置角色)",
378
+ placeholder: f ? "角色加载失败" : z.length ? "点击下拉选择角色(可多选)" : "暂无角色(请确认本系统已配置角色)",
376
379
  notFoundContent: f ? `加载失败:${f}` : "暂无角色数据",
377
380
  labelTips: "主路径:本系统 SSO 角色(这类事常驻通知谁)。可与「通知范围」「例外抄送」并存;emit 时与显式 userIds **并集**(不再互相覆盖)。至少填角色/槽位/例外抄送之一。",
378
381
  ...y
@@ -386,7 +389,7 @@ const b = ve, Ce = he, X = Se, y = {
386
389
  label: "通知范围",
387
390
  mode: "multiple",
388
391
  disabled: !m(s),
389
- options: ce.map((e) => ({
392
+ options: ue.map((e) => ({
390
393
  value: e.value,
391
394
  label: e.label
392
395
  })),
@@ -406,7 +409,7 @@ const b = ve, Ce = he, X = Se, y = {
406
409
  label: "例外抄送",
407
410
  mode: "multiple",
408
411
  disabled: !m(s),
409
- options: ee,
412
+ options: te,
410
413
  optionFilterProp: "searchText",
411
414
  optionLabelProp: "label",
412
415
  filterOption: (e, n) => {
@@ -416,12 +419,12 @@ const b = ve, Ce = he, X = Se, y = {
416
419
  optionRender: (e) => {
417
420
  var o, d;
418
421
  const n = ((o = e.data) == null ? void 0 : o.label) ?? e.label, a = (d = e.data) == null ? void 0 : d.description;
419
- return /* @__PURE__ */ x("div", { style: { lineHeight: 1.35, padding: "2px 0" }, children: [
422
+ return /* @__PURE__ */ F("div", { style: { lineHeight: 1.35, padding: "2px 0" }, children: [
420
423
  /* @__PURE__ */ t("div", { children: n }),
421
424
  a ? /* @__PURE__ */ t("div", { style: { fontSize: 12, color: "rgba(0,0,0,0.45)" }, children: a }) : null
422
425
  ] });
423
426
  },
424
- placeholder: v ? "人员加载失败" : z.length ? "按部门选择例外抄送人(可多选,日常可留空)" : "暂无人员(请确认本租户有用户)",
427
+ placeholder: v ? "人员加载失败" : A.length ? "按部门选择例外抄送人(可多选,日常可留空)" : "暂无人员(请确认本租户有用户)",
425
428
  notFoundContent: v ? `加载失败:${v}` : "暂无人员数据",
426
429
  labelTips: "非常驻名单:仅管理员例外通知等场景。与角色、通知范围并集送达;任务当事人优先用槽位 + emit.audienceContext。",
427
430
  ...y
@@ -429,7 +432,7 @@ const b = ve, Ce = he, X = Se, y = {
429
432
  "audienceUserIds"
430
433
  ),
431
434
  /* @__PURE__ */ t(
432
- X,
435
+ Z,
433
436
  {
434
437
  name: "slaHours",
435
438
  label: "处理时限(小时)",
@@ -441,7 +444,7 @@ const b = ve, Ce = he, X = Se, y = {
441
444
  "slaHours"
442
445
  ),
443
446
  /* @__PURE__ */ t(
444
- X,
447
+ Z,
445
448
  {
446
449
  name: "scanLookbackDays",
447
450
  label: "扫描回看(天)",
@@ -461,6 +464,6 @@ const b = ve, Ce = he, X = Se, y = {
461
464
  ] });
462
465
  };
463
466
  export {
464
- Be as PushRulesPanel
467
+ $e as PushRulesPanel
465
468
  };
466
469
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.tsx"],"sourcesContent":["import { FormInfo, FormModal, Input, InputNumber, 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, Modal, Space, Switch, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n MessageAudienceRoleOption,\n MessageAudienceUserOption,\n MessageCrudFlags,\n MessageEventCatalogItem,\n MessageTemplateAdminItem,\n PushRuleAdminItem,\n} from '../types';\nimport {\n AUDIENCE_SLOT_OPTIONS,\n ORG_TENANT_SLOT,\n hasAudienceSelection,\n normalizeAudienceSlots,\n} from '../audienceSlots';\nimport { resolveTemplateCodeAfterEventChange } from '../../utils/adminGuards';\nimport { buildAudienceUserSelectGroups } from '../../utils/audienceUserSelectOptions';\nimport styles from '../style.module.scss';\n\n/** CI tsc:kne Select 重载与 FieldProps 交叉时误匹配 FormItem children;宽化为任意 props */\nconst FiSelect = Select as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInput = Input as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInputNumber = InputNumber as unknown as React.ComponentType<Record<string, unknown>>;\n\n/** ReactModal zIndex≈1100;Select 默认 1050 会钻到 footer 后面。挂 body + 抬高弹出层 */\nconst selectInModalPopupProps = {\n getPopupContainer: () => document.body,\n styles: { popup: { root: { zIndex: 2000 } } },\n} as const;\n\nexport type PushRulesPanelProps = {\n crud: MessageCrudFlags;\n catalog: MessageEventCatalogItem[];\n templates: MessageTemplateAdminItem[];\n roleOptions: MessageAudienceRoleOption[];\n userOptions?: MessageAudienceUserOption[];\n /** 角色 options 加载失败短文案(勿静默空列表) */\n audienceRolesError?: string;\n /** 例外抄送(静态 userIds)options 加载失败短文案 */\n audienceUsersError?: string;\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 createNonce?: number;\n};\n\ntype FormShape = {\n label?: string;\n eventKey?: string;\n templateCode?: string;\n levels?: string[];\n audienceRoles?: string[];\n audienceUserIds?: string[];\n audienceSlots?: string[];\n slaHours?: number;\n scanLookbackDays?: number;\n};\n\n/**\n * 推送规则 CRUD:必含 eventKey + templateCode;channels 默认 in_app。\n * 受众:角色多选 + 通知范围(audienceSlots)+ 例外抄送;roles∪slots∪userIds 至少一个。\n * 任务当事人/组织槽依赖 emit.audienceContext;禁 Tree 盖壳。\n */\nexport const PushRulesPanel: React.FC<PushRulesPanelProps> = ({\n crud,\n catalog,\n templates,\n roleOptions,\n userOptions = [],\n audienceRolesError = '',\n audienceUsersError = '',\n fetchPushRules,\n savePushRule,\n setPushRuleEnabled,\n deletePushRule,\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<PushRuleAdminItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [editing, setEditing] = useState<PushRuleAdminItem | 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 fetchPushRules();\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 }, [fetchPushRules]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n if (!createNonce || !canCreate) return;\n const first = catalog[0];\n const tplForEvent = templates.find((t) => t.eventKey === first?.eventKey);\n setIsCreate(true);\n setEditing({\n label: first?.label || '新建推送规则',\n eventKey: first?.eventKey || '',\n templateCode: tplForEvent?.code || '',\n levels: ['L2'],\n audienceRoles: [],\n audienceUserIds: [],\n audienceSlots: [],\n channels: ['in_app'],\n slaHours: 36,\n scanLookbackDays: 7,\n enabled: true,\n });\n }, [createNonce, canCreate, catalog, templates]);\n\n const templatesForEvent = useCallback(\n (eventKey?: string) =>\n templates\n .filter((t) => !eventKey || t.eventKey === eventKey)\n .map((t) => ({\n value: String(t.code || ''),\n label: `${t.label || t.code || ''}(${t.code || ''})`,\n }))\n .filter((o) => o.value),\n [templates],\n );\n\n const tplOptions = useMemo(\n () => templatesForEvent(editing?.eventKey),\n [templatesForEvent, editing?.eventKey],\n );\n const scenarioLabel = useMemo(() => {\n const ek = editing?.eventKey;\n return catalog.find((c) => c.eventKey === ek)?.label || ek || '当前场景';\n }, [catalog, editing?.eventKey]);\n const noTplForEvent = Boolean(editing) && tplOptions.length === 0;\n\n const audienceUserSelectGroups = useMemo(\n () => buildAudienceUserSelectGroups(userOptions),\n [userOptions],\n );\n\n const formData = useMemo(\n () => ({\n label: editing?.label,\n eventKey: editing?.eventKey,\n templateCode: editing?.templateCode,\n levels: editing?.levels || [],\n audienceRoles: editing?.audienceRoles || [],\n audienceUserIds: editing?.audienceUserIds || [],\n audienceSlots: editing?.audienceSlots || [],\n slaHours: editing?.slaHours ?? 0,\n scanLookbackDays: editing?.scanLookbackDays ?? 0,\n }),\n [editing],\n );\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!formWritable(isCreate) || !editing) {\n message.warning('当前为只读');\n return false;\n }\n const eventKey = String(editing.eventKey || data.eventKey || '').trim();\n const templateCode = String(data.templateCode || '').trim();\n if (!eventKey) {\n message.warning('请选择事件');\n return false;\n }\n if (!templateCode) {\n message.warning('请关联模板编号');\n return false;\n }\n if (templatesForEvent(eventKey).length === 0) {\n message.warning('该场景暂无消息模板,请先到「消息模板」新建后再关联');\n return false;\n }\n const audienceRoles = data.audienceRoles || [];\n const audienceUserIds = data.audienceUserIds || [];\n const audienceSlots = normalizeAudienceSlots(data.audienceSlots || []);\n if (\n !hasAudienceSelection({\n roles: audienceRoles,\n slots: audienceSlots,\n userIds: audienceUserIds,\n })\n ) {\n message.warning('请选择受众角色、通知范围或例外抄送(至少一个)');\n return false;\n }\n if (audienceSlots.includes(ORG_TENANT_SLOT)) {\n const ok = await new Promise<boolean>((resolve) => {\n Modal.confirm({\n title: '确认通知本租户全员?',\n content:\n '已选「本租户(全公司)」:将向当前租户内用户展开(≠跨租户)。emit 时按页拉取,可能人数较多。确认保存?',\n okText: '确认保存',\n cancelText: '取消',\n onOk: () => resolve(true),\n onCancel: () => resolve(false),\n });\n });\n if (!ok) return false;\n }\n try {\n await savePushRule({\n ...editing,\n label: String(data.label || editing.label || '').trim() || eventKey,\n eventKey,\n templateCode,\n levels: data.levels || [],\n audienceRoles,\n audienceUserIds,\n audienceSlots,\n channels: ['in_app'],\n slaHours: Number(data.slaHours ?? 0),\n scanLookbackDays: Number(data.scanLookbackDays ?? 0),\n enabled: isCreate ? true : editing.enabled !== false,\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, savePushRule, templatesForEvent],\n );\n\n const columns = useMemo(\n () => [\n { title: '名称', dataIndex: 'label', key: 'label', ellipsis: true },\n {\n title: '事件',\n dataIndex: 'eventKey',\n key: 'eventKey',\n render: (v: string) => catalog.find((c) => c.eventKey === v)?.label || v || '—',\n },\n { title: '关联模板', dataIndex: 'templateCode', key: 'templateCode', width: 140 },\n {\n title: '级别',\n dataIndex: 'levels',\n key: 'levels',\n width: 100,\n render: (lv: string[] | undefined) => (lv || []).join(',') || '—',\n },\n {\n title: '启用',\n dataIndex: 'enabled',\n key: 'enabled',\n width: 80,\n render: (_: unknown, r: PushRuleAdminItem) => (\n <Switch\n size=\"small\"\n checked={r.enabled !== false}\n disabled={!canUpdate || !setPushRuleEnabled}\n onChange={(checked) => {\n void (async () => {\n try {\n await setPushRuleEnabled?.(r, checked);\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n })();\n }}\n />\n ),\n },\n {\n title: '操作',\n key: 'actions',\n width: 140,\n render: (_: unknown, r: PushRuleAdminItem) => (\n <Space size=\"small\">\n <Button\n type=\"link\"\n size=\"small\"\n disabled={!canUpdate}\n onClick={() => {\n setIsCreate(false);\n setEditing({\n ...r,\n audienceRoles: r.audienceRoles || [],\n audienceUserIds: r.audienceUserIds || [],\n audienceSlots: r.audienceSlots || [],\n });\n }}\n >\n 编辑\n </Button>\n {canDelete && deletePushRule ? (\n <Button\n type=\"link\"\n size=\"small\"\n danger\n onClick={() => {\n void (async () => {\n try {\n await deletePushRule(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 ) : null}\n </Space>\n ),\n },\n ],\n [canUpdate, canDelete, catalog, deletePushRule, reload, setPushRuleEnabled],\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=\"暂无推送规则\" />\n ) : (\n <Table<PushRuleAdminItem>\n rowKey={(r) => r.id || r.code || String(r.eventKey)}\n tableName=\"msg-center-push-rules\"\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={560}\n size=\"small\"\n className=\"msg-center-form-modal\"\n okText=\"保存\"\n okButtonProps={{ disabled: noTplForEvent || !formWritable(isCreate) }}\n autoClose={false}\n formProps={formProps}\n >\n {noTplForEvent ? (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n message={`「${scenarioLabel}」暂无消息模板`}\n description=\"请先到「消息模板」Tab 为该场景新建模板,再回来关联。当前无法保存推送规则。\"\n />\n ) : null}\n {audienceRolesError ? (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n message={`受众角色加载失败:${audienceRolesError}`}\n />\n ) : null}\n {audienceUsersError ? (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n message={`例外抄送人员加载失败:${audienceUsersError}`}\n />\n ) : null}\n <FormInfo\n column={1}\n list={[\n <FiSelect\n key=\"eventKey\"\n name=\"eventKey\"\n label=\"适用场景\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate)}\n options={catalog.map((c) => ({\n value: c.eventKey,\n label: c.label || c.eventKey,\n }))}\n optionFilterProp=\"label\"\n placeholder={catalog.length ? '点击下拉选择场景' : '暂无事件目录'}\n notFoundContent=\"暂无场景\"\n onChange={(ek: string) => {\n const next = String(ek || '');\n const opts = templatesForEvent(next);\n setEditing((prev) =>\n prev\n ? {\n ...prev,\n eventKey: next,\n templateCode: resolveTemplateCodeAfterEventChange(prev.templateCode, opts),\n label: catalog.find((c) => c.eventKey === next)?.label || prev.label,\n }\n : prev,\n );\n }}\n {...selectInModalPopupProps}\n />,\n <FiInput\n key=\"label\"\n name=\"label\"\n label=\"名称\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate)}\n />,\n <FiSelect\n key={`tpl-${editing?.eventKey || ''}`}\n name=\"templateCode\"\n label=\"关联模板\"\n rule=\"REQ\"\n disabled={(!canUpdate && !isCreate) || noTplForEvent}\n options={tplOptions}\n optionFilterProp=\"label\"\n placeholder={\n noTplForEvent ? '该场景暂无模板,请先新建消息模板' : '点击下拉选择本场景已有模板'\n }\n notFoundContent=\"该场景暂无模板\"\n labelTips=\"选项来自「消息模板」Tab 中与当前适用场景相同的模板(按模板编号关联)。\"\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"levels\"\n name=\"levels\"\n label=\"级别\"\n mode=\"multiple\"\n disabled={!canUpdate && !isCreate}\n options={['L1', 'L2', 'L3'].map((x) => ({ value: x, label: x }))}\n placeholder=\"点击下拉选择级别(可多选)\"\n notFoundContent=\"无级别选项\"\n labelTips=\"告警/任务级别档:L1 最高、L2 中、L3 较低。规则匹配 emit 时带 level 会对齐这些档。\"\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"audienceRoles\"\n name=\"audienceRoles\"\n label=\"受众角色\"\n mode=\"multiple\"\n disabled={!formWritable(isCreate)}\n options={roleOptions.map((r) => ({ value: r.code, label: r.name || r.code }))}\n optionFilterProp=\"label\"\n placeholder={\n audienceRolesError\n ? '角色加载失败'\n : roleOptions.length\n ? '点击下拉选择角色(可多选)'\n : '暂无角色(请确认本系统已配置角色)'\n }\n notFoundContent={\n audienceRolesError ? `加载失败:${audienceRolesError}` : '暂无角色数据'\n }\n labelTips=\"主路径:本系统 SSO 角色(这类事常驻通知谁)。可与「通知范围」「例外抄送」并存;emit 时与显式 userIds **并集**(不再互相覆盖)。至少填角色/槽位/例外抄送之一。\"\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"audienceSlots\"\n name=\"audienceSlots\"\n label=\"通知范围\"\n mode=\"multiple\"\n disabled={!formWritable(isCreate)}\n options={AUDIENCE_SLOT_OPTIONS.map((o) => ({\n value: o.value,\n label: o.label,\n }))}\n optionFilterProp=\"label\"\n maxTagCount=\"responsive\"\n placeholder=\"可选:本人/领导/部门/分厂/租户或任务当事人\"\n notFoundContent=\"暂无槽位\"\n labelTips=\"相对关系与组织范围依赖业务 emit 的 audienceContext;无上下文的槽不会发出。选「本租户(全公司)」保存前会二次确认。与角色、例外抄送并集送达。\"\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"audienceUserIds\"\n name=\"audienceUserIds\"\n label=\"例外抄送\"\n mode=\"multiple\"\n disabled={!formWritable(isCreate)}\n options={audienceUserSelectGroups}\n optionFilterProp=\"searchText\"\n optionLabelProp=\"label\"\n filterOption={(input: string, option?: { searchText?: string; label?: string }) => {\n const q = String(input || '')\n .trim()\n .toLowerCase();\n if (!q) return true;\n const hay = String(option?.searchText || option?.label || '').toLowerCase();\n return hay.includes(q);\n }}\n optionRender={(ori: {\n data?: { label?: string; description?: string };\n label?: React.ReactNode;\n }) => {\n const label = ori.data?.label ?? ori.label;\n const description = ori.data?.description;\n return (\n <div style={{ lineHeight: 1.35, padding: '2px 0' }}>\n <div>{label}</div>\n {description ? (\n <div style={{ fontSize: 12, color: 'rgba(0,0,0,0.45)' }}>{description}</div>\n ) : null}\n </div>\n );\n }}\n placeholder={\n audienceUsersError\n ? '人员加载失败'\n : userOptions.length\n ? '按部门选择例外抄送人(可多选,日常可留空)'\n : '暂无人员(请确认本租户有用户)'\n }\n notFoundContent={\n audienceUsersError ? `加载失败:${audienceUsersError}` : '暂无人员数据'\n }\n labelTips=\"非常驻名单:仅管理员例外通知等场景。与角色、通知范围并集送达;任务当事人优先用槽位 + emit.audienceContext。\"\n {...selectInModalPopupProps}\n />,\n <FiInputNumber\n key=\"slaHours\"\n name=\"slaHours\"\n label=\"处理时限(小时)\"\n disabled={!canUpdate && !isCreate}\n min={0}\n style={{ width: '100%' }}\n labelTips=\"期望处理完成的时限(小时),默认 36。本期仅存配置,站内信推送暂不自动计时催办。\"\n />,\n <FiInputNumber\n key=\"scanLookbackDays\"\n name=\"scanLookbackDays\"\n label=\"扫描回看(天)\"\n disabled={!canUpdate && !isCreate}\n min={0}\n style={{ width: '100%' }}\n labelTips=\"巡检/匹配规则时往回看多少天的业务数据,默认 7。本期仅存配置,由后续巡检任务消费。\"\n />,\n ]}\n />\n </FormModal>\n </div>\n );\n};\n\nexport default PushRulesPanel;\n"],"names":["FiSelect","Select","FiInput","Input","FiInputNumber","InputNumber","selectInModalPopupProps","PushRulesPanel","crud","catalog","templates","roleOptions","userOptions","audienceRolesError","audienceUsersError","fetchPushRules","savePushRule","setPushRuleEnabled","deletePushRule","createNonce","canCreate","canUpdate","canDelete","canRead","formWritable","creating","rows","setRows","useState","loading","setLoading","error","setError","editing","setEditing","isCreate","setIsCreate","reload","useCallback","list","useEffect","first","tplForEvent","t","templatesForEvent","eventKey","o","tplOptions","useMemo","scenarioLabel","ek","_a","c","noTplForEvent","audienceUserSelectGroups","buildAudienceUserSelectGroups","formData","formProps","data","message","templateCode","audienceRoles","audienceUserIds","audienceSlots","normalizeAudienceSlots","hasAudienceSelection","ORG_TENANT_SLOT","resolve","Modal","e","columns","v","lv","_","r","jsx","Switch","checked","jsxs","Space","Button","styles","Alert","PageSpin","Empty","Table","FormModal","FormInfo","next","opts","prev","resolveTemplateCodeAfterEventChange","x","AUDIENCE_SLOT_OPTIONS","input","option","q","ori","label","description","_b"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.tsx"],"sourcesContent":["import { FormInfo, FormModal, Input, InputNumber, 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, Modal, Space, Switch, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n MessageAudienceRoleOption,\n MessageAudienceUserOption,\n MessageCrudFlags,\n MessageEventCatalogItem,\n MessageLevelOption,\n MessageTemplateAdminItem,\n PushRuleAdminItem,\n} from '../types';\nimport {\n AUDIENCE_SLOT_OPTIONS,\n ORG_TENANT_SLOT,\n hasAudienceSelection,\n normalizeAudienceSlots,\n} from '../audienceSlots';\nimport { resolveTemplateCodeAfterEventChange } from '../../utils/adminGuards';\nimport { buildAudienceUserSelectGroups } from '../../utils/audienceUserSelectOptions';\nimport styles from '../style.module.scss';\n\n/** CI tsc:kne Select 重载与 FieldProps 交叉时误匹配 FormItem children;宽化为任意 props */\nconst FiSelect = Select as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInput = Input as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInputNumber = InputNumber as unknown as React.ComponentType<Record<string, unknown>>;\n\n/** ReactModal zIndex≈1100;Select 默认 1050 会钻到 footer 后面。挂 body + 抬高弹出层 */\nconst selectInModalPopupProps = {\n getPopupContainer: () => document.body,\n styles: { popup: { root: { zIndex: 2000 } } },\n} as const;\n\nexport type PushRulesPanelProps = {\n crud: MessageCrudFlags;\n catalog: MessageEventCatalogItem[];\n templates: MessageTemplateAdminItem[];\n roleOptions: MessageAudienceRoleOption[];\n userOptions?: MessageAudienceUserOption[];\n /** 角色 options 加载失败短文案(勿静默空列表) */\n audienceRolesError?: string;\n /** 例外抄送(静态 userIds)options 加载失败短文案 */\n audienceUsersError?: string;\n /**\n * 级别多选 options(业务注入)。未传 / 空 → 下拉无选项;禁 core 写死业务档位。\n */\n levelOptions?: readonly MessageLevelOption[];\n /** 新建规则 levels 初值;未传则 `[]` */\n defaultLevels?: readonly string[];\n /** 级别字段 tip;未传用中性说明 */\n levelFieldTips?: string;\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 createNonce?: number;\n};\n\nconst DEFAULT_LEVEL_FIELD_TIPS =\n '规则匹配 emit 时带 level 会对齐所选档;选项由业务注入(各系统档位不同)。';\n\ntype FormShape = {\n label?: string;\n eventKey?: string;\n templateCode?: string;\n levels?: string[];\n audienceRoles?: string[];\n audienceUserIds?: string[];\n audienceSlots?: string[];\n slaHours?: number;\n scanLookbackDays?: number;\n};\n\n/**\n * 推送规则 CRUD:必含 eventKey + templateCode;channels 默认 in_app。\n * 受众:角色多选 + 通知范围(audienceSlots)+ 例外抄送;roles∪slots∪userIds 至少一个。\n * 任务当事人/组织槽依赖 emit.audienceContext;禁 Tree 盖壳。\n */\nexport const PushRulesPanel: React.FC<PushRulesPanelProps> = ({\n crud,\n catalog,\n templates,\n roleOptions,\n userOptions = [],\n audienceRolesError = '',\n audienceUsersError = '',\n levelOptions = [],\n defaultLevels = [],\n levelFieldTips = DEFAULT_LEVEL_FIELD_TIPS,\n fetchPushRules,\n savePushRule,\n setPushRuleEnabled,\n deletePushRule,\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<PushRuleAdminItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [editing, setEditing] = useState<PushRuleAdminItem | 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 fetchPushRules();\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 }, [fetchPushRules]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n if (!createNonce || !canCreate) return;\n const first = catalog[0];\n const tplForEvent = templates.find((t) => t.eventKey === first?.eventKey);\n setIsCreate(true);\n setEditing({\n label: first?.label || '新建推送规则',\n eventKey: first?.eventKey || '',\n templateCode: tplForEvent?.code || '',\n levels: Array.isArray(defaultLevels) ? [...defaultLevels] : [],\n audienceRoles: [],\n audienceUserIds: [],\n audienceSlots: [],\n channels: ['in_app'],\n slaHours: 36,\n scanLookbackDays: 7,\n enabled: true,\n });\n // defaultLevels 仅在打开新建时取样;勿列入 deps(业务常传内联数组)\n // eslint-disable-next-line react-hooks/exhaustive-deps -- createNonce 驱动打开\n }, [createNonce, canCreate, catalog, templates]);\n\n const templatesForEvent = useCallback(\n (eventKey?: string) =>\n templates\n .filter((t) => !eventKey || t.eventKey === eventKey)\n .map((t) => ({\n value: String(t.code || ''),\n label: `${t.label || t.code || ''}(${t.code || ''})`,\n }))\n .filter((o) => o.value),\n [templates],\n );\n\n const tplOptions = useMemo(\n () => templatesForEvent(editing?.eventKey),\n [templatesForEvent, editing?.eventKey],\n );\n const scenarioLabel = useMemo(() => {\n const ek = editing?.eventKey;\n return catalog.find((c) => c.eventKey === ek)?.label || ek || '当前场景';\n }, [catalog, editing?.eventKey]);\n const noTplForEvent = Boolean(editing) && tplOptions.length === 0;\n\n const audienceUserSelectGroups = useMemo(\n () => buildAudienceUserSelectGroups(userOptions),\n [userOptions],\n );\n\n const formData = useMemo(\n () => ({\n label: editing?.label,\n eventKey: editing?.eventKey,\n templateCode: editing?.templateCode,\n levels: editing?.levels || [],\n audienceRoles: editing?.audienceRoles || [],\n audienceUserIds: editing?.audienceUserIds || [],\n audienceSlots: editing?.audienceSlots || [],\n slaHours: editing?.slaHours ?? 0,\n scanLookbackDays: editing?.scanLookbackDays ?? 0,\n }),\n [editing],\n );\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!formWritable(isCreate) || !editing) {\n message.warning('当前为只读');\n return false;\n }\n const eventKey = String(editing.eventKey || data.eventKey || '').trim();\n const templateCode = String(data.templateCode || '').trim();\n if (!eventKey) {\n message.warning('请选择事件');\n return false;\n }\n if (!templateCode) {\n message.warning('请关联模板编号');\n return false;\n }\n if (templatesForEvent(eventKey).length === 0) {\n message.warning('该场景暂无消息模板,请先到「消息模板」新建后再关联');\n return false;\n }\n const audienceRoles = data.audienceRoles || [];\n const audienceUserIds = data.audienceUserIds || [];\n const audienceSlots = normalizeAudienceSlots(data.audienceSlots || []);\n if (\n !hasAudienceSelection({\n roles: audienceRoles,\n slots: audienceSlots,\n userIds: audienceUserIds,\n })\n ) {\n message.warning('请选择受众角色、通知范围或例外抄送(至少一个)');\n return false;\n }\n if (audienceSlots.includes(ORG_TENANT_SLOT)) {\n const ok = await new Promise<boolean>((resolve) => {\n Modal.confirm({\n title: '确认通知本租户全员?',\n content:\n '已选「本租户(全公司)」:将向当前租户内用户展开(≠跨租户)。emit 时按页拉取,可能人数较多。确认保存?',\n okText: '确认保存',\n cancelText: '取消',\n onOk: () => resolve(true),\n onCancel: () => resolve(false),\n });\n });\n if (!ok) return false;\n }\n try {\n await savePushRule({\n ...editing,\n label: String(data.label || editing.label || '').trim() || eventKey,\n eventKey,\n templateCode,\n levels: data.levels || [],\n audienceRoles,\n audienceUserIds,\n audienceSlots,\n channels: ['in_app'],\n slaHours: Number(data.slaHours ?? 0),\n scanLookbackDays: Number(data.scanLookbackDays ?? 0),\n enabled: isCreate ? true : editing.enabled !== false,\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, savePushRule, templatesForEvent],\n );\n\n const columns = useMemo(\n () => [\n { title: '名称', dataIndex: 'label', key: 'label', ellipsis: true },\n {\n title: '事件',\n dataIndex: 'eventKey',\n key: 'eventKey',\n render: (v: string) => catalog.find((c) => c.eventKey === v)?.label || v || '—',\n },\n { title: '关联模板', dataIndex: 'templateCode', key: 'templateCode', width: 140 },\n {\n title: '级别',\n dataIndex: 'levels',\n key: 'levels',\n width: 100,\n render: (lv: string[] | undefined) => (lv || []).join(',') || '—',\n },\n {\n title: '启用',\n dataIndex: 'enabled',\n key: 'enabled',\n width: 80,\n render: (_: unknown, r: PushRuleAdminItem) => (\n <Switch\n size=\"small\"\n checked={r.enabled !== false}\n disabled={!canUpdate || !setPushRuleEnabled}\n onChange={(checked) => {\n void (async () => {\n try {\n await setPushRuleEnabled?.(r, checked);\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n })();\n }}\n />\n ),\n },\n {\n title: '操作',\n key: 'actions',\n width: 140,\n render: (_: unknown, r: PushRuleAdminItem) => (\n <Space size=\"small\">\n <Button\n type=\"link\"\n size=\"small\"\n disabled={!canUpdate}\n onClick={() => {\n setIsCreate(false);\n setEditing({\n ...r,\n audienceRoles: r.audienceRoles || [],\n audienceUserIds: r.audienceUserIds || [],\n audienceSlots: r.audienceSlots || [],\n });\n }}\n >\n 编辑\n </Button>\n {canDelete && deletePushRule ? (\n <Button\n type=\"link\"\n size=\"small\"\n danger\n onClick={() => {\n void (async () => {\n try {\n await deletePushRule(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 ) : null}\n </Space>\n ),\n },\n ],\n [canUpdate, canDelete, catalog, deletePushRule, reload, setPushRuleEnabled],\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=\"暂无推送规则\" />\n ) : (\n <Table<PushRuleAdminItem>\n rowKey={(r) => r.id || r.code || String(r.eventKey)}\n tableName=\"msg-center-push-rules\"\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={560}\n size=\"small\"\n className=\"msg-center-form-modal\"\n okText=\"保存\"\n okButtonProps={{ disabled: noTplForEvent || !formWritable(isCreate) }}\n autoClose={false}\n formProps={formProps}\n >\n {noTplForEvent ? (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n message={`「${scenarioLabel}」暂无消息模板`}\n description=\"请先到「消息模板」Tab 为该场景新建模板,再回来关联。当前无法保存推送规则。\"\n />\n ) : null}\n {audienceRolesError ? (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n message={`受众角色加载失败:${audienceRolesError}`}\n />\n ) : null}\n {audienceUsersError ? (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n message={`例外抄送人员加载失败:${audienceUsersError}`}\n />\n ) : null}\n <FormInfo\n column={1}\n list={[\n <FiSelect\n key=\"eventKey\"\n name=\"eventKey\"\n label=\"适用场景\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate)}\n options={catalog.map((c) => ({\n value: c.eventKey,\n label: c.label || c.eventKey,\n }))}\n optionFilterProp=\"label\"\n placeholder={catalog.length ? '点击下拉选择场景' : '暂无事件目录'}\n notFoundContent=\"暂无场景\"\n onChange={(ek: string) => {\n const next = String(ek || '');\n const opts = templatesForEvent(next);\n setEditing((prev) =>\n prev\n ? {\n ...prev,\n eventKey: next,\n templateCode: resolveTemplateCodeAfterEventChange(prev.templateCode, opts),\n label: catalog.find((c) => c.eventKey === next)?.label || prev.label,\n }\n : prev,\n );\n }}\n {...selectInModalPopupProps}\n />,\n <FiInput\n key=\"label\"\n name=\"label\"\n label=\"名称\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate)}\n />,\n <FiSelect\n key={`tpl-${editing?.eventKey || ''}`}\n name=\"templateCode\"\n label=\"关联模板\"\n rule=\"REQ\"\n disabled={(!canUpdate && !isCreate) || noTplForEvent}\n options={tplOptions}\n optionFilterProp=\"label\"\n placeholder={\n noTplForEvent ? '该场景暂无模板,请先新建消息模板' : '点击下拉选择本场景已有模板'\n }\n notFoundContent=\"该场景暂无模板\"\n labelTips=\"选项来自「消息模板」Tab 中与当前适用场景相同的模板(按模板编号关联)。\"\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"levels\"\n name=\"levels\"\n label=\"级别\"\n mode=\"multiple\"\n disabled={!canUpdate && !isCreate}\n options={levelOptions}\n placeholder={\n levelOptions.length\n ? '点击下拉选择级别(可多选)'\n : '未配置级别选项(请业务注入 levelOptions)'\n }\n notFoundContent={\n levelOptions.length\n ? '无级别选项'\n : '未注入 levelOptions(业务档位,勿在 core 写死)'\n }\n labelTips={levelFieldTips}\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"audienceRoles\"\n name=\"audienceRoles\"\n label=\"受众角色\"\n mode=\"multiple\"\n disabled={!formWritable(isCreate)}\n options={roleOptions.map((r) => ({ value: r.code, label: r.name || r.code }))}\n optionFilterProp=\"label\"\n placeholder={\n audienceRolesError\n ? '角色加载失败'\n : roleOptions.length\n ? '点击下拉选择角色(可多选)'\n : '暂无角色(请确认本系统已配置角色)'\n }\n notFoundContent={\n audienceRolesError ? `加载失败:${audienceRolesError}` : '暂无角色数据'\n }\n labelTips=\"主路径:本系统 SSO 角色(这类事常驻通知谁)。可与「通知范围」「例外抄送」并存;emit 时与显式 userIds **并集**(不再互相覆盖)。至少填角色/槽位/例外抄送之一。\"\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"audienceSlots\"\n name=\"audienceSlots\"\n label=\"通知范围\"\n mode=\"multiple\"\n disabled={!formWritable(isCreate)}\n options={AUDIENCE_SLOT_OPTIONS.map((o) => ({\n value: o.value,\n label: o.label,\n }))}\n optionFilterProp=\"label\"\n maxTagCount=\"responsive\"\n placeholder=\"可选:本人/领导/部门/分厂/租户或任务当事人\"\n notFoundContent=\"暂无槽位\"\n labelTips=\"相对关系与组织范围依赖业务 emit 的 audienceContext;无上下文的槽不会发出。选「本租户(全公司)」保存前会二次确认。与角色、例外抄送并集送达。\"\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"audienceUserIds\"\n name=\"audienceUserIds\"\n label=\"例外抄送\"\n mode=\"multiple\"\n disabled={!formWritable(isCreate)}\n options={audienceUserSelectGroups}\n optionFilterProp=\"searchText\"\n optionLabelProp=\"label\"\n filterOption={(input: string, option?: { searchText?: string; label?: string }) => {\n const q = String(input || '')\n .trim()\n .toLowerCase();\n if (!q) return true;\n const hay = String(option?.searchText || option?.label || '').toLowerCase();\n return hay.includes(q);\n }}\n optionRender={(ori: {\n data?: { label?: string; description?: string };\n label?: React.ReactNode;\n }) => {\n const label = ori.data?.label ?? ori.label;\n const description = ori.data?.description;\n return (\n <div style={{ lineHeight: 1.35, padding: '2px 0' }}>\n <div>{label}</div>\n {description ? (\n <div style={{ fontSize: 12, color: 'rgba(0,0,0,0.45)' }}>{description}</div>\n ) : null}\n </div>\n );\n }}\n placeholder={\n audienceUsersError\n ? '人员加载失败'\n : userOptions.length\n ? '按部门选择例外抄送人(可多选,日常可留空)'\n : '暂无人员(请确认本租户有用户)'\n }\n notFoundContent={\n audienceUsersError ? `加载失败:${audienceUsersError}` : '暂无人员数据'\n }\n labelTips=\"非常驻名单:仅管理员例外通知等场景。与角色、通知范围并集送达;任务当事人优先用槽位 + emit.audienceContext。\"\n {...selectInModalPopupProps}\n />,\n <FiInputNumber\n key=\"slaHours\"\n name=\"slaHours\"\n label=\"处理时限(小时)\"\n disabled={!canUpdate && !isCreate}\n min={0}\n style={{ width: '100%' }}\n labelTips=\"期望处理完成的时限(小时),默认 36。本期仅存配置,站内信推送暂不自动计时催办。\"\n />,\n <FiInputNumber\n key=\"scanLookbackDays\"\n name=\"scanLookbackDays\"\n label=\"扫描回看(天)\"\n disabled={!canUpdate && !isCreate}\n min={0}\n style={{ width: '100%' }}\n labelTips=\"巡检/匹配规则时往回看多少天的业务数据,默认 7。本期仅存配置,由后续巡检任务消费。\"\n />,\n ]}\n />\n </FormModal>\n </div>\n );\n};\n\nexport default PushRulesPanel;\n"],"names":["FiSelect","Select","FiInput","Input","FiInputNumber","InputNumber","selectInModalPopupProps","DEFAULT_LEVEL_FIELD_TIPS","PushRulesPanel","crud","catalog","templates","roleOptions","userOptions","audienceRolesError","audienceUsersError","levelOptions","defaultLevels","levelFieldTips","fetchPushRules","savePushRule","setPushRuleEnabled","deletePushRule","createNonce","canCreate","canUpdate","canDelete","canRead","formWritable","creating","rows","setRows","useState","loading","setLoading","error","setError","editing","setEditing","isCreate","setIsCreate","reload","useCallback","list","useEffect","first","tplForEvent","t","templatesForEvent","eventKey","o","tplOptions","useMemo","scenarioLabel","ek","_a","c","noTplForEvent","audienceUserSelectGroups","buildAudienceUserSelectGroups","formData","formProps","data","message","templateCode","audienceRoles","audienceUserIds","audienceSlots","normalizeAudienceSlots","hasAudienceSelection","ORG_TENANT_SLOT","resolve","Modal","e","columns","v","lv","_","r","jsx","Switch","checked","jsxs","Space","Button","styles","Alert","PageSpin","Empty","Table","FormModal","FormInfo","next","opts","prev","resolveTemplateCodeAfterEventChange","AUDIENCE_SLOT_OPTIONS","input","option","q","ori","label","description","_b"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export { MessageTemplateAdmin } from './MessageTemplateAdmin';
2
- export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageAudienceUserOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './types';
2
+ export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageAudienceUserOption, MessageTemplateVariable, MessageTemplateVariableAdmin, MessageLevelOption, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './types';
3
3
  export { variablesFromCatalog, previewVarsFromVariables, resolveMessageAdminPermissions, } from './types';
4
4
  export { AUDIENCE_SLOT_OPTIONS, ORG_TENANT_SLOT, normalizeAudienceSlots, hasAudienceSelection, } from './audienceSlots';
5
5
  export type { AudienceSlotOption } from './audienceSlots';
@@ -101,6 +101,11 @@ export type PushRuleAdminItem = {
101
101
  scanLookbackDays?: number;
102
102
  enabled?: boolean;
103
103
  };
104
+ /** 推送规则「级别」多选 option;档位语义因业务而异,须由业务 DI,core 不内置 L1/L2/… */
105
+ export type MessageLevelOption = {
106
+ value: string;
107
+ label: string;
108
+ };
104
109
  export type MessageTemplateAdminProps = {
105
110
  fetchTemplates: () => Promise<MessageTemplateAdminItem[]>;
106
111
  saveTemplate?: (item: MessageTemplateAdminItem) => Promise<void>;
@@ -121,6 +126,15 @@ export type MessageTemplateAdminProps = {
121
126
  * 任务认领人/分配人等当事人由业务 emit 传 userIds,勿靠配置面点名。
122
127
  */
123
128
  fetchAudienceUsers?: () => Promise<MessageAudienceUserOption[]>;
129
+ /**
130
+ * 推送规则「级别」多选 options(业务注入)。
131
+ * 未传 / 空数组 → 下拉无选项(禁 core 写死 L1/L2/L3);各业务档位不同(如 S3 含 L2+)。
132
+ */
133
+ levelOptions?: readonly MessageLevelOption[];
134
+ /** 新建推送规则时 levels 初值;未传则 `[]` */
135
+ defaultLevels?: readonly string[];
136
+ /** 级别字段 labelTips;未传用中性说明(不写死「L1 最高」等业务语义) */
137
+ levelFieldTips?: string;
124
138
  /**
125
139
  * @deprecated 变量须来自 catalog;仅联调 fixture 可传。业务页勿硬编码平行表。
126
140
  */
@@ -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 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 /** 受众槽位码(与 mc audienceSlots 对齐) */\n audienceSlots?: string[];\n enabled?: boolean;\n channel?: string;\n /**\n * 配置归属:catalog=Agent 内置(可虚拟行);tenant=租户自定义/覆盖。\n * 与 mc list `source` 对齐。\n */\n source?: 'catalog' | 'tenant';\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 /** 受众槽位 options(与 core AUDIENCE_SLOT_OPTIONS 对齐;有则优先) */\n audienceSlotOptions?: { value: string; label: string }[];\n};\n\nexport type MessageAudienceRoleOption = {\n /** 写入模板的角色码 */\n code: string;\n /** 展示名(来自 SSO / fixture) */\n name: string;\n};\n\n/** 推送规则例外抄送选项(SSO 本租户用户;展示名取自接口) */\nexport type MessageAudienceUserOption = {\n id: string;\n /** displayName 优先 */\n name: string;\n /** 工号(SSO employeeId) */\n employeeId?: string;\n /** 主部门 / 首个组织名(SSO orgs) */\n departmentName?: string;\n /** 角色展示名,顿号拼接(SSO roles.name) */\n roleNames?: 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 audienceSlots?: 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 * 推送规则「例外抄送」多选 options(SSO 本租户用户;静态 userIds)。\n * 未传则例外抄送 Select 为空(禁手输 id);展示名须来自接口 displayName。\n * 任务认领人/分配人等当事人由业务 emit 传 userIds,勿靠配置面点名。\n */\n fetchAudienceUsers?: () => Promise<MessageAudienceUserOption[]>;\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 /** 模板受众角色插槽;须保持多选下拉语义,禁止 Tree 盖壳默认 Select */\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;AAiJO,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;"}
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 /** 受众槽位码(与 mc audienceSlots 对齐) */\n audienceSlots?: string[];\n enabled?: boolean;\n channel?: string;\n /**\n * 配置归属:catalog=Agent 内置(可虚拟行);tenant=租户自定义/覆盖。\n * 与 mc list `source` 对齐。\n */\n source?: 'catalog' | 'tenant';\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 /** 受众槽位 options(与 core AUDIENCE_SLOT_OPTIONS 对齐;有则优先) */\n audienceSlotOptions?: { value: string; label: string }[];\n};\n\nexport type MessageAudienceRoleOption = {\n /** 写入模板的角色码 */\n code: string;\n /** 展示名(来自 SSO / fixture) */\n name: string;\n};\n\n/** 推送规则例外抄送选项(SSO 本租户用户;展示名取自接口) */\nexport type MessageAudienceUserOption = {\n id: string;\n /** displayName 优先 */\n name: string;\n /** 工号(SSO employeeId) */\n employeeId?: string;\n /** 主部门 / 首个组织名(SSO orgs) */\n departmentName?: string;\n /** 角色展示名,顿号拼接(SSO roles.name) */\n roleNames?: 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 audienceSlots?: string[];\n channels?: string[];\n slaHours?: number;\n scanLookbackDays?: number;\n enabled?: boolean;\n};\n\n/** 推送规则「级别」多选 option;档位语义因业务而异,须由业务 DI,core 不内置 L1/L2/… */\nexport type MessageLevelOption = {\n value: string;\n label: string;\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 * 推送规则「例外抄送」多选 options(SSO 本租户用户;静态 userIds)。\n * 未传则例外抄送 Select 为空(禁手输 id);展示名须来自接口 displayName。\n * 任务认领人/分配人等当事人由业务 emit 传 userIds,勿靠配置面点名。\n */\n fetchAudienceUsers?: () => Promise<MessageAudienceUserOption[]>;\n /**\n * 推送规则「级别」多选 options(业务注入)。\n * 未传 / 空数组 → 下拉无选项(禁 core 写死 L1/L2/L3);各业务档位不同(如 S3 含 L2+)。\n */\n levelOptions?: readonly MessageLevelOption[];\n /** 新建推送规则时 levels 初值;未传则 `[]` */\n defaultLevels?: readonly string[];\n /** 级别字段 labelTips;未传用中性说明(不写死「L1 最高」等业务语义) */\n levelFieldTips?: string;\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 /** 模板受众角色插槽;须保持多选下拉语义,禁止 Tree 盖壳默认 Select */\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;AAgKO,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;"}
@@ -1,5 +1,5 @@
1
1
  export { MessageTemplateAdmin } from './MessageTemplateAdmin';
2
- export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageAudienceUserOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './MessageTemplateAdmin';
2
+ export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageAudienceUserOption, MessageTemplateVariable, MessageTemplateVariableAdmin, MessageLevelOption, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './MessageTemplateAdmin';
3
3
  export { generateTemplateCode, normalizeTemplatePlaceholders, applyTemplateVars, stripHtmlToText, } from './utils/templateCode';
4
4
  export { resolveMessageAdminPermissions } from './MessageTemplateAdmin';
5
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';
@@ -7,6 +7,6 @@ export type { ActionTrackingShellProps } from './ActionTracking';
7
7
  export { CreateActionModal, CreateActionForm, renderPersonOptionLabel, CREATE_ACTION_VARIETY_PAGE_SIZE, PersonRoleCascader, PersonRoleCascaderField, SetFormFields, findPersonCascadePath, cascadePathStillValid, validateCreateActionPersons, createActionPersonWarnMessage, personDisplayName, addDaysYmd, ActionFilterBar, ActionListTable, ActionFollowModal, CancelExecutionModal, CancelExecutionForm, sanitizeActionHtml, isActionExecuteHidden, defaultCreatedRange, normalizeActionFilters, canQueryActionList, resetActionFiltersToDefault, } from './ActionTracking';
8
8
  export type { ActionExecuteGateRow, ActionExecuteGateOptions, CreateActionModalProps, CreateActionFormProps, PersonRoleCascaderProps, PersonRoleCascaderFieldProps, CreateActionPrefill, CreateActionScopeLock, CreateActionScopeMode, LockedContextField, ActionPersonCascadeOption, ActionPersonOption, CreateActionPersonCatalog, CreateActionSelectOption, CreateActionDimensionOption, CreateActionLoaders, CreateActionSelectPageQuery, CreateActionSelectPageResult, CreateActionSubmitPayload, CreateActionPersonValidateError, CreateActionPersonValidateResult, ActionFilterBarProps, ActionListTableProps, ActionFollowModalProps, ActionFollowView, CancelExecutionModalProps, ActionListFilters, ActionListRowBase, ActionListSelectOption, ActionListColumns, ActionListEmptyConfig, } from './ActionTracking';
9
9
  export { MessageTemplateAdmin } from './MessageCenter';
10
- export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageAudienceUserOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './MessageCenter';
10
+ export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageAudienceUserOption, MessageTemplateVariable, MessageTemplateVariableAdmin, MessageLevelOption, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './MessageCenter';
11
11
  export { generateTemplateCode, normalizeTemplatePlaceholders, applyTemplateVars, resolveMessageAdminPermissions, 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, useMsgCenterAppKey, MsgCenterAppSwitcher, } from './MessageCenter';
12
12
  export type { MsgCenterAppSwitchState, MsgCenterSwitchableApp, MsgCenterSwitchableAppKey, MsgCenterAppSwitcherProps, } from './MessageCenter';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hkyhy/marsun-components-core",
3
- "version": "0.1.135",
3
+ "version": "0.1.136",
4
4
  "description": "Marsun pure UI component library",
5
5
  "type": "module",
6
6
  "repository": {