@hkyhy/marsun-components-core 0.1.130 → 0.1.131

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 (28) hide show
  1. package/README.md +1 -0
  2. package/dist/_virtual/index.js +5 -5
  3. package/dist/_virtual/index2.js +5 -5
  4. package/dist/components/Editor/RichTextEditor/RichTextEditor.d.ts +3 -1
  5. package/dist/components/Editor/RichTextEditor/RichTextEditor.js +140 -61
  6. package/dist/components/Editor/RichTextEditor/RichTextEditor.js.map +1 -1
  7. package/dist/components/Editor/RichTextEditor/style.module.scss.js +7 -7
  8. package/dist/components/Editor/index.d.ts +2 -2
  9. package/dist/components/Editor/index.js +20 -14
  10. package/dist/components/Editor/msgVarTokenPlugin.d.ts +22 -1
  11. package/dist/components/Editor/msgVarTokenPlugin.js +188 -45
  12. package/dist/components/Editor/msgVarTokenPlugin.js.map +1 -1
  13. package/dist/components/Editor/variableMention.d.ts +20 -1
  14. package/dist/components/Editor/variableMention.js +134 -46
  15. package/dist/components/Editor/variableMention.js.map +1 -1
  16. package/dist/components/FormInfo/RichTextField/index.d.ts +2 -0
  17. package/dist/components/FormInfo/RichTextField/index.js +46 -43
  18. package/dist/components/FormInfo/RichTextField/index.js.map +1 -1
  19. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +121 -112
  20. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
  21. package/dist/editor.js +22 -16
  22. package/dist/index.js +361 -355
  23. package/dist/marsun-components-core.css +1 -1
  24. package/dist/node_modules/@antv/g-lite/dist/index.esm.js +1 -1
  25. package/dist/node_modules/@antv/g2/esm/data/kde.js +1 -1
  26. package/dist/node_modules/eventemitter3/index.js +1 -1
  27. package/dist/styles/global.css +1 -1
  28. package/package.json +1 -1
