@hkyhy/marsun-components-core 0.1.102 → 0.1.113
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/Filter/createKneFilterField.js +42 -39
- package/dist/components/Filter/createKneFilterField.js.map +1 -1
- package/dist/components/Form/SuperSelect.js +48 -45
- package/dist/components/Form/SuperSelect.js.map +1 -1
- package/dist/components/ReactFilter/fields/index.js +33 -26
- package/dist/components/ReactFilter/fields/index.js.map +1 -1
- package/dist/components/ReactFilter/renderSelectListItemContent.d.ts +8 -0
- package/dist/components/ReactFilter/renderSelectListItemContent.js +12 -0
- package/dist/components/ReactFilter/renderSelectListItemContent.js.map +1 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.d.ts +1 -1
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js +158 -137
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js.map +1 -1
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +218 -126
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.d.ts +8 -1
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js +310 -170
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js.map +1 -1
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.js +87 -76
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.js.map +1 -1
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/audienceSlots.d.ts +14 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/audienceSlots.js +31 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/audienceSlots.js.map +1 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/index.d.ts +3 -1
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/style.module.scss.js +18 -6
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/style.module.scss.js.map +1 -1
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.d.ts +27 -0
- package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.js.map +1 -1
- package/dist/components/Tools/MessageCenter/index.d.ts +3 -1
- package/dist/components/Tools/MessageCenter/utils/audienceUserSelectOptions.d.ts +16 -0
- package/dist/components/Tools/MessageCenter/utils/audienceUserSelectOptions.js +33 -0
- package/dist/components/Tools/MessageCenter/utils/audienceUserSelectOptions.js.map +1 -0
- package/dist/components/Tools/MessageCenter/utils/templateCode.js +11 -17
- package/dist/components/Tools/MessageCenter/utils/templateCode.js.map +1 -1
- package/dist/components/Tools/index.d.ts +1 -1
- package/dist/marsun-components-core.css +1 -1
- package/dist/styles/global.css +1 -1
- package/package.json +8 -1
package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js.map
CHANGED
|
@@ -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={!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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"}
|
|
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, Modal, Space, Switch, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n MessageAudienceRoleOption,\n MessageAudienceUserOption,\n MessageCrudFlags,\n MessageEventCatalogItem,\n MessageTemplateAdminItem,\n PushRuleAdminItem,\n} from '../types';\nimport {\n AUDIENCE_SLOT_OPTIONS,\n ORG_TENANT_SLOT,\n hasAudienceSelection,\n normalizeAudienceSlots,\n} from '../audienceSlots';\nimport { resolveTemplateCodeAfterEventChange } from '../../utils/adminGuards';\nimport { buildAudienceUserSelectGroups } from '../../utils/audienceUserSelectOptions';\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\n/** ReactModal zIndex≈1100;Select 默认 1050 会钻到 footer 后面。挂 body + 抬高弹出层 */\nconst selectInModalPopupProps = {\n getPopupContainer: () => document.body,\n styles: { popup: { root: { zIndex: 2000 } } },\n} as const;\n\nexport type PushRulesPanelProps = {\n crud: MessageCrudFlags;\n catalog: MessageEventCatalogItem[];\n templates: MessageTemplateAdminItem[];\n roleOptions: MessageAudienceRoleOption[];\n userOptions?: MessageAudienceUserOption[];\n /** 角色 options 加载失败短文案(勿静默空列表) */\n audienceRolesError?: string;\n /** 例外抄送(静态 userIds)options 加载失败短文案 */\n audienceUsersError?: string;\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 audienceUserIds?: string[];\n audienceSlots?: string[];\n slaHours?: number;\n scanLookbackDays?: number;\n};\n\n/**\n * 推送规则 CRUD:必含 eventKey + templateCode;channels 默认 in_app。\n * 受众:角色多选 + 通知范围(audienceSlots)+ 例外抄送;roles∪slots∪userIds 至少一个。\n * 任务当事人/组织槽依赖 emit.audienceContext;禁 Tree 盖壳。\n */\nexport const PushRulesPanel: React.FC<PushRulesPanelProps> = ({\n crud,\n catalog,\n templates,\n roleOptions,\n userOptions = [],\n audienceRolesError = '',\n audienceUsersError = '',\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 audienceUserIds: [],\n audienceSlots: [],\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 tplOptions = useMemo(\n () => templatesForEvent(editing?.eventKey),\n [templatesForEvent, editing?.eventKey],\n );\n const scenarioLabel = useMemo(() => {\n const ek = editing?.eventKey;\n return catalog.find((c) => c.eventKey === ek)?.label || ek || '当前场景';\n }, [catalog, editing?.eventKey]);\n const noTplForEvent = Boolean(editing) && tplOptions.length === 0;\n\n const audienceUserSelectGroups = useMemo(\n () => buildAudienceUserSelectGroups(userOptions),\n [userOptions],\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 audienceUserIds: editing?.audienceUserIds || [],\n audienceSlots: editing?.audienceSlots || [],\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 if (templatesForEvent(eventKey).length === 0) {\n message.warning('该场景暂无消息模板,请先到「消息模板」新建后再关联');\n return false;\n }\n const audienceRoles = data.audienceRoles || [];\n const audienceUserIds = data.audienceUserIds || [];\n const audienceSlots = normalizeAudienceSlots(data.audienceSlots || []);\n if (\n !hasAudienceSelection({\n roles: audienceRoles,\n slots: audienceSlots,\n userIds: audienceUserIds,\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 '已选「本租户(全公司)」:将向当前租户内用户展开(≠跨租户)。emit 时按页拉取,可能人数较多。确认保存?',\n okText: '确认保存',\n cancelText: '取消',\n onOk: () => resolve(true),\n onCancel: () => resolve(false),\n });\n });\n if (!ok) 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,\n audienceUserIds,\n audienceSlots,\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, templatesForEvent],\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 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=\"small\">\n <Button\n type=\"link\"\n size=\"small\"\n disabled={!canUpdate}\n onClick={() => {\n setIsCreate(false);\n setEditing({\n ...r,\n audienceRoles: r.audienceRoles || [],\n audienceUserIds: r.audienceUserIds || [],\n audienceSlots: r.audienceSlots || [],\n });\n }}\n >\n 编辑\n </Button>\n {canDelete && deletePushRule ? (\n <Button\n type=\"link\"\n size=\"small\"\n danger\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 ) : null}\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 || String(r.eventKey)}\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 size=\"small\"\n className=\"msg-center-form-modal\"\n okText=\"保存\"\n okButtonProps={{ disabled: noTplForEvent || !formWritable(isCreate) }}\n autoClose={false}\n formProps={formProps}\n >\n {noTplForEvent ? (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n message={`「${scenarioLabel}」暂无消息模板`}\n description=\"请先到「消息模板」Tab 为该场景新建模板,再回来关联。当前无法保存推送规则。\"\n />\n ) : null}\n {audienceRolesError ? (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n message={`受众角色加载失败:${audienceRolesError}`}\n />\n ) : null}\n {audienceUsersError ? (\n <Alert\n type=\"warning\"\n showIcon\n style={{ marginBottom: 12 }}\n message={`例外抄送人员加载失败:${audienceUsersError}`}\n />\n ) : null}\n <FormInfo\n column={1}\n list={[\n <FiSelect\n key=\"eventKey\"\n name=\"eventKey\"\n label=\"适用场景\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate)}\n options={catalog.map((c) => ({\n value: c.eventKey,\n label: c.label || c.eventKey,\n }))}\n optionFilterProp=\"label\"\n placeholder={catalog.length ? '点击下拉选择场景' : '暂无事件目录'}\n notFoundContent=\"暂无场景\"\n onChange={(ek: string) => {\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 {...selectInModalPopupProps}\n />,\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 && !isCreate) || noTplForEvent}\n options={tplOptions}\n optionFilterProp=\"label\"\n placeholder={\n noTplForEvent ? '该场景暂无模板,请先新建消息模板' : '点击下拉选择本场景已有模板'\n }\n notFoundContent=\"该场景暂无模板\"\n labelTips=\"选项来自「消息模板」Tab 中与当前适用场景相同的模板(按模板编号关联)。\"\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"levels\"\n name=\"levels\"\n label=\"级别\"\n mode=\"multiple\"\n disabled={!canUpdate && !isCreate}\n options={['L1', 'L2', 'L3'].map((x) => ({ value: x, label: x }))}\n placeholder=\"点击下拉选择级别(可多选)\"\n notFoundContent=\"无级别选项\"\n labelTips=\"告警/任务级别档:L1 最高、L2 中、L3 较低。规则匹配 emit 时带 level 会对齐这些档。\"\n {...selectInModalPopupProps}\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 audienceRolesError\n ? '角色加载失败'\n : roleOptions.length\n ? '点击下拉选择角色(可多选)'\n : '暂无角色(请确认本系统已配置角色)'\n }\n notFoundContent={\n audienceRolesError ? `加载失败:${audienceRolesError}` : '暂无角色数据'\n }\n labelTips=\"主路径:本系统 SSO 角色(这类事常驻通知谁)。可与「通知范围」「例外抄送」并存;emit 时与显式 userIds **并集**(不再互相覆盖)。至少填角色/槽位/例外抄送之一。\"\n {...selectInModalPopupProps}\n />,\n <FiSelect\n key=\"audienceSlots\"\n name=\"audienceSlots\"\n label=\"通知范围\"\n mode=\"multiple\"\n disabled={!formWritable(isCreate)}\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 <FiSelect\n key=\"audienceUserIds\"\n name=\"audienceUserIds\"\n label=\"例外抄送\"\n mode=\"multiple\"\n disabled={!formWritable(isCreate)}\n options={audienceUserSelectGroups}\n optionFilterProp=\"searchText\"\n optionLabelProp=\"label\"\n filterOption={(input: string, option?: { searchText?: string; label?: string }) => {\n const q = String(input || '')\n .trim()\n .toLowerCase();\n if (!q) return true;\n const hay = String(option?.searchText || option?.label || '').toLowerCase();\n return hay.includes(q);\n }}\n optionRender={(ori: {\n data?: { label?: string; description?: string };\n label?: React.ReactNode;\n }) => {\n const label = ori.data?.label ?? ori.label;\n const description = ori.data?.description;\n return (\n <div style={{ lineHeight: 1.35, padding: '2px 0' }}>\n <div>{label}</div>\n {description ? (\n <div style={{ fontSize: 12, color: 'rgba(0,0,0,0.45)' }}>{description}</div>\n ) : null}\n </div>\n );\n }}\n placeholder={\n audienceUsersError\n ? '人员加载失败'\n : userOptions.length\n ? '按部门选择例外抄送人(可多选,日常可留空)'\n : '暂无人员(请确认本租户有用户)'\n }\n notFoundContent={\n audienceUsersError ? `加载失败:${audienceUsersError}` : '暂无人员数据'\n }\n labelTips=\"非常驻名单:仅管理员例外通知等场景。与角色、通知范围并集送达;任务当事人优先用槽位 + emit.audienceContext。\"\n {...selectInModalPopupProps}\n />,\n <FiInputNumber\n key=\"slaHours\"\n name=\"slaHours\"\n label=\"处理时限(小时)\"\n disabled={!canUpdate && !isCreate}\n min={0}\n style={{ width: '100%' }}\n labelTips=\"期望处理完成的时限(小时),默认 36。本期仅存配置,站内信推送暂不自动计时催办。\"\n />,\n <FiInputNumber\n key=\"scanLookbackDays\"\n name=\"scanLookbackDays\"\n label=\"扫描回看(天)\"\n disabled={!canUpdate && !isCreate}\n min={0}\n style={{ width: '100%' }}\n labelTips=\"巡检/匹配规则时往回看多少天的业务数据,默认 7。本期仅存配置,由后续巡检任务消费。\"\n />,\n ]}\n />\n </FormModal>\n </div>\n );\n};\n\nexport default PushRulesPanel;\n"],"names":["FiSelect","Select","FiInput","Input","FiInputNumber","InputNumber","selectInModalPopupProps","PushRulesPanel","crud","catalog","templates","roleOptions","userOptions","audienceRolesError","audienceUsersError","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","t","templatesForEvent","eventKey","o","tplOptions","useMemo","scenarioLabel","ek","_a","c","noTplForEvent","audienceUserSelectGroups","buildAudienceUserSelectGroups","formData","formProps","data","message","templateCode","audienceRoles","audienceUserIds","audienceSlots","normalizeAudienceSlots","hasAudienceSelection","ORG_TENANT_SLOT","resolve","Modal","e","columns","v","lv","_","r","jsx","Switch","checked","jsxs","Space","Button","styles","Alert","PageSpin","Empty","Table","FormModal","FormInfo","next","opts","prev","resolveTemplateCodeAfterEventChange","x","AUDIENCE_SLOT_OPTIONS","input","option","q","ori","label","description","_b"],"mappings":"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"}
|
|
@@ -1,109 +1,115 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { message as i, Tag as j, Space as
|
|
3
|
-
import { useState as c, useCallback as
|
|
4
|
-
import { canDeleteTenantVariable as
|
|
5
|
-
import
|
|
1
|
+
import { jsx as n, jsxs as F } from "react/jsx-runtime";
|
|
2
|
+
import { message as i, Tag as j, Space as N, Button as T } from "antd";
|
|
3
|
+
import { useState as c, useCallback as _, useEffect as B, useMemo as f } from "react";
|
|
4
|
+
import { canDeleteTenantVariable as K } from "../../utils/adminGuards.js";
|
|
5
|
+
import L from "../style.module.scss.js";
|
|
6
6
|
import Q from "../../../../Alert/Alert.js";
|
|
7
7
|
import U from "../../../../Layout/PageSpin/index.js";
|
|
8
|
-
import
|
|
8
|
+
import M from "../../../../Empty/Empty.js";
|
|
9
9
|
import W from "../../../../Table/Table.js";
|
|
10
10
|
import q from "../../../../FormInfo/FormModal.js";
|
|
11
11
|
import G from "../../../../FormInfo/FormInfo.js";
|
|
12
12
|
import { Input as H, Select as J } from "../../../../FormInfo/fields.js";
|
|
13
|
-
const O = J,
|
|
13
|
+
const O = J, P = H, le = ({
|
|
14
14
|
crud: m,
|
|
15
|
-
fetchVariables:
|
|
16
|
-
saveVariable:
|
|
15
|
+
fetchVariables: b,
|
|
16
|
+
saveVariable: g,
|
|
17
17
|
deleteVariable: l,
|
|
18
|
-
createNonce:
|
|
18
|
+
createNonce: k = 0
|
|
19
19
|
}) => {
|
|
20
|
-
const
|
|
21
|
-
|
|
20
|
+
const p = m.create, u = m.update, h = m.delete, R = m.read, y = (e) => e ? p : u, [w, S] = c([]), [C, E] = c(!1), [I, x] = c(""), [t, d] = c(null), [s, z] = c(!1), o = _(async () => {
|
|
21
|
+
E(!0), x("");
|
|
22
22
|
try {
|
|
23
|
-
const
|
|
24
|
-
S(Array.isArray(
|
|
25
|
-
} catch (
|
|
26
|
-
x(
|
|
23
|
+
const e = await b();
|
|
24
|
+
S(Array.isArray(e) ? e : []);
|
|
25
|
+
} catch (e) {
|
|
26
|
+
x(e instanceof Error ? e.message : String(e)), S([]);
|
|
27
27
|
} finally {
|
|
28
|
-
|
|
28
|
+
E(!1);
|
|
29
29
|
}
|
|
30
|
-
}, [
|
|
31
|
-
|
|
30
|
+
}, [b]);
|
|
31
|
+
B(() => {
|
|
32
32
|
o();
|
|
33
|
-
}, [o]),
|
|
34
|
-
!
|
|
35
|
-
}, [
|
|
36
|
-
const
|
|
33
|
+
}, [o]), B(() => {
|
|
34
|
+
!k || !p || (z(!0), d({ key: "", label: "", type: "string", source: "tenant" }));
|
|
35
|
+
}, [k, p]);
|
|
36
|
+
const v = f(
|
|
37
37
|
() => ({
|
|
38
|
-
key:
|
|
39
|
-
label:
|
|
40
|
-
type: (
|
|
38
|
+
key: t == null ? void 0 : t.key,
|
|
39
|
+
label: t == null ? void 0 : t.label,
|
|
40
|
+
type: (t == null ? void 0 : t.type) || "string"
|
|
41
41
|
}),
|
|
42
|
-
[
|
|
43
|
-
),
|
|
42
|
+
[t]
|
|
43
|
+
), A = f(
|
|
44
44
|
() => ({
|
|
45
|
-
data:
|
|
46
|
-
onSubmit: async (
|
|
47
|
-
if (!
|
|
48
|
-
const
|
|
49
|
-
if (!
|
|
45
|
+
data: v,
|
|
46
|
+
onSubmit: async (e) => {
|
|
47
|
+
if (!y(s) || !t) return !1;
|
|
48
|
+
const r = String(e.key || t.key || "").trim();
|
|
49
|
+
if (!r)
|
|
50
50
|
return i.warning("请填写变量 key"), !1;
|
|
51
51
|
try {
|
|
52
|
-
await
|
|
53
|
-
...
|
|
54
|
-
key:
|
|
55
|
-
label: String(
|
|
56
|
-
type: String(
|
|
52
|
+
await g({
|
|
53
|
+
...t,
|
|
54
|
+
key: r,
|
|
55
|
+
label: String(e.label || "").trim(),
|
|
56
|
+
type: String(e.type || "string"),
|
|
57
57
|
source: "tenant"
|
|
58
58
|
}), i.success("已保存"), d(null), await o();
|
|
59
|
-
} catch (
|
|
60
|
-
return i.error(
|
|
59
|
+
} catch (a) {
|
|
60
|
+
return i.error(a instanceof Error ? a.message : String(a)), !1;
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
}),
|
|
64
|
-
[
|
|
65
|
-
),
|
|
64
|
+
[p, u, t, v, s, o, g]
|
|
65
|
+
), D = f(
|
|
66
66
|
() => [
|
|
67
67
|
{ title: "key", dataIndex: "key", key: "key", width: 140 },
|
|
68
68
|
{ title: "中文", dataIndex: "label", key: "label", ellipsis: !0 },
|
|
69
|
-
{
|
|
69
|
+
{
|
|
70
|
+
title: "类型",
|
|
71
|
+
dataIndex: "type",
|
|
72
|
+
key: "type",
|
|
73
|
+
width: 110,
|
|
74
|
+
render: (e) => e === "number" ? "数字(number)" : e === "string" || !e ? "文本(string)" : e
|
|
75
|
+
},
|
|
70
76
|
{
|
|
71
77
|
title: "来源",
|
|
72
78
|
dataIndex: "source",
|
|
73
79
|
key: "source",
|
|
74
80
|
width: 100,
|
|
75
|
-
render: (
|
|
81
|
+
render: (e, r) => /* @__PURE__ */ n(j, { children: r.source === "tenant" ? r.baseline ? "覆盖基线" : "租户" : "基线" })
|
|
76
82
|
},
|
|
77
83
|
{
|
|
78
84
|
title: "操作",
|
|
79
85
|
key: "actions",
|
|
80
86
|
width: 140,
|
|
81
|
-
render: (
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
|
|
87
|
+
render: (e, r) => /* @__PURE__ */ F(N, { size: 4, children: [
|
|
88
|
+
/* @__PURE__ */ n(
|
|
89
|
+
T,
|
|
84
90
|
{
|
|
85
91
|
type: "link",
|
|
86
92
|
size: "small",
|
|
87
|
-
disabled: !
|
|
93
|
+
disabled: !u,
|
|
88
94
|
onClick: () => {
|
|
89
|
-
|
|
95
|
+
z(!1), d({ ...r });
|
|
90
96
|
},
|
|
91
97
|
children: "编辑"
|
|
92
98
|
}
|
|
93
99
|
),
|
|
94
|
-
/* @__PURE__ */
|
|
95
|
-
|
|
100
|
+
/* @__PURE__ */ n(
|
|
101
|
+
T,
|
|
96
102
|
{
|
|
97
103
|
type: "link",
|
|
98
104
|
size: "small",
|
|
99
105
|
danger: !0,
|
|
100
|
-
disabled: !h || !l || !
|
|
106
|
+
disabled: !h || !l || !K(r),
|
|
101
107
|
onClick: () => {
|
|
102
108
|
(async () => {
|
|
103
109
|
try {
|
|
104
|
-
await (l == null ? void 0 : l(
|
|
105
|
-
} catch (
|
|
106
|
-
i.error(
|
|
110
|
+
await (l == null ? void 0 : l(r)), i.success("已删除"), await o();
|
|
111
|
+
} catch (a) {
|
|
112
|
+
i.error(a instanceof Error ? a.message : String(a));
|
|
107
113
|
}
|
|
108
114
|
})();
|
|
109
115
|
},
|
|
@@ -113,60 +119,65 @@ const O = J, T = H, le = ({
|
|
|
113
119
|
] })
|
|
114
120
|
}
|
|
115
121
|
],
|
|
116
|
-
[
|
|
122
|
+
[u, h, l, o]
|
|
117
123
|
);
|
|
118
|
-
return /* @__PURE__ */ F("div", { className:
|
|
119
|
-
I ? /* @__PURE__ */
|
|
120
|
-
/* @__PURE__ */
|
|
124
|
+
return /* @__PURE__ */ F("div", { className: L.pane, children: [
|
|
125
|
+
I ? /* @__PURE__ */ n(Q, { type: "error", showIcon: !0, message: I, style: { marginBottom: 12 } }) : null,
|
|
126
|
+
/* @__PURE__ */ n(U, { spinning: C, children: R ? w.length === 0 && !C ? /* @__PURE__ */ n(M, { description: "暂无变量。基线来自 catalog;可新建租户变量。catalog 为空时模板「插入变量」不可用。" }) : /* @__PURE__ */ n(
|
|
121
127
|
W,
|
|
122
128
|
{
|
|
123
|
-
rowKey: (
|
|
129
|
+
rowKey: (e) => e.key,
|
|
124
130
|
tableName: "msg-center-variables",
|
|
125
131
|
columnConfigEnabled: !1,
|
|
126
132
|
columnResizeEnabled: !1,
|
|
127
|
-
columns:
|
|
133
|
+
columns: D,
|
|
128
134
|
dataSource: w,
|
|
129
135
|
pagination: !1,
|
|
130
136
|
size: "small"
|
|
131
137
|
}
|
|
132
|
-
) : /* @__PURE__ */
|
|
133
|
-
/* @__PURE__ */
|
|
138
|
+
) : /* @__PURE__ */ n(M, { description: "无消息变量读取权限" }) }),
|
|
139
|
+
/* @__PURE__ */ n(
|
|
134
140
|
q,
|
|
135
141
|
{
|
|
136
|
-
title:
|
|
137
|
-
open: !!
|
|
142
|
+
title: s ? "新建变量" : "编辑变量",
|
|
143
|
+
open: !!t,
|
|
138
144
|
onCancel: () => d(null),
|
|
139
145
|
width: 480,
|
|
146
|
+
size: "small",
|
|
147
|
+
className: "msg-center-form-modal",
|
|
140
148
|
okText: "保存",
|
|
141
149
|
autoClose: !1,
|
|
142
|
-
formProps:
|
|
143
|
-
children: /* @__PURE__ */
|
|
150
|
+
formProps: A,
|
|
151
|
+
children: /* @__PURE__ */ n(
|
|
144
152
|
G,
|
|
145
153
|
{
|
|
146
154
|
column: 1,
|
|
147
155
|
list: [
|
|
148
|
-
/* @__PURE__ */
|
|
149
|
-
|
|
156
|
+
/* @__PURE__ */ n(
|
|
157
|
+
P,
|
|
150
158
|
{
|
|
151
159
|
name: "key",
|
|
152
160
|
label: "key",
|
|
153
161
|
rule: "REQ",
|
|
154
|
-
disabled: !
|
|
162
|
+
disabled: !y(s) || !s && !!(t != null && t.key),
|
|
155
163
|
placeholder: "如 customField"
|
|
156
164
|
},
|
|
157
165
|
"key"
|
|
158
166
|
),
|
|
159
|
-
/* @__PURE__ */
|
|
160
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ n(P, { name: "label", label: "中文名", disabled: !y(s) }, "label"),
|
|
168
|
+
/* @__PURE__ */ n(
|
|
161
169
|
O,
|
|
162
170
|
{
|
|
163
171
|
name: "type",
|
|
164
172
|
label: "类型",
|
|
165
|
-
disabled: !
|
|
173
|
+
disabled: !y(s),
|
|
166
174
|
options: [
|
|
167
|
-
{ value: "string", label: "string" },
|
|
168
|
-
{ value: "number", label: "number" }
|
|
169
|
-
]
|
|
175
|
+
{ value: "string", label: "文本(string)" },
|
|
176
|
+
{ value: "number", label: "数字(number)" }
|
|
177
|
+
],
|
|
178
|
+
labelTips: "仅影响模板「效果预览」示例值(数字用 1,文本用中文名);非通用配置类型系统。本期仅支持 string / number。",
|
|
179
|
+
getPopupContainer: () => document.body,
|
|
180
|
+
styles: { popup: { root: { zIndex: 2e3 } } }
|
|
170
181
|
},
|
|
171
182
|
"type"
|
|
172
183
|
)
|
package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.tsx"],"sourcesContent":["import { FormInfo, FormModal, Input, 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, Space, Tag, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { MessageCrudFlags, MessageTemplateVariableAdmin } from '../types';\nimport { canDeleteTenantVariable } from '../../utils/adminGuards';\nimport styles from '../style.module.scss';\n\n/** CI tsc:kne Field 重载误匹配 FormItem children */\nconst FiSelect = Select as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInput = Input as unknown as React.ComponentType<Record<string, unknown>>;\n\nexport type VariablesPanelProps = {\n crud: MessageCrudFlags;\n fetchVariables: () => Promise<MessageTemplateVariableAdmin[]>;\n saveVariable: (item: MessageTemplateVariableAdmin) => Promise<void>;\n deleteVariable?: (item: MessageTemplateVariableAdmin) => Promise<void>;\n createNonce?: number;\n};\n\ntype FormShape = { key?: string; label?: string; type?: string };\n\n/**\n * 租户变量管理:可增改;基线 key 不可删(source=catalog 或 baseline)。\n */\nexport const VariablesPanel: React.FC<VariablesPanelProps> = ({\n crud,\n fetchVariables,\n saveVariable,\n deleteVariable,\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<MessageTemplateVariableAdmin[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [editing, setEditing] = useState<MessageTemplateVariableAdmin | 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 fetchVariables();\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 }, [fetchVariables]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n if (!createNonce || !canCreate) return;\n setIsCreate(true);\n setEditing({ key: '', label: '', type: 'string', source: 'tenant' });\n }, [createNonce, canCreate]);\n\n const formData = useMemo(\n () => ({\n key: editing?.key,\n label: editing?.label,\n type: editing?.type || 'string',\n }),\n [editing],\n );\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!formWritable(isCreate) || !editing) return false;\n const key = String(data.key || editing.key || '').trim();\n if (!key) {\n message.warning('请填写变量 key');\n return false;\n }\n try {\n await saveVariable({\n ...editing,\n key,\n label: String(data.label || '').trim(),\n type: String(data.type || 'string'),\n source: 'tenant',\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, saveVariable],\n );\n\n const columns = useMemo(\n () => [\n { title: 'key', dataIndex: 'key', key: 'key', width: 140 },\n { title: '中文', dataIndex: 'label', key: 'label', ellipsis: true },\n { title: '类型', dataIndex: 'type', key: 'type', width: 90 },\n {\n title: '来源',\n dataIndex: 'source',\n key: 'source',\n width: 100,\n render: (_: unknown, r: MessageTemplateVariableAdmin) => (\n <Tag>{r.source === 'tenant' ? (r.baseline ? '覆盖基线' : '租户') : '基线'}</Tag>\n ),\n },\n {\n title: '操作',\n key: 'actions',\n width: 140,\n render: (_: unknown, r: MessageTemplateVariableAdmin) => (\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 || !deleteVariable || !canDeleteTenantVariable(r)}\n onClick={() => {\n void (async () => {\n try {\n await deleteVariable?.(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, deleteVariable, reload],\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=\"暂无变量。基线来自 catalog;可新建租户变量。catalog 为空时模板「插入变量」不可用。\" />\n ) : (\n <Table<MessageTemplateVariableAdmin>\n rowKey={(r) => r.key}\n tableName=\"msg-center-variables\"\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={480}\n okText=\"保存\"\n autoClose={false}\n formProps={formProps}\n >\n <FormInfo\n column={1}\n list={[\n <FiInput\n key=\"key\"\n name=\"key\"\n label=\"key\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate) || (!isCreate && Boolean(editing?.key))}\n placeholder=\"如 customField\"\n />,\n <FiInput key=\"label\" name=\"label\" label=\"中文名\" disabled={!formWritable(isCreate)} />,\n <FiSelect\n key=\"type\"\n name=\"type\"\n label=\"类型\"\n disabled={!formWritable(isCreate)}\n options={[\n { value: 'string', label: 'string' },\n { value: 'number', label: 'number' },\n ]}\n />,\n ]}\n />\n </FormModal>\n </div>\n );\n};\n\nexport default VariablesPanel;\n"],"names":["FiSelect","Select","FiInput","Input","VariablesPanel","crud","fetchVariables","saveVariable","deleteVariable","createNonce","canCreate","canUpdate","canDelete","canRead","formWritable","creating","rows","setRows","useState","loading","setLoading","error","setError","editing","setEditing","isCreate","setIsCreate","reload","useCallback","list","e","useEffect","formData","useMemo","formProps","data","key","message","columns","_","r","jsx","Tag","jsxs","Space","Button","canDeleteTenantVariable","styles","Alert","PageSpin","Empty","Table","FormModal","FormInfo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.tsx"],"sourcesContent":["import { FormInfo, FormModal, Input, 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, Space, Tag, message } from 'antd';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport type { MessageCrudFlags, MessageTemplateVariableAdmin } from '../types';\nimport { canDeleteTenantVariable } from '../../utils/adminGuards';\nimport styles from '../style.module.scss';\n\n/** CI tsc:kne Field 重载误匹配 FormItem children */\nconst FiSelect = Select as unknown as React.ComponentType<Record<string, unknown>>;\nconst FiInput = Input as unknown as React.ComponentType<Record<string, unknown>>;\n\nexport type VariablesPanelProps = {\n crud: MessageCrudFlags;\n fetchVariables: () => Promise<MessageTemplateVariableAdmin[]>;\n saveVariable: (item: MessageTemplateVariableAdmin) => Promise<void>;\n deleteVariable?: (item: MessageTemplateVariableAdmin) => Promise<void>;\n createNonce?: number;\n};\n\ntype FormShape = { key?: string; label?: string; type?: string };\n\n/**\n * 租户变量管理:可增改;基线 key 不可删(source=catalog 或 baseline)。\n */\nexport const VariablesPanel: React.FC<VariablesPanelProps> = ({\n crud,\n fetchVariables,\n saveVariable,\n deleteVariable,\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<MessageTemplateVariableAdmin[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [editing, setEditing] = useState<MessageTemplateVariableAdmin | 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 fetchVariables();\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 }, [fetchVariables]);\n\n useEffect(() => {\n void reload();\n }, [reload]);\n\n useEffect(() => {\n if (!createNonce || !canCreate) return;\n setIsCreate(true);\n setEditing({ key: '', label: '', type: 'string', source: 'tenant' });\n }, [createNonce, canCreate]);\n\n const formData = useMemo(\n () => ({\n key: editing?.key,\n label: editing?.label,\n type: editing?.type || 'string',\n }),\n [editing],\n );\n\n const formProps = useMemo(\n () => ({\n data: formData,\n onSubmit: async (data: FormShape) => {\n if (!formWritable(isCreate) || !editing) return false;\n const key = String(data.key || editing.key || '').trim();\n if (!key) {\n message.warning('请填写变量 key');\n return false;\n }\n try {\n await saveVariable({\n ...editing,\n key,\n label: String(data.label || '').trim(),\n type: String(data.type || 'string'),\n source: 'tenant',\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, saveVariable],\n );\n\n const columns = useMemo(\n () => [\n { title: 'key', dataIndex: 'key', key: 'key', width: 140 },\n { title: '中文', dataIndex: 'label', key: 'label', ellipsis: true },\n {\n title: '类型',\n dataIndex: 'type',\n key: 'type',\n width: 110,\n render: (t: string | undefined) =>\n t === 'number' ? '数字(number)' : t === 'string' || !t ? '文本(string)' : t,\n },\n {\n title: '来源',\n dataIndex: 'source',\n key: 'source',\n width: 100,\n render: (_: unknown, r: MessageTemplateVariableAdmin) => (\n <Tag>{r.source === 'tenant' ? (r.baseline ? '覆盖基线' : '租户') : '基线'}</Tag>\n ),\n },\n {\n title: '操作',\n key: 'actions',\n width: 140,\n render: (_: unknown, r: MessageTemplateVariableAdmin) => (\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 || !deleteVariable || !canDeleteTenantVariable(r)}\n onClick={() => {\n void (async () => {\n try {\n await deleteVariable?.(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, deleteVariable, reload],\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=\"暂无变量。基线来自 catalog;可新建租户变量。catalog 为空时模板「插入变量」不可用。\" />\n ) : (\n <Table<MessageTemplateVariableAdmin>\n rowKey={(r) => r.key}\n tableName=\"msg-center-variables\"\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={480}\n size=\"small\"\n className=\"msg-center-form-modal\"\n okText=\"保存\"\n autoClose={false}\n formProps={formProps}\n >\n <FormInfo\n column={1}\n list={[\n <FiInput\n key=\"key\"\n name=\"key\"\n label=\"key\"\n rule=\"REQ\"\n disabled={!formWritable(isCreate) || (!isCreate && Boolean(editing?.key))}\n placeholder=\"如 customField\"\n />,\n <FiInput key=\"label\" name=\"label\" label=\"中文名\" disabled={!formWritable(isCreate)} />,\n <FiSelect\n key=\"type\"\n name=\"type\"\n label=\"类型\"\n disabled={!formWritable(isCreate)}\n options={[\n { value: 'string', label: '文本(string)' },\n { value: 'number', label: '数字(number)' },\n ]}\n labelTips=\"仅影响模板「效果预览」示例值(数字用 1,文本用中文名);非通用配置类型系统。本期仅支持 string / number。\"\n getPopupContainer={() => document.body}\n styles={{ popup: { root: { zIndex: 2000 } } }}\n />,\n ]}\n />\n </FormModal>\n </div>\n );\n};\n\nexport default VariablesPanel;\n"],"names":["FiSelect","Select","FiInput","Input","VariablesPanel","crud","fetchVariables","saveVariable","deleteVariable","createNonce","canCreate","canUpdate","canDelete","canRead","formWritable","creating","rows","setRows","useState","loading","setLoading","error","setError","editing","setEditing","isCreate","setIsCreate","reload","useCallback","list","useEffect","formData","useMemo","formProps","data","key","message","e","columns","t","_","jsx","Tag","jsxs","Space","Button","canDeleteTenantVariable","styles","Alert","PageSpin","Empty","Table","r","FormModal","FormInfo"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** 消息受众槽位 — 与 mc catalog `audienceSlotOptions` 对齐(中文 label / 存码);禁 FE 另造平行表。 */
|
|
2
|
+
export type AudienceSlotOption = {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const AUDIENCE_SLOT_OPTIONS: AudienceSlotOption[];
|
|
7
|
+
export declare const ORG_TENANT_SLOT = "org.tenant";
|
|
8
|
+
export declare function normalizeAudienceSlots(raw: unknown): string[];
|
|
9
|
+
/** 保存门禁:roles ∪ slots ∪ userIds 至少一个 */
|
|
10
|
+
export declare function hasAudienceSelection(opts: {
|
|
11
|
+
roles?: string[] | null;
|
|
12
|
+
slots?: string[] | null;
|
|
13
|
+
userIds?: string[] | null;
|
|
14
|
+
}): boolean;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const n = [
|
|
2
|
+
{ value: "task.assigner", label: "分配任务的人" },
|
|
3
|
+
{ value: "task.assignee", label: "接受/被分配任务的人" },
|
|
4
|
+
{ value: "task.claimer", label: "认领人" },
|
|
5
|
+
{ value: "task.reporter", label: "发起/提报人" },
|
|
6
|
+
{ value: "party.self", label: "本人" },
|
|
7
|
+
{ value: "party.self_and_manager", label: "本人及直属领导" },
|
|
8
|
+
{ value: "org.department", label: "本部门" },
|
|
9
|
+
{ value: "org.factory", label: "本分厂" },
|
|
10
|
+
{ value: "org.tenant", label: "本租户(全公司)" }
|
|
11
|
+
], o = "org.tenant";
|
|
12
|
+
function s(l) {
|
|
13
|
+
if (!Array.isArray(l)) return [];
|
|
14
|
+
const r = new Set(n.map((a) => a.value)), t = [];
|
|
15
|
+
for (const a of l) {
|
|
16
|
+
const e = String(a || "").trim();
|
|
17
|
+
e && r.has(e) && !t.includes(e) && t.push(e);
|
|
18
|
+
}
|
|
19
|
+
return t;
|
|
20
|
+
}
|
|
21
|
+
function u(l) {
|
|
22
|
+
const r = (l.roles || []).filter((e) => String(e || "").trim()), t = s(l.slots || []), a = (l.userIds || []).filter((e) => String(e || "").trim());
|
|
23
|
+
return r.length > 0 || t.length > 0 || a.length > 0;
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
n as AUDIENCE_SLOT_OPTIONS,
|
|
27
|
+
o as ORG_TENANT_SLOT,
|
|
28
|
+
u as hasAudienceSelection,
|
|
29
|
+
s as normalizeAudienceSlots
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=audienceSlots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audienceSlots.js","sources":["../../../../../src/components/Tools/MessageCenter/MessageTemplateAdmin/audienceSlots.ts"],"sourcesContent":["/** 消息受众槽位 — 与 mc catalog `audienceSlotOptions` 对齐(中文 label / 存码);禁 FE 另造平行表。 */\nexport type AudienceSlotOption = {\n value: string;\n label: string;\n};\n\nexport const AUDIENCE_SLOT_OPTIONS: AudienceSlotOption[] = [\n { value: 'task.assigner', label: '分配任务的人' },\n { value: 'task.assignee', label: '接受/被分配任务的人' },\n { value: 'task.claimer', label: '认领人' },\n { value: 'task.reporter', label: '发起/提报人' },\n { value: 'party.self', label: '本人' },\n { value: 'party.self_and_manager', label: '本人及直属领导' },\n { value: 'org.department', label: '本部门' },\n { value: 'org.factory', label: '本分厂' },\n { value: 'org.tenant', label: '本租户(全公司)' },\n];\n\nexport const ORG_TENANT_SLOT = 'org.tenant';\n\nexport function normalizeAudienceSlots(raw: unknown): string[] {\n if (!Array.isArray(raw)) return [];\n const allow = new Set(AUDIENCE_SLOT_OPTIONS.map((o) => o.value));\n const out: string[] = [];\n for (const x of raw) {\n const s = String(x || '').trim();\n if (s && allow.has(s) && !out.includes(s)) out.push(s);\n }\n return out;\n}\n\n/** 保存门禁:roles ∪ slots ∪ userIds 至少一个 */\nexport function hasAudienceSelection(opts: {\n roles?: string[] | null;\n slots?: string[] | null;\n userIds?: string[] | null;\n}): boolean {\n const roles = (opts.roles || []).filter((x) => String(x || '').trim());\n const slots = normalizeAudienceSlots(opts.slots || []);\n const userIds = (opts.userIds || []).filter((x) => String(x || '').trim());\n return roles.length > 0 || slots.length > 0 || userIds.length > 0;\n}\n"],"names":["AUDIENCE_SLOT_OPTIONS","ORG_TENANT_SLOT","normalizeAudienceSlots","raw","allow","o","out","x","s","hasAudienceSelection","opts","roles","slots","userIds"],"mappings":"AAMO,MAAMA,IAA8C;AAAA,EACzD,EAAE,OAAO,iBAAiB,OAAO,SAAA;AAAA,EACjC,EAAE,OAAO,iBAAiB,OAAO,aAAA;AAAA,EACjC,EAAE,OAAO,gBAAgB,OAAO,MAAA;AAAA,EAChC,EAAE,OAAO,iBAAiB,OAAO,SAAA;AAAA,EACjC,EAAE,OAAO,cAAc,OAAO,KAAA;AAAA,EAC9B,EAAE,OAAO,0BAA0B,OAAO,UAAA;AAAA,EAC1C,EAAE,OAAO,kBAAkB,OAAO,MAAA;AAAA,EAClC,EAAE,OAAO,eAAe,OAAO,MAAA;AAAA,EAC/B,EAAE,OAAO,cAAc,OAAO,WAAA;AAChC,GAEaC,IAAkB;AAExB,SAASC,EAAuBC,GAAwB;AAC7D,MAAI,CAAC,MAAM,QAAQA,CAAG,UAAU,CAAA;AAChC,QAAMC,IAAQ,IAAI,IAAIJ,EAAsB,IAAI,CAACK,MAAMA,EAAE,KAAK,CAAC,GACzDC,IAAgB,CAAA;AACtB,aAAWC,KAAKJ,GAAK;AACnB,UAAMK,IAAI,OAAOD,KAAK,EAAE,EAAE,KAAA;AAC1B,IAAIC,KAAKJ,EAAM,IAAII,CAAC,KAAK,CAACF,EAAI,SAASE,CAAC,KAAGF,EAAI,KAAKE,CAAC;AAAA,EACvD;AACA,SAAOF;AACT;AAGO,SAASG,EAAqBC,GAIzB;AACV,QAAMC,KAASD,EAAK,SAAS,CAAA,GAAI,OAAO,CAACH,MAAM,OAAOA,KAAK,EAAE,EAAE,MAAM,GAC/DK,IAAQV,EAAuBQ,EAAK,SAAS,CAAA,CAAE,GAC/CG,KAAWH,EAAK,WAAW,CAAA,GAAI,OAAO,CAACH,MAAM,OAAOA,KAAK,EAAE,EAAE,MAAM;AACzE,SAAOI,EAAM,SAAS,KAAKC,EAAM,SAAS,KAAKC,EAAQ,SAAS;AAClE;"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { MessageTemplateAdmin } from './MessageTemplateAdmin';
|
|
2
|
-
export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './types';
|
|
2
|
+
export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageAudienceUserOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './types';
|
|
3
3
|
export { variablesFromCatalog, previewVarsFromVariables, resolveMessageAdminPermissions, } from './types';
|
|
4
|
+
export { AUDIENCE_SLOT_OPTIONS, ORG_TENANT_SLOT, normalizeAudienceSlots, hasAudienceSelection, } from './audienceSlots';
|
|
5
|
+
export type { AudienceSlotOption } from './audienceSlots';
|
|
@@ -1,12 +1,24 @@
|
|
|
1
|
-
const e = "
|
|
1
|
+
const e = "_root_qzt49_2", t = "_pane_qzt49_6", _ = "_previewCollapse_qzt49_47", o = "_previewCard_qzt49_51", p = "_previewTitle_qzt49_59", i = "_previewBody_qzt49_65", r = "_previewEmpty_qzt49_79", a = "_audienceBlock_qzt49_83", c = "_audienceLabel_qzt49_87", n = {
|
|
2
2
|
root: e,
|
|
3
|
-
pane:
|
|
4
|
-
|
|
3
|
+
pane: t,
|
|
4
|
+
previewCollapse: _,
|
|
5
|
+
previewCard: o,
|
|
6
|
+
previewTitle: p,
|
|
7
|
+
previewBody: i,
|
|
8
|
+
previewEmpty: r,
|
|
9
|
+
audienceBlock: a,
|
|
10
|
+
audienceLabel: c
|
|
5
11
|
};
|
|
6
12
|
export {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
13
|
+
a as audienceBlock,
|
|
14
|
+
c as audienceLabel,
|
|
15
|
+
n as default,
|
|
16
|
+
t as pane,
|
|
17
|
+
i as previewBody,
|
|
18
|
+
o as previewCard,
|
|
19
|
+
_ as previewCollapse,
|
|
20
|
+
r as previewEmpty,
|
|
21
|
+
p as previewTitle,
|
|
10
22
|
e as root
|
|
11
23
|
};
|
|
12
24
|
//# sourceMappingURL=style.module.scss.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"style.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
|