@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.
- package/dist/components/Editor/VariablePicker.js +13 -13
- package/dist/components/Editor/VariablePicker.js.map +1 -1
- package/dist/components/FormInfo/RichTextField/index.js +46 -69
- package/dist/components/FormInfo/RichTextField/index.js.map +1 -1
- package/dist/components/FormInfo/VariableMentionInput/index.d.ts +1 -0
- package/dist/components/FormInfo/VariableMentionInput/index.js +53 -47
- package/dist/components/FormInfo/VariableMentionInput/index.js.map +1 -1
- package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js +6 -5
- package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js.map +1 -1
- package/dist/components/Tools/Inbox/InboxBell/InboxBell.d.ts +3 -0
- package/dist/components/Tools/Inbox/InboxBell/InboxBell.js +59 -49
- package/dist/components/Tools/Inbox/InboxBell/InboxBell.js.map +1 -1
- package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js +20 -18
- package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js.map +1 -1
- package/dist/components/Tools/Inbox/index.d.ts +1 -0
- package/dist/components/Tools/Inbox/sanitizeInboxHtml.d.ts +5 -0
- package/dist/components/Tools/Inbox/sanitizeInboxHtml.js +14 -0
- package/dist/components/Tools/Inbox/sanitizeInboxHtml.js.map +1 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +100 -99
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js +47 -45
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js.map +1 -1
- package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.d.ts +22 -0
- package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js +64 -0
- package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js.map +1 -0
- package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/index.d.ts +2 -0
- package/dist/components/Tools/MessageCenter/index.d.ts +5 -0
- package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.d.ts +39 -0
- package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js +94 -0
- package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js.map +1 -0
- package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.d.ts +2 -0
- package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js +18 -0
- package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js.map +1 -0
- package/dist/components/Tools/index.d.ts +2 -1
- package/dist/index.js +641 -626
- package/dist/index.js.map +1 -1
- package/dist/marsun-components-core.css +1 -1
- package/dist/node_modules/dompurify/dist/purify.es.js +908 -0
- package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
- package/dist/node_modules/isomorphic-dompurify/dist/browser.js +17 -0
- package/dist/node_modules/isomorphic-dompurify/dist/browser.js.map +1 -0
- package/dist/styles/global.css +1 -1
- package/package.json +2 -1
|
@@ -1,181 +1,182 @@
|
|
|
1
|
-
import { jsx as r, jsxs as
|
|
2
|
-
import { RichTextField as
|
|
3
|
-
import { normalizeTemplatePlaceholders as
|
|
4
|
-
import { Typography as
|
|
5
|
-
import { useState as I, useEffect as
|
|
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
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
const
|
|
12
|
-
open:
|
|
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:
|
|
16
|
-
roleOptions:
|
|
17
|
-
variables:
|
|
18
|
-
catalogError:
|
|
19
|
-
previewVars:
|
|
20
|
-
canWrite:
|
|
21
|
-
onCancel:
|
|
22
|
-
onSubmit:
|
|
23
|
-
renderAudienceField:
|
|
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 [
|
|
26
|
-
|
|
27
|
-
if (!
|
|
28
|
-
|
|
25
|
+
const [d, v] = I([]), [w, u] = I(!1);
|
|
26
|
+
C(() => {
|
|
27
|
+
if (!T || !e) {
|
|
28
|
+
u(!1);
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
const o = window.requestAnimationFrame(() =>
|
|
31
|
+
v(e.audienceRoles || e.roles || []);
|
|
32
|
+
const o = window.requestAnimationFrame(() => u(!0));
|
|
33
33
|
return () => window.cancelAnimationFrame(o);
|
|
34
|
-
}, [
|
|
35
|
-
const
|
|
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:
|
|
39
|
+
titleTemplate: b(
|
|
40
40
|
e.titleTemplate || e.titlePreview || ""
|
|
41
41
|
),
|
|
42
|
-
bodyTemplate:
|
|
43
|
-
} : {}, [e]),
|
|
44
|
-
|
|
45
|
-
}, []),
|
|
46
|
-
if (!
|
|
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(
|
|
48
|
+
/* @__PURE__ */ r(y.Text, { type: "secondary", children: "加载编辑器…" }, "loading")
|
|
49
49
|
];
|
|
50
50
|
const o = [];
|
|
51
|
-
return s || o.push(/* @__PURE__ */ r(
|
|
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: !
|
|
58
|
+
disabled: !m,
|
|
59
59
|
optionLabelProp: "label",
|
|
60
|
-
options:
|
|
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
|
-
|
|
69
|
+
A,
|
|
70
70
|
{
|
|
71
71
|
name: "titleTemplate",
|
|
72
72
|
label: "标题模板",
|
|
73
|
-
disabled: !
|
|
73
|
+
disabled: !m,
|
|
74
74
|
enableVariableMention: !0,
|
|
75
|
-
variables:
|
|
76
|
-
catalogError:
|
|
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
|
-
|
|
83
|
+
q,
|
|
84
84
|
{
|
|
85
85
|
name: "bodyTemplate",
|
|
86
86
|
label: "正文模板",
|
|
87
|
-
disabled: !
|
|
87
|
+
disabled: !m,
|
|
88
88
|
enableVariableMention: !0,
|
|
89
|
-
variables:
|
|
90
|
-
catalogError:
|
|
91
|
-
editorKey:
|
|
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
|
-
}, [
|
|
98
|
+
}, [w, s, m, n, f, M, a]), V = x(
|
|
99
99
|
() => ({
|
|
100
100
|
data: S,
|
|
101
101
|
onSubmit: async (o) => {
|
|
102
|
-
if (!
|
|
103
|
-
return
|
|
104
|
-
const t = String(o.
|
|
102
|
+
if (!m)
|
|
103
|
+
return F.warning("当前为只读(业务未授予写权限)"), !1;
|
|
104
|
+
const t = String(o.eventKey || "").trim();
|
|
105
105
|
if (!t)
|
|
106
|
-
return
|
|
107
|
-
|
|
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
|
|
109
|
+
await R({
|
|
112
110
|
...e || {},
|
|
113
111
|
code: o.code || (e == null ? void 0 : e.code),
|
|
114
|
-
eventKey:
|
|
115
|
-
scenario:
|
|
116
|
-
label:
|
|
117
|
-
messageType: (
|
|
118
|
-
titleTemplate:
|
|
119
|
-
bodyTemplate:
|
|
120
|
-
audienceRoles:
|
|
121
|
-
roles:
|
|
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
|
-
}),
|
|
125
|
-
} catch (
|
|
126
|
-
return
|
|
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,
|
|
128
|
+
[S, m, n, R, e, d, s, g]
|
|
131
129
|
);
|
|
132
|
-
return /* @__PURE__ */
|
|
133
|
-
|
|
130
|
+
return /* @__PURE__ */ c(
|
|
131
|
+
Q,
|
|
134
132
|
{
|
|
135
133
|
title: s ? "新建模板" : "编辑模板",
|
|
136
|
-
open:
|
|
137
|
-
onCancel:
|
|
134
|
+
open: T,
|
|
135
|
+
onCancel: g,
|
|
138
136
|
width: 720,
|
|
139
137
|
okText: "保存",
|
|
140
138
|
autoClose: !1,
|
|
141
139
|
focusable: { trap: !1 },
|
|
142
|
-
afterOpenChange:
|
|
143
|
-
formProps:
|
|
140
|
+
afterOpenChange: L,
|
|
141
|
+
formProps: V,
|
|
144
142
|
children: [
|
|
145
|
-
/* @__PURE__ */ r(
|
|
146
|
-
|
|
147
|
-
const t = (typeof o.getFormData == "function" ? o.getFormData() : void 0) ?? o.formData ?? S,
|
|
148
|
-
|
|
149
|
-
|
|
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__ */
|
|
152
|
-
|
|
153
|
-
/* @__PURE__ */
|
|
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
|
-
|
|
153
|
+
l || "—"
|
|
156
154
|
] }),
|
|
157
|
-
/* @__PURE__ */
|
|
155
|
+
/* @__PURE__ */ c(y.Paragraph, { type: "secondary", className: j.preview, children: [
|
|
158
156
|
"正文预览:",
|
|
159
|
-
|
|
157
|
+
h || "—"
|
|
160
158
|
] })
|
|
161
159
|
] });
|
|
162
160
|
} }) : null,
|
|
163
|
-
/* @__PURE__ */
|
|
164
|
-
/* @__PURE__ */ r(
|
|
165
|
-
|
|
166
|
-
|
|
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:
|
|
171
|
-
disabled: !
|
|
172
|
-
placeholder:
|
|
173
|
-
options:
|
|
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
|
-
|
|
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
|
-
|
|
189
|
+
re as TemplateFormModal
|
|
189
190
|
};
|
|
190
191
|
//# sourceMappingURL=TemplateFormModal.js.map
|
package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map
CHANGED
|
@@ -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,6 +1,6 @@
|
|
|
1
|
-
import { jsx as o, jsxs as
|
|
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
|
|
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
|
|
13
|
+
const h = oe, ne = le, T = te, ke = ({
|
|
14
14
|
crud: f,
|
|
15
|
-
catalog:
|
|
15
|
+
catalog: i,
|
|
16
16
|
templates: u,
|
|
17
17
|
roleOptions: Q,
|
|
18
18
|
fetchPushRules: S,
|
|
19
19
|
savePushRule: K,
|
|
20
|
-
setPushRuleEnabled:
|
|
21
|
-
deletePushRule:
|
|
22
|
-
createNonce:
|
|
20
|
+
setPushRuleEnabled: d,
|
|
21
|
+
deletePushRule: p,
|
|
22
|
+
createNonce: L = 0
|
|
23
23
|
}) => {
|
|
24
|
-
const v = f.create, s = f.update,
|
|
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
|
-
|
|
37
|
-
}, [
|
|
38
|
-
if (!
|
|
39
|
-
const e =
|
|
40
|
-
z(!0),
|
|
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
|
-
}, [
|
|
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 =
|
|
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 =
|
|
69
|
+
), W = C(
|
|
70
70
|
() => ({
|
|
71
71
|
data: A,
|
|
72
72
|
onSubmit: async (e) => {
|
|
73
|
-
if (!
|
|
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:
|
|
92
|
-
}), r.success("已保存"),
|
|
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,
|
|
99
|
-
), q =
|
|
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 =
|
|
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 || !
|
|
129
|
+
disabled: !s || !d,
|
|
130
130
|
onChange: (t) => {
|
|
131
131
|
(async () => {
|
|
132
132
|
try {
|
|
133
|
-
await (
|
|
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__ */
|
|
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),
|
|
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: !
|
|
165
|
+
disabled: !I || !p,
|
|
166
166
|
onClick: () => {
|
|
167
167
|
(async () => {
|
|
168
168
|
try {
|
|
169
|
-
await (
|
|
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,
|
|
181
|
+
[s, I, i, p, m, d]
|
|
182
182
|
);
|
|
183
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
198
|
+
/* @__PURE__ */ w(
|
|
199
199
|
ee,
|
|
200
200
|
{
|
|
201
|
-
title:
|
|
201
|
+
title: c ? "新建推送规则" : "编辑推送规则",
|
|
202
202
|
open: !!a,
|
|
203
|
-
onCancel: () =>
|
|
203
|
+
onCancel: () => b(null),
|
|
204
204
|
width: 560,
|
|
205
205
|
okText: "保存",
|
|
206
206
|
autoClose: !1,
|
|
207
207
|
formProps: W,
|
|
208
208
|
children: [
|
|
209
|
-
/* @__PURE__ */
|
|
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: !
|
|
215
|
+
disabled: !k(c),
|
|
216
216
|
value: (a == null ? void 0 : a.eventKey) || void 0,
|
|
217
|
-
|
|
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
|
-
|
|
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 =
|
|
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: !
|
|
252
|
+
disabled: !k(c)
|
|
252
253
|
},
|
|
253
254
|
"label"
|
|
254
255
|
),
|
|
255
256
|
/* @__PURE__ */ o(
|
|
256
|
-
|
|
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
|
-
|
|
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
|
-
|
|
281
|
+
h,
|
|
281
282
|
{
|
|
282
283
|
name: "audienceRoles",
|
|
283
284
|
label: "受众角色",
|
|
284
285
|
mode: "multiple",
|
|
285
|
-
disabled: !
|
|
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
|
),
|