@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.
Files changed (37) hide show
  1. package/dist/components/Filter/createKneFilterField.js +42 -39
  2. package/dist/components/Filter/createKneFilterField.js.map +1 -1
  3. package/dist/components/Form/SuperSelect.js +48 -45
  4. package/dist/components/Form/SuperSelect.js.map +1 -1
  5. package/dist/components/ReactFilter/fields/index.js +33 -26
  6. package/dist/components/ReactFilter/fields/index.js.map +1 -1
  7. package/dist/components/ReactFilter/renderSelectListItemContent.d.ts +8 -0
  8. package/dist/components/ReactFilter/renderSelectListItemContent.js +12 -0
  9. package/dist/components/ReactFilter/renderSelectListItemContent.js.map +1 -0
  10. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.d.ts +1 -1
  11. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js +158 -137
  12. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/MessageTemplateAdmin.js.map +1 -1
  13. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +218 -126
  14. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
  15. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.d.ts +8 -1
  16. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js +310 -170
  17. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/PushRulesPanel/index.js.map +1 -1
  18. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.js +87 -76
  19. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/VariablesPanel/index.js.map +1 -1
  20. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/audienceSlots.d.ts +14 -0
  21. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/audienceSlots.js +31 -0
  22. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/audienceSlots.js.map +1 -0
  23. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/index.d.ts +3 -1
  24. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/style.module.scss.js +18 -6
  25. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/style.module.scss.js.map +1 -1
  26. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.d.ts +27 -0
  27. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/types.js.map +1 -1
  28. package/dist/components/Tools/MessageCenter/index.d.ts +3 -1
  29. package/dist/components/Tools/MessageCenter/utils/audienceUserSelectOptions.d.ts +16 -0
  30. package/dist/components/Tools/MessageCenter/utils/audienceUserSelectOptions.js +33 -0
  31. package/dist/components/Tools/MessageCenter/utils/audienceUserSelectOptions.js.map +1 -0
  32. package/dist/components/Tools/MessageCenter/utils/templateCode.js +11 -17
  33. package/dist/components/Tools/MessageCenter/utils/templateCode.js.map +1 -1
  34. package/dist/components/Tools/index.d.ts +1 -1
  35. package/dist/marsun-components-core.css +1 -1
  36. package/dist/styles/global.css +1 -1
  37. package/package.json +8 -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={!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":";;;;;;;;;;;;AAkBA,MAAMA,IAAWC,IACXC,KAAUC,IACVC,IAAgBC,IA2BTC,KAAgD,CAAC;AAAA,EAC5D,MAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,aAAAC,IAAc;AAChB,MAAM;AACJ,QAAMC,IAAYT,EAAK,QACjBU,IAAYV,EAAK,QACjBW,IAAYX,EAAK,QACjBY,IAAUZ,EAAK,MACfa,IAAe,CAACC,MAAuBA,IAAWL,IAAYC,GAE9D,CAACK,GAAMC,CAAO,IAAIC,EAA8B,CAAA,CAAE,GAClD,CAACC,GAASC,CAAU,IAAIF,EAAS,EAAK,GACtC,CAACG,GAAOC,CAAQ,IAAIJ,EAAS,EAAE,GAC/B,CAACK,GAASC,CAAU,IAAIN,EAAmC,IAAI,GAC/D,CAACO,GAAUC,CAAW,IAAIR,EAAS,EAAK,GAExCS,IAASC,EAAY,YAAY;AACrC,IAAAR,EAAW,EAAI,GACfE,EAAS,EAAE;AACX,QAAI;AACF,YAAMO,IAAO,MAAMxB,EAAA;AACnB,MAAAY,EAAQ,MAAM,QAAQY,CAAI,IAAIA,IAAO,CAAA,CAAE;AAAA,IACzC,SAAS,GAAG;AACV,MAAAP,EAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,GACnDL,EAAQ,CAAA,CAAE;AAAA,IACZ,UAAA;AACE,MAAAG,EAAW,EAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAACf,CAAc,CAAC;AAEnB,EAAAyB,EAAU,MAAM;AACd,IAAKH,EAAA;AAAA,EACP,GAAG,CAACA,CAAM,CAAC,GAEXG,EAAU,MAAM;AACd,QAAI,CAACrB,KAAe,CAACC,EAAW;AAChC,UAAMqB,IAAQ7B,EAAQ,CAAC,GACjB8B,IAAc7B,EAAU,KAAK,CAAC,MAAM,EAAE,cAAa4B,KAAA,gBAAAA,EAAO,SAAQ;AACxE,IAAAL,EAAY,EAAI,GAChBF,EAAW;AAAA,MACT,QAAOO,KAAA,gBAAAA,EAAO,UAAS;AAAA,MACvB,WAAUA,KAAA,gBAAAA,EAAO,aAAY;AAAA,MAC7B,eAAcC,KAAA,gBAAAA,EAAa,SAAQ;AAAA,MACnC,QAAQ,CAAC,IAAI;AAAA,MACb,eAAe,CAAA;AAAA,MACf,UAAU,CAAC,QAAQ;AAAA,MACnB,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,SAAS;AAAA,IAAA,CACV;AAAA,EACH,GAAG,CAACvB,GAAaC,GAAWR,GAASC,CAAS,CAAC;AAE/C,QAAM8B,IAAoBL;AAAA,IACxB,CAACM,MACC/B,EACG,OAAO,CAACgC,MAAM,CAACD,KAAYC,EAAE,aAAaD,CAAQ,EAClD,IAAI,CAACC,OAAO;AAAA,MACX,OAAO,OAAOA,EAAE,QAAQ,EAAE;AAAA,MAC1B,OAAO,GAAGA,EAAE,SAASA,EAAE,QAAQ,EAAE,IAAIA,EAAE,QAAQ,EAAE;AAAA,IAAA,EACjD,EACD,OAAO,CAACC,MAAMA,EAAE,KAAK;AAAA,IAC1B,CAACjC,CAAS;AAAA,EAAA,GAGNkC,IAAWC;AAAA,IACf,OAAO;AAAA,MACL,OAAOf,KAAA,gBAAAA,EAAS;AAAA,MAChB,UAAUA,KAAA,gBAAAA,EAAS;AAAA,MACnB,cAAcA,KAAA,gBAAAA,EAAS;AAAA,MACvB,SAAQA,KAAA,gBAAAA,EAAS,WAAU,CAAA;AAAA,MAC3B,gBAAeA,KAAA,gBAAAA,EAAS,kBAAiB,CAAA;AAAA,MACzC,WAAUA,KAAA,gBAAAA,EAAS,aAAY;AAAA,MAC/B,mBAAkBA,KAAA,gBAAAA,EAAS,qBAAoB;AAAA,IAAA;AAAA,IAEjD,CAACA,CAAO;AAAA,EAAA,GAGJgB,IAAYD;AAAA,IAChB,OAAO;AAAA,MACL,MAAMD;AAAA,MACN,UAAU,OAAOG,MAAoB;AACnC,YAAI,CAAC1B,EAAaW,CAAQ,KAAK,CAACF;AAC9B,iBAAAkB,EAAQ,QAAQ,OAAO,GAChB;AAET,cAAMP,IAAW,OAAOX,EAAQ,YAAYiB,EAAK,YAAY,EAAE,EAAE,KAAA,GAC3DE,IAAe,OAAOF,EAAK,gBAAgB,EAAE,EAAE,KAAA;AACrD,YAAI,CAACN;AACH,iBAAAO,EAAQ,QAAQ,OAAO,GAChB;AAET,YAAI,CAACC;AACH,iBAAAD,EAAQ,QAAQ,SAAS,GAClB;AAET,YAAI;AACF,gBAAMnC,EAAa;AAAA,YACjB,GAAGiB;AAAA,YACH,OAAO,OAAOiB,EAAK,SAASjB,EAAQ,SAAS,EAAE,EAAE,KAAA,KAAUW;AAAA,YAC3D,UAAAA;AAAA,YACA,cAAAQ;AAAA,YACA,QAAQF,EAAK,UAAU,CAAA;AAAA,YACvB,eAAeA,EAAK,iBAAiB,CAAA;AAAA,YACrC,UAAU,CAAC,QAAQ;AAAA,YACnB,UAAU,OAAOA,EAAK,YAAY,CAAC;AAAA,YACnC,kBAAkB,OAAOA,EAAK,oBAAoB,CAAC;AAAA,YACnD,SAASf,IAAW,KAAOF,EAAQ,YAAY;AAAA,UAAA,CAChD,GACDkB,EAAQ,QAAQ,KAAK,GACrBjB,EAAW,IAAI,GACf,MAAMG,EAAA;AAAA,QACR,SAASgB,GAAG;AACV,iBAAAF,EAAQ,MAAME,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC,CAAC,GACjD;AAAA,QACT;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,CAACjC,GAAWC,GAAWY,GAASc,GAAUZ,GAAUE,GAAQrB,CAAY;AAAA,EAAA,GAGpEsC,IAAUN;AAAA,IACd,MAAM;AAAA,MACJ,EAAE,OAAO,MAAM,WAAW,SAAS,KAAK,SAAS,UAAU,GAAA;AAAA,MAC3D;AAAA,QACE,OAAO;AAAA,QACP,WAAW;AAAA,QACX,KAAK;AAAA,QACL,QAAQ,CAACO;;AAAc,mBAAAC,IAAA5C,EAAQ,KAAK,CAAC6C,MAAMA,EAAE,aAAaF,CAAC,MAApC,gBAAAC,EAAuC,UAASD,KAAK;AAAA;AAAA,MAAA;AAAA,MAE9E,EAAE,OAAO,QAAQ,WAAW,gBAAgB,KAAK,gBAAgB,OAAO,IAAA;AAAA,MACxE;AAAA,QACE,OAAO;AAAA,QACP,WAAW;AAAA,QACX,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAACG,OAA8BA,KAAM,CAAA,GAAI,KAAK,GAAG,KAAK;AAAA,MAAA;AAAA,MAEhE;AAAA,QACE,OAAO;AAAA,QACP,WAAW;AAAA,QACX,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAACC,GAAYC,MACnB,gBAAAC;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAASF,EAAE,YAAY;AAAA,YACvB,UAAU,CAACvC,KAAa,CAACJ;AAAA,YACzB,UAAU,CAAC8C,MAAY;AACrB,eAAM,YAAY;AAChB,oBAAI;AACF,yBAAM9C,KAAA,gBAAAA,EAAqB2C,GAAGG,KAC9BZ,EAAQ,QAAQY,IAAU,QAAQ,KAAK,GACvC,MAAM1B,EAAA;AAAA,gBACR,SAASgB,GAAG;AACV,kBAAAF,EAAQ,MAAME,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC,CAAC;AAAA,gBAC1D;AAAA,cACF,GAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,MAGJ;AAAA,QACE,OAAO;AAAA,QACP,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAACM,GAAYC,MACnB,gBAAAI,EAACC,GAAA,EAAM,MAAM,GACX,UAAA;AAAA,UAAA,gBAAAJ;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,UAAU,CAAC7C;AAAA,cACX,SAAS,MAAM;AACb,gBAAAe,EAAY,EAAK,GACjBF,EAAW,EAAE,GAAG0B,GAAG;AAAA,cACrB;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD,gBAAAC;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,QAAM;AAAA,cACN,UAAU,CAAC5C,KAAa,CAACJ;AAAA,cACzB,SAAS,MAAM;AACb,iBAAM,YAAY;AAChB,sBAAI;AACF,2BAAMA,KAAA,gBAAAA,EAAiB0C,KACvBT,EAAQ,QAAQ,KAAK,GACrB,MAAMd,EAAA;AAAA,kBACR,SAASgB,GAAG;AACV,oBAAAF,EAAQ,MAAME,aAAa,QAAQA,EAAE,UAAU,OAAOA,CAAC,CAAC;AAAA,kBAC1D;AAAA,gBACF,GAAA;AAAA,cACF;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,EAAA,CACF;AAAA,MAAA;AAAA,IAEJ;AAAA,IAEF,CAAChC,GAAWC,GAAWV,GAASM,GAAgBmB,GAAQpB,CAAkB;AAAA,EAAA;AAG5E,SACE,gBAAA+C,EAAC,OAAA,EAAI,WAAWG,EAAO,MACpB,UAAA;AAAA,IAAApC,IAAQ,gBAAA8B,EAACO,GAAA,EAAM,MAAK,SAAQ,UAAQ,IAAC,SAASrC,GAAO,OAAO,EAAE,cAAc,GAAA,GAAM,IAAK;AAAA,IACxF,gBAAA8B,EAACQ,KAAS,UAAUxC,GACjB,UAACN,IAEEG,EAAK,WAAW,KAAK,CAACG,sBACvByC,GAAA,EAAM,aAAY,UAAS,IAE5B,gBAAAT;AAAA,MAACU;AAAA,MAAA;AAAA,QACC,QAAQ,CAACX,MAAMA,EAAE,MAAMA,EAAE,QAAQ,GAAGA,EAAE,QAAQ,IAAIA,EAAE,YAAY;AAAA,QAChE,WAAU;AAAA,QACV,qBAAqB;AAAA,QACrB,qBAAqB;AAAA,QACrB,SAAAN;AAAA,QACA,YAAY5B;AAAA,QACZ,YAAY;AAAA,QACZ,MAAK;AAAA,MAAA;AAAA,IAAA,IAZP,gBAAAmC,EAACS,KAAM,aAAY,aAAY,GAenC;AAAA,IACA,gBAAAN;AAAA,MAACQ;AAAA,MAAA;AAAA,QACC,OAAOrC,IAAW,WAAW;AAAA,QAC7B,MAAM,EAAQF;AAAA,QACd,UAAU,MAAMC,EAAW,IAAI;AAAA,QAC/B,OAAO;AAAA,QACP,QAAO;AAAA,QACP,WAAW;AAAA,QACX,WAAAe;AAAA,QAGA,UAAA;AAAA,UAAA,gBAAAe,EAAC,OAAA,EAAI,OAAO,EAAE,cAAc,MAC1B,UAAA;AAAA,YAAA,gBAAAH,EAAC,SAAI,OAAO,EAAE,cAAc,EAAA,GAAK,UAAA,QAAI;AAAA,YACrC,gBAAAA;AAAA,cAACY;AAAAA,cAAA;AAAA,gBACC,OAAO,EAAE,OAAO,OAAA;AAAA,gBAChB,UAAU,CAACjD,EAAaW,CAAQ;AAAA,gBAChC,QAAOF,KAAA,gBAAAA,EAAS,aAAY;AAAA,gBAC5B,aAAarB,EAAQ,SAAS,aAAa;AAAA,gBAC3C,SAASA,EAAQ,IAAI,CAAC6C,OAAO;AAAA,kBAC3B,OAAOA,EAAE;AAAA,kBACT,OAAOA,EAAE,SAASA,EAAE;AAAA,gBAAA,EACpB;AAAA,gBACF,UAAU,CAACiB,MAAO;AAChB,wBAAMC,IAAO,OAAOD,KAAM,EAAE,GACtBE,IAAOjC,EAAkBgC,CAAI;AACnC,kBAAAzC;AAAA,oBAAW,CAAC2C;;AACV,6BAAAA,KACI;AAAA,wBACE,GAAGA;AAAA,wBACH,UAAUF;AAAA,wBACV,cAAcG,EAAoCD,EAAK,cAAcD,CAAI;AAAA,wBACzE,SAAOpB,IAAA5C,EAAQ,KAAK,CAAC6C,MAAMA,EAAE,aAAakB,CAAI,MAAvC,gBAAAnB,EAA0C,UAASqB,EAAK;AAAA,sBAAA;AAAA;AAAA,kBAEjE;AAAA,gBAER;AAAA,gBACA,YAAU;AAAA,gBACV,kBAAiB;AAAA,cAAA;AAAA,YAAA;AAAA,UACnB,GACF;AAAA,UACA,gBAAAhB;AAAA,YAACkB;AAAA,YAAA;AAAA,cACC,QAAQ;AAAA,cACR,MAAM;AAAA,gBACJ,gBAAAlB;AAAA,kBAACvD;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,MAAK;AAAA,oBACL,UAAU,CAACkB,EAAaW,CAAQ;AAAA,kBAAA;AAAA,kBAJ5B;AAAA,gBAAA;AAAA,gBAMN,gBAAA0B;AAAA,kBAACzD;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,MAAK;AAAA,oBACL,UAAU,CAACiB;AAAA,oBACX,SAASsB,EAAkBV,KAAA,gBAAAA,EAAS,QAAQ;AAAA,oBAC5C,YAAU;AAAA,oBACV,kBAAiB;AAAA,kBAAA;AAAA,kBAPZ,QAAOA,KAAA,gBAAAA,EAAS,aAAY,EAAE;AAAA,gBAAA;AAAA,gBASrC,gBAAA4B;AAAA,kBAACzD;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,MAAK;AAAA,oBACL,UAAU,CAACiB;AAAA,oBACX,SAAS,CAAC,MAAM,MAAM,IAAI,EAAE,IAAI,CAAC2D,OAAO,EAAE,OAAOA,GAAG,OAAOA,IAAI;AAAA,kBAAA;AAAA,kBAL3D;AAAA,gBAAA;AAAA,gBAON,gBAAAnB;AAAA,kBAACzD;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,MAAK;AAAA,oBACL,UAAU,CAACoB,EAAaW,CAAQ;AAAA,oBAChC,SAASrB,EAAY,IAAI,CAAC8C,OAAO,EAAE,OAAOA,EAAE,MAAM,OAAOA,EAAE,QAAQA,EAAE,OAAO;AAAA,oBAC5E,kBAAiB;AAAA,oBACjB,aAAY;AAAA,kBAAA;AAAA,kBAPR;AAAA,gBAAA;AAAA,gBASN,gBAAAC;AAAA,kBAACrD;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,UAAU,CAACa;AAAA,oBACX,KAAK;AAAA,oBACL,OAAO,EAAE,OAAO,OAAA;AAAA,kBAAO;AAAA,kBALnB;AAAA,gBAAA;AAAA,gBAON,gBAAAwC;AAAA,kBAACrD;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,OAAM;AAAA,oBACN,UAAU,CAACa;AAAA,oBACX,KAAK;AAAA,oBACL,OAAO,EAAE,OAAO,OAAA;AAAA,kBAAO;AAAA,kBALnB;AAAA,gBAAA;AAAA,cAMN;AAAA,YACF;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
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 a, jsxs as F } from "react/jsx-runtime";
2
- import { message as i, Tag as j, Space as _, Button as B } from "antd";
3
- import { useState as c, useCallback as K, useEffect as M, useMemo as f } from "react";
4
- import { canDeleteTenantVariable as L } from "../../utils/adminGuards.js";
5
- import N from "../style.module.scss.js";
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 R from "../../../../Empty/Empty.js";
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, T = H, le = ({
13
+ const O = J, P = H, le = ({
14
14
  crud: m,
15
- fetchVariables: k,
16
- saveVariable: b,
15
+ fetchVariables: b,
16
+ saveVariable: g,
17
17
  deleteVariable: l,
18
- createNonce: g = 0
18
+ createNonce: k = 0
19
19
  }) => {
20
- const y = m.create, p = m.update, h = m.delete, A = m.read, u = (t) => t ? y : p, [w, S] = c([]), [E, C] = c(!1), [I, x] = c(""), [e, d] = c(null), [r, v] = c(!1), o = K(async () => {
21
- C(!0), x("");
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 t = await k();
24
- S(Array.isArray(t) ? t : []);
25
- } catch (t) {
26
- x(t instanceof Error ? t.message : String(t)), S([]);
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
- C(!1);
28
+ E(!1);
29
29
  }
30
- }, [k]);
31
- M(() => {
30
+ }, [b]);
31
+ B(() => {
32
32
  o();
33
- }, [o]), M(() => {
34
- !g || !y || (v(!0), d({ key: "", label: "", type: "string", source: "tenant" }));
35
- }, [g, y]);
36
- const z = f(
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: e == null ? void 0 : e.key,
39
- label: e == null ? void 0 : e.label,
40
- type: (e == null ? void 0 : e.type) || "string"
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
- [e]
43
- ), D = f(
42
+ [t]
43
+ ), A = f(
44
44
  () => ({
45
- data: z,
46
- onSubmit: async (t) => {
47
- if (!u(r) || !e) return !1;
48
- const n = String(t.key || e.key || "").trim();
49
- if (!n)
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 b({
53
- ...e,
54
- key: n,
55
- label: String(t.label || "").trim(),
56
- type: String(t.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 (s) {
60
- return i.error(s instanceof Error ? s.message : String(s)), !1;
59
+ } catch (a) {
60
+ return i.error(a instanceof Error ? a.message : String(a)), !1;
61
61
  }
62
62
  }
63
63
  }),
64
- [y, p, e, z, r, o, b]
65
- ), P = f(
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
- { title: "类型", dataIndex: "type", key: "type", width: 90 },
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: (t, n) => /* @__PURE__ */ a(j, { children: n.source === "tenant" ? n.baseline ? "覆盖基线" : "租户" : "基线" })
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: (t, n) => /* @__PURE__ */ F(_, { size: 4, children: [
82
- /* @__PURE__ */ a(
83
- B,
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: !p,
93
+ disabled: !u,
88
94
  onClick: () => {
89
- v(!1), d({ ...n });
95
+ z(!1), d({ ...r });
90
96
  },
91
97
  children: "编辑"
92
98
  }
93
99
  ),
94
- /* @__PURE__ */ a(
95
- B,
100
+ /* @__PURE__ */ n(
101
+ T,
96
102
  {
97
103
  type: "link",
98
104
  size: "small",
99
105
  danger: !0,
100
- disabled: !h || !l || !L(n),
106
+ disabled: !h || !l || !K(r),
101
107
  onClick: () => {
102
108
  (async () => {
103
109
  try {
104
- await (l == null ? void 0 : l(n)), i.success("已删除"), await o();
105
- } catch (s) {
106
- i.error(s instanceof Error ? s.message : String(s));
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
- [p, h, l, o]
122
+ [u, h, l, o]
117
123
  );
118
- return /* @__PURE__ */ F("div", { className: N.pane, children: [
119
- I ? /* @__PURE__ */ a(Q, { type: "error", showIcon: !0, message: I, style: { marginBottom: 12 } }) : null,
120
- /* @__PURE__ */ a(U, { spinning: E, children: A ? w.length === 0 && !E ? /* @__PURE__ */ a(R, { description: "暂无变量。基线来自 catalog;可新建租户变量。catalog 为空时模板「插入变量」不可用。" }) : /* @__PURE__ */ a(
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: (t) => t.key,
129
+ rowKey: (e) => e.key,
124
130
  tableName: "msg-center-variables",
125
131
  columnConfigEnabled: !1,
126
132
  columnResizeEnabled: !1,
127
- columns: P,
133
+ columns: D,
128
134
  dataSource: w,
129
135
  pagination: !1,
130
136
  size: "small"
131
137
  }
132
- ) : /* @__PURE__ */ a(R, { description: "无消息变量读取权限" }) }),
133
- /* @__PURE__ */ a(
138
+ ) : /* @__PURE__ */ n(M, { description: "无消息变量读取权限" }) }),
139
+ /* @__PURE__ */ n(
134
140
  q,
135
141
  {
136
- title: r ? "新建变量" : "编辑变量",
137
- open: !!e,
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: D,
143
- children: /* @__PURE__ */ a(
150
+ formProps: A,
151
+ children: /* @__PURE__ */ n(
144
152
  G,
145
153
  {
146
154
  column: 1,
147
155
  list: [
148
- /* @__PURE__ */ a(
149
- T,
156
+ /* @__PURE__ */ n(
157
+ P,
150
158
  {
151
159
  name: "key",
152
160
  label: "key",
153
161
  rule: "REQ",
154
- disabled: !u(r) || !r && !!(e != null && e.key),
162
+ disabled: !y(s) || !s && !!(t != null && t.key),
155
163
  placeholder: "如 customField"
156
164
  },
157
165
  "key"
158
166
  ),
159
- /* @__PURE__ */ a(T, { name: "label", label: "中文名", disabled: !u(r) }, "label"),
160
- /* @__PURE__ */ a(
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: !u(r),
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
  )
@@ -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 = "_root_yae2i_1", o = "_pane_yae2i_5", t = "_preview_yae2i_18", _ = {
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: o,
4
- preview: t
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
- _ as default,
8
- o as pane,
9
- t as preview,
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":";;;;;;;;;;;"}