@hkyhy/marsun-components-core 0.1.121 → 0.1.123

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 (26) hide show
  1. package/README.md +2 -0
  2. package/dist/components/InfoPage/Content/index.d.ts +8 -1
  3. package/dist/components/InfoPage/Content/index.js +103 -57
  4. package/dist/components/InfoPage/Content/index.js.map +1 -1
  5. package/dist/components/InfoPage/Content/style.module.scss.js +10 -8
  6. package/dist/components/InfoPage/Content/style.module.scss.js.map +1 -1
  7. package/dist/components/InfoPage/index.d.ts +13 -1
  8. package/dist/components/Tools/ActionTracking/List/ActionListTable.js +1 -1
  9. package/dist/components/Tools/ActionTracking/List/ActionListTable.js.map +1 -1
  10. package/dist/components/Tools/Inbox/InboxBell/InboxBell.d.ts +14 -3
  11. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js +136 -95
  12. package/dist/components/Tools/Inbox/InboxBell/InboxBell.js.map +1 -1
  13. package/dist/components/Tools/Inbox/InboxBell/index.d.ts +1 -1
  14. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js +18 -16
  15. package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js.map +1 -1
  16. package/dist/components/Tools/Inbox/index.d.ts +2 -1
  17. package/dist/components/Tools/Inbox/requestInboxBadgeRefresh.d.ts +9 -0
  18. package/dist/components/Tools/Inbox/requestInboxBadgeRefresh.js +15 -0
  19. package/dist/components/Tools/Inbox/requestInboxBadgeRefresh.js.map +1 -0
  20. package/dist/components/Tools/index.d.ts +2 -1
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.js +400 -396
  23. package/dist/index.js.map +1 -1
  24. package/dist/marsun-components-core.css +1 -1
  25. package/dist/styles/global.css +1 -1
  26. package/package.json +1 -1
