@hkyhy/marsun-components-core 0.1.101 → 0.1.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/components/Editor/VariablePicker.js +13 -13
  2. package/dist/components/Editor/VariablePicker.js.map +1 -1
  3. package/dist/components/FormInfo/RichTextField/index.js +46 -69
  4. package/dist/components/FormInfo/RichTextField/index.js.map +1 -1
  5. package/dist/components/FormInfo/VariableMentionInput/index.d.ts +1 -0
  6. package/dist/components/FormInfo/VariableMentionInput/index.js +53 -47
  7. package/dist/components/FormInfo/VariableMentionInput/index.js.map +1 -1
  8. package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js +6 -5
  9. package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js.map +1 -1
  10. package/dist/components/Tools/Inbox/InboxBell/InboxBell.d.ts +3 -0
  11. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js +59 -49
  12. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js.map +1 -1
  13. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js +20 -18
  14. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js.map +1 -1
  15. package/dist/components/Tools/Inbox/index.d.ts +1 -0
  16. package/dist/components/Tools/Inbox/sanitizeInboxHtml.d.ts +5 -0
  17. package/dist/components/Tools/Inbox/sanitizeInboxHtml.js +14 -0
  18. package/dist/components/Tools/Inbox/sanitizeInboxHtml.js.map +1 -0
  19. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +100 -99
  20. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
  21. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js +47 -45
  22. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js.map +1 -1
  23. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.d.ts +22 -0
  24. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js +64 -0
  25. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js.map +1 -0
  26. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/index.d.ts +2 -0
  27. package/dist/components/Tools/MessageCenter/index.d.ts +5 -0
  28. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.d.ts +39 -0
  29. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js +94 -0
  30. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js.map +1 -0
  31. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.d.ts +2 -0
  32. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js +18 -0
  33. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js.map +1 -0
  34. package/dist/components/Tools/index.d.ts +2 -1
  35. package/dist/index.js +641 -626
  36. package/dist/index.js.map +1 -1
  37. package/dist/marsun-components-core.css +1 -1
  38. package/dist/node_modules/dompurify/dist/purify.es.js +908 -0
  39. package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
  40. package/dist/node_modules/isomorphic-dompurify/dist/browser.js +17 -0
  41. package/dist/node_modules/isomorphic-dompurify/dist/browser.js.map +1 -0
  42. package/dist/styles/global.css +1 -1
  43. package/package.json +2 -1
@@ -1,181 +1,182 @@
1
- import { jsx as r, jsxs as p, Fragment as Q } from "react/jsx-runtime";
2
- import { RichTextField as V } from "../../../../FormInfo/RichTextField/index.js";
3
- import { normalizeTemplatePlaceholders as h, applyTemplateVars as H, stripHtmlToText as $ } from "../../utils/templateCode.js";
4
- import { Typography as c, message as T, Select as q } from "antd";
5
- import { useState as I, useEffect as z, useMemo as x, useCallback as B } from "react";
1
+ import { jsx as r, jsxs as c, Fragment as $ } from "react/jsx-runtime";
2
+ import { RichTextField as q } from "../../../../FormInfo/RichTextField/index.js";
3
+ import { normalizeTemplatePlaceholders as b, applyTemplateVars as H, stripHtmlToText as z } from "../../utils/templateCode.js";
4
+ import { Typography as y, message as F, Select as B } from "antd";
5
+ import { useState as I, useEffect as C, useMemo as x, useCallback as E } from "react";
6
6
  import j from "../style.module.scss.js";
