@hkyhy/marsun-components-core 0.1.101 → 0.1.102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/components/Editor/VariablePicker.js +13 -13
  2. package/dist/components/Editor/VariablePicker.js.map +1 -1
  3. package/dist/components/FormInfo/RichTextField/index.js +46 -69
  4. package/dist/components/FormInfo/RichTextField/index.js.map +1 -1
  5. package/dist/components/FormInfo/VariableMentionInput/index.d.ts +1 -0
  6. package/dist/components/FormInfo/VariableMentionInput/index.js +53 -47
  7. package/dist/components/FormInfo/VariableMentionInput/index.js.map +1 -1
  8. package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js +6 -5
  9. package/dist/components/FormInfo/VariableMentionInput/style.module.scss.js.map +1 -1
  10. package/dist/components/Tools/Inbox/InboxBell/InboxBell.d.ts +3 -0
  11. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js +59 -49
  12. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js.map +1 -1
  13. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js +20 -18
  14. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js.map +1 -1
  15. package/dist/components/Tools/Inbox/index.d.ts +1 -0
  16. package/dist/components/Tools/Inbox/sanitizeInboxHtml.d.ts +5 -0
  17. package/dist/components/Tools/Inbox/sanitizeInboxHtml.js +14 -0
  18. package/dist/components/Tools/Inbox/sanitizeInboxHtml.js.map +1 -0
  19. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +100 -99
  20. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
  21. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js +47 -45
  22. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js.map +1 -1
  23. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.d.ts +22 -0
  24. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js +64 -0
  25. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.js.map +1 -0
  26. package/dist/components/Tools/MessageCenter/MsgCenterAppSwitcher/index.d.ts +2 -0
  27. package/dist/components/Tools/MessageCenter/index.d.ts +5 -0
  28. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.d.ts +39 -0
  29. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js +94 -0
  30. package/dist/components/Tools/MessageCenter/msgCenterAppSwitch.js.map +1 -0
  31. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.d.ts +2 -0
  32. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js +18 -0
  33. package/dist/components/Tools/MessageCenter/useMsgCenterAppKey.js.map +1 -0
  34. package/dist/components/Tools/index.d.ts +2 -1
  35. package/dist/index.js +641 -626
  36. package/dist/index.js.map +1 -1
  37. package/dist/marsun-components-core.css +1 -1
  38. package/dist/node_modules/dompurify/dist/purify.es.js +908 -0
  39. package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
  40. package/dist/node_modules/isomorphic-dompurify/dist/browser.js +17 -0
  41. package/dist/node_modules/isomorphic-dompurify/dist/browser.js.map +1 -0
  42. package/dist/styles/global.css +1 -1
  43. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.tsx"],"sourcesContent":["import { FormInfo, FormModal, Input, InputNumber, Select } from '@/components/FormInfo';\nimport { Alert } from '@/components/Alert';\nimport { Empty } from '@/components/Empty';\nimport { PageSpin } from '@/components/Layout';\nimport { Table } from '@/components/Table';\nimport { Button, Select as AntSelect, Space, Switch, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n MessageAudienceRoleOption,\n MessageCrudFlags,\n MessageEventCatalogItem,\n MessageTemplateAdminItem,\n PushRuleAdminItem,\n} from '../types';\nimport { resolveTemplateCodeAfterEventChange } from '../../utils/adminGuards';\nimport styles from '../style.module.scss';\n\n/** CI tsc:kne Select 重载与 FieldProps 交叉时误匹配 FormItem children;宽化为任意 props */\nconst FiSelect = Select as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInput = Input as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInputNumber = InputNumber as unknown as React.ComponentType<Record<string, unknown>>;\n\nexport type PushRulesPanelProps = {\n crud: MessageCrudFlags;\n catalog: MessageEventCatalogItem[];\n templates: MessageTemplateAdminItem[];\n roleOptions: MessageAudienceRoleOption[];\n fetchPushRules: () => Promise<PushRuleAdminItem[]>;\n savePushRule: (item: PushRuleAdminItem) => Promise<void>;\n setPushRuleEnabled?: (item: PushRuleAdminItem, enabled: boolean) => Promise<void>;\n deletePushRule?: (item: PushRuleAdminItem) => Promise<void>;\n createNonce?: number;\n};\n\ntype FormShape = {\n label?: string;\n eventKey?: string;\n templateCode?: string;\n levels?: string[];\n audienceRoles?: string[];\n slaHours?: number;\n scanLookbackDays?: number;\n};\n\n/**\n * 推送规则 CRUD:必含 eventKey + templateCode;channels 默认 in_app。\n */\nexport const PushRulesPanel: React.FC<PushRulesPanelProps> = ({\n crud,\n catalog,\n templates,\n roleOptions,\n fetchPushRules,\n savePushRule,\n setPushRuleEnabled,\n deletePushRule,\n createNonce = 0,\n}) => {\n const canCreate = crud.create;\n const canUpdate = crud.update;\n const canDelete = crud.delete;\n const canRead = crud.read;\n const formWritable = (creating: boolean) => (creating ? canCreate : canUpdate);\n\n const [rows, setRows] = useState<PushRuleAdminItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [editing, setEditing] = useState<PushRuleAdminItem | null>(null);\n const [isCreate, setIsCreate] = useState(false);\n\n const reload = useCallback(async () => {\n setLoading(true);\n setError('');\n try {\n const list = await fetchPushRules();\n setRows(Array.isArray(list) ? list : []);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setRows([]);\n } finally {\n setLoading(false);\n }\n }, [fetchPushRules]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n if (!createNonce || !canCreate) return;\n const first = catalog[0];\n const tplForEvent = templates.find((t) => t.eventKey === first?.eventKey);\n setIsCreate(true);\n setEditing({\n label: first?.label || '新建推送规则',\n eventKey: first?.eventKey || '',\n templateCode: tplForEvent?.code || '',\n levels: ['L2'],\n audienceRoles: [],\n channels: ['in_app'],\n slaHours: 36,\n scanLookbackDays: 7,\n enabled: true,\n });\n }, [createNonce, canCreate, catalog, templates]);\n\n const templatesForEvent = useCallback(\n (eventKey?: string) =>\n templates\n .filter((t) => !eventKey || t.eventKey === eventKey)\n .map((t) => ({\n value: String(t.code || ''),\n label: `${t.label || t.code || ''}(${t.code || ''})`,\n }))\n .filter((o) => o.value),\n [templates],\n );\n\n const formData = useMemo(\n () => ({\n label: editing?.label,\n eventKey: editing?.eventKey,\n templateCode: editing?.templateCode,\n levels: editing?.levels || [],\n audienceRoles: editing?.audienceRoles || [],\n slaHours: editing?.slaHours ?? 0,\n scanLookbackDays: editing?.scanLookbackDays ?? 0,\n }),\n [editing],\n );\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!formWritable(isCreate) || !editing) {\n message.warning('当前为只读');\n return false;\n }\n const eventKey = String(editing.eventKey || data.eventKey || '').trim();\n const templateCode = String(data.templateCode || '').trim();\n if (!eventKey) {\n message.warning('请选择事件');\n return false;\n }\n if (!templateCode) {\n message.warning('请关联模板编号');\n return false;\n }\n try {\n await savePushRule({\n ...editing,\n label: String(data.label || editing.label || '').trim() || eventKey,\n eventKey,\n templateCode,\n levels: data.levels || [],\n audienceRoles: data.audienceRoles || [],\n channels: ['in_app'],\n slaHours: Number(data.slaHours ?? 0),\n scanLookbackDays: Number(data.scanLookbackDays ?? 0),\n enabled: isCreate ? true : editing.enabled !== false,\n });\n message.success('已保存');\n setEditing(null);\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n return false;\n }\n },\n }),\n [canCreate, canUpdate, editing, formData, isCreate, reload, savePushRule],\n );\n\n const columns = useMemo(\n () => [\n { title: '名称', dataIndex: 'label', key: 'label', ellipsis: true },\n {\n title: '事件',\n dataIndex: 'eventKey',\n key: 'eventKey',\n render: (v: string) => catalog.find((c) => c.eventKey === v)?.label || v || '—',\n },\n { title: '关联模板', dataIndex: 'templateCode', key: 'templateCode', width: 140 },\n {\n title: '级别',\n dataIndex: 'levels',\n key: 'levels',\n width: 100,\n render: (lv: string[] | undefined) => (lv || []).join(',') || '—',\n },\n {\n title: '启用',\n dataIndex: 'enabled',\n key: 'enabled',\n width: 80,\n render: (_: unknown, r: PushRuleAdminItem) => (\n <Switch\n size=\"small\"\n checked={r.enabled !== false}\n disabled={!canUpdate || !setPushRuleEnabled}\n onChange={(checked) => {\n void (async () => {\n try {\n await setPushRuleEnabled?.(r, checked);\n message.success(checked ? '已启用' : '已停用');\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n })();\n }}\n />\n ),\n },\n {\n title: '操作',\n key: 'actions',\n width: 140,\n render: (_: unknown, r: PushRuleAdminItem) => (\n <Space size={4}>\n <Button\n type=\"link\"\n size=\"small\"\n disabled={!canUpdate}\n onClick={() => {\n setIsCreate(false);\n setEditing({ ...r });\n }}\n >\n 编辑\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n danger\n disabled={!canDelete || !deletePushRule}\n onClick={() => {\n void (async () => {\n try {\n await deletePushRule?.(r);\n message.success('已删除');\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n })();\n }}\n >\n 删除\n </Button>\n </Space>\n ),\n },\n ],\n [canUpdate, canDelete, catalog, deletePushRule, reload, setPushRuleEnabled],\n );\n\n return (\n <div className={styles.pane}>\n {error ? <Alert type=\"error\" showIcon message={error} style={{ marginBottom: 12 }} /> : null}\n <PageSpin spinning={loading}>\n {!canRead ? (\n <Empty description=\"无推送规则读取权限\" />\n ) : rows.length === 0 && !loading ? (\n <Empty description=\"暂无推送规则\" />\n ) : (\n <Table<PushRuleAdminItem>\n rowKey={(r) => r.id || r.code || `${r.eventKey}-${r.templateCode}`}\n tableName=\"msg-center-push-rules\"\n columnConfigEnabled={false}\n columnResizeEnabled={false}\n columns={columns}\n dataSource={rows}\n pagination={false}\n size=\"small\"\n />\n )}\n </PageSpin>\n <FormModal\n title={isCreate ? '新建推送规则' : '编辑推送规则'}\n open={Boolean(editing)}\n onCancel={() => setEditing(null)}\n width={560}\n okText=\"保存\"\n autoClose={false}\n formProps={formProps}\n >\n {/* 事件用 antd Select:FormInfo Select + onChange 在 CI tsc 下与 kne 重载冲突 */}\n <div style={{ marginBottom: 16 }}>\n <div style={{ marginBottom: 8 }}>事件</div>\n <AntSelect\n style={{ width: '100%' }}\n disabled={!canUpdate}\n value={editing?.eventKey || undefined}\n options={catalog.map((c) => ({\n value: c.eventKey,\n label: c.label || c.eventKey,\n }))}\n onChange={(ek) => {\n const next = String(ek || '');\n const opts = templatesForEvent(next);\n setEditing((prev) =>\n prev\n ? {\n ...prev,\n eventKey: next,\n templateCode: resolveTemplateCodeAfterEventChange(prev.templateCode, opts),\n label: catalog.find((c) => c.eventKey === next)?.label || prev.label,\n }\n : prev,\n );\n }}\n showSearch\n optionFilterProp=\"label\"\n />\n </div>\n <FormInfo\n column={1}\n list={[\n <FiInput\n key=\"label\"\n name=\"label\"\n label=\"名称\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate)}\n />,\n <FiSelect\n key={`tpl-${editing?.eventKey || ''}`}\n name=\"templateCode\"\n label=\"关联模板\"\n rule=\"REQ\"\n disabled={!canUpdate}\n options={templatesForEvent(editing?.eventKey)}\n showSearch\n optionFilterProp=\"label\"\n />,\n <FiSelect\n key=\"levels\"\n name=\"levels\"\n label=\"级别\"\n mode=\"multiple\"\n disabled={!canUpdate}\n options={['L1', 'L2', 'L3'].map((x) => ({ value: x, label: x }))}\n />,\n <FiSelect\n key=\"audienceRoles\"\n name=\"audienceRoles\"\n label=\"受众角色\"\n mode=\"multiple\"\n disabled={!canUpdate}\n options={roleOptions.map((r) => ({ value: r.code, label: r.name || r.code }))}\n optionFilterProp=\"label\"\n />,\n <FiInputNumber\n key=\"slaHours\"\n name=\"slaHours\"\n label=\"SLA(小时)\"\n disabled={!canUpdate}\n min={0}\n style={{ width: '100%' }}\n />,\n <FiInputNumber\n key=\"scanLookbackDays\"\n name=\"scanLookbackDays\"\n label=\"回看(天)\"\n disabled={!canUpdate}\n min={0}\n style={{ width: '100%' }}\n />,\n ]}\n />\n </FormModal>\n </div>\n );\n};\n\nexport default PushRulesPanel;\n"],"names":["FiSelect","Select","FiInput","Input","FiInputNumber","InputNumber","PushRulesPanel","crud","catalog","templates","roleOptions","fetchPushRules","savePushRule","setPushRuleEnabled","deletePushRule","createNonce","canCreate","canUpdate","canDelete","canRead","formWritable","creating","rows","setRows","useState","loading","setLoading","error","setError","editing","setEditing","isCreate","setIsCreate","reload","useCallback","list","useEffect","first","tplForEvent","templatesForEvent","eventKey","t","o","formData","useMemo","formProps","data","message","templateCode","e","columns","v","_a","c","lv","_","r","jsx","Switch","checked","jsxs","Space","Button","styles","Alert","PageSpin","Empty","Table","FormModal","AntSelect","ek","next","opts","prev","resolveTemplateCodeAfterEventChange","FormInfo","x"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.tsx"],"sourcesContent":["import { FormInfo, FormModal, Input, InputNumber, Select } from '@/components/FormInfo';\nimport { Alert } from '@/components/Alert';\nimport { Empty } from '@/components/Empty';\nimport { PageSpin } from '@/components/Layout';\nimport { Table } from '@/components/Table';\nimport { Button, Select as AntSelect, Space, Switch, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n MessageAudienceRoleOption,\n MessageCrudFlags,\n MessageEventCatalogItem,\n MessageTemplateAdminItem,\n PushRuleAdminItem,\n} from '../types';\nimport { resolveTemplateCodeAfterEventChange } from '../../utils/adminGuards';\nimport styles from '../style.module.scss';\n\n/** CI tsc:kne Select 重载与 FieldProps 交叉时误匹配 FormItem children;宽化为任意 props */\nconst FiSelect = Select as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInput = Input as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInputNumber = InputNumber as unknown as React.ComponentType<Record<string, unknown>>;\n\nexport type PushRulesPanelProps = {\n crud: MessageCrudFlags;\n catalog: MessageEventCatalogItem[];\n templates: MessageTemplateAdminItem[];\n roleOptions: MessageAudienceRoleOption[];\n fetchPushRules: () => Promise<PushRuleAdminItem[]>;\n savePushRule: (item: PushRuleAdminItem) => Promise<void>;\n setPushRuleEnabled?: (item: PushRuleAdminItem, enabled: boolean) => Promise<void>;\n deletePushRule?: (item: PushRuleAdminItem) => Promise<void>;\n createNonce?: number;\n};\n\ntype FormShape = {\n label?: string;\n eventKey?: string;\n templateCode?: string;\n levels?: string[];\n audienceRoles?: string[];\n slaHours?: number;\n scanLookbackDays?: number;\n};\n\n/**\n * 推送规则 CRUD:必含 eventKey + templateCode;channels 默认 in_app。\n */\nexport const PushRulesPanel: React.FC<PushRulesPanelProps> = ({\n crud,\n catalog,\n templates,\n roleOptions,\n fetchPushRules,\n savePushRule,\n setPushRuleEnabled,\n deletePushRule,\n createNonce = 0,\n}) => {\n const canCreate = crud.create;\n const canUpdate = crud.update;\n const canDelete = crud.delete;\n const canRead = crud.read;\n const formWritable = (creating: boolean) => (creating ? canCreate : canUpdate);\n\n const [rows, setRows] = useState<PushRuleAdminItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [editing, setEditing] = useState<PushRuleAdminItem | null>(null);\n const [isCreate, setIsCreate] = useState(false);\n\n const reload = useCallback(async () => {\n setLoading(true);\n setError('');\n try {\n const list = await fetchPushRules();\n setRows(Array.isArray(list) ? list : []);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setRows([]);\n } finally {\n setLoading(false);\n }\n }, [fetchPushRules]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n if (!createNonce || !canCreate) return;\n const first = catalog[0];\n const tplForEvent = templates.find((t) => t.eventKey === first?.eventKey);\n setIsCreate(true);\n setEditing({\n label: first?.label || '新建推送规则',\n eventKey: first?.eventKey || '',\n templateCode: tplForEvent?.code || '',\n levels: ['L2'],\n audienceRoles: [],\n channels: ['in_app'],\n slaHours: 36,\n scanLookbackDays: 7,\n enabled: true,\n });\n }, [createNonce, canCreate, catalog, templates]);\n\n const templatesForEvent = useCallback(\n (eventKey?: string) =>\n templates\n .filter((t) => !eventKey || t.eventKey === eventKey)\n .map((t) => ({\n value: String(t.code || ''),\n label: `${t.label || t.code || ''}(${t.code || ''})`,\n }))\n .filter((o) => o.value),\n [templates],\n );\n\n const formData = useMemo(\n () => ({\n label: editing?.label,\n eventKey: editing?.eventKey,\n templateCode: editing?.templateCode,\n levels: editing?.levels || [],\n audienceRoles: editing?.audienceRoles || [],\n slaHours: editing?.slaHours ?? 0,\n scanLookbackDays: editing?.scanLookbackDays ?? 0,\n }),\n [editing],\n );\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!formWritable(isCreate) || !editing) {\n message.warning('当前为只读');\n return false;\n }\n const eventKey = String(editing.eventKey || data.eventKey || '').trim();\n const templateCode = String(data.templateCode || '').trim();\n if (!eventKey) {\n message.warning('请选择事件');\n return false;\n }\n if (!templateCode) {\n message.warning('请关联模板编号');\n return false;\n }\n try {\n await savePushRule({\n ...editing,\n label: String(data.label || editing.label || '').trim() || eventKey,\n eventKey,\n templateCode,\n levels: data.levels || [],\n audienceRoles: data.audienceRoles || [],\n channels: ['in_app'],\n slaHours: Number(data.slaHours ?? 0),\n scanLookbackDays: Number(data.scanLookbackDays ?? 0),\n enabled: isCreate ? true : editing.enabled !== false,\n });\n message.success('已保存');\n setEditing(null);\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n return false;\n }\n },\n }),\n [canCreate, canUpdate, editing, formData, isCreate, reload, savePushRule],\n );\n\n const columns = useMemo(\n () => [\n { title: '名称', dataIndex: 'label', key: 'label', ellipsis: true },\n {\n title: '事件',\n dataIndex: 'eventKey',\n key: 'eventKey',\n render: (v: string) => catalog.find((c) => c.eventKey === v)?.label || v || '—',\n },\n { title: '关联模板', dataIndex: 'templateCode', key: 'templateCode', width: 140 },\n {\n title: '级别',\n dataIndex: 'levels',\n key: 'levels',\n width: 100,\n render: (lv: string[] | undefined) => (lv || []).join(',') || '—',\n },\n {\n title: '启用',\n dataIndex: 'enabled',\n key: 'enabled',\n width: 80,\n render: (_: unknown, r: PushRuleAdminItem) => (\n <Switch\n size=\"small\"\n checked={r.enabled !== false}\n disabled={!canUpdate || !setPushRuleEnabled}\n onChange={(checked) => {\n void (async () => {\n try {\n await setPushRuleEnabled?.(r, checked);\n message.success(checked ? '已启用' : '已停用');\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n })();\n }}\n />\n ),\n },\n {\n title: '操作',\n key: 'actions',\n width: 140,\n render: (_: unknown, r: PushRuleAdminItem) => (\n <Space size={4}>\n <Button\n type=\"link\"\n size=\"small\"\n disabled={!canUpdate}\n onClick={() => {\n setIsCreate(false);\n setEditing({ ...r });\n }}\n >\n 编辑\n </Button>\n <Button\n type=\"link\"\n size=\"small\"\n danger\n disabled={!canDelete || !deletePushRule}\n onClick={() => {\n void (async () => {\n try {\n await deletePushRule?.(r);\n message.success('已删除');\n await reload();\n } catch (e) {\n message.error(e instanceof Error ? e.message : String(e));\n }\n })();\n }}\n >\n 删除\n </Button>\n </Space>\n ),\n },\n ],\n [canUpdate, canDelete, catalog, deletePushRule, reload, setPushRuleEnabled],\n );\n\n return (\n <div className={styles.pane}>\n {error ? <Alert type=\"error\" showIcon message={error} style={{ marginBottom: 12 }} /> : null}\n <PageSpin spinning={loading}>\n {!canRead ? (\n <Empty description=\"无推送规则读取权限\" />\n ) : rows.length === 0 && !loading ? (\n <Empty description=\"暂无推送规则\" />\n ) : (\n <Table<PushRuleAdminItem>\n rowKey={(r) => r.id || r.code || `${r.eventKey}-${r.templateCode}`}\n tableName=\"msg-center-push-rules\"\n columnConfigEnabled={false}\n columnResizeEnabled={false}\n columns={columns}\n dataSource={rows}\n pagination={false}\n size=\"small\"\n />\n )}\n </PageSpin>\n <FormModal\n title={isCreate ? '新建推送规则' : '编辑推送规则'}\n open={Boolean(editing)}\n onCancel={() => setEditing(null)}\n width={560}\n okText=\"保存\"\n autoClose={false}\n formProps={formProps}\n >\n {/* 事件用 antd Select:FormInfo Select + onChange 在 CI tsc 下与 kne 重载冲突 */}\n <div style={{ marginBottom: 16 }}>\n <div style={{ marginBottom: 8 }}>适用场景</div>\n <AntSelect\n style={{ width: '100%' }}\n disabled={!formWritable(isCreate)}\n value={editing?.eventKey || undefined}\n placeholder={catalog.length ? '选择场景(中文)' : '暂无事件目录'}\n options={catalog.map((c) => ({\n value: c.eventKey,\n label: c.label || c.eventKey,\n }))}\n onChange={(ek) => {\n const next = String(ek || '');\n const opts = templatesForEvent(next);\n setEditing((prev) =>\n prev\n ? {\n ...prev,\n eventKey: next,\n templateCode: resolveTemplateCodeAfterEventChange(prev.templateCode, opts),\n label: catalog.find((c) => c.eventKey === next)?.label || prev.label,\n }\n : prev,\n );\n }}\n showSearch\n optionFilterProp=\"label\"\n />\n </div>\n <FormInfo\n column={1}\n list={[\n <FiInput\n key=\"label\"\n name=\"label\"\n label=\"名称\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate)}\n />,\n <FiSelect\n key={`tpl-${editing?.eventKey || ''}`}\n name=\"templateCode\"\n label=\"关联模板\"\n rule=\"REQ\"\n disabled={!canUpdate}\n options={templatesForEvent(editing?.eventKey)}\n showSearch\n optionFilterProp=\"label\"\n />,\n <FiSelect\n key=\"levels\"\n name=\"levels\"\n label=\"级别\"\n mode=\"multiple\"\n disabled={!canUpdate}\n options={['L1', 'L2', 'L3'].map((x) => ({ value: x, label: x }))}\n />,\n <FiSelect\n key=\"audienceRoles\"\n name=\"audienceRoles\"\n label=\"受众角色\"\n mode=\"multiple\"\n disabled={!formWritable(isCreate)}\n options={roleOptions.map((r) => ({ value: r.code, label: r.name || r.code }))}\n optionFilterProp=\"label\"\n placeholder=\"下拉选择角色(可多选)\"\n />,\n <FiInputNumber\n key=\"slaHours\"\n name=\"slaHours\"\n label=\"SLA(小时)\"\n disabled={!canUpdate}\n min={0}\n style={{ width: '100%' }}\n />,\n <FiInputNumber\n key=\"scanLookbackDays\"\n name=\"scanLookbackDays\"\n label=\"回看(天)\"\n disabled={!canUpdate}\n min={0}\n style={{ width: '100%' }}\n />,\n ]}\n />\n </FormModal>\n </div>\n );\n};\n\nexport default PushRulesPanel;\n"],"names":["FiSelect","Select","FiInput","Input","FiInputNumber","InputNumber","PushRulesPanel","crud","catalog","templates","roleOptions","fetchPushRules","savePushRule","setPushRuleEnabled","deletePushRule","createNonce","canCreate","canUpdate","canDelete","canRead","formWritable","creating","rows","setRows","useState","loading","setLoading","error","setError","editing","setEditing","isCreate","setIsCreate","reload","useCallback","list","useEffect","first","tplForEvent","templatesForEvent","eventKey","t","o","formData","useMemo","formProps","data","message","templateCode","e","columns","v","_a","c","lv","_","r","jsx","Switch","checked","jsxs","Space","Button","styles","Alert","PageSpin","Empty","Table","FormModal","AntSelect","ek","next","opts","prev","resolveTemplateCodeAfterEventChange","FormInfo","x"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { default as React } from 'react';
2
+ export type MsgCenterAppSwitcherProps = {
3
+ /**
4
+ * 返回当前用户**有权进入**的 SystemApp(须调用方用 EP 过滤;本组件再收窄到可切换 appKey)。
5
+ * 禁止传入全量 Agent 目录。
6
+ */
7
+ listAuthorizedSystemApps: () => Promise<Array<{
8
+ code: string;
9
+ name: string;
10
+ }>>;
11
+ /** 本壳默认 appKey(无 session 时) */
12
+ fallbackAppKey: string;
13
+ className?: string;
14
+ style?: React.CSSProperties;
15
+ /** 切换成功回调(铃铛/Admin 另订阅 store) */
16
+ onAppKeyChange?: (appKey: string) => void;
17
+ };
18
+ /**
19
+ * AgentHub 消息中心 App 切换器:仅有权 + 本期可切换对;展示名取 SSO name。
20
+ */
21
+ declare const MsgCenterAppSwitcher: React.FC<MsgCenterAppSwitcherProps>;
22
+ export default MsgCenterAppSwitcher;
@@ -0,0 +1,64 @@
1
+ import { jsxs as x, jsx as E } from "react/jsx-runtime";
2
+ import { Typography as j, Select as v } from "antd";
3
+ import { useState as o, useCallback as K, useEffect as M, useMemo as T } from "react";
4
+ import { getMsgCenterAppKey as h, filterMsgCenterSwitchableApps as F, resolveMsgCenterSwitchState as L, setMsgCenterAppKey as w, subscribeMsgCenterAppKey as P } from "../msgCenterAppSwitch.js";
5
+ const D = ({
6
+ listAuthorizedSystemApps: l,
7
+ fallbackAppKey: s,
8
+ className: p,
9
+ style: c,
10
+ onAppKeyChange: a
11
+ }) => {
12
+ const [n, u] = o([]), [f, m] = o(!1), [g, d] = o(null), [S, i] = o(() => h(s)), y = K(async () => {
13
+ m(!0), d(null);
14
+ try {
15
+ const e = await l(), t = F(e || []);
16
+ u(t);
17
+ const r = L(t, s);
18
+ i(r.currentAppKey), h(s) !== r.currentAppKey && t.length && w(
19
+ r.currentAppKey,
20
+ t.map((b) => b.appKey)
21
+ );
22
+ } catch (e) {
23
+ d(e instanceof Error ? e.message : String(e)), u([]);
24
+ } finally {
25
+ m(!1);
26
+ }
27
+ }, [s, l]);
28
+ M(() => {
29
+ y();
30
+ }, [y]), M(() => P((e) => {
31
+ e && i(e);
32
+ }), []);
33
+ const C = T(
34
+ () => n.map((e) => ({
35
+ value: e.appKey,
36
+ label: e.name
37
+ })),
38
+ [n]
39
+ );
40
+ return g ? /* @__PURE__ */ x(j.Text, { type: "danger", className: p, style: c, children: [
41
+ "应用列表不可用:",
42
+ g
43
+ ] }) : !f && n.length <= 1 ? null : /* @__PURE__ */ E(
44
+ v,
45
+ {
46
+ className: p,
47
+ style: { minWidth: 180, ...c },
48
+ loading: f,
49
+ value: S,
50
+ options: C,
51
+ optionFilterProp: "label",
52
+ placeholder: "消息应用",
53
+ "aria-label": "消息中心应用切换",
54
+ onChange: (e) => {
55
+ const t = n.map((r) => r.appKey);
56
+ w(e, t), i(e), a == null || a(e);
57
+ }
58
+ }
59
+ );
60
+ };
61
+ export {
62
+ D as default
63
+ };
64
+ //# sourceMappingURL=MsgCenterAppSwitcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MsgCenterAppSwitcher.js","sources":["../../../../../src/components/Tools/MessageCenter/MsgCenterAppSwitcher/MsgCenterAppSwitcher.tsx"],"sourcesContent":["import { Select, Typography } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport {\n filterMsgCenterSwitchableApps,\n getMsgCenterAppKey,\n resolveMsgCenterSwitchState,\n setMsgCenterAppKey,\n subscribeMsgCenterAppKey,\n type MsgCenterSwitchableApp,\n} from '../msgCenterAppSwitch';\n\nexport type MsgCenterAppSwitcherProps = {\n /**\n * 返回当前用户**有权进入**的 SystemApp(须调用方用 EP 过滤;本组件再收窄到可切换 appKey)。\n * 禁止传入全量 Agent 目录。\n */\n listAuthorizedSystemApps: () => Promise<Array<{ code: string; name: string }>>;\n /** 本壳默认 appKey(无 session 时) */\n fallbackAppKey: string;\n className?: string;\n style?: React.CSSProperties;\n /** 切换成功回调(铃铛/Admin 另订阅 store) */\n onAppKeyChange?: (appKey: string) => void;\n};\n\n/**\n * AgentHub 消息中心 App 切换器:仅有权 + 本期可切换对;展示名取 SSO name。\n */\nconst MsgCenterAppSwitcher: React.FC<MsgCenterAppSwitcherProps> = ({\n listAuthorizedSystemApps,\n fallbackAppKey,\n className,\n style,\n onAppKeyChange,\n}) => {\n const [apps, setApps] = useState<MsgCenterSwitchableApp[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [current, setCurrent] = useState(() => getMsgCenterAppKey(fallbackAppKey));\n\n const reload = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const raw = await listAuthorizedSystemApps();\n const filtered = filterMsgCenterSwitchableApps(raw || []);\n setApps(filtered);\n const state = resolveMsgCenterSwitchState(filtered, fallbackAppKey);\n setCurrent(state.currentAppKey);\n if (getMsgCenterAppKey(fallbackAppKey) !== state.currentAppKey && filtered.length) {\n setMsgCenterAppKey(\n state.currentAppKey,\n filtered.map((a) => a.appKey),\n );\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setApps([]);\n } finally {\n setLoading(false);\n }\n }, [fallbackAppKey, listAuthorizedSystemApps]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n return subscribeMsgCenterAppKey((next) => {\n if (next) setCurrent(next);\n });\n }, []);\n\n const options = useMemo(\n () =>\n apps.map((a) => ({\n value: a.appKey,\n label: a.name,\n })),\n [apps],\n );\n\n if (error) {\n return (\n <Typography.Text type=\"danger\" className={className} style={style}>\n 应用列表不可用:{error}\n </Typography.Text>\n );\n }\n\n if (!loading && apps.length <= 1) {\n // 单权或无可切换:不展示切换器(PB-01:无第二项)\n return null;\n }\n\n return (\n <Select\n className={className}\n style={{ minWidth: 180, ...style }}\n loading={loading}\n value={current}\n options={options}\n optionFilterProp=\"label\"\n placeholder=\"消息应用\"\n aria-label=\"消息中心应用切换\"\n onChange={(value: string) => {\n const allowed = apps.map((a) => a.appKey);\n setMsgCenterAppKey(value, allowed);\n setCurrent(value);\n onAppKeyChange?.(value);\n }}\n />\n );\n};\n\nexport default MsgCenterAppSwitcher;\n"],"names":["MsgCenterAppSwitcher","listAuthorizedSystemApps","fallbackAppKey","className","style","onAppKeyChange","apps","setApps","useState","loading","setLoading","error","setError","current","setCurrent","getMsgCenterAppKey","reload","useCallback","raw","filtered","filterMsgCenterSwitchableApps","state","resolveMsgCenterSwitchState","setMsgCenterAppKey","a","useEffect","subscribeMsgCenterAppKey","next","options","useMemo","Typography","jsx","Select","value","allowed"],"mappings":";;;;AA4BA,MAAMA,IAA4D,CAAC;AAAA,EACjE,0BAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,gBAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAmC,CAAA,CAAE,GACvD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAAOC,CAAQ,IAAIJ,EAAwB,IAAI,GAChD,CAACK,GAASC,CAAU,IAAIN,EAAS,MAAMO,EAAmBb,CAAc,CAAC,GAEzEc,IAASC,EAAY,YAAY;AACrC,IAAAP,EAAW,EAAI,GACfE,EAAS,IAAI;AACb,QAAI;AACF,YAAMM,IAAM,MAAMjB,EAAA,GACZkB,IAAWC,EAA8BF,KAAO,EAAE;AACxD,MAAAX,EAAQY,CAAQ;AAChB,YAAME,IAAQC,EAA4BH,GAAUjB,CAAc;AAClE,MAAAY,EAAWO,EAAM,aAAa,GAC1BN,EAAmBb,CAAc,MAAMmB,EAAM,iBAAiBF,EAAS,UACzEI;AAAA,QACEF,EAAM;AAAA,QACNF,EAAS,IAAI,CAACK,MAAMA,EAAE,MAAM;AAAA,MAAA;AAAA,IAGlC,SAAS,GAAG;AACV,MAAAZ,EAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,GACnDL,EAAQ,CAAA,CAAE;AAAA,IACZ,UAAA;AACE,MAAAG,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACR,GAAgBD,CAAwB,CAAC;AAE7C,EAAAwB,EAAU,MAAM;AACd,IAAKT,EAAA;AAAA,EACP,GAAG,CAACA,CAAM,CAAC,GAEXS,EAAU,MACDC,EAAyB,CAACC,MAAS;AACxC,IAAIA,OAAiBA,CAAI;AAAA,EAC3B,CAAC,GACA,CAAA,CAAE;AAEL,QAAMC,IAAUC;AAAA,IACd,MACEvB,EAAK,IAAI,CAACkB,OAAO;AAAA,MACf,OAAOA,EAAE;AAAA,MACT,OAAOA,EAAE;AAAA,IAAA,EACT;AAAA,IACJ,CAAClB,CAAI;AAAA,EAAA;AAGP,SAAIK,sBAECmB,EAAW,MAAX,EAAgB,MAAK,UAAS,WAAA3B,GAAsB,OAAAC,GAAc,UAAA;AAAA,IAAA;AAAA,IACxDO;AAAA,EAAA,GACX,IAIA,CAACF,KAAWH,EAAK,UAAU,IAEtB,OAIP,gBAAAyB;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAA7B;AAAA,MACA,OAAO,EAAE,UAAU,KAAK,GAAGC,EAAA;AAAA,MAC3B,SAAAK;AAAA,MACA,OAAOI;AAAA,MACP,SAAAe;AAAA,MACA,kBAAiB;AAAA,MACjB,aAAY;AAAA,MACZ,cAAW;AAAA,MACX,UAAU,CAACK,MAAkB;AAC3B,cAAMC,IAAU5B,EAAK,IAAI,CAACkB,MAAMA,EAAE,MAAM;AACxC,QAAAD,EAAmBU,GAAOC,CAAO,GACjCpB,EAAWmB,CAAK,GAChB5B,KAAA,QAAAA,EAAiB4B;AAAA,MACnB;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,2 @@
1
+ export { default as MsgCenterAppSwitcher } from './MsgCenterAppSwitcher';
2
+ export type { MsgCenterAppSwitcherProps } from './MsgCenterAppSwitcher';
@@ -2,3 +2,8 @@ export { MessageTemplateAdmin } from './MessageTemplateAdmin';
2
2
  export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './MessageTemplateAdmin';
3
3
  export { generateTemplateCode, normalizeTemplatePlaceholders, applyTemplateVars, stripHtmlToText, } from './utils/templateCode';
4
4
  export { resolveMessageAdminPermissions } from './MessageTemplateAdmin';
5
+ export { MSG_CENTER_APP_SWITCH_STORAGE_KEY, SYSTEM_APP_TO_MSG_CENTER_APP_KEY, MSG_CENTER_SWITCHABLE_APP_KEYS, msgCenterAppKeyFromSystemAppCode, filterMsgCenterSwitchableApps, getMsgCenterAppKey, setMsgCenterAppKey, subscribeMsgCenterAppKey, bindMsgCenterAppKeyStorageSync, resolveMsgCenterSwitchState, } from './msgCenterAppSwitch';
6
+ export type { MsgCenterAppSwitchState, MsgCenterSwitchableApp, MsgCenterSwitchableAppKey, } from './msgCenterAppSwitch';
7
+ export { useMsgCenterAppKey } from './useMsgCenterAppKey';
8
+ export { MsgCenterAppSwitcher } from './MsgCenterAppSwitcher';
9
+ export type { MsgCenterAppSwitcherProps } from './MsgCenterAppSwitcher';
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 消息中心运行时 appKey 切换(Phase B)。
3
+ * Hub 写入;各业务 App 铃铛/Admin 读取。跨页签用 sessionStorage + storage 事件。
4
+ * 禁 Hub=全 Agent;仅 catalog 可切换对。
5
+ */
6
+ export declare const MSG_CENTER_APP_SWITCH_STORAGE_KEY = "marsun.msgCenter.currentAppKey";
7
+ /** SystemApp.code → mc catalog appKey(非中文表;仅 Quality 例外) */
8
+ export declare const SYSTEM_APP_TO_MSG_CENTER_APP_KEY: Readonly<Record<string, string>>;
9
+ /** 本期允许出现在切换器中的 mc appKey */
10
+ export declare const MSG_CENTER_SWITCHABLE_APP_KEYS: readonly ["equipment-agent", "s3-quality"];
11
+ export type MsgCenterSwitchableAppKey = (typeof MSG_CENTER_SWITCHABLE_APP_KEYS)[number];
12
+ export type MsgCenterAppSwitchState = {
13
+ currentAppKey: string;
14
+ currentSystemAppCode: string;
15
+ currentSystemAppName: string;
16
+ };
17
+ export type MsgCenterSwitchableApp = {
18
+ appKey: string;
19
+ systemAppCode: string;
20
+ name: string;
21
+ };
22
+ type Listener = (appKey: string) => void;
23
+ /** 从 SystemApp.code 解析 mc appKey;未知则原样返回(调用方须再过滤) */
24
+ export declare function msgCenterAppKeyFromSystemAppCode(systemAppCode: string): string;
25
+ /**
26
+ * 仅保留本期可切换且用户有权进入的项(禁全量 Agent)。
27
+ * `apps` 须已是「有权进入」子集(由 Hub 用 EP 过滤后再传入)。
28
+ */
29
+ export declare function filterMsgCenterSwitchableApps(apps: Array<{
30
+ code: string;
31
+ name: string;
32
+ }>): MsgCenterSwitchableApp[];
33
+ export declare function getMsgCenterAppKey(fallbackAppKey: string): string;
34
+ export declare function setMsgCenterAppKey(appKey: string, allowed?: readonly string[]): void;
35
+ export declare function subscribeMsgCenterAppKey(listener: Listener): () => void;
36
+ /** 浏览器多页签:storage 事件(仅跨 tab;同页靠 subscribe) */
37
+ export declare function bindMsgCenterAppKeyStorageSync(): () => void;
38
+ export declare function resolveMsgCenterSwitchState(apps: MsgCenterSwitchableApp[], fallbackAppKey: string): MsgCenterAppSwitchState;
39
+ export {};
@@ -0,0 +1,94 @@
1
+ const c = "marsun.msgCenter.currentAppKey", S = {
2
+ "equipment-agent": "equipment-agent",
3
+ "s3-agent": "s3-quality"
4
+ }, g = ["equipment-agent", "s3-quality"], u = /* @__PURE__ */ new Set();
5
+ function m() {
6
+ if (typeof sessionStorage > "u") return "";
7
+ try {
8
+ return String(sessionStorage.getItem(c) || "").trim();
9
+ } catch {
10
+ return "";
11
+ }
12
+ }
13
+ function y(t) {
14
+ if (!(typeof sessionStorage > "u"))
15
+ try {
16
+ sessionStorage.setItem(c, t);
17
+ } catch {
18
+ }
19
+ }
20
+ function p(t) {
21
+ u.forEach((e) => {
22
+ try {
23
+ e(t);
24
+ } catch {
25
+ }
26
+ });
27
+ }
28
+ function a(t) {
29
+ const e = String(t || "").trim();
30
+ return e ? S[e] || e : "";
31
+ }
32
+ function f(t) {
33
+ const e = [], o = /* @__PURE__ */ new Set();
34
+ for (const r of t) {
35
+ const n = String((r == null ? void 0 : r.code) || "").trim(), i = String((r == null ? void 0 : r.name) || "").trim() || n;
36
+ if (!n) continue;
37
+ const s = a(n);
38
+ g.includes(s) && (o.has(s) || (o.add(s), e.push({ appKey: s, systemAppCode: n, name: i })));
39
+ }
40
+ return e;
41
+ }
42
+ function d(t) {
43
+ const e = m();
44
+ return e || String(t || "").trim();
45
+ }
46
+ function A(t, e) {
47
+ const o = String(t || "").trim();
48
+ if (o) {
49
+ if (e && e.length > 0 && !e.includes(o))
50
+ throw new Error(`appKey 不在可切换列表:${o}`);
51
+ y(o), p(o);
52
+ }
53
+ }
54
+ function C(t) {
55
+ return u.add(t), () => {
56
+ u.delete(t);
57
+ };
58
+ }
59
+ function E() {
60
+ if (typeof window > "u") return () => {
61
+ };
62
+ const t = (e) => {
63
+ e.storageArea === sessionStorage && e.key === c && p(String(e.newValue || "").trim());
64
+ };
65
+ return window.addEventListener("storage", t), () => window.removeEventListener("storage", t);
66
+ }
67
+ function _(t, e) {
68
+ const o = d(e), r = t.find((i) => i.appKey === o);
69
+ if (r)
70
+ return {
71
+ currentAppKey: r.appKey,
72
+ currentSystemAppCode: r.systemAppCode,
73
+ currentSystemAppName: r.name
74
+ };
75
+ const n = t.find((i) => i.appKey === e) || t[0];
76
+ return {
77
+ currentAppKey: (n == null ? void 0 : n.appKey) || e,
78
+ currentSystemAppCode: (n == null ? void 0 : n.systemAppCode) || e,
79
+ currentSystemAppName: (n == null ? void 0 : n.name) || e
80
+ };
81
+ }
82
+ export {
83
+ c as MSG_CENTER_APP_SWITCH_STORAGE_KEY,
84
+ g as MSG_CENTER_SWITCHABLE_APP_KEYS,
85
+ S as SYSTEM_APP_TO_MSG_CENTER_APP_KEY,
86
+ E as bindMsgCenterAppKeyStorageSync,
87
+ f as filterMsgCenterSwitchableApps,
88
+ d as getMsgCenterAppKey,
89
+ a as msgCenterAppKeyFromSystemAppCode,
90
+ _ as resolveMsgCenterSwitchState,
91
+ A as setMsgCenterAppKey,
92
+ C as subscribeMsgCenterAppKey
93
+ };
94
+ //# sourceMappingURL=msgCenterAppSwitch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msgCenterAppSwitch.js","sources":["../../../../src/components/Tools/MessageCenter/msgCenterAppSwitch.ts"],"sourcesContent":["/**\n * 消息中心运行时 appKey 切换(Phase B)。\n * Hub 写入;各业务 App 铃铛/Admin 读取。跨页签用 sessionStorage + storage 事件。\n * 禁 Hub=全 Agent;仅 catalog 可切换对。\n */\n\nexport const MSG_CENTER_APP_SWITCH_STORAGE_KEY = 'marsun.msgCenter.currentAppKey';\n\n/** SystemApp.code → mc catalog appKey(非中文表;仅 Quality 例外) */\nexport const SYSTEM_APP_TO_MSG_CENTER_APP_KEY: Readonly<Record<string, string>> = {\n 'equipment-agent': 'equipment-agent',\n 's3-agent': 's3-quality',\n};\n\n/** 本期允许出现在切换器中的 mc appKey */\nexport const MSG_CENTER_SWITCHABLE_APP_KEYS = ['equipment-agent', 's3-quality'] as const;\n\nexport type MsgCenterSwitchableAppKey = (typeof MSG_CENTER_SWITCHABLE_APP_KEYS)[number];\n\nexport type MsgCenterAppSwitchState = {\n currentAppKey: string;\n currentSystemAppCode: string;\n currentSystemAppName: string;\n};\n\nexport type MsgCenterSwitchableApp = {\n appKey: string;\n systemAppCode: string;\n name: string;\n};\n\ntype Listener = (appKey: string) => void;\n\nconst listeners = new Set<Listener>();\n\nfunction readStorage(): string {\n if (typeof sessionStorage === 'undefined') return '';\n try {\n return String(sessionStorage.getItem(MSG_CENTER_APP_SWITCH_STORAGE_KEY) || '').trim();\n } catch {\n return '';\n }\n}\n\nfunction writeStorage(appKey: string): void {\n if (typeof sessionStorage === 'undefined') return;\n try {\n sessionStorage.setItem(MSG_CENTER_APP_SWITCH_STORAGE_KEY, appKey);\n } catch {\n /* ignore quota */\n }\n}\n\nfunction notify(appKey: string): void {\n listeners.forEach((fn) => {\n try {\n fn(appKey);\n } catch {\n /* listener error 不阻断 */\n }\n });\n}\n\n/** 从 SystemApp.code 解析 mc appKey;未知则原样返回(调用方须再过滤) */\nexport function msgCenterAppKeyFromSystemAppCode(systemAppCode: string): string {\n const code = String(systemAppCode || '').trim();\n if (!code) return '';\n return SYSTEM_APP_TO_MSG_CENTER_APP_KEY[code] || code;\n}\n\n/**\n * 仅保留本期可切换且用户有权进入的项(禁全量 Agent)。\n * `apps` 须已是「有权进入」子集(由 Hub 用 EP 过滤后再传入)。\n */\nexport function filterMsgCenterSwitchableApps(\n apps: Array<{ code: string; name: string }>,\n): MsgCenterSwitchableApp[] {\n const out: MsgCenterSwitchableApp[] = [];\n const seen = new Set<string>();\n for (const raw of apps) {\n const systemAppCode = String(raw?.code || '').trim();\n const name = String(raw?.name || '').trim() || systemAppCode;\n if (!systemAppCode) continue;\n const appKey = msgCenterAppKeyFromSystemAppCode(systemAppCode);\n if (!(MSG_CENTER_SWITCHABLE_APP_KEYS as readonly string[]).includes(appKey)) continue;\n if (seen.has(appKey)) continue;\n seen.add(appKey);\n out.push({ appKey, systemAppCode, name });\n }\n return out;\n}\n\nexport function getMsgCenterAppKey(fallbackAppKey: string): string {\n const fromStore = readStorage();\n if (fromStore) return fromStore;\n return String(fallbackAppKey || '').trim();\n}\n\nexport function setMsgCenterAppKey(appKey: string, allowed?: readonly string[]): void {\n const next = String(appKey || '').trim();\n if (!next) return;\n if (allowed && allowed.length > 0 && !allowed.includes(next)) {\n throw new Error(`appKey 不在可切换列表:${next}`);\n }\n writeStorage(next);\n notify(next);\n}\n\nexport function subscribeMsgCenterAppKey(listener: Listener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n/** 浏览器多页签:storage 事件(仅跨 tab;同页靠 subscribe) */\nexport function bindMsgCenterAppKeyStorageSync(): () => void {\n if (typeof window === 'undefined') return () => undefined;\n const onStorage = (ev: StorageEvent) => {\n if (ev.storageArea !== sessionStorage) return;\n if (ev.key !== MSG_CENTER_APP_SWITCH_STORAGE_KEY) return;\n notify(String(ev.newValue || '').trim());\n };\n window.addEventListener('storage', onStorage);\n return () => window.removeEventListener('storage', onStorage);\n}\n\nexport function resolveMsgCenterSwitchState(\n apps: MsgCenterSwitchableApp[],\n fallbackAppKey: string,\n): MsgCenterAppSwitchState {\n const currentAppKey = getMsgCenterAppKey(fallbackAppKey);\n const hit = apps.find((a) => a.appKey === currentAppKey);\n if (hit) {\n return {\n currentAppKey: hit.appKey,\n currentSystemAppCode: hit.systemAppCode,\n currentSystemAppName: hit.name,\n };\n }\n const fb = apps.find((a) => a.appKey === fallbackAppKey) || apps[0];\n return {\n currentAppKey: fb?.appKey || fallbackAppKey,\n currentSystemAppCode: fb?.systemAppCode || fallbackAppKey,\n currentSystemAppName: fb?.name || fallbackAppKey,\n };\n}\n"],"names":["MSG_CENTER_APP_SWITCH_STORAGE_KEY","SYSTEM_APP_TO_MSG_CENTER_APP_KEY","MSG_CENTER_SWITCHABLE_APP_KEYS","listeners","readStorage","writeStorage","appKey","notify","fn","msgCenterAppKeyFromSystemAppCode","systemAppCode","code","filterMsgCenterSwitchableApps","apps","out","seen","raw","name","getMsgCenterAppKey","fallbackAppKey","fromStore","setMsgCenterAppKey","allowed","next","subscribeMsgCenterAppKey","listener","bindMsgCenterAppKeyStorageSync","onStorage","ev","resolveMsgCenterSwitchState","currentAppKey","hit","a","fb"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** 订阅当前消息中心 appKey(Hub 切换后触发重渲染) */
2
+ export declare function useMsgCenterAppKey(fallbackAppKey: string): string;
@@ -0,0 +1,18 @@
1
+ import { useState as p, useEffect as g } from "react";
2
+ import { getMsgCenterAppKey as t, subscribeMsgCenterAppKey as i, bindMsgCenterAppKeyStorageSync as c } from "./msgCenterAppSwitch.js";
3
+ function C(e) {
4
+ const [r, n] = p(() => t(e));
5
+ return g(() => {
6
+ n(t(e));
7
+ const s = i((u) => {
8
+ n(u || t(e));
9
+ }), o = c();
10
+ return () => {
11
+ s(), o();
12
+ };
13
+ }, [e]), r;
14
+ }
15
+ export {
16
+ C as useMsgCenterAppKey
17
+ };
18
+ //# sourceMappingURL=useMsgCenterAppKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMsgCenterAppKey.js","sources":["../../../../src/components/Tools/MessageCenter/useMsgCenterAppKey.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport {\n getMsgCenterAppKey,\n subscribeMsgCenterAppKey,\n bindMsgCenterAppKeyStorageSync,\n} from './msgCenterAppSwitch';\n\n/** 订阅当前消息中心 appKey(Hub 切换后触发重渲染) */\nexport function useMsgCenterAppKey(fallbackAppKey: string): string {\n const [appKey, setAppKey] = useState(() => getMsgCenterAppKey(fallbackAppKey));\n\n useEffect(() => {\n setAppKey(getMsgCenterAppKey(fallbackAppKey));\n const unsub = subscribeMsgCenterAppKey((next) => {\n setAppKey(next || getMsgCenterAppKey(fallbackAppKey));\n });\n const unbind = bindMsgCenterAppKeyStorageSync();\n return () => {\n unsub();\n unbind();\n };\n }, [fallbackAppKey]);\n\n return appKey;\n}\n"],"names":["useMsgCenterAppKey","fallbackAppKey","appKey","setAppKey","useState","getMsgCenterAppKey","useEffect","unsub","subscribeMsgCenterAppKey","next","unbind","bindMsgCenterAppKeyStorageSync"],"mappings":";;AAQO,SAASA,EAAmBC,GAAgC;AACjE,QAAM,CAACC,GAAQC,CAAS,IAAIC,EAAS,MAAMC,EAAmBJ,CAAc,CAAC;AAE7E,SAAAK,EAAU,MAAM;AACd,IAAAH,EAAUE,EAAmBJ,CAAc,CAAC;AAC5C,UAAMM,IAAQC,EAAyB,CAACC,MAAS;AAC/C,MAAAN,EAAUM,KAAQJ,EAAmBJ,CAAc,CAAC;AAAA,IACtD,CAAC,GACKS,IAASC,EAAA;AACf,WAAO,MAAM;AACX,MAAAJ,EAAA,GACAG,EAAA;AAAA,IACF;AAAA,EACF,GAAG,CAACT,CAAc,CAAC,GAEZC;AACT;"}
@@ -2,4 +2,5 @@ export { InboxBell } from './Inbox';
2
2
  export type { InboxBellItem, InboxBellListResult, InboxBellListParams, InboxBellProps, InboxBellMessageType, } from './Inbox';
3
3
  export { MessageTemplateAdmin } from './MessageCenter';
4
4
  export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './MessageCenter';
5
- export { generateTemplateCode, normalizeTemplatePlaceholders, applyTemplateVars, resolveMessageAdminPermissions, } from './MessageCenter';
5
+ export { generateTemplateCode, normalizeTemplatePlaceholders, applyTemplateVars, resolveMessageAdminPermissions, MSG_CENTER_APP_SWITCH_STORAGE_KEY, SYSTEM_APP_TO_MSG_CENTER_APP_KEY, MSG_CENTER_SWITCHABLE_APP_KEYS, msgCenterAppKeyFromSystemAppCode, filterMsgCenterSwitchableApps, getMsgCenterAppKey, setMsgCenterAppKey, subscribeMsgCenterAppKey, bindMsgCenterAppKeyStorageSync, resolveMsgCenterSwitchState, useMsgCenterAppKey, MsgCenterAppSwitcher, } from './MessageCenter';
6
+ export type { MsgCenterAppSwitchState, MsgCenterSwitchableApp, MsgCenterSwitchableAppKey, MsgCenterAppSwitcherProps, } from './MessageCenter';