@hkyhy/marsun-components-core 0.1.100 → 0.1.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/components/Editor/VariablePicker.js +13 -13
  2. package/dist/components/Editor/VariablePicker.js.map +1 -1
  3. package/dist/components/FormInfo/RichTextField/index.js +46 -69
  4. package/dist/components/FormInfo/RichTextField/index.js.map +1 -1
  5. package/dist/components/FormInfo/VariableMentionInput/index.d.ts +1 -0
  6. package/dist/components/FormInfo/VariableMentionInput/index.js +53 -47
  7. package/dist/components/FormInfo/VariableMentionInput/index.js.map +1 -1
  8. package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js +6 -5
  9. package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js.map +1 -1
  10. package/dist/components/Tools/Inbox/InboxBell/InboxBell.d.ts +3 -0
  11. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js +59 -49
  12. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js.map +1 -1
  13. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js +20 -18
  14. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js.map +1 -1
  15. package/dist/components/Tools/Inbox/index.d.ts +1 -0
  16. package/dist/components/Tools/Inbox/sanitizeInboxHtml.d.ts +5 -0
  17. package/dist/components/Tools/Inbox/sanitizeInboxHtml.js +14 -0
  18. package/dist/components/Tools/Inbox/sanitizeInboxHtml.js.map +1 -0
  19. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/List/columns.d.ts +1 -1
  20. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/List/columns.js +3 -3
  21. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/List/columns.js.map +1 -1
  22. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js +160 -145
  23. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js.map +1 -1
  24. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +100 -99
  25. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
  26. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.d.ts +2 -2
  27. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js +140 -129
  28. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js.map +1 -1
  29. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.d.ts +2 -2
  30. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.js +78 -78
  31. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.js.map +1 -1
  32. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/index.d.ts +2 -2
  33. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.d.ts +26 -0
  34. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.js +47 -19
  35. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.js.map +1 -1
  36. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.d.ts +22 -0
  37. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js +64 -0
  38. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js.map +1 -0
  39. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/index.d.ts +2 -0
  40. package/dist/components/Tools/MessageCenter/index.d.ts +7 -1
  41. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.d.ts +39 -0
  42. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js +94 -0
  43. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js.map +1 -0
  44. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.d.ts +2 -0
  45. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js +18 -0
  46. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js.map +1 -0
  47. package/dist/components/Tools/index.d.ts +3 -2
  48. package/dist/index.js +653 -636
  49. package/dist/index.js.map +1 -1
  50. package/dist/marsun-components-core.css +1 -1
  51. package/dist/node_modules/dompurify/dist/purify.es.js +908 -0
  52. package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
  53. package/dist/node_modules/isomorphic-dompurify/dist/browser.js +17 -0
  54. package/dist/node_modules/isomorphic-dompurify/dist/browser.js.map +1 -0
  55. package/dist/styles/global.css +1 -1
  56. package/package.json +2 -1
@@ -1,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":"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"}
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,7 +1,7 @@
1
1
  import { default as React } from 'react';
2
- import { MessageAudienceRoleOption, MessageEventCatalogItem, MessageTemplateAdminItem, PushRuleAdminItem } from '../types';
2
+ import { MessageAudienceRoleOption, MessageCrudFlags, MessageEventCatalogItem, MessageTemplateAdminItem, PushRuleAdminItem } from '../types';
3
3
  export type PushRulesPanelProps = {
4
- canWrite: boolean;
4
+ crud: MessageCrudFlags;
5
5
  catalog: MessageEventCatalogItem[];
6
6
  templates: MessageTemplateAdminItem[];
7
7
  roleOptions: MessageAudienceRoleOption[];