@@ -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 { sanitizeInboxHtml } from '@/components/Tools/Inbox/sanitizeInboxHtml';\nimport { applyTemplateVars, normalizeTemplatePlaceholders } from '../../utils/templateCode';\nimport { Collapse, Modal, 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 {\n AUDIENCE_SLOT_OPTIONS,\n ORG_TENANT_SLOT,\n hasAudienceSelection,\n normalizeAudienceSlots,\n} from '../audienceSlots';\nimport styles from '../style.module.scss';\n\n/** ReactModal 内 Select 弹出层须高于 Modal(≈1100) */\nconst selectInModalPopupProps = {\n getPopupContainer: () => document.body,\n styles: { popup: { root: { zIndex: 2000 } } },\n} as const;\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 audienceRoles?: string[];\n audienceSlots?: 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 /** 仅业务 DI 自定义受众插槽时使用;默认走 FormInfo Select */\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 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 audienceRoles: initial.audienceRoles || initial.roles || [],\n audienceSlots: initial.audienceSlots || [],\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 || c.eventKey,\n }))}\n placeholder={catalog.length ? '选择场景' : '暂无事件目录'}\n {...selectInModalPopupProps}\n />,\n <Input\n key=\"titleTemplate\"\n name=\"titleTemplate\"\n label=\"标题模板\"\n rule=\"REQ\"\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 if (!renderAudienceField) {\n fields.push(\n <Select\n key=\"audienceRoles\"\n name=\"audienceRoles\"\n label=\"受众角色\"\n mode=\"multiple\"\n allowClear\n disabled={!canWrite}\n options={roleOptions.map((r) => ({\n value: r.code,\n label: r.name || r.code,\n }))}\n optionFilterProp=\"label\"\n maxTagCount=\"responsive\"\n placeholder={roleOptions.length ? '下拉选择角色(可多选)' : '暂无角色数据'}\n notFoundContent=\"暂无角色\"\n labelTips=\"可与「通知范围」并存;至少选角色或槽位之一。emit 与显式 userIds 并集送达。\"\n {...selectInModalPopupProps}\n />,\n <Select\n key=\"audienceSlots\"\n name=\"audienceSlots\"\n label=\"通知范围\"\n mode=\"multiple\"\n allowClear\n disabled={!canWrite}\n options={AUDIENCE_SLOT_OPTIONS.map((o) => ({\n value: o.value,\n label: o.label,\n }))}\n optionFilterProp=\"label\"\n maxTagCount=\"responsive\"\n placeholder=\"可选:本人/领导/部门/分厂/租户或任务当事人\"\n notFoundContent=\"暂无槽位\"\n labelTips=\"依赖业务 emit.audienceContext;无上下文的槽不会发出。选「本租户」保存前会确认。\"\n {...selectInModalPopupProps}\n />,\n );\n }\n return fields;\n }, [\n editorReady,\n isCreate,\n canWrite,\n catalog,\n variables,\n editorKey,\n catalogError,\n renderAudienceField,\n roleOptions,\n ]);\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 titleTemplate = normalizeTemplatePlaceholders(String(data.titleTemplate || ''));\n if (!titleTemplate.trim()) {\n message.warning('请填写标题模板');\n return false;\n }\n const audienceRoles = renderAudienceField\n ? roles\n : Array.isArray(data.audienceRoles)\n ? data.audienceRoles\n : [];\n const audienceSlots = normalizeAudienceSlots(data.audienceSlots || []);\n if (\n !hasAudienceSelection({\n roles: audienceRoles,\n slots: audienceSlots,\n userIds: null,\n })\n ) {\n message.warning('请选择受众角色或通知范围(至少一个)');\n return false;\n }\n if (audienceSlots.includes(ORG_TENANT_SLOT)) {\n const ok = await new Promise<boolean>((resolve) => {\n Modal.confirm({\n title: '确认通知本租户全员?',\n content: '已选「本租户(全公司)」:将向当前租户内用户展开(≠跨租户)。确认保存?',\n okText: '确认保存',\n cancelText: '取消',\n onOk: () => resolve(true),\n onCancel: () => resolve(false),\n });\n });\n if (!ok) 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,\n bodyTemplate: normalizeTemplatePlaceholders(String(data.bodyTemplate || '')),\n audienceRoles,\n roles: audienceRoles,\n audienceSlots,\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 [\n formData,\n canWrite,\n catalog,\n onSubmit,\n initial,\n roles,\n isCreate,\n onCancel,\n renderAudienceField,\n ],\n );\n\n return (\n <FormModal\n title={isCreate ? '新建模板' : '编辑模板'}\n open={open}\n onCancel={onCancel}\n width={720}\n size=\"small\"\n className=\"msg-center-form-modal\"\n okText=\"保存\"\n autoClose={false}\n focusable={{ trap: false }}\n afterOpenChange={handleAfterOpenChange}\n formProps={formProps}\n >\n <FormInfo column={1} list={fieldList} />\n {renderAudienceField ? (\n <div className={styles.audienceBlock}>\n <Typography.Text className={styles.audienceLabel}>\n <span style={{ color: '#ff4d4f', marginRight: 4 }}>*</span>\n 受众角色\n </Typography.Text>\n {renderAudienceField({ roles, onChange: setRoles })}\n </div>\n ) : null}\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 bodyRaw = applyTemplateVars(String(data.bodyTemplate || ''), previewVars);\n const bodyHtml = sanitizeInboxHtml(bodyRaw);\n return (\n <div className={styles.previewCollapse}>\n {varsEmptyHint ? (\n <Typography.Text type=\"secondary\">{varsEmptyHint}</Typography.Text>\n ) : null}\n <Collapse\n ghost\n size=\"small\"\n items={[\n {\n key: 'preview',\n label: '效果预览',\n children: (\n <div className={styles.previewCard}>\n <div className={styles.previewTitle}>\n {titlePreview.trim() || (\n <span className={styles.previewEmpty}>(无标题)</span>\n )}\n </div>\n {bodyHtml ? (\n <div\n className={styles.previewBody}\n dangerouslySetInnerHTML={{ __html: bodyHtml }}\n />\n ) : (\n <div className={`${styles.previewBody} ${styles.previewEmpty}`}>\n (无正文)\n </div>\n )}\n </div>\n ),\n },\n ]}\n />\n </div>\n );\n }}\n </FormItem>\n ) : null}\n </FormModal>\n );\n};\n\nexport default TemplateFormModal;\n"],"names":["selectInModalPopupProps","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","r","AUDIENCE_SLOT_OPTIONS","o","formProps","data","message","eventKey","titleTemplate","audienceRoles","audienceSlots","normalizeAudienceSlots","hasAudienceSelection","ORG_TENANT_SLOT","resolve","Modal","hit","scenario","e","jsxs","FormModal","FormInfo","styles","FormItem","api","titlePreview","applyTemplateVars","bodyRaw","bodyHtml","sanitizeInboxHtml","Collapse"],"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 ensureRichTextBlockHtml,\n unwrapMsgVarSpansForStorage,\n} from '@/components/Editor/variableMention';\nimport { sanitizeInboxHtml } from '@/components/Tools/Inbox/sanitizeInboxHtml';\nimport { applyTemplateVars, normalizeTemplatePlaceholders } from '../../utils/templateCode';\nimport { Collapse, Modal, Typography, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n MessageAudienceRoleOption,\n MessageEventCatalogItem,\n MessageTemplateAdminItem,\n MessageTemplateVariable,\n} from '../types';\nimport {\n AUDIENCE_SLOT_OPTIONS,\n ORG_TENANT_SLOT,\n hasAudienceSelection,\n normalizeAudienceSlots,\n} from '../audienceSlots';\nimport styles from '../style.module.scss';\n\n/** ReactModal 内 Select 弹出层须高于 Modal(≈1100) */\nconst selectInModalPopupProps = {\n getPopupContainer: () => document.body,\n styles: { popup: { root: { zIndex: 2000 } } },\n} as const;\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 audienceRoles?: string[];\n audienceSlots?: 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 /** 仅业务 DI 自定义受众插槽时使用;默认走 FormInfo Select */\n const [roles, setRoles] = useState<string[]>([]);\n const [editorReady, setEditorReady] = useState(false);\n /** 编辑器最新 HTML(优先于 Form data,避免字色/加粗未写入 Form 就点保存) */\n const latestBodyHtmlRef = useRef('');\n\n useEffect(() => {\n if (!open || !initial) {\n setEditorReady(false);\n latestBodyHtmlRef.current = '';\n return;\n }\n setRoles(initial.audienceRoles || initial.roles || []);\n latestBodyHtmlRef.current = ensureRichTextBlockHtml(\n normalizeTemplatePlaceholders(initial.bodyTemplate || ''),\n );\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 // seed/库内常为无 <p> 纯文本;先块级化,避免 RTE setData 丢正文\n bodyTemplate: ensureRichTextBlockHtml(\n normalizeTemplatePlaceholders(initial.bodyTemplate || ''),\n ),\n audienceRoles: initial.audienceRoles || initial.roles || [],\n audienceSlots: initial.audienceSlots || [],\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 // 始终登记 bodyTemplate 等字段(勿先只渲染「加载中」——Form 首挂无 name 时 data 回填易丢,\n // 预览仍能读到 store/兜底,编辑区却一直空)。CKEditor 仅用 editorReady 控制挂载。\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 || c.eventKey,\n }))}\n placeholder={catalog.length ? '选择场景' : '暂无事件目录'}\n {...selectInModalPopupProps}\n />,\n <Input\n key=\"titleTemplate\"\n name=\"titleTemplate\"\n label=\"标题模板\"\n rule=\"REQ\"\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 onEditorHtml={(html) => {\n latestBodyHtmlRef.current = html;\n }}\n />,\n );\n if (!renderAudienceField) {\n fields.push(\n <Select\n key=\"audienceRoles\"\n name=\"audienceRoles\"\n label=\"受众角色\"\n mode=\"multiple\"\n allowClear\n disabled={!canWrite}\n options={roleOptions.map((r) => ({\n value: r.code,\n label: r.name || r.code,\n }))}\n optionFilterProp=\"label\"\n maxTagCount=\"responsive\"\n placeholder={roleOptions.length ? '下拉选择角色(可多选)' : '暂无角色数据'}\n notFoundContent=\"暂无角色\"\n labelTips=\"可与「通知范围」并存;至少选角色或槽位之一。emit 与显式 userIds 并集送达。\"\n {...selectInModalPopupProps}\n />,\n <Select\n key=\"audienceSlots\"\n name=\"audienceSlots\"\n label=\"通知范围\"\n mode=\"multiple\"\n allowClear\n disabled={!canWrite}\n options={AUDIENCE_SLOT_OPTIONS.map((o) => ({\n value: o.value,\n label: o.label,\n }))}\n optionFilterProp=\"label\"\n maxTagCount=\"responsive\"\n placeholder=\"可选:本人/领导/部门/分厂/租户或任务当事人\"\n notFoundContent=\"暂无槽位\"\n labelTips=\"依赖业务 emit.audienceContext;无上下文的槽不会发出。选「本租户」保存前会确认。\"\n {...selectInModalPopupProps}\n />,\n );\n }\n return fields;\n }, [\n editorReady,\n isCreate,\n canWrite,\n catalog,\n variables,\n editorKey,\n catalogError,\n renderAudienceField,\n roleOptions,\n ]);\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 titleTemplate = normalizeTemplatePlaceholders(String(data.titleTemplate || ''));\n if (!titleTemplate.trim()) {\n message.warning('请填写标题模板');\n return false;\n }\n const audienceRoles = renderAudienceField\n ? roles\n : Array.isArray(data.audienceRoles)\n ? data.audienceRoles\n : [];\n const audienceSlots = normalizeAudienceSlots(data.audienceSlots || []);\n if (\n !hasAudienceSelection({\n roles: audienceRoles,\n slots: audienceSlots,\n userIds: null,\n })\n ) {\n message.warning('请选择受众角色或通知范围(至少一个)');\n return false;\n }\n if (audienceSlots.includes(ORG_TENANT_SLOT)) {\n const ok = await new Promise<boolean>((resolve) => {\n Modal.confirm({\n title: '确认通知本租户全员?',\n content: '已选「本租户(全公司)」:将向当前租户内用户展开(≠跨租户)。确认保存?',\n okText: '确认保存',\n cancelText: '取消',\n onOk: () => resolve(true),\n onCancel: () => resolve(false),\n });\n });\n if (!ok) 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,\n bodyTemplate: unwrapMsgVarSpansForStorage(\n normalizeTemplatePlaceholders(\n String(latestBodyHtmlRef.current || data.bodyTemplate || ''),\n ),\n ),\n audienceRoles,\n roles: audienceRoles,\n audienceSlots,\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 [\n formData,\n canWrite,\n catalog,\n onSubmit,\n initial,\n roles,\n isCreate,\n onCancel,\n renderAudienceField,\n ],\n );\n\n return (\n <FormModal\n title={isCreate ? '新建模板' : '编辑模板'}\n open={open}\n onCancel={onCancel}\n width={720}\n size=\"small\"\n className=\"msg-center-form-modal\"\n okText=\"保存\"\n autoClose={false}\n focusable={{ trap: false }}\n afterOpenChange={handleAfterOpenChange}\n formProps={formProps}\n >\n <FormInfo column={1} list={fieldList} />\n {renderAudienceField ? (\n <div className={styles.audienceBlock}>\n <Typography.Text className={styles.audienceLabel}>\n <span style={{ color: '#ff4d4f', marginRight: 4 }}>*</span>\n 受众角色\n </Typography.Text>\n {renderAudienceField({ roles, onChange: setRoles })}\n </div>\n ) : null}\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 bodyRaw = applyTemplateVars(String(data.bodyTemplate || ''), previewVars);\n const bodyHtml = sanitizeInboxHtml(bodyRaw);\n return (\n <div className={styles.previewCollapse}>\n {varsEmptyHint ? (\n <Typography.Text type=\"secondary\">{varsEmptyHint}</Typography.Text>\n ) : null}\n <Collapse\n ghost\n size=\"small\"\n items={[\n {\n key: 'preview',\n label: '效果预览',\n children: (\n <div className={styles.previewCard}>\n <div className={styles.previewTitle}>\n {titlePreview.trim() || (\n <span className={styles.previewEmpty}>(无标题)</span>\n )}\n </div>\n {bodyHtml ? (\n <div\n className={styles.previewBody}\n dangerouslySetInnerHTML={{ __html: bodyHtml }}\n />\n ) : (\n <div className={`${styles.previewBody} ${styles.previewEmpty}`}>\n (无正文)\n </div>\n )}\n </div>\n ),\n },\n ]}\n />\n </div>\n );\n }}\n </FormItem>\n ) : null}\n </FormModal>\n );\n};\n\nexport default TemplateFormModal;\n"],"names":["selectInModalPopupProps","TemplateFormModal","open","isCreate","initial","catalog","roleOptions","variables","catalogError","previewVars","canWrite","onCancel","onSubmit","renderAudienceField","roles","setRoles","useState","editorReady","setEditorReady","latestBodyHtmlRef","useRef","useEffect","ensureRichTextBlockHtml","normalizeTemplatePlaceholders","id","editorKey","formData","useMemo","varsEmptyHint","handleAfterOpenChange","useCallback","nextOpen","fieldList","fields","jsx","Input","Select","c","RichTextField","html","r","AUDIENCE_SLOT_OPTIONS","o","formProps","data","message","eventKey","titleTemplate","audienceRoles","audienceSlots","normalizeAudienceSlots","hasAudienceSelection","ORG_TENANT_SLOT","resolve","Modal","hit","scenario","unwrapMsgVarSpansForStorage","e","jsxs","FormModal","FormInfo","styles","Typography","FormItem","api","titlePreview","applyTemplateVars","bodyRaw","bodyHtml","sanitizeInboxHtml","Collapse"],"mappings":"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"}
package/dist/editor.js CHANGED
@@ -1,21 +1,27 @@
1
- import { MSG_VAR_TOKEN_CLASS as o, VAR_PLACEHOLDER_RE as t, filterVariableFeed as a, formatVariableOptionLabel as i, insertVarTokenAt as n, normalizeMentionHtmlToVarTokens as V, toMentionFeedItem as l, toVarToken as s, upliftVarTokensToMentions as T, wrapVarTokensForDisplay as m } from "./components/Editor/variableMention.js";
2
- import { MsgVarWidget as f, insertMsgVar as k } from "./components/Editor/msgVarTokenPlugin.js";
3
- import { RichTextEditor as x } from "./components/Editor/RichTextEditor/RichTextEditor.js";
1
+ import { MSG_VAR_MARK_ATTRS as o, MsgVarWidget as t, collectMarksFromAncestors as a, insertMsgVar as n } from "./components/Editor/msgVarTokenPlugin.js";
2
+ import { MSG_VAR_TOKEN_CLASS as s, VAR_PLACEHOLDER_RE as l, ensureRichTextBlockHtml as V, filterVariableFeed as p, formatVariableOptionLabel as m, insertVarTokenAt as T, normalizeMentionHtmlToVarTokens as M, prepareEditorHtml as A, splitInlineFormatAroundMsgVars as R, toMentionFeedItem as k, toVarToken as _, unwrapMsgVarSpansForStorage as c, upliftVarTokensToMentions as f, wrapVarTokensForDisplay as S } from "./components/Editor/variableMention.js";
3
+ import { RichTextEditor as g } from "./components/Editor/RichTextEditor/RichTextEditor.js";
4
4
  import { VariablePicker as E } from "./components/Editor/VariablePicker.js";