7
- import { Input as K, Select as O } from "../../../../FormInfo/fields.js";
8
- import _ from "../../../../FormInfo/FormModal.js";
9
- import G from "../../../../FormInfo/FormInfo.js";
10
- import J from "../../../../FormInfo/FormItem.js";
11
- const te = ({
12
- open: g,
7
+ import { Input as A, Select as O } from "../../../../FormInfo/fields.js";
8
+ import Q from "../../../../FormInfo/FormModal.js";
9
+ import _ from "../../../../FormInfo/FormInfo.js";
10
+ import G from "../../../../FormInfo/FormItem.js";
11
+ const re = ({
12
+ open: T,
13
13
  isCreate: s,
14
14
  initial: e,
15
- catalog: f,
16
- roleOptions: P,
17
- variables: y,
18
- catalogError: u,
19
- previewVars: R,
20
- canWrite: l,
21
- onCancel: v,
22
- onSubmit: k,
23
- renderAudienceField: M
15
+ catalog: n,
16
+ roleOptions: K,
17
+ variables: f,
18
+ catalogError: a,
19
+ previewVars: P,
20
+ canWrite: m,
21
+ onCancel: g,
22
+ onSubmit: R,
23
+ renderAudienceField: k
24
24
  }) => {
25
- const [m, w] = I([]), [F, b] = I(!1);
26
- z(() => {
27
- if (!g || !e) {
28
- b(!1);
25
+ const [d, v] = I([]), [w, u] = I(!1);
26
+ C(() => {
27
+ if (!T || !e) {
28
+ u(!1);
29
29
  return;
30
30
  }
31
- w(e.audienceRoles || e.roles || []);
32
- const o = window.requestAnimationFrame(() => b(!0));
31
+ v(e.audienceRoles || e.roles || []);
32
+ const o = window.requestAnimationFrame(() => u(!0));
33
33
  return () => window.cancelAnimationFrame(o);
34
- }, [g, e]);
35
- const D = (e == null ? void 0 : e.id) || (e == null ? void 0 : e.code) || (s ? "create" : "edit"), S = x(() => e ? {
34
+ }, [T, e]);
35
+ const M = (e == null ? void 0 : e.id) || (e == null ? void 0 : e.code) || (s ? "create" : "edit"), S = x(() => e ? {
36
36
  code: e.code,
37
37
  eventKey: e.eventKey,
38
38
  scenario: e.scenario || e.label || "",
39
- titleTemplate: h(
39
+ titleTemplate: b(
40
40
  e.titleTemplate || e.titlePreview || ""
41
41
  ),
42
- bodyTemplate: h(e.bodyTemplate || "")
43
- } : {}, [e]), E = u ? `目录加载失败,无法插入变量(${u})` : y.length === 0 ? "暂无 catalog 变量" : "", A = B((o) => {
44
- b(!!o);
45
- }, []), L = x(() => {
46
- if (!F)
42
+ bodyTemplate: b(e.bodyTemplate || "")
43
+ } : {}, [e]), D = a ? `目录加载失败,无法插入变量(${a})` : f.length === 0 ? "暂无 catalog 变量" : "", L = E((o) => {
44
+ u(!!o);
45
+ }, []), N = x(() => {
46
+ if (!w)
47
47
  return [
48
- /* @__PURE__ */ r(c.Text, { type: "secondary", children: "加载编辑器…" }, "loading")
48
+ /* @__PURE__ */ r(y.Text, { type: "secondary", children: "加载编辑器…" }, "loading")
49
49
  ];
50
50
  const o = [];
51
- return s || o.push(/* @__PURE__ */ r(K, { name: "code", label: "编号", disabled: !0 }, "code")), o.push(
51
+ return s || o.push(/* @__PURE__ */ r(A, { name: "code", label: "编号", disabled: !0 }, "code")), o.push(
52
52
  /* @__PURE__ */ r(
53
53
  O,
54
54
  {
55
55
  name: "eventKey",
56
- label: "事件",
56
+ label: "适用场景",
57
57
  rule: "REQ",
58
- disabled: !l,
58
+ disabled: !m,
59
59
  optionLabelProp: "label",
60
- options: f.map((t) => ({
60
+ options: n.map((t) => ({
61
61
  value: t.eventKey,
62
- label: t.label
63
- }))
62
+ label: t.label || t.eventKey
63
+ })),
64
+ placeholder: n.length ? "选择场景" : "暂无事件目录"
64
65
  },
65
66
  "eventKey"
66
67
  ),
67
- /* @__PURE__ */ r(K, { name: "scenario", label: "适用场景", rule: "REQ", disabled: !l }, "scenario"),
68
68
  /* @__PURE__ */ r(
69
- K,
69
+ A,
70
70
  {
71
71
  name: "titleTemplate",
72
72
  label: "标题模板",
73
- disabled: !l,
73
+ disabled: !m,
74
74
  enableVariableMention: !0,
75
- variables: y,
76
- catalogError: u,
75
+ variables: f,
76
+ catalogError: a,
77
77
  placeholder: "点「插入变量」选择 catalog 变量",
78
78
  labelTips: s ? "新建默认停用。标题:点「插入变量」插入明文 {{key}}(可手改)。正文:原子色块,不可改字,整颗删除。" : "标题可手改 {{key}};正文为原子色块(不可改字、Backspace 整颗删)。"
79
79
  },
80
80
  "titleTemplate"
81
81
  ),
82
82
  /* @__PURE__ */ r(
83
- V,
83
+ q,
84
84
  {
85
85
  name: "bodyTemplate",
86
86
  label: "正文模板",
87
- disabled: !l,
87
+ disabled: !m,
88
88
  enableVariableMention: !0,
89
- variables: y,
90
- catalogError: u,
91
- editorKey: D,
89
+ variables: f,
90
+ catalogError: a,
91
+ editorKey: M,
92
92
  placeholder: "编辑正文,点「插入变量」",
93
93
  minHeight: 160
94
94
  },
95
95
  "bodyTemplate"
96
96
  )
97
97
  ), o;
98
- }, [F, s, l, f, y, D]), N = x(
98
+ }, [w, s, m, n, f, M, a]), V = x(
99
99
  () => ({
100
100
  data: S,
101
101
  onSubmit: async (o) => {
102
- if (!l)
103
- return T.warning("当前为只读(业务未授予写权限)"), !1;
104
- const t = String(o.scenario || "").trim(), n = String(o.eventKey || "").trim();
102
+ if (!m)
103
+ return F.warning("当前为只读(业务未授予写权限)"), !1;
104
+ const t = String(o.eventKey || "").trim();
105
105
  if (!t)
106
- return T.warning("请填写适用场景"), !1;
107
- if (!n)
108
- return T.warning("请选择事件"), !1;
109
- const a = f.find((d) => d.eventKey === n);
106
+ return F.warning("请选择适用场景"), !1;
107
+ const l = n.find((p) => p.eventKey === t), h = String((l == null ? void 0 : l.label) || o.scenario || t).trim();
110
108
  try {
111
- await k({
109
+ await R({
112
110
  ...e || {},
113
111
  code: o.code || (e == null ? void 0 : e.code),
114
- eventKey: n,
115
- scenario: t,
116
- label: t,
117
- messageType: (a == null ? void 0 : a.messageType) || (e == null ? void 0 : e.messageType) || "alert",
118
- titleTemplate: h(String(o.titleTemplate || "")),
119
- bodyTemplate: h(String(o.bodyTemplate || "")),
120
- audienceRoles: m,
121
- roles: m,
112
+ eventKey: t,
113
+ scenario: h,
114
+ label: h,
115
+ messageType: (l == null ? void 0 : l.messageType) || (e == null ? void 0 : e.messageType) || "alert",
116
+ titleTemplate: b(String(o.titleTemplate || "")),
117
+ bodyTemplate: b(String(o.bodyTemplate || "")),
118
+ audienceRoles: d,
119
+ roles: d,
122
120
  enabled: s ? !1 : (e == null ? void 0 : e.enabled) !== !1,
123
121
  channel: (e == null ? void 0 : e.channel) || "in_app"
124
- }), v();
125
- } catch (d) {
126
- return T.error(d instanceof Error ? d.message : String(d)), !1;
122
+ }), g();
123
+ } catch (p) {
124
+ return F.error(p instanceof Error ? p.message : String(p)), !1;
127
125
  }
128
126
  }
129
127
  }),
130
- [S, l, f, k, e, m, s, v]
128
+ [S, m, n, R, e, d, s, g]
131
129
  );
132
- return /* @__PURE__ */ p(
133
- _,
130
+ return /* @__PURE__ */ c(
131
+ Q,
134
132
  {
135
133
  title: s ? "新建模板" : "编辑模板",
136
- open: g,
137
- onCancel: v,
134
+ open: T,
135
+ onCancel: g,
138
136
  width: 720,
139
137
  okText: "保存",
140
138
  autoClose: !1,
141
139
  focusable: { trap: !1 },
142
- afterOpenChange: A,
143
- formProps: N,
140
+ afterOpenChange: L,
141
+ formProps: V,
144
142
  children: [
145
- /* @__PURE__ */ r(G, { column: 1, list: L }),
146
- F ? /* @__PURE__ */ r(J, { children: (o) => {
147
- const t = (typeof o.getFormData == "function" ? o.getFormData() : void 0) ?? o.formData ?? S, n = H(String(t.titleTemplate || ""), R), a = H(
148
- $(String(t.bodyTemplate || "")),
149
- R
143
+ /* @__PURE__ */ r(_, { column: 1, list: N }),
144
+ w ? /* @__PURE__ */ r(G, { children: (o) => {
145
+ const t = (typeof o.getFormData == "function" ? o.getFormData() : void 0) ?? o.formData ?? S, l = H(String(t.titleTemplate || ""), P), h = H(
146
+ z(String(t.bodyTemplate || "")),
147
+ P
150
148
  );
151
- return /* @__PURE__ */ p(Q, { children: [
152
- E ? /* @__PURE__ */ r(c.Text, { type: "secondary", children: E }) : null,
153
- /* @__PURE__ */ p(c.Paragraph, { type: "secondary", className: j.preview, children: [
149
+ return /* @__PURE__ */ c($, { children: [
150
+ D ? /* @__PURE__ */ r(y.Text, { type: "secondary", children: D }) : null,
151
+ /* @__PURE__ */ c(y.Paragraph, { type: "secondary", className: j.preview, children: [
154
152
  "标题预览:",
155
- n || "—"
153
+ l || "—"
156
154
  ] }),
157
- /* @__PURE__ */ p(c.Paragraph, { type: "secondary", className: j.preview, children: [
155
+ /* @__PURE__ */ c(y.Paragraph, { type: "secondary", className: j.preview, children: [
158
156
  "正文预览:",
159
- a || "—"
157
+ h || "—"
160
158
  ] })
161
159
  ] });
162
160
  } }) : null,
163
- /* @__PURE__ */ p("div", { style: { marginTop: 12 }, children: [
164
- /* @__PURE__ */ r(c.Text, { children: "受众角色" }),
165
- M ? M({ roles: m, onChange: w }) : /* @__PURE__ */ r(
166
- q,
161
+ /* @__PURE__ */ c("div", { style: { marginTop: 12 }, children: [
162
+ /* @__PURE__ */ r(y.Text, { children: "受众角色" }),
163
+ k ? k({ roles: d, onChange: v }) : /* @__PURE__ */ r(
164
+ B,
167
165
  {
168
166
  mode: "multiple",
167
+ allowClear: !0,
168
+ showSearch: !0,
169
169
  style: { width: "100%", marginTop: 8 },
170
- value: m,
171
- disabled: !l,
172
- placeholder: P.length ? "选择角色" : "暂无角色数据",
173
- options: P.map((o) => ({
170
+ value: d,
171
+ disabled: !m,
172
+ placeholder: K.length ? "下拉选择角色(可多选)" : "暂无角色数据",
173
+ options: K.map((o) => ({
174
174
  value: o.code,
175
175
  label: o.name || o.code
176
176
  })),
177
177
  optionFilterProp: "label",
178
- onChange: (o) => w(o || []),
178
+ maxTagCount: "responsive",
179
+ onChange: (o) => v(o || []),
179
180
  notFoundContent: "暂无角色"
180
181
  }
181
182
  )
@@ -185,6 +186,6 @@ const te = ({
185
186
  );
186
187
  };
187
188
  export {
188
- te as TemplateFormModal
189
+ re as TemplateFormModal
189
190
  };
190
191
  //# sourceMappingURL=TemplateFormModal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateFormModal.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.tsx"],"sourcesContent":["import { FormInfo, FormItem, FormModal, Input, Select } from '@/components/FormInfo';\nimport { RichTextField } from '@/components/FormInfo/RichTextField';\nimport {\n applyTemplateVars,\n normalizeTemplatePlaceholders,\n stripHtmlToText,\n} from '../../utils/templateCode';\nimport { Select as AntSelect, Typography, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n MessageAudienceRoleOption,\n MessageEventCatalogItem,\n MessageTemplateAdminItem,\n MessageTemplateVariable,\n} from '../types';\nimport styles from '../style.module.scss';\n\nexport type TemplateFormModalProps = {\n open: boolean;\n isCreate: boolean;\n initial: MessageTemplateAdminItem | null;\n catalog: MessageEventCatalogItem[];\n roleOptions: MessageAudienceRoleOption[];\n variables: MessageTemplateVariable[];\n /** catalog 请求失败时的短文案(与「变量为空」区分) */\n catalogError?: string;\n previewVars: Record<string, string>;\n canWrite: boolean;\n onCancel: () => void;\n onSubmit: (item: MessageTemplateAdminItem) => Promise<void>;\n renderAudienceField?: (ctx: {\n roles: string[];\n onChange: (roles: string[]) => void;\n }) => React.ReactNode;\n};\n\ntype FormShape = {\n code?: string;\n eventKey?: string;\n scenario?: string;\n titleTemplate?: string;\n bodyTemplate?: string;\n};\n\ntype FormApiLike = {\n formData?: FormShape;\n getFormData?: () => FormShape;\n};\n\n/**\n * 模板新建/编辑:FormModal + FormInfo;正文 RichTextField。\n * CKEditor 在 open 后微任务挂载,避免与 Modal focus/动画互抢;禁 mention uplift 死循环。\n */\nexport const TemplateFormModal: React.FC<TemplateFormModalProps> = ({\n open,\n isCreate,\n initial,\n catalog,\n roleOptions,\n variables,\n catalogError,\n previewVars,\n canWrite,\n onCancel,\n onSubmit,\n renderAudienceField,\n}) => {\n const [roles, setRoles] = useState<string[]>([]);\n const [editorReady, setEditorReady] = useState(false);\n\n useEffect(() => {\n if (!open || !initial) {\n setEditorReady(false);\n return;\n }\n setRoles(initial.audienceRoles || initial.roles || []);\n // 打开后再挂编辑器(afterOpenChange 兜底 + rAF)\n const id = window.requestAnimationFrame(() => setEditorReady(true));\n return () => window.cancelAnimationFrame(id);\n }, [open, initial]);\n\n const editorKey = initial?.id || initial?.code || (isCreate ? 'create' : 'edit');\n\n const formData = useMemo<FormShape>(() => {\n if (!initial) return {};\n return {\n code: initial.code,\n eventKey: initial.eventKey,\n scenario: initial.scenario || initial.label || '',\n titleTemplate: normalizeTemplatePlaceholders(\n initial.titleTemplate || initial.titlePreview || '',\n ),\n bodyTemplate: normalizeTemplatePlaceholders(initial.bodyTemplate || ''),\n };\n }, [initial]);\n\n const varsEmptyHint = catalogError\n ? `目录加载失败,无法插入变量(${catalogError})`\n : variables.length === 0\n ? '暂无 catalog 变量'\n : '';\n\n const handleAfterOpenChange = useCallback((nextOpen: boolean) => {\n if (nextOpen) setEditorReady(true);\n else setEditorReady(false);\n }, []);\n\n const fieldList = useMemo(() => {\n if (!editorReady) {\n return [\n <Typography.Text key=\"loading\" type=\"secondary\">\n 加载编辑器…\n </Typography.Text>,\n ];\n }\n const fields: React.ReactNode[] = [];\n if (!isCreate) {\n fields.push(<Input key=\"code\" name=\"code\" label=\"编号\" disabled />);\n }\n fields.push(\n <Select\n key=\"eventKey\"\n name=\"eventKey\"\n label=\"事件\"\n rule=\"REQ\"\n disabled={!canWrite}\n optionLabelProp=\"label\"\n options={catalog.map((c) => ({\n value: c.eventKey,\n label: c.label,\n }))}\n />,\n <Input key=\"scenario\" name=\"scenario\" label=\"适用场景\" rule=\"REQ\" disabled={!canWrite} />,\n <Input\n key=\"titleTemplate\"\n name=\"titleTemplate\"\n label=\"标题模板\"\n disabled={!canWrite}\n enableVariableMention\n variables={variables}\n catalogError={catalogError}\n placeholder=\"点「插入变量」选择 catalog 变量\"\n labelTips={\n isCreate\n ? '新建默认停用。标题:点「插入变量」插入明文 {{key}}(可手改)。正文:原子色块,不可改字,整颗删除。'\n : '标题可手改 {{key}};正文为原子色块(不可改字、Backspace 整颗删)。'\n }\n />,\n <RichTextField\n key=\"bodyTemplate\"\n name=\"bodyTemplate\"\n label=\"正文模板\"\n disabled={!canWrite}\n enableVariableMention\n variables={variables}\n catalogError={catalogError}\n editorKey={editorKey}\n placeholder=\"编辑正文,点「插入变量」\"\n minHeight={160}\n />,\n );\n return fields;\n }, [editorReady, isCreate, canWrite, catalog, variables, editorKey]);\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!canWrite) {\n message.warning('当前为只读(业务未授予写权限)');\n return false;\n }\n const scenario = String(data.scenario || '').trim();\n const eventKey = String(data.eventKey || '').trim();\n if (!scenario) {\n message.warning('请填写适用场景');\n return false;\n }\n if (!eventKey) {\n message.warning('请选择事件');\n return false;\n }\n const hit = catalog.find((c) => c.eventKey === eventKey);\n try {\n await onSubmit({\n ...(initial || {}),\n code: data.code || initial?.code,\n eventKey,\n scenario,\n label: scenario,\n messageType: hit?.messageType || initial?.messageType || 'alert',\n titleTemplate: normalizeTemplatePlaceholders(String(data.titleTemplate || '')),\n bodyTemplate: normalizeTemplatePlaceholders(String(data.bodyTemplate || '')),\n audienceRoles: roles,\n roles,\n enabled: isCreate ? false : initial?.enabled !== false,\n channel: initial?.channel || 'in_app',\n });\n onCancel();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n return false;\n }\n },\n }),\n [formData, canWrite, catalog, onSubmit, initial, roles, isCreate, onCancel],\n );\n\n return (\n <FormModal\n title={isCreate ? '新建模板' : '编辑模板'}\n open={open}\n onCancel={onCancel}\n width={720}\n okText=\"保存\"\n autoClose={false}\n focusable={{ trap: false }}\n afterOpenChange={handleAfterOpenChange}\n formProps={formProps}\n >\n <FormInfo column={1} list={fieldList} />\n {editorReady ? (\n <FormItem>\n {(api: FormApiLike) => {\n const data =\n (typeof api.getFormData === 'function' ? api.getFormData() : undefined) ??\n api.formData ??\n formData;\n const titlePreview = applyTemplateVars(String(data.titleTemplate || ''), previewVars);\n const bodyPreview = applyTemplateVars(\n stripHtmlToText(String(data.bodyTemplate || '')),\n previewVars,\n );\n return (\n <>\n {varsEmptyHint ? (\n <Typography.Text type=\"secondary\">{varsEmptyHint}</Typography.Text>\n ) : null}\n <Typography.Paragraph type=\"secondary\" className={styles.preview}>\n 标题预览:{titlePreview || '—'}\n </Typography.Paragraph>\n <Typography.Paragraph type=\"secondary\" className={styles.preview}>\n 正文预览:{bodyPreview || '—'}\n </Typography.Paragraph>\n </>\n );\n }}\n </FormItem>\n ) : null}\n <div style={{ marginTop: 12 }}>\n <Typography.Text>受众角色</Typography.Text>\n {renderAudienceField ? (\n renderAudienceField({ roles, onChange: setRoles })\n ) : (\n <AntSelect\n mode=\"multiple\"\n style={{ width: '100%', marginTop: 8 }}\n value={roles}\n disabled={!canWrite}\n placeholder={roleOptions.length ? '选择角色' : '暂无角色数据'}\n options={roleOptions.map((r) => ({\n value: r.code,\n label: r.name || r.code,\n }))}\n optionFilterProp=\"label\"\n onChange={(v) => setRoles(v || [])}\n notFoundContent=\"暂无角色\"\n />\n )}\n </div>\n </FormModal>\n );\n};\n\nexport default TemplateFormModal;\n"],"names":["TemplateFormModal","open","isCreate","initial","catalog","roleOptions","variables","catalogError","previewVars","canWrite","onCancel","onSubmit","renderAudienceField","roles","setRoles","useState","editorReady","setEditorReady","useEffect","id","editorKey","formData","useMemo","normalizeTemplatePlaceholders","varsEmptyHint","handleAfterOpenChange","useCallback","nextOpen","fieldList","Typography","fields","jsx","Input","Select","c","RichTextField","formProps","data","message","scenario","eventKey","hit","e","jsxs","FormModal","FormInfo","FormItem","api","titlePreview","applyTemplateVars","bodyPreview","stripHtmlToText","Fragment","styles","AntSelect","r","v"],"mappings":";;;;;;;;;;AAqDO,MAAMA,KAAsD,CAAC;AAAA,EAClE,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,aAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,qBAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAmB,CAAA,CAAE,GACzC,CAACC,GAAaC,CAAc,IAAIF,EAAS,EAAK;AAEpD,EAAAG,EAAU,MAAM;AACd,QAAI,CAACjB,KAAQ,CAACE,GAAS;AACrB,MAAAc,EAAe,EAAK;AACpB;AAAA,IACF;AACA,IAAAH,EAASX,EAAQ,iBAAiBA,EAAQ,SAAS,CAAA,CAAE;AAErD,UAAMgB,IAAK,OAAO,sBAAsB,MAAMF,EAAe,EAAI,CAAC;AAClE,WAAO,MAAM,OAAO,qBAAqBE,CAAE;AAAA,EAC7C,GAAG,CAAClB,GAAME,CAAO,CAAC;AAElB,QAAMiB,KAAYjB,KAAA,gBAAAA,EAAS,QAAMA,KAAA,gBAAAA,EAAS,UAASD,IAAW,WAAW,SAEnEmB,IAAWC,EAAmB,MAC7BnB,IACE;AAAA,IACL,MAAMA,EAAQ;AAAA,IACd,UAAUA,EAAQ;AAAA,IAClB,UAAUA,EAAQ,YAAYA,EAAQ,SAAS;AAAA,IAC/C,eAAeoB;AAAA,MACbpB,EAAQ,iBAAiBA,EAAQ,gBAAgB;AAAA,IAAA;AAAA,IAEnD,cAAcoB,EAA8BpB,EAAQ,gBAAgB,EAAE;AAAA,EAAA,IARnD,CAAA,GAUpB,CAACA,CAAO,CAAC,GAENqB,IAAgBjB,IAClB,iBAAiBA,CAAY,MAC7BD,EAAU,WAAW,IACnB,kBACA,IAEAmB,IAAwBC,EAAY,CAACC,MAAsB;AAC/D,MAAI,EAAAA,CAA6B;AAAA,EAEnC,GAAG,CAAA,CAAE,GAECC,IAAYN,EAAQ,MAAM;AAC9B,QAAI,CAACN;AACH,aAAO;AAAA,0BACJa,EAAW,MAAX,EAA8B,MAAK,aAAY,sBAA3B,SAErB;AAAA,MAAA;AAGJ,UAAMC,IAA4B,CAAA;AAClC,WAAK5B,KACH4B,EAAO,KAAK,gBAAAC,EAACC,GAAA,EAAiB,MAAK,QAAO,OAAM,MAAK,UAAQ,GAAA,GAAtC,MAAuC,CAAE,GAElEF,EAAO;AAAA,MACL,gBAAAC;AAAA,QAACE;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,OAAM;AAAA,UACN,MAAK;AAAA,UACL,UAAU,CAACxB;AAAA,UACX,iBAAgB;AAAA,UAChB,SAASL,EAAQ,IAAI,CAAC8B,OAAO;AAAA,YAC3B,OAAOA,EAAE;AAAA,YACT,OAAOA,EAAE;AAAA,UAAA,EACT;AAAA,QAAA;AAAA,QATE;AAAA,MAAA;AAAA,MAWN,gBAAAH,EAACC,GAAA,EAAqB,MAAK,YAAW,OAAM,QAAO,MAAK,OAAM,UAAU,CAACvB,EAAA,GAA9D,UAAwE;AAAA,MACnF,gBAAAsB;AAAA,QAACC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,OAAM;AAAA,UACN,UAAU,CAACvB;AAAA,UACX,uBAAqB;AAAA,UACrB,WAAAH;AAAA,UACA,cAAAC;AAAA,UACA,aAAY;AAAA,UACZ,WACEL,IACI,0DACA;AAAA,QAAA;AAAA,QAXF;AAAA,MAAA;AAAA,MAcN,gBAAA6B;AAAA,QAACI;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,OAAM;AAAA,UACN,UAAU,CAAC1B;AAAA,UACX,uBAAqB;AAAA,UACrB,WAAAH;AAAA,UACA,cAAAC;AAAA,UACA,WAAAa;AAAA,UACA,aAAY;AAAA,UACZ,WAAW;AAAA,QAAA;AAAA,QATP;AAAA,MAAA;AAAA,IAUN,GAEKU;AAAA,EACT,GAAG,CAACd,GAAad,GAAUO,GAAUL,GAASE,GAAWc,CAAS,CAAC,GAE7DgB,IAAYd;AAAA,IAChB,OAAO;AAAA,MACL,MAAMD;AAAA,MACN,UAAU,OAAOgB,MAAoB;AACnC,YAAI,CAAC5B;AACH,iBAAA6B,EAAQ,QAAQ,iBAAiB,GAC1B;AAET,cAAMC,IAAW,OAAOF,EAAK,YAAY,EAAE,EAAE,KAAA,GACvCG,IAAW,OAAOH,EAAK,YAAY,EAAE,EAAE,KAAA;AAC7C,YAAI,CAACE;AACH,iBAAAD,EAAQ,QAAQ,SAAS,GAClB;AAET,YAAI,CAACE;AACH,iBAAAF,EAAQ,QAAQ,OAAO,GAChB;AAET,cAAMG,IAAMrC,EAAQ,KAAK,CAAC8B,MAAMA,EAAE,aAAaM,CAAQ;AACvD,YAAI;AACF,gBAAM7B,EAAS;AAAA,YACb,GAAIR,KAAW,CAAA;AAAA,YACf,MAAMkC,EAAK,SAAQlC,KAAA,gBAAAA,EAAS;AAAA,YAC5B,UAAAqC;AAAA,YACA,UAAAD;AAAA,YACA,OAAOA;AAAA,YACP,cAAaE,KAAA,gBAAAA,EAAK,iBAAetC,KAAA,gBAAAA,EAAS,gBAAe;AAAA,YACzD,eAAeoB,EAA8B,OAAOc,EAAK,iBAAiB,EAAE,CAAC;AAAA,YAC7E,cAAcd,EAA8B,OAAOc,EAAK,gBAAgB,EAAE,CAAC;AAAA,YAC3E,eAAexB;AAAA,YACf,OAAAA;AAAA,YACA,SAASX,IAAW,MAAQC,KAAA,gBAAAA,EAAS,aAAY;AAAA,YACjD,UAASA,KAAA,gBAAAA,EAAS,YAAW;AAAA,UAAA,CAC9B,GACDO,EAAA;AAAA,QACF,SAASgC,GAAG;AACV,iBAAAJ,EAAQ,MAAMI,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC,CAAC,GACjD;AAAA,QACT;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,CAACrB,GAAUZ,GAAUL,GAASO,GAAUR,GAASU,GAAOX,GAAUQ,CAAQ;AAAA,EAAA;AAG5E,SACE,gBAAAiC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAO1C,IAAW,SAAS;AAAA,MAC3B,MAAAD;AAAA,MACA,UAAAS;AAAA,MACA,OAAO;AAAA,MACP,QAAO;AAAA,MACP,WAAW;AAAA,MACX,WAAW,EAAE,MAAM,GAAA;AAAA,MACnB,iBAAiBe;AAAA,MACjB,WAAAW;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAAL,EAACc,GAAA,EAAS,QAAQ,GAAG,MAAMjB,GAAW;AAAA,QACrCZ,IACC,gBAAAe,EAACe,GAAA,EACE,UAAA,CAACC,MAAqB;AACrB,gBAAMV,KACH,OAAOU,EAAI,eAAgB,aAAaA,EAAI,gBAAgB,WAC7DA,EAAI,YACJ1B,GACI2B,IAAeC,EAAkB,OAAOZ,EAAK,iBAAiB,EAAE,GAAG7B,CAAW,GAC9E0C,IAAcD;AAAA,YAClBE,EAAgB,OAAOd,EAAK,gBAAgB,EAAE,CAAC;AAAA,YAC/C7B;AAAA,UAAA;AAEF,iBACE,gBAAAmC,EAAAS,GAAA,EACG,UAAA;AAAA,YAAA5B,sBACEK,EAAW,MAAX,EAAgB,MAAK,aAAa,aAAc,IAC/C;AAAA,YACJ,gBAAAc,EAACd,EAAW,WAAX,EAAqB,MAAK,aAAY,WAAWwB,EAAO,SAAS,UAAA;AAAA,cAAA;AAAA,cAC1DL,KAAgB;AAAA,YAAA,GACxB;AAAA,YACA,gBAAAL,EAACd,EAAW,WAAX,EAAqB,MAAK,aAAY,WAAWwB,EAAO,SAAS,UAAA;AAAA,cAAA;AAAA,cAC1DH,KAAe;AAAA,YAAA,EAAA,CACvB;AAAA,UAAA,GACF;AAAA,QAEJ,GACF,IACE;AAAA,0BACH,OAAA,EAAI,OAAO,EAAE,WAAW,MACvB,UAAA;AAAA,UAAA,gBAAAnB,EAACF,EAAW,MAAX,EAAgB,UAAA,OAAA,CAAI;AAAA,UACpBjB,IACCA,EAAoB,EAAE,OAAAC,GAAO,UAAUC,EAAA,CAAU,IAEjD,gBAAAiB;AAAA,YAACuB;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO,EAAE,OAAO,QAAQ,WAAW,EAAA;AAAA,cACnC,OAAOzC;AAAA,cACP,UAAU,CAACJ;AAAA,cACX,aAAaJ,EAAY,SAAS,SAAS;AAAA,cAC3C,SAASA,EAAY,IAAI,CAACkD,OAAO;AAAA,gBAC/B,OAAOA,EAAE;AAAA,gBACT,OAAOA,EAAE,QAAQA,EAAE;AAAA,cAAA,EACnB;AAAA,cACF,kBAAiB;AAAA,cACjB,UAAU,CAACC,MAAM1C,EAAS0C,KAAK,CAAA,CAAE;AAAA,cACjC,iBAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,QAClB,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"TemplateFormModal.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.tsx"],"sourcesContent":["import { FormInfo, FormItem, FormModal, Input, Select } from '@/components/FormInfo';\nimport { RichTextField } from '@/components/FormInfo/RichTextField';\nimport {\n applyTemplateVars,\n normalizeTemplatePlaceholders,\n stripHtmlToText,\n} from '../../utils/templateCode';\nimport { Select as AntSelect, Typography, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n MessageAudienceRoleOption,\n MessageEventCatalogItem,\n MessageTemplateAdminItem,\n MessageTemplateVariable,\n} from '../types';\nimport styles from '../style.module.scss';\n\nexport type TemplateFormModalProps = {\n open: boolean;\n isCreate: boolean;\n initial: MessageTemplateAdminItem | null;\n catalog: MessageEventCatalogItem[];\n roleOptions: MessageAudienceRoleOption[];\n variables: MessageTemplateVariable[];\n /** catalog 请求失败时的短文案(与「变量为空」区分) */\n catalogError?: string;\n previewVars: Record<string, string>;\n canWrite: boolean;\n onCancel: () => void;\n onSubmit: (item: MessageTemplateAdminItem) => Promise<void>;\n renderAudienceField?: (ctx: {\n roles: string[];\n onChange: (roles: string[]) => void;\n }) => React.ReactNode;\n};\n\ntype FormShape = {\n code?: string;\n eventKey?: string;\n scenario?: string;\n titleTemplate?: string;\n bodyTemplate?: string;\n};\n\ntype FormApiLike = {\n formData?: FormShape;\n getFormData?: () => FormShape;\n};\n\n/**\n * 模板新建/编辑:FormModal + FormInfo;正文 RichTextField。\n * CKEditor 在 open 后微任务挂载,避免与 Modal focus/动画互抢;禁 mention uplift 死循环。\n */\nexport const TemplateFormModal: React.FC<TemplateFormModalProps> = ({\n open,\n isCreate,\n initial,\n catalog,\n roleOptions,\n variables,\n catalogError,\n previewVars,\n canWrite,\n onCancel,\n onSubmit,\n renderAudienceField,\n}) => {\n const [roles, setRoles] = useState<string[]>([]);\n const [editorReady, setEditorReady] = useState(false);\n\n useEffect(() => {\n if (!open || !initial) {\n setEditorReady(false);\n return;\n }\n setRoles(initial.audienceRoles || initial.roles || []);\n // 打开后再挂编辑器(afterOpenChange 兜底 + rAF)\n const id = window.requestAnimationFrame(() => setEditorReady(true));\n return () => window.cancelAnimationFrame(id);\n }, [open, initial]);\n\n const editorKey = initial?.id || initial?.code || (isCreate ? 'create' : 'edit');\n\n const formData = useMemo<FormShape>(() => {\n if (!initial) return {};\n return {\n code: initial.code,\n eventKey: initial.eventKey,\n scenario: initial.scenario || initial.label || '',\n titleTemplate: normalizeTemplatePlaceholders(\n initial.titleTemplate || initial.titlePreview || '',\n ),\n bodyTemplate: normalizeTemplatePlaceholders(initial.bodyTemplate || ''),\n };\n }, [initial]);\n\n const varsEmptyHint = catalogError\n ? `目录加载失败,无法插入变量(${catalogError})`\n : variables.length === 0\n ? '暂无 catalog 变量'\n : '';\n\n const handleAfterOpenChange = useCallback((nextOpen: boolean) => {\n if (nextOpen) setEditorReady(true);\n else setEditorReady(false);\n }, []);\n\n const fieldList = useMemo(() => {\n if (!editorReady) {\n return [\n <Typography.Text key=\"loading\" type=\"secondary\">\n 加载编辑器…\n </Typography.Text>,\n ];\n }\n const fields: React.ReactNode[] = [];\n if (!isCreate) {\n fields.push(<Input key=\"code\" name=\"code\" label=\"编号\" disabled />);\n }\n // 适用场景 = catalog 中文下拉(value=eventKey);禁自由输入英文 key\n fields.push(\n <Select\n key=\"eventKey\"\n name=\"eventKey\"\n label=\"适用场景\"\n rule=\"REQ\"\n disabled={!canWrite}\n optionLabelProp=\"label\"\n options={catalog.map((c) => ({\n value: c.eventKey,\n label: c.label || c.eventKey,\n }))}\n placeholder={catalog.length ? '选择场景' : '暂无事件目录'}\n />,\n <Input\n key=\"titleTemplate\"\n name=\"titleTemplate\"\n label=\"标题模板\"\n disabled={!canWrite}\n enableVariableMention\n variables={variables}\n catalogError={catalogError}\n placeholder=\"点「插入变量」选择 catalog 变量\"\n labelTips={\n isCreate\n ? '新建默认停用。标题:点「插入变量」插入明文 {{key}}(可手改)。正文:原子色块,不可改字,整颗删除。'\n : '标题可手改 {{key}};正文为原子色块(不可改字、Backspace 整颗删)。'\n }\n />,\n <RichTextField\n key=\"bodyTemplate\"\n name=\"bodyTemplate\"\n label=\"正文模板\"\n disabled={!canWrite}\n enableVariableMention\n variables={variables}\n catalogError={catalogError}\n editorKey={editorKey}\n placeholder=\"编辑正文,点「插入变量」\"\n minHeight={160}\n />,\n );\n return fields;\n }, [editorReady, isCreate, canWrite, catalog, variables, editorKey, catalogError]);\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!canWrite) {\n message.warning('当前为只读(业务未授予写权限)');\n return false;\n }\n const eventKey = String(data.eventKey || '').trim();\n if (!eventKey) {\n message.warning('请选择适用场景');\n return false;\n }\n const hit = catalog.find((c) => c.eventKey === eventKey);\n const scenario = String(hit?.label || data.scenario || eventKey).trim();\n try {\n await onSubmit({\n ...(initial || {}),\n code: data.code || initial?.code,\n eventKey,\n scenario,\n label: scenario,\n messageType: hit?.messageType || initial?.messageType || 'alert',\n titleTemplate: normalizeTemplatePlaceholders(String(data.titleTemplate || '')),\n bodyTemplate: normalizeTemplatePlaceholders(String(data.bodyTemplate || '')),\n audienceRoles: roles,\n roles,\n enabled: isCreate ? false : initial?.enabled !== false,\n channel: initial?.channel || 'in_app',\n });\n onCancel();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n return false;\n }\n },\n }),\n [formData, canWrite, catalog, onSubmit, initial, roles, isCreate, onCancel],\n );\n\n return (\n <FormModal\n title={isCreate ? '新建模板' : '编辑模板'}\n open={open}\n onCancel={onCancel}\n width={720}\n okText=\"保存\"\n autoClose={false}\n focusable={{ trap: false }}\n afterOpenChange={handleAfterOpenChange}\n formProps={formProps}\n >\n <FormInfo column={1} list={fieldList} />\n {editorReady ? (\n <FormItem>\n {(api: FormApiLike) => {\n const data =\n (typeof api.getFormData === 'function' ? api.getFormData() : undefined) ??\n api.formData ??\n formData;\n const titlePreview = applyTemplateVars(String(data.titleTemplate || ''), previewVars);\n const bodyPreview = applyTemplateVars(\n stripHtmlToText(String(data.bodyTemplate || '')),\n previewVars,\n );\n return (\n <>\n {varsEmptyHint ? (\n <Typography.Text type=\"secondary\">{varsEmptyHint}</Typography.Text>\n ) : null}\n <Typography.Paragraph type=\"secondary\" className={styles.preview}>\n 标题预览:{titlePreview || '—'}\n </Typography.Paragraph>\n <Typography.Paragraph type=\"secondary\" className={styles.preview}>\n 正文预览:{bodyPreview || '—'}\n </Typography.Paragraph>\n </>\n );\n }}\n </FormItem>\n ) : null}\n <div style={{ marginTop: 12 }}>\n <Typography.Text>受众角色</Typography.Text>\n {renderAudienceField ? (\n renderAudienceField({ roles, onChange: setRoles })\n ) : (\n <AntSelect\n mode=\"multiple\"\n allowClear\n showSearch\n style={{ width: '100%', marginTop: 8 }}\n value={roles}\n disabled={!canWrite}\n placeholder={roleOptions.length ? '下拉选择角色(可多选)' : '暂无角色数据'}\n options={roleOptions.map((r) => ({\n value: r.code,\n label: r.name || r.code,\n }))}\n optionFilterProp=\"label\"\n maxTagCount=\"responsive\"\n onChange={(v) => setRoles(v || [])}\n notFoundContent=\"暂无角色\"\n />\n )}\n </div>\n </FormModal>\n );\n};\n\nexport default TemplateFormModal;\n"],"names":["TemplateFormModal","open","isCreate","initial","catalog","roleOptions","variables","catalogError","previewVars","canWrite","onCancel","onSubmit","renderAudienceField","roles","setRoles","useState","editorReady","setEditorReady","useEffect","id","editorKey","formData","useMemo","normalizeTemplatePlaceholders","varsEmptyHint","handleAfterOpenChange","useCallback","nextOpen","fieldList","Typography","fields","jsx","Input","Select","c","RichTextField","formProps","data","message","eventKey","hit","scenario","e","jsxs","FormModal","FormInfo","FormItem","api","titlePreview","applyTemplateVars","bodyPreview","stripHtmlToText","Fragment","styles","AntSelect","r","v"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { jsx as o, jsxs as k } from "react/jsx-runtime";
1
+ import { jsx as o, jsxs as w } from "react/jsx-runtime";
2
2
  import { message as r, Switch as J, Space as O, Button as N, Select as V } from "antd";
3
- import { useState as y, useCallback as M, useEffect as _, useMemo as w } from "react";
3
+ import { useState as y, useCallback as M, useEffect as _, useMemo as C } from "react";
4
4
  import { resolveTemplateCodeAfterEventChange as X } from "../../utils/adminGuards.js";
5
5
  import Y from "../style.module.scss.js";
6
6
  import Z from "../../../../Alert/Alert.js";
@@ -10,18 +10,18 @@ import P from "../../../../Table/Table.js";
10
10
  import ee from "../../../../FormInfo/FormModal.js";
11
11
  import ae from "../../../../FormInfo/FormInfo.js";
12
12
  import { Input as le, Select as oe, InputNumber as te } from "../../../../FormInfo/fields.js";
13
- const C = oe, ne = le, T = te, ke = ({
13
+ const h = oe, ne = le, T = te, ke = ({
14
14
  crud: f,
15
- catalog: c,
15
+ catalog: i,
16
16
  templates: u,
17
17
  roleOptions: Q,
18
18
  fetchPushRules: S,
19
19
  savePushRule: K,
20
- setPushRuleEnabled: m,
21
- deletePushRule: d,
22
- createNonce: h = 0
20
+ setPushRuleEnabled: d,
21
+ deletePushRule: p,
22
+ createNonce: L = 0
23
23
  }) => {
24
- const v = f.create, s = f.update, L = f.delete, U = f.read, I = (e) => e ? v : s, [g, x] = y([]), [D, F] = y(!1), [E, H] = y(""), [a, p] = y(null), [b, z] = y(!1), i = M(async () => {
24
+ const v = f.create, s = f.update, I = f.delete, U = f.read, k = (e) => e ? v : s, [g, x] = y([]), [D, F] = y(!1), [E, H] = y(""), [a, b] = y(null), [c, z] = y(!1), m = M(async () => {
25
25
  F(!0), H("");
26
26
  try {
27
27
  const e = await S();
@@ -33,11 +33,11 @@ const C = oe, ne = le, T = te, ke = ({
33
33
  }
34
34
  }, [S]);
35
35
  _(() => {
36
- i();
37
- }, [i]), _(() => {
38
- if (!h || !v) return;
39
- const e = c[0], l = u.find((t) => t.eventKey === (e == null ? void 0 : e.eventKey));
40
- z(!0), p({
36
+ m();
37
+ }, [m]), _(() => {
38
+ if (!L || !v) return;
39
+ const e = i[0], l = u.find((t) => t.eventKey === (e == null ? void 0 : e.eventKey));
40
+ z(!0), b({
41
41
  label: (e == null ? void 0 : e.label) || "新建推送规则",
42
42
  eventKey: (e == null ? void 0 : e.eventKey) || "",
43
43
  templateCode: (l == null ? void 0 : l.code) || "",
@@ -48,14 +48,14 @@ const C = oe, ne = le, T = te, ke = ({
48
48
  scanLookbackDays: 7,
49
49
  enabled: !0
50
50
  });
51
- }, [h, v, c, u]);
51
+ }, [L, v, i, u]);
52
52
  const $ = M(
53
53
  (e) => u.filter((l) => !e || l.eventKey === e).map((l) => ({
54
54
  value: String(l.code || ""),
55
55
  label: `${l.label || l.code || ""}(${l.code || ""})`
56
56
  })).filter((l) => l.value),
57
57
  [u]
58
- ), A = w(
58
+ ), A = C(
59
59
  () => ({
60
60
  label: a == null ? void 0 : a.label,
61
61
  eventKey: a == null ? void 0 : a.eventKey,
@@ -66,11 +66,11 @@ const C = oe, ne = le, T = te, ke = ({
66
66
  scanLookbackDays: (a == null ? void 0 : a.scanLookbackDays) ?? 0
67
67
  }),
68
68
  [a]
69
- ), W = w(
69
+ ), W = C(
70
70
  () => ({
71
71
  data: A,
72
72
  onSubmit: async (e) => {
73
- if (!I(b) || !a)
73
+ if (!k(c) || !a)
74
74
  return r.warning("当前为只读"), !1;
75
75
  const l = String(a.eventKey || e.eventKey || "").trim(), t = String(e.templateCode || "").trim();
76
76
  if (!l)
@@ -88,15 +88,15 @@ const C = oe, ne = le, T = te, ke = ({
88
88
  channels: ["in_app"],
89
89
  slaHours: Number(e.slaHours ?? 0),
90
90
  scanLookbackDays: Number(e.scanLookbackDays ?? 0),
91
- enabled: b ? !0 : a.enabled !== !1
92
- }), r.success("已保存"), p(null), await i();
91
+ enabled: c ? !0 : a.enabled !== !1
92
+ }), r.success("已保存"), b(null), await m();
93
93
  } catch (n) {
94
94
  return r.error(n instanceof Error ? n.message : String(n)), !1;
95
95
  }
96
96
  }
97
97
  }),
98
- [v, s, a, A, b, i, K]
99
- ), q = w(
98
+ [v, s, a, A, c, m, K]
99
+ ), q = C(
100
100
  () => [
101
101
  { title: "名称", dataIndex: "label", key: "label", ellipsis: !0 },
102
102
  {
@@ -105,7 +105,7 @@ const C = oe, ne = le, T = te, ke = ({
105
105
  key: "eventKey",
106
106
  render: (e) => {
107
107
  var l;
108
- return ((l = c.find((t) => t.eventKey === e)) == null ? void 0 : l.label) || e || "—";
108
+ return ((l = i.find((t) => t.eventKey === e)) == null ? void 0 : l.label) || e || "—";
109
109
  }
110
110
  },
111
111
  { title: "关联模板", dataIndex: "templateCode", key: "templateCode", width: 140 },
@@ -126,11 +126,11 @@ const C = oe, ne = le, T = te, ke = ({
126
126
  {
127
127
  size: "small",
128
128
  checked: l.enabled !== !1,
129
- disabled: !s || !m,
129
+ disabled: !s || !d,
130
130
  onChange: (t) => {
131
131
  (async () => {
132
132
  try {
133
- await (m == null ? void 0 : m(l, t)), r.success(t ? "已启用" : "已停用"), await i();
133
+ await (d == null ? void 0 : d(l, t)), r.success(t ? "已启用" : "已停用"), await m();
134
134
  } catch (n) {
135
135
  r.error(n instanceof Error ? n.message : String(n));
136
136
  }
@@ -143,7 +143,7 @@ const C = oe, ne = le, T = te, ke = ({
143
143
  title: "操作",
144
144
  key: "actions",
145
145
  width: 140,
146
- render: (e, l) => /* @__PURE__ */ k(O, { size: 4, children: [
146
+ render: (e, l) => /* @__PURE__ */ w(O, { size: 4, children: [
147
147
  /* @__PURE__ */ o(
148
148
  N,
149
149
  {
@@ -151,7 +151,7 @@ const C = oe, ne = le, T = te, ke = ({
151
151
  size: "small",
152
152
  disabled: !s,
153
153
  onClick: () => {
154
- z(!1), p({ ...l });
154
+ z(!1), b({ ...l });
155
155
  },
156
156
  children: "编辑"
157
157
  }
@@ -162,11 +162,11 @@ const C = oe, ne = le, T = te, ke = ({
162
162
  type: "link",
163
163
  size: "small",
164
164
  danger: !0,
165
- disabled: !L || !d,
165
+ disabled: !I || !p,
166
166
  onClick: () => {
167
167
  (async () => {
168
168
  try {
169
- await (d == null ? void 0 : d(l)), r.success("已删除"), await i();
169
+ await (p == null ? void 0 : p(l)), r.success("已删除"), await m();
170
170
  } catch (t) {
171
171
  r.error(t instanceof Error ? t.message : String(t));
172
172
  }
@@ -178,9 +178,9 @@ const C = oe, ne = le, T = te, ke = ({
178
178
  ] })
179
179
  }
180
180
  ],
181
- [s, L, c, d, i, m]
181
+ [s, I, i, p, m, d]
182
182
  );
183
- return /* @__PURE__ */ k("div", { className: Y.pane, children: [
183
+ return /* @__PURE__ */ w("div", { className: Y.pane, children: [
184
184
  E ? /* @__PURE__ */ o(Z, { type: "error", showIcon: !0, message: E, style: { marginBottom: 12 } }) : null,
185
185
  /* @__PURE__ */ o(R, { spinning: D, children: U ? g.length === 0 && !D ? /* @__PURE__ */ o(j, { description: "暂无推送规则" }) : /* @__PURE__ */ o(
186
186
  P,
@@ -195,39 +195,40 @@ const C = oe, ne = le, T = te, ke = ({
195
195
  size: "small"
196
196
  }
197
197
  ) : /* @__PURE__ */ o(j, { description: "无推送规则读取权限" }) }),
198
- /* @__PURE__ */ k(
198
+ /* @__PURE__ */ w(
199
199
  ee,
200
200
  {
201
- title: b ? "新建推送规则" : "编辑推送规则",
201
+ title: c ? "新建推送规则" : "编辑推送规则",
202
202
  open: !!a,
203
- onCancel: () => p(null),
203
+ onCancel: () => b(null),
204
204
  width: 560,
205
205
  okText: "保存",
206
206
  autoClose: !1,
207
207
  formProps: W,
208
208
  children: [
209
- /* @__PURE__ */ k("div", { style: { marginBottom: 16 }, children: [
210
- /* @__PURE__ */ o("div", { style: { marginBottom: 8 }, children: "事件" }),
209
+ /* @__PURE__ */ w("div", { style: { marginBottom: 16 }, children: [
210
+ /* @__PURE__ */ o("div", { style: { marginBottom: 8 }, children: "适用场景" }),
211
211
  /* @__PURE__ */ o(
212
212
  V,
213
213
  {
214
214
  style: { width: "100%" },
215
- disabled: !s,
215
+ disabled: !k(c),
216
216
  value: (a == null ? void 0 : a.eventKey) || void 0,
217
- options: c.map((e) => ({
217
+ placeholder: i.length ? "选择场景(中文)" : "暂无事件目录",
218
+ options: i.map((e) => ({
218
219
  value: e.eventKey,
219
220
  label: e.label || e.eventKey
220
221
  })),
221
222
  onChange: (e) => {
222
223
  const l = String(e || ""), t = $(l);
223
- p(
224
+ b(
224
225
  (n) => {
225
226
  var B;
226
227
  return n && {
227
228
  ...n,
228
229
  eventKey: l,
229
230
  templateCode: X(n.templateCode, t),
230
- label: ((B = c.find((G) => G.eventKey === l)) == null ? void 0 : B.label) || n.label
231
+ label: ((B = i.find((G) => G.eventKey === l)) == null ? void 0 : B.label) || n.label
231
232
  };
232
233
  }
233
234
  );
@@ -248,12 +249,12 @@ const C = oe, ne = le, T = te, ke = ({
248
249
  name: "label",
249
250
  label: "名称",
250
251
  rule: "REQ",
251
- disabled: !I(b)
252
+ disabled: !k(c)
252
253
  },
253
254
  "label"
254
255
  ),
255
256
  /* @__PURE__ */ o(
256
- C,
257
+ h,
257
258
  {
258
259
  name: "templateCode",
259
260
  label: "关联模板",
@@ -266,7 +267,7 @@ const C = oe, ne = le, T = te, ke = ({
266
267
  `tpl-${(a == null ? void 0 : a.eventKey) || ""}`
267
268
  ),
268
269
  /* @__PURE__ */ o(
269
- C,
270
+ h,
270
271
  {
271
272
  name: "levels",
272
273
  label: "级别",
@@ -277,14 +278,15 @@ const C = oe, ne = le, T = te, ke = ({
277
278
  "levels"
278
279
  ),
279
280
  /* @__PURE__ */ o(
280
- C,
281
+ h,
281
282
  {
282
283
  name: "audienceRoles",
283
284
  label: "受众角色",
284
285
  mode: "multiple",
285
- disabled: !s,
286
+ disabled: !k(c),
286
287
  options: Q.map((e) => ({ value: e.code, label: e.name || e.code })),
287
- optionFilterProp: "label"
288
+ optionFilterProp: "label",
289
+ placeholder: "下拉选择角色(可多选)"
288
290
  },
289
291
  "audienceRoles"
290
292
  ),