@@ -1,130 +1,165 @@
1
- import { jsxs as b, jsx as a } from "react/jsx-runtime";
2
- import { Badge as R, Button as U, Drawer as W, Space as $, message as A } from "antd";
3
- import x from "classnames";
4
- import { useState as n, useCallback as E, useEffect as T, useMemo as F } from "react";
5
- import { sanitizeInboxHtml as D } from "../sanitizeInboxHtml.js";
6
- import t from "./style.module.scss.js";
7
- import { Bell as K } from "../../../Icons/Bell.js";
8
- import Y from "../../../StateBar/StateBar.js";
9
- import q from "../../../SegmentedRadio/SegmentedRadio.js";
10
- import G from "../../../Layout/PageSpin/index.js";
11
- import J from "../../../Empty/Empty.js";
12
- const Q = [
1
+ import { jsxs as p, jsx as n } from "react/jsx-runtime";
2
+ import { Badge as G, Button as V, Drawer as Y, Space as K, Tag as X, message as q } from "antd";
3
+ import I from "classnames";
4
+ import { forwardRef as J, useState as l, useRef as z, useCallback as H, useImperativeHandle as Q, useEffect as d, useMemo as Z } from "react";
5
+ import { sanitizeInboxHtml as ee } from "../sanitizeInboxHtml.js";
6
+ import { INBOX_BADGE_REFRESH_EVENT as M } from "../requestInboxBadgeRefresh.js";
7
+ import r from "./style.module.scss.js";
8
+ import { Bell as te } from "../../../Icons/Bell.js";
9
+ import ne from "../../../StateBar/StateBar.js";
10
+ import re from "../../../SegmentedRadio/SegmentedRadio.js";
11
+ import ae from "../../../Layout/PageSpin/index.js";
12
+ import se from "../../../Empty/Empty.js";
13
+ const le = [
13
14
  { key: "", label: "全部" },
14
15
  { key: "alert", label: "预警" },
15
16
  { key: "action", label: "行动" },
16
17
  { key: "remind", label: "提醒" }
17
- ], ie = ({
18
- fetchInbox: o,
19
- markRead: M,
20
- onNavigate: v,
21
- pollMs: m = 6e4,
22
- pageSize: w = 50,
23
- className: H,
24
- title: I = "站内信"
25
- }) => {
26
- const [p, i] = n(!1), [B, N] = n(!1), [u, k] = n(""), [S, y] = n([]), [s, f] = n(0), [C, z] = n({}), [h, P] = n(""), [d, _] = n("all"), O = E(async () => {
27
- N(!0), k("");
18
+ ], ie = {
19
+ alert: "预警",
20
+ action: "行动",
21
+ remind: "提醒"
22
+ }, oe = 300;
23
+ function de(T) {
24
+ const s = String(T || "").trim().toLowerCase();
25
+ return s ? ie[s] || s : "";
26
+ }
27
+ const Ee = J(function({
28
+ fetchInbox: s,
29
+ markRead: P,
30
+ onNavigate: E,
31
+ pollMs: f = 0,
32
+ locationKey: B,
33
+ pageSize: N = 50,
34
+ className: A,
35
+ title: U = "站内信"
36
+ }, D) {
37
+ const [y, u] = l(!1), [S, L] = l(!1), [v, k] = l(""), [C, h] = l([]), [c, g] = l(0), [_, O] = l({}), [w, F] = l(""), [m, W] = l("all"), i = z(null), R = z(!1), x = H(async () => {
38
+ L(!0), k("");
28
39
  try {
29
- const e = await o({
40
+ const e = await s({
30
41
  currentPage: 1,
31
- pageSize: w,
32
- messageType: h || void 0,
33
- unreadOnly: d === "unread" || void 0,
34
- readOnly: d === "read" || void 0
42
+ pageSize: N,
43
+ messageType: w || void 0,
44
+ unreadOnly: m === "unread" || void 0,
45
+ readOnly: m === "read" || void 0
35
46
  });
36
- y((e == null ? void 0 : e.itemList) || []), f(typeof (e == null ? void 0 : e.unreadTotal) == "number" ? e.unreadTotal : 0), z((e == null ? void 0 : e.unreadByMessageType) || {});
47
+ h((e == null ? void 0 : e.itemList) || []), g(typeof (e == null ? void 0 : e.unreadTotal) == "number" ? e.unreadTotal : 0), O((e == null ? void 0 : e.unreadByMessageType) || {});
37
48
  } catch (e) {
38
- y([]), k(e instanceof Error ? e.message : String(e));
49
+ h([]), k(e instanceof Error ? e.message : String(e));
39
50
  } finally {
40
- N(!1);
51
+ L(!1);
41
52
  }
42
- }, [o, h, w, d]), c = E(async () => {
53
+ }, [s, w, N, m]), a = H(async () => {
43
54
  try {
44
- const e = await o({ currentPage: 1, pageSize: 1 });
45
- f(typeof (e == null ? void 0 : e.unreadTotal) == "number" ? e.unreadTotal : 0), z((e == null ? void 0 : e.unreadByMessageType) || {});
55
+ const e = await s({ currentPage: 1, pageSize: 1 });
56
+ g(typeof (e == null ? void 0 : e.unreadTotal) == "number" ? e.unreadTotal : 0), O((e == null ? void 0 : e.unreadByMessageType) || {});
46
57
  } catch {
47
58
  }
48
- }, [o]);
49
- T(() => {
50
- c();
51
- }, [c]), T(() => {
52
- if (m <= 0) return;
59
+ }, [s]);
60
+ Q(D, () => ({ refreshBadge: a }), [a]), d(() => {
61
+ a();
62
+ }, [a]), d(() => {
63
+ if (B !== void 0) {
64
+ if (!R.current) {
65
+ R.current = !0;
66
+ return;
67
+ }
68
+ a();
69
+ }
70
+ }, [B, a]), d(() => {
71
+ if (f <= 0) return;
53
72
  const e = window.setInterval(() => {
54
- c();
55
- }, m);
73
+ a();
74
+ }, f);
56
75
  return () => window.clearInterval(e);
57
- }, [m, c]), T(() => {
58
- p && O();
59
- }, [p, O]);
60
- const j = F(
61
- () => Q.map((e) => {
62
- const r = e.key ? C[e.key] || 0 : s;
76
+ }, [f, a]), d(() => {
77
+ const e = () => {
78
+ i.current != null && window.clearTimeout(i.current), i.current = window.setTimeout(() => {
79
+ i.current = null, a();
80
+ }, oe);
81
+ }, t = () => {
82
+ document.visibilityState === "visible" && e();
83
+ };
84
+ return window.addEventListener("focus", e), document.addEventListener("visibilitychange", t), () => {
85
+ window.removeEventListener("focus", e), document.removeEventListener("visibilitychange", t), i.current != null && (window.clearTimeout(i.current), i.current = null);
86
+ };
87
+ }, [a]), d(() => {
88
+ const e = () => {
89
+ a();
90
+ };
91
+ return window.addEventListener(M, e), () => window.removeEventListener(M, e);
92
+ }, [a]), d(() => {
93
+ y && x();
94
+ }, [y, x]);
95
+ const $ = Z(
96
+ () => le.map((e) => {
97
+ const t = e.key ? _[e.key] || 0 : c;
63
98
  return {
64
99
  key: e.key || "all",
65
- label: r > 0 ? `${e.label} (${r})` : e.label
100
+ label: t > 0 ? `${e.label} (${t})` : e.label
66
101
  };
67
102
  }),
68
- [C, s]
69
- ), L = async (e) => {
103
+ [_, c]
104
+ ), j = async (e) => {
70
105
  if (!e.read)
71
106
  try {
72
- await M(e.id), y((l) => l.map((g) => g.id === e.id ? { ...g, read: !0 } : g)), f((l) => Math.max(0, l - 1));
73
- } catch (l) {
74
- A.error(l instanceof Error ? l.message : "标记已读失败");
107
+ await P(e.id), h((o) => o.map((b) => b.id === e.id ? { ...b, read: !0 } : b)), g((o) => Math.max(0, o - 1));
108
+ } catch (o) {
109
+ q.error(o instanceof Error ? o.message : "标记已读失败");
75
110
  return;
76
111
  }
77
- const r = String(e.href || "").trim();
78
- if (r) {
79
- if (v) {
80
- v(r, e), i(!1);
112
+ const t = String(e.href || "").trim();
113
+ if (t) {
114
+ if (E) {
115
+ E(t, e), u(!1);
81
116
  return;
82
117
  }
83
- r.startsWith("http://") || r.startsWith("https://") ? window.open(r, "_blank", "noopener,noreferrer") : window.location.assign(r), i(!1);
118
+ t.startsWith("http://") || t.startsWith("https://") ? window.open(t, "_blank", "noopener,noreferrer") : window.location.assign(t), u(!1);
84
119
  }
85
120
  };
86
- return /* @__PURE__ */ b("div", { className: x(t.bellWrap, H), children: [
87
- /* @__PURE__ */ a(R, { count: s, size: "small", overflowCount: 99, offset: [-4, 4], children: /* @__PURE__ */ a(
88
- U,
121
+ return /* @__PURE__ */ p("div", { className: I(r.bellWrap, A), children: [
122
+ /* @__PURE__ */ n(G, { count: c, size: "small", overflowCount: 99, offset: [-4, 4], children: /* @__PURE__ */ n(
123
+ V,
89
124
  {
90
125
  type: "text",
91
- className: t.bellBtn,
92
- icon: /* @__PURE__ */ a(K, { size: 16, "aria-hidden": !0 }),
93
- "aria-label": s > 0 ? `站内信,${s} 条未读` : "站内信",
94
- onClick: () => i(!0)
126
+ className: r.bellBtn,
127
+ icon: /* @__PURE__ */ n(te, { size: 16, "aria-hidden": !0 }),
128
+ "aria-label": c > 0 ? `站内信,${c} 条未读` : "站内信",
129
+ onClick: () => u(!0)
95
130
  }
96
131
  ) }),
97
- /* @__PURE__ */ b(
98
- W,
132
+ /* @__PURE__ */ p(
133
+ Y,
99
134
  {
100
- title: I,
101
- open: p,
102
- onClose: () => i(!1),
135
+ title: U,
136
+ open: y,
137
+ onClose: () => u(!1),
103
138
  size: 420,
104
139
  destroyOnClose: !1,
105
- className: t.drawer,
140
+ className: r.drawer,
106
141
  styles: {
107
142
  header: { padding: "12px 16px" },
108
143
  body: { padding: "12px 16px" }
109
144
  },
110
145
  children: [
111
- /* @__PURE__ */ a(
112
- Y,
146
+ /* @__PURE__ */ n(
147
+ ne,
113
148
  {
114
- className: t.typeTabs,
149
+ className: r.typeTabs,
115
150
  size: "small",
116
- activeKey: h || "all",
117
- onChange: (e) => P(e === "all" ? "" : e),
118
- stateOption: j,
151
+ activeKey: w || "all",
152
+ onChange: (e) => F(e === "all" ? "" : e),
153
+ stateOption: $,
119
154
  isInner: !0
120
155
  }
121
156
  ),
122
- /* @__PURE__ */ a("div", { className: t.filterRow, children: /* @__PURE__ */ a(
123
- q,
157
+ /* @__PURE__ */ n("div", { className: r.filterRow, children: /* @__PURE__ */ n(
158
+ re,
124
159
  {
125
160
  size: "small",
126
- value: d,
127
- onChange: (e) => _(e),
161
+ value: m,
162
+ onChange: (e) => W(e),
128
163
  options: [
129
164
  { value: "all", label: "全部" },
130
165
  { value: "unread", label: "未读" },
@@ -132,26 +167,32 @@ const Q = [
132
167
  ]
133
168
  }
134
169
  ) }),
135
- u ? /* @__PURE__ */ a("p", { className: t.error, children: u }) : null,
136
- /* @__PURE__ */ a(G, { spinning: B, children: !B && !u && S.length === 0 ? /* @__PURE__ */ a(J, { description: "暂无站内信" }) : /* @__PURE__ */ a("ul", { className: t.list, children: S.map((e) => /* @__PURE__ */ a("li", { children: /* @__PURE__ */ a(
170
+ v ? /* @__PURE__ */ n("p", { className: r.error, children: v }) : null,
171
+ /* @__PURE__ */ n(ae, { spinning: S, children: !S && !v && C.length === 0 ? /* @__PURE__ */ n(se, { description: "暂无站内信" }) : /* @__PURE__ */ n("ul", { className: r.list, children: C.map((e) => /* @__PURE__ */ n("li", { children: /* @__PURE__ */ n(
137
172
  "button",
138
173
  {
139
174
  type: "button",
140
- className: x(t.item, !e.read && t.itemUnread),
141
- onClick: () => void L(e),
142
- children: /* @__PURE__ */ b($, { orientation: "vertical", size: 2, style: { width: "100%" }, children: [
143
- /* @__PURE__ */ a("span", { className: t.itemTitle, children: e.title || "(无标题)" }),
175
+ className: I(r.item, !e.read && r.itemUnread),
176
+ onClick: () => void j(e),
177
+ children: /* @__PURE__ */ p(K, { orientation: "vertical", size: 2, style: { width: "100%" }, children: [
178
+ /* @__PURE__ */ n("span", { className: r.itemTitle, children: e.title || "(无标题)" }),
144
179
  (() => {
145
- const r = D(e.bodyHtml);
146
- return r ? /* @__PURE__ */ a(
180
+ const t = ee(e.bodyHtml);
181
+ return t ? /* @__PURE__ */ n(
147
182
  "div",
148
183
  {
149
- className: t.itemBodyHtml,
150
- dangerouslySetInnerHTML: { __html: r }
184
+ className: r.itemBodyHtml,
185
+ dangerouslySetInnerHTML: { __html: t }
151
186
  }
152
- ) : e.summary ? /* @__PURE__ */ a("span", { className: t.itemSummary, children: e.summary }) : null;
187
+ ) : e.summary ? /* @__PURE__ */ n("span", { className: r.itemSummary, children: e.summary }) : null;
153
188
  })(),
154
- /* @__PURE__ */ a("span", { className: t.itemMeta, children: [e.messageType, e.createdAt].filter(Boolean).join(" · ") || "—" })
189
+ (() => {
190
+ const t = de(e.messageType);
191
+ return /* @__PURE__ */ p("span", { className: r.itemMeta, children: [
192
+ t ? /* @__PURE__ */ n(X, { className: r.typeTag, children: t }) : null,
193
+ e.createdAt || (t ? "" : "—")
194
+ ] });
195
+ })()
155
196
  ] })
156
197
  }
157
198
  ) }, e.id)) }) })
@@ -159,8 +200,8 @@ const Q = [
159
200
  }
160
201
  )
161
202
  ] });
162
- };
203
+ });
163
204
  export {
164
- ie as default
205
+ Ee as default
165
206
  };
166
207
  //# sourceMappingURL=InboxBell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InboxBell.js","sources":["../../../../../src/components/Tools/Inbox/InboxBell/InboxBell.tsx"],"sourcesContent":["import { Badge, Button, Drawer, Space, message } from 'antd';\nimport classNames from 'classnames';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { Empty } from '@/components/Empty';\nimport { Bell } from '@/components/Icons';\nimport { PageSpin } from '@/components/Layout';\nimport { SegmentedRadio } from '@/components/SegmentedRadio';\nimport { StateBar } from '@/components/StateBar';\nimport { sanitizeInboxHtml } from '../sanitizeInboxHtml';\nimport styles from './style.module.scss';\n\nexport type InboxBellMessageType = 'alert' | 'action' | 'remind' | string;\n\nexport type InboxBellItem = {\n id: string;\n title?: string;\n /** 纯文本摘要(列表兼容) */\n summary?: string;\n /** 已渲染 HTML 正文;空则主摘要位回落 summary */\n bodyHtml?: string | null;\n read?: boolean;\n messageType?: InboxBellMessageType;\n href?: string;\n createdAt?: string;\n level?: string;\n};\n\nexport type InboxBellListResult = {\n itemList: InboxBellItem[];\n total?: number;\n unreadTotal?: number;\n unreadByMessageType?: Partial<Record<string, number>>;\n};\n\nexport type InboxBellListParams = {\n unreadOnly?: boolean;\n readOnly?: boolean;\n messageType?: InboxBellMessageType;\n currentPage?: number;\n pageSize?: number;\n};\n\nexport type InboxBellProps = {\n /** 拉取站内信(业务注入;须带 JWT 身份,禁止无身份全表) */\n fetchInbox: (params: InboxBellListParams) => Promise<InboxBellListResult>;\n /** 标记已读 */\n markRead: (id: string) => Promise<void | InboxBellItem>;\n /** 点击条目:默认用 window.location / 业务 navigate */\n onNavigate?: (href: string, item: InboxBellItem) => void;\n /** 轮询未读角标(ms);≤0 关闭 */\n pollMs?: number;\n pageSize?: number;\n className?: string;\n /** Drawer 标题 */\n title?: string;\n};\n\nconst TYPE_TABS: Array<{ key: string; label: string }> = [\n { key: '', label: '全部' },\n { key: 'alert', label: '预警' },\n { key: 'action', label: '行动' },\n { key: 'remind', label: '提醒' },\n];\n\n/**\n * 通用站内信铃铛:列表 / 已读 / Tab / 角标。\n * 不含认领、行动等业务动作;由注入的 fetchInbox / markRead / onNavigate 对接消息服务。\n */\nconst InboxBell: React.FC<InboxBellProps> = ({\n fetchInbox,\n markRead,\n onNavigate,\n pollMs = 60_000,\n pageSize = 50,\n className,\n title = '站内信',\n}) => {\n const [open, setOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [items, setItems] = useState<InboxBellItem[]>([]);\n const [unreadTotal, setUnreadTotal] = useState(0);\n const [unreadByType, setUnreadByType] = useState<Partial<Record<string, number>>>({});\n const [messageType, setMessageType] = useState<string>('');\n const [readFilter, setReadFilter] = useState<'all' | 'unread' | 'read'>('all');\n\n const load = useCallback(async () => {\n setLoading(true);\n setError('');\n try {\n const res = await fetchInbox({\n currentPage: 1,\n pageSize,\n messageType: messageType || undefined,\n unreadOnly: readFilter === 'unread' || undefined,\n readOnly: readFilter === 'read' || undefined,\n });\n setItems(res?.itemList || []);\n setUnreadTotal(typeof res?.unreadTotal === 'number' ? res.unreadTotal : 0);\n setUnreadByType(res?.unreadByMessageType || {});\n } catch (e) {\n setItems([]);\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(false);\n }\n }, [fetchInbox, messageType, pageSize, readFilter]);\n\n const refreshBadge = useCallback(async () => {\n try {\n const res = await fetchInbox({ currentPage: 1, pageSize: 1 });\n setUnreadTotal(typeof res?.unreadTotal === 'number' ? res.unreadTotal : 0);\n setUnreadByType(res?.unreadByMessageType || {});\n } catch {\n /* 角标失败不打断 UI */\n }\n }, [fetchInbox]);\n\n useEffect(() => {\n void refreshBadge();\n }, [refreshBadge]);\n\n useEffect(() => {\n if (pollMs <= 0) return undefined;\n const t = window.setInterval(() => {\n void refreshBadge();\n }, pollMs);\n return () => window.clearInterval(t);\n }, [pollMs, refreshBadge]);\n\n useEffect(() => {\n if (open) void load();\n }, [open, load]);\n\n const typeTabOptions = useMemo(\n () =>\n TYPE_TABS.map((t) => {\n const n = t.key ? unreadByType[t.key] || 0 : unreadTotal;\n return {\n key: t.key || 'all',\n label: n > 0 ? `${t.label} (${n})` : t.label,\n };\n }),\n [unreadByType, unreadTotal],\n );\n\n const handleOpenItem = async (item: InboxBellItem) => {\n if (!item.read) {\n try {\n await markRead(item.id);\n setItems((prev) => prev.map((x) => (x.id === item.id ? { ...x, read: true } : x)));\n setUnreadTotal((n) => Math.max(0, n - 1));\n } catch (e) {\n message.error(e instanceof Error ? e.message : '标记已读失败');\n return;\n }\n }\n const href = String(item.href || '').trim();\n if (!href) return;\n if (onNavigate) {\n onNavigate(href, item);\n setOpen(false);\n return;\n }\n if (href.startsWith('http://') || href.startsWith('https://')) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n window.location.assign(href);\n }\n setOpen(false);\n };\n\n return (\n <div className={classNames(styles.bellWrap, className)}>\n <Badge count={unreadTotal} size=\"small\" overflowCount={99} offset={[-4, 4]}>\n <Button\n type=\"text\"\n className={styles.bellBtn}\n icon={<Bell size={16} aria-hidden />}\n aria-label={unreadTotal > 0 ? `站内信,${unreadTotal} 条未读` : '站内信'}\n onClick={() => setOpen(true)}\n />\n </Badge>\n <Drawer\n title={title}\n open={open}\n onClose={() => setOpen(false)}\n size={420}\n destroyOnClose={false}\n className={styles.drawer}\n styles={{\n header: { padding: '12px 16px' },\n body: { padding: '12px 16px' },\n }}\n >\n <StateBar\n className={styles.typeTabs}\n size=\"small\"\n activeKey={messageType || 'all'}\n onChange={(k) => setMessageType(k === 'all' ? '' : k)}\n stateOption={typeTabOptions}\n isInner\n />\n <div className={styles.filterRow}>\n <SegmentedRadio<'all' | 'unread' | 'read'>\n size=\"small\"\n value={readFilter}\n onChange={(v) => setReadFilter(v)}\n options={[\n { value: 'all', label: '全部' },\n { value: 'unread', label: '未读' },\n { value: 'read', label: '已读' },\n ]}\n />\n </div>\n {error ? <p className={styles.error}>{error}</p> : null}\n <PageSpin spinning={loading}>\n {!loading && !error && items.length === 0 ? (\n <Empty description=\"暂无站内信\" />\n ) : (\n <ul className={styles.list}>\n {items.map((item) => (\n <li key={item.id}>\n <button\n type=\"button\"\n className={classNames(styles.item, !item.read && styles.itemUnread)}\n onClick={() => void handleOpenItem(item)}\n >\n <Space orientation=\"vertical\" size={2} style={{ width: '100%' }}>\n <span className={styles.itemTitle}>{item.title || '(无标题)'}</span>\n {(() => {\n const safeHtml = sanitizeInboxHtml(item.bodyHtml);\n if (safeHtml) {\n return (\n <div\n className={styles.itemBodyHtml}\n dangerouslySetInnerHTML={{ __html: safeHtml }}\n />\n );\n }\n return item.summary ? (\n <span className={styles.itemSummary}>{item.summary}</span>\n ) : null;\n })()}\n <span className={styles.itemMeta}>\n {[item.messageType, item.createdAt].filter(Boolean).join(' · ') || '—'}\n </span>\n </Space>\n </button>\n </li>\n ))}\n </ul>\n )}\n </PageSpin>\n </Drawer>\n </div>\n );\n};\n\nexport default InboxBell;\n"],"names":["TYPE_TABS","InboxBell","fetchInbox","markRead","onNavigate","pollMs","pageSize","className","title","open","setOpen","useState","loading","setLoading","error","setError","items","setItems","unreadTotal","setUnreadTotal","unreadByType","setUnreadByType","messageType","setMessageType","readFilter","setReadFilter","load","useCallback","res","refreshBadge","useEffect","t","typeTabOptions","useMemo","n","handleOpenItem","item","prev","x","e","message","href","classNames","styles","jsx","Badge","Button","Bell","jsxs","Drawer","StateBar","k","SegmentedRadio","v","PageSpin","Empty","Space","safeHtml","sanitizeInboxHtml"],"mappings":"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"}
1
+ {"version":3,"file":"InboxBell.js","sources":["../../../../../src/components/Tools/Inbox/InboxBell/InboxBell.tsx"],"sourcesContent":["import { Badge, Button, Drawer, Space, Tag, message } from 'antd';\nimport classNames from 'classnames';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Empty } from '@/components/Empty';\nimport { Bell } from '@/components/Icons';\nimport { PageSpin } from '@/components/Layout';\nimport { SegmentedRadio } from '@/components/SegmentedRadio';\nimport { StateBar } from '@/components/StateBar';\nimport { sanitizeInboxHtml } from '../sanitizeInboxHtml';\nimport { INBOX_BADGE_REFRESH_EVENT } from '../requestInboxBadgeRefresh';\nimport styles from './style.module.scss';\n\nexport type InboxBellMessageType = 'alert' | 'action' | 'remind' | string;\n\nexport type InboxBellItem = {\n id: string;\n title?: string;\n /** 纯文本摘要(列表兼容) */\n summary?: string;\n /** 已渲染 HTML 正文;空则主摘要位回落 summary */\n bodyHtml?: string | null;\n read?: boolean;\n messageType?: InboxBellMessageType;\n href?: string;\n createdAt?: string;\n level?: string;\n};\n\nexport type InboxBellListResult = {\n itemList: InboxBellItem[];\n total?: number;\n unreadTotal?: number;\n unreadByMessageType?: Partial<Record<string, number>>;\n};\n\nexport type InboxBellListParams = {\n unreadOnly?: boolean;\n readOnly?: boolean;\n messageType?: InboxBellMessageType;\n currentPage?: number;\n pageSize?: number;\n};\n\nexport type InboxBellProps = {\n /** 拉取站内信(业务注入;须带 JWT 身份,禁止无身份全表) */\n fetchInbox: (params: InboxBellListParams) => Promise<InboxBellListResult>;\n /** 标记已读 */\n markRead: (id: string) => Promise<void | InboxBellItem>;\n /** 点击条目:默认用 window.location / 业务 navigate */\n onNavigate?: (href: string, item: InboxBellItem) => void;\n /**\n * 轮询未读角标(ms)。默认 `0`(关定时);`>0` 才 setInterval。\n * 角标另由:挂载首刷、`locationKey`、focus/visibility、`requestInboxBadgeRefresh` 触发。\n */\n pollMs?: number;\n /**\n * 路由/页面身份;变化时刷新角标(如 React Router `location.pathname`)。\n * 整页加载靠挂载首刷,不必另传。\n */\n locationKey?: string | number;\n pageSize?: number;\n className?: string;\n /** Drawer 标题 */\n title?: string;\n};\n\nexport type InboxBellHandle = {\n refreshBadge: () => Promise<void>;\n};\n\nconst TYPE_TABS: Array<{ key: string; label: string }> = [\n { key: '', label: '全部' },\n { key: 'alert', label: '预警' },\n { key: 'action', label: '行动' },\n { key: 'remind', label: '提醒' },\n];\n\nconst TYPE_TAG_LABEL: Record<string, string> = {\n alert: '预警',\n action: '行动',\n remind: '提醒',\n};\n\nconst FOCUS_DEBOUNCE_MS = 300;\n\nfunction messageTypeLabel(raw?: string): string {\n const key = String(raw || '')\n .trim()\n .toLowerCase();\n if (!key) return '';\n return TYPE_TAG_LABEL[key] || key;\n}\n\n/**\n * 通用站内信铃铛:列表 / 已读 / Tab / 角标。\n * 不含认领、行动等业务动作;由注入的 fetchInbox / markRead / onNavigate 对接消息服务。\n * 默认不定时轮询;有消息侧靠业务回调 / 路由 / 焦点再拉角标(真·SSE push 他窗)。\n */\nconst InboxBell = forwardRef<InboxBellHandle, InboxBellProps>(function InboxBell(\n {\n fetchInbox,\n markRead,\n onNavigate,\n pollMs = 0,\n locationKey,\n pageSize = 50,\n className,\n title = '站内信',\n },\n ref,\n) {\n const [open, setOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [items, setItems] = useState<InboxBellItem[]>([]);\n const [unreadTotal, setUnreadTotal] = useState(0);\n const [unreadByType, setUnreadByType] = useState<Partial<Record<string, number>>>({});\n const [messageType, setMessageType] = useState<string>('');\n const [readFilter, setReadFilter] = useState<'all' | 'unread' | 'read'>('all');\n const focusDebounceRef = useRef<number | null>(null);\n const locationKeyPrimedRef = useRef(false);\n\n const load = useCallback(async () => {\n setLoading(true);\n setError('');\n try {\n const res = await fetchInbox({\n currentPage: 1,\n pageSize,\n messageType: messageType || undefined,\n unreadOnly: readFilter === 'unread' || undefined,\n readOnly: readFilter === 'read' || undefined,\n });\n setItems(res?.itemList || []);\n setUnreadTotal(typeof res?.unreadTotal === 'number' ? res.unreadTotal : 0);\n setUnreadByType(res?.unreadByMessageType || {});\n } catch (e) {\n setItems([]);\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(false);\n }\n }, [fetchInbox, messageType, pageSize, readFilter]);\n\n const refreshBadge = useCallback(async () => {\n try {\n const res = await fetchInbox({ currentPage: 1, pageSize: 1 });\n setUnreadTotal(typeof res?.unreadTotal === 'number' ? res.unreadTotal : 0);\n setUnreadByType(res?.unreadByMessageType || {});\n } catch {\n /* 角标失败不打断 UI */\n }\n }, [fetchInbox]);\n\n useImperativeHandle(ref, () => ({ refreshBadge }), [refreshBadge]);\n\n useEffect(() => {\n void refreshBadge();\n }, [refreshBadge]);\n\n useEffect(() => {\n if (locationKey === undefined) return;\n // 挂载首刷已由 refreshBadge effect 覆盖;仅后续路由变化再拉\n if (!locationKeyPrimedRef.current) {\n locationKeyPrimedRef.current = true;\n return;\n }\n void refreshBadge();\n }, [locationKey, refreshBadge]);\n\n useEffect(() => {\n if (pollMs <= 0) return undefined;\n const t = window.setInterval(() => {\n void refreshBadge();\n }, pollMs);\n return () => window.clearInterval(t);\n }, [pollMs, refreshBadge]);\n\n useEffect(() => {\n const schedule = () => {\n if (focusDebounceRef.current != null) {\n window.clearTimeout(focusDebounceRef.current);\n }\n focusDebounceRef.current = window.setTimeout(() => {\n focusDebounceRef.current = null;\n void refreshBadge();\n }, FOCUS_DEBOUNCE_MS);\n };\n\n const onVisibility = () => {\n if (document.visibilityState === 'visible') schedule();\n };\n\n window.addEventListener('focus', schedule);\n document.addEventListener('visibilitychange', onVisibility);\n return () => {\n window.removeEventListener('focus', schedule);\n document.removeEventListener('visibilitychange', onVisibility);\n if (focusDebounceRef.current != null) {\n window.clearTimeout(focusDebounceRef.current);\n focusDebounceRef.current = null;\n }\n };\n }, [refreshBadge]);\n\n useEffect(() => {\n const onExternal = () => {\n void refreshBadge();\n };\n window.addEventListener(INBOX_BADGE_REFRESH_EVENT, onExternal);\n return () => window.removeEventListener(INBOX_BADGE_REFRESH_EVENT, onExternal);\n }, [refreshBadge]);\n\n useEffect(() => {\n if (open) void load();\n }, [open, load]);\n\n const typeTabOptions = useMemo(\n () =>\n TYPE_TABS.map((t) => {\n const n = t.key ? unreadByType[t.key] || 0 : unreadTotal;\n return {\n key: t.key || 'all',\n label: n > 0 ? `${t.label} (${n})` : t.label,\n };\n }),\n [unreadByType, unreadTotal],\n );\n\n const handleOpenItem = async (item: InboxBellItem) => {\n if (!item.read) {\n try {\n await markRead(item.id);\n setItems((prev) => prev.map((x) => (x.id === item.id ? { ...x, read: true } : x)));\n setUnreadTotal((n) => Math.max(0, n - 1));\n } catch (e) {\n message.error(e instanceof Error ? e.message : '标记已读失败');\n return;\n }\n }\n const href = String(item.href || '').trim();\n if (!href) return;\n if (onNavigate) {\n onNavigate(href, item);\n setOpen(false);\n return;\n }\n if (href.startsWith('http://') || href.startsWith('https://')) {\n window.open(href, '_blank', 'noopener,noreferrer');\n } else {\n window.location.assign(href);\n }\n setOpen(false);\n };\n\n return (\n <div className={classNames(styles.bellWrap, className)}>\n <Badge count={unreadTotal} size=\"small\" overflowCount={99} offset={[-4, 4]}>\n <Button\n type=\"text\"\n className={styles.bellBtn}\n icon={<Bell size={16} aria-hidden />}\n aria-label={unreadTotal > 0 ? `站内信,${unreadTotal} 条未读` : '站内信'}\n onClick={() => setOpen(true)}\n />\n </Badge>\n <Drawer\n title={title}\n open={open}\n onClose={() => setOpen(false)}\n size={420}\n destroyOnClose={false}\n className={styles.drawer}\n styles={{\n header: { padding: '12px 16px' },\n body: { padding: '12px 16px' },\n }}\n >\n <StateBar\n className={styles.typeTabs}\n size=\"small\"\n activeKey={messageType || 'all'}\n onChange={(k) => setMessageType(k === 'all' ? '' : k)}\n stateOption={typeTabOptions}\n isInner\n />\n <div className={styles.filterRow}>\n <SegmentedRadio<'all' | 'unread' | 'read'>\n size=\"small\"\n value={readFilter}\n onChange={(v) => setReadFilter(v)}\n options={[\n { value: 'all', label: '全部' },\n { value: 'unread', label: '未读' },\n { value: 'read', label: '已读' },\n ]}\n />\n </div>\n {error ? <p className={styles.error}>{error}</p> : null}\n <PageSpin spinning={loading}>\n {!loading && !error && items.length === 0 ? (\n <Empty description=\"暂无站内信\" />\n ) : (\n <ul className={styles.list}>\n {items.map((item) => (\n <li key={item.id}>\n <button\n type=\"button\"\n className={classNames(styles.item, !item.read && styles.itemUnread)}\n onClick={() => void handleOpenItem(item)}\n >\n <Space orientation=\"vertical\" size={2} style={{ width: '100%' }}>\n <span className={styles.itemTitle}>{item.title || '(无标题)'}</span>\n {(() => {\n const safeHtml = sanitizeInboxHtml(item.bodyHtml);\n if (safeHtml) {\n return (\n <div\n className={styles.itemBodyHtml}\n dangerouslySetInnerHTML={{ __html: safeHtml }}\n />\n );\n }\n return item.summary ? (\n <span className={styles.itemSummary}>{item.summary}</span>\n ) : null;\n })()}\n {(() => {\n const typeLabel = messageTypeLabel(item.messageType);\n return (\n <span className={styles.itemMeta}>\n {typeLabel ? <Tag className={styles.typeTag}>{typeLabel}</Tag> : null}\n {item.createdAt || (typeLabel ? '' : '—')}\n </span>\n );\n })()}\n </Space>\n </button>\n </li>\n ))}\n </ul>\n )}\n </PageSpin>\n </Drawer>\n </div>\n );\n});\n\nexport default InboxBell;\n"],"names":["TYPE_TABS","TYPE_TAG_LABEL","FOCUS_DEBOUNCE_MS","messageTypeLabel","raw","key","InboxBell","forwardRef","fetchInbox","markRead","onNavigate","pollMs","locationKey","pageSize","className","title","ref","open","setOpen","useState","loading","setLoading","error","setError","items","setItems","unreadTotal","setUnreadTotal","unreadByType","setUnreadByType","messageType","setMessageType","readFilter","setReadFilter","focusDebounceRef","useRef","locationKeyPrimedRef","load","useCallback","res","refreshBadge","useImperativeHandle","useEffect","t","schedule","onVisibility","onExternal","INBOX_BADGE_REFRESH_EVENT","typeTabOptions","useMemo","n","handleOpenItem","item","prev","x","e","message","href","classNames","styles","jsx","Badge","Button","Bell","jsxs","Drawer","StateBar","k","SegmentedRadio","v","PageSpin","Empty","Space","safeHtml","sanitizeInboxHtml","typeLabel","Tag"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
1
  export { default as InboxBell } from './InboxBell';
2
- export type { InboxBellItem, InboxBellListResult, InboxBellListParams, InboxBellProps, InboxBellMessageType, } from './InboxBell';
2
+ export type { InboxBellItem, InboxBellListResult, InboxBellListParams, InboxBellProps, InboxBellMessageType, InboxBellHandle, } from './InboxBell';
@@ -1,32 +1,34 @@
1
- const t = "_bellWrap_1t9v6_1", e = "_drawer_1t9v6_9", _ = "_bellBtn_1t9v6_16", r = "_typeTabs_1t9v6_35", i = "_filterRow_1t9v6_42", m = "_error_1t9v6_50", l = "_list_1t9v6_56", o = "_item_1t9v6_65", s = "_itemUnread_1t9v6_79", a = "_itemTitle_1t9v6_84", n = "_itemSummary_1t9v6_92", c = "_itemBodyHtml_1t9v6_100", v = "_itemMeta_1t9v6_120", d = {
1
+ const t = "_bellWrap_12frd_1", e = "_drawer_12frd_9", r = "_bellBtn_12frd_16", _ = "_typeTabs_12frd_35", i = "_filterRow_12frd_42", m = "_error_12frd_50", l = "_list_12frd_56", o = "_item_12frd_65", d = "_itemUnread_12frd_79", s = "_itemTitle_12frd_84", a = "_itemSummary_12frd_92", n = "_itemBodyHtml_12frd_100", f = "_itemMeta_12frd_120", c = "_typeTag_12frd_131", y = {
2
2
  bellWrap: t,
3
3
  drawer: e,
4
- bellBtn: _,
5
- typeTabs: r,
4
+ bellBtn: r,
5
+ typeTabs: _,
6
6
  filterRow: i,
7
7
  error: m,
8
8
  list: l,
9
9
  item: o,
10
- itemUnread: s,
11
- itemTitle: a,
12
- itemSummary: n,
13
- itemBodyHtml: c,
14
- itemMeta: v
10
+ itemUnread: d,
11
+ itemTitle: s,
12
+ itemSummary: a,
13
+ itemBodyHtml: n,
14
+ itemMeta: f,
15
+ typeTag: c
15
16
  };
16
17
  export {
17
- _ as bellBtn,
18
+ r as bellBtn,
18
19
  t as bellWrap,
19
- d as default,
20
+ y as default,
20
21
  e as drawer,
21
22
  m as error,
22
23
  i as filterRow,
23
24
  o as item,
24
- c as itemBodyHtml,
25
- v as itemMeta,
26
- n as itemSummary,
27
- a as itemTitle,
28
- s as itemUnread,
25
+ n as itemBodyHtml,
26
+ f as itemMeta,
27
+ a as itemSummary,
28
+ s as itemTitle,
29
+ d as itemUnread,
29
30
  l as list,
30
- r as typeTabs
31
+ _ as typeTabs,
32
+ c as typeTag
31
33
  };
32
34
  //# 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":";;;;;;;;;;;;;;;;"}
@@ -1,3 +1,4 @@
1
1
  export { InboxBell } from './InboxBell';
2
- export type { InboxBellItem, InboxBellListResult, InboxBellListParams, InboxBellProps, InboxBellMessageType, } from './InboxBell';
2
+ export type { InboxBellItem, InboxBellListResult, InboxBellListParams, InboxBellProps, InboxBellMessageType, InboxBellHandle, } from './InboxBell';
3
3
  export { sanitizeInboxHtml } from './sanitizeInboxHtml';
4
+ export { INBOX_BADGE_REFRESH_EVENT, requestInboxBadgeRefresh, requestInboxBadgeRefreshAfterWrite, } from './requestInboxBadgeRefresh';
@@ -0,0 +1,9 @@
1
+ /** 站内信角标:外部(业务写成功 / AppShell)触发刷新的事件名 */
2
+ export declare const INBOX_BADGE_REFRESH_EVENT = "marsun-msg-center:refresh-badge";
3
+ /**
4
+ * 请求刷新 InboxBell 未读角标(window CustomEvent)。
5
+ * 铃铛未挂载时无副作用;挂载实例会监听并 refreshBadge。
6
+ */
7
+ export declare function requestInboxBadgeRefresh(): void;
8
+ /** 业务写成功后:立即 + 单次延迟补刷(盖 async outbox;非轮询) */
9
+ export declare function requestInboxBadgeRefreshAfterWrite(delayMs?: number): void;
@@ -0,0 +1,15 @@
1
+ const t = "marsun-msg-center:refresh-badge";
2
+ function e() {
3
+ typeof window > "u" || window.dispatchEvent(new CustomEvent(t));
4
+ }
5
+ function r(n = 1200) {
6
+ e(), !(typeof window > "u") && window.setTimeout(() => {
7
+ e();
8
+ }, n);
9
+ }
10
+ export {
11
+ t as INBOX_BADGE_REFRESH_EVENT,
12
+ e as requestInboxBadgeRefresh,
13
+ r as requestInboxBadgeRefreshAfterWrite
14
+ };
15
+ //# sourceMappingURL=requestInboxBadgeRefresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestInboxBadgeRefresh.js","sources":["../../../../src/components/Tools/Inbox/requestInboxBadgeRefresh.ts"],"sourcesContent":["/** 站内信角标:外部(业务写成功 / AppShell)触发刷新的事件名 */\nexport const INBOX_BADGE_REFRESH_EVENT = 'marsun-msg-center:refresh-badge';\n\n/**\n * 请求刷新 InboxBell 未读角标(window CustomEvent)。\n * 铃铛未挂载时无副作用;挂载实例会监听并 refreshBadge。\n */\nexport function requestInboxBadgeRefresh(): void {\n if (typeof window === 'undefined') return;\n window.dispatchEvent(new CustomEvent(INBOX_BADGE_REFRESH_EVENT));\n}\n\n/** 业务写成功后:立即 + 单次延迟补刷(盖 async outbox;非轮询) */\nexport function requestInboxBadgeRefreshAfterWrite(delayMs = 1200): void {\n requestInboxBadgeRefresh();\n if (typeof window === 'undefined') return;\n window.setTimeout(() => {\n requestInboxBadgeRefresh();\n }, delayMs);\n}\n"],"names":["INBOX_BADGE_REFRESH_EVENT","requestInboxBadgeRefresh","requestInboxBadgeRefreshAfterWrite","delayMs"],"mappings":"AACO,MAAMA,IAA4B;AAMlC,SAASC,IAAiC;AAC/C,EAAI,OAAO,SAAW,OACtB,OAAO,cAAc,IAAI,YAAYD,CAAyB,CAAC;AACjE;AAGO,SAASE,EAAmCC,IAAU,MAAY;AAEvE,EADAF,EAAA,GACI,SAAO,SAAW,QACtB,OAAO,WAAW,MAAM;AACtB,IAAAA,EAAA;AAAA,EACF,GAAGE,CAAO;AACZ;"}
@@ -1,5 +1,6 @@
1
1
  export { InboxBell } from './Inbox';
2
- export type { InboxBellItem, InboxBellListResult, InboxBellListParams, InboxBellProps, InboxBellMessageType, } from './Inbox';
2
+ export type { InboxBellItem, InboxBellListResult, InboxBellListParams, InboxBellProps, InboxBellMessageType, InboxBellHandle, } from './Inbox';
3
+ export { INBOX_BADGE_REFRESH_EVENT, requestInboxBadgeRefresh, requestInboxBadgeRefreshAfterWrite, } from './Inbox';
3
4
  export { ActionTrackingShell } from './ActionTracking';
4
5
  export type { ActionTrackingShellProps } from './ActionTracking';
5
6
  export { CreateActionModal, CreateActionForm, renderPersonOptionLabel, CREATE_ACTION_VARIETY_PAGE_SIZE, PersonRoleCascader, PersonRoleCascaderField, SetFormFields, findPersonCascadePath, cascadePathStillValid, validateCreateActionPersons, createActionPersonWarnMessage, personDisplayName, addDaysYmd, ActionFilterBar, ActionListTable, ActionFollowModal, CancelExecutionModal, CancelExecutionForm, sanitizeActionHtml, defaultCreatedRange, normalizeActionFilters, canQueryActionList, resetActionFiltersToDefault, } from './ActionTracking';
package/dist/index.d.ts CHANGED
@@ -39,6 +39,7 @@ export * from './components/InteractiveBlock';
39
39
  export * from './components/Layout';
40
40
  export * from './components/Modal';
41
41
  export { default as InfoPage, Content as InfoPageContent, InfoList, Descriptions as InfoPageDescriptions, DetailList, CentralContent, FieldView, TableView, formatView, defaultFormat, computeColumnsValue, computeDisplay, computeColumnsDisplay, SplitLine, Flow, Report, Score, } from './components/InfoPage';
42
+ export type { ContentItem, ContentLayout, ContentProps, InfoPagePartProps, } from './components/InfoPage';
42
43
  export { FlexBox, FlexBoxFetch, useFlexBox, defaultColumns as flexBoxDefaultColumns, FlexBoxView, FlexBoxViewItem, getItemKey as flexBoxGetItemKey, } from './components/FlexBox';
43
44
  export { ReactModal, ReactDrawer, useModal, useDrawer, useConfirmModal, DrawerContextHolder, ScrollRegion, TabsLayout, ColumnsLayout, createModalRender, createDrawerRender, modalClassNames, } from './components/ReactModal';
44
45
  export * from './components/Permissions';