5
5
  export {
6
- o as MSG_VAR_TOKEN_CLASS,
7
- f as MsgVarWidget,
8
- x as RichTextEditor,
9
- t as VAR_PLACEHOLDER_RE,
6
+ o as MSG_VAR_MARK_ATTRS,
7
+ s as MSG_VAR_TOKEN_CLASS,
8
+ t as MsgVarWidget,
9
+ g as RichTextEditor,
10
+ l as VAR_PLACEHOLDER_RE,
10
11
  E as VariablePicker,
11
- a as filterVariableFeed,
12
- i as formatVariableOptionLabel,
13
- k as insertMsgVar,
14
- n as insertVarTokenAt,
15
- V as normalizeMentionHtmlToVarTokens,
16
- l as toMentionFeedItem,
17
- s as toVarToken,
18
- T as upliftVarTokensToMentions,
19
- m as wrapVarTokensForDisplay
12
+ a as collectMarksFromAncestors,
13
+ V as ensureRichTextBlockHtml,
14
+ p as filterVariableFeed,
15
+ m as formatVariableOptionLabel,
16
+ n as insertMsgVar,
17
+ T as insertVarTokenAt,
18
+ M as normalizeMentionHtmlToVarTokens,
19
+ A as prepareEditorHtml,
20
+ R as splitInlineFormatAroundMsgVars,
21
+ k as toMentionFeedItem,
22
+ _ as toVarToken,
23
+ c as unwrapMsgVarSpansForStorage,
24
+ f as upliftVarTokensToMentions,
25
+ S as wrapVarTokensForDisplay
20
26
  };
21
27
  //# sourceMappingURL=editor.js.map