@hkyhy/marsun-components-core 0.1.122 → 0.1.124
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/components/File/FileItem/index.js +65 -55
- package/dist/components/File/FileItem/index.js.map +1 -1
- package/dist/components/File/FilePreview/FilePreviewContent.js +114 -90
- package/dist/components/File/FilePreview/FilePreviewContent.js.map +1 -1
- package/dist/components/File/FilePreview/index.js +43 -33
- package/dist/components/File/FilePreview/index.js.map +1 -1
- package/dist/components/File/index.d.ts +1 -0
- package/dist/components/File/utils/authedFetch.d.ts +12 -0
- package/dist/components/File/utils/authedFetch.js +50 -0
- package/dist/components/File/utils/authedFetch.js.map +1 -0
- package/dist/components/Form/index.d.ts +1 -1
- package/dist/components/Form/kneFormInfo.d.ts +2 -0
- package/dist/components/Form/kneFormInfo.js +30 -27
- package/dist/components/Form/kneFormInfo.js.map +1 -1
- package/dist/components/FormInfo/fields.d.ts +2 -0
- package/dist/components/FormInfo/fields.js +22 -19
- package/dist/components/FormInfo/fields.js.map +1 -1
- package/dist/components/FormInfo/index.d.ts +1 -1
- package/dist/components/InfoPage/Content/index.d.ts +8 -1
- package/dist/components/InfoPage/Content/index.js +103 -57
- package/dist/components/InfoPage/Content/index.js.map +1 -1
- package/dist/components/InfoPage/Content/style.module.scss.js +10 -8
- package/dist/components/InfoPage/Content/style.module.scss.js.map +1 -1
- package/dist/components/InfoPage/index.d.ts +13 -1
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.d.ts +8 -1
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.js +148 -142
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.js.map +1 -1
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.module.scss.js +5 -4
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionForm.module.scss.js.map +1 -1
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.d.ts +10 -2
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.js +122 -116
- package/dist/components/Tools/ActionTracking/CreateAction/CreateActionModal.js.map +1 -1
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.js +20 -31
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.js.map +1 -1
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.module.scss.js +1 -2
- package/dist/components/Tools/ActionTracking/CreateAction/PersonRoleCascaderField.module.scss.js.map +1 -1
- package/dist/components/Tools/ActionTracking/CreateAction/index.d.ts +1 -1
- package/dist/components/Tools/ActionTracking/CreateAction/submitHelpers.d.ts +5 -0
- package/dist/components/Tools/ActionTracking/CreateAction/submitHelpers.js +37 -18
- package/dist/components/Tools/ActionTracking/CreateAction/submitHelpers.js.map +1 -1
- package/dist/components/Tools/ActionTracking/CreateAction/types.d.ts +9 -0
- package/dist/components/Tools/ActionTracking/index.d.ts +1 -1
- package/dist/components/Tools/Inbox/InboxBell/InboxBell.d.ts +14 -3
- package/dist/components/Tools/Inbox/InboxBell/InboxBell.js +136 -95
- package/dist/components/Tools/Inbox/InboxBell/InboxBell.js.map +1 -1
- package/dist/components/Tools/Inbox/InboxBell/index.d.ts +1 -1
- package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js +18 -16
- package/dist/components/Tools/Inbox/InboxBell/style.module.scss.js.map +1 -1
- package/dist/components/Tools/Inbox/index.d.ts +2 -1
- package/dist/components/Tools/Inbox/requestInboxBadgeRefresh.d.ts +9 -0
- package/dist/components/Tools/Inbox/requestInboxBadgeRefresh.js +15 -0
- package/dist/components/Tools/Inbox/requestInboxBadgeRefresh.js.map +1 -0
- package/dist/components/Tools/index.d.ts +3 -2
- package/dist/file.js +24 -19
- package/dist/file.js.map +1 -1
- package/dist/form-info.js +46 -45
- package/dist/index.d.ts +1 -0
- package/dist/index.js +534 -524
- package/dist/index.js.map +1 -1
- package/dist/marsun-components-core.css +1 -1
- package/dist/styles/global.css +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { default as React } from 'react';
|
|
2
1
|
export type InboxBellMessageType = 'alert' | 'action' | 'remind' | string;
|
|
3
2
|
export type InboxBellItem = {
|
|
4
3
|
id: string;
|
|
@@ -33,16 +32,28 @@ export type InboxBellProps = {
|
|
|
33
32
|
markRead: (id: string) => Promise<void | InboxBellItem>;
|
|
34
33
|
/** 点击条目:默认用 window.location / 业务 navigate */
|
|
35
34
|
onNavigate?: (href: string, item: InboxBellItem) => void;
|
|
36
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* 轮询未读角标(ms)。默认 `0`(关定时);`>0` 才 setInterval。
|
|
37
|
+
* 角标另由:挂载首刷、`locationKey`、focus/visibility、`requestInboxBadgeRefresh` 触发。
|
|
38
|
+
*/
|
|
37
39
|
pollMs?: number;
|
|
40
|
+
/**
|
|
41
|
+
* 路由/页面身份;变化时刷新角标(如 React Router `location.pathname`)。
|
|
42
|
+
* 整页加载靠挂载首刷,不必另传。
|
|
43
|
+
*/
|
|
44
|
+
locationKey?: string | number;
|
|
38
45
|
pageSize?: number;
|
|
39
46
|
className?: string;
|
|
40
47
|
/** Drawer 标题 */
|
|
41
48
|
title?: string;
|
|
42
49
|
};
|
|
50
|
+
export type InboxBellHandle = {
|
|
51
|
+
refreshBadge: () => Promise<void>;
|
|
52
|
+
};
|
|
43
53
|
/**
|
|
44
54
|
* 通用站内信铃铛:列表 / 已读 / Tab / 角标。
|
|
45
55
|
* 不含认领、行动等业务动作;由注入的 fetchInbox / markRead / onNavigate 对接消息服务。
|
|
56
|
+
* 默认不定时轮询;有消息侧靠业务回调 / 路由 / 焦点再拉角标(真·SSE push 他窗)。
|
|
46
57
|
*/
|
|
47
|
-
declare const InboxBell:
|
|
58
|
+
declare const InboxBell: import('react').ForwardRefExoticComponent<InboxBellProps & import('react').RefAttributes<InboxBellHandle>>;
|
|
48
59
|
export default InboxBell;
|
|
@@ -1,130 +1,165 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { Badge as
|
|
3
|
-
import
|
|
4
|
-
import { useState as
|
|
5
|
-
import { sanitizeInboxHtml as
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
40
|
+
const e = await s({
|
|
30
41
|
currentPage: 1,
|
|
31
|
-
pageSize:
|
|
32
|
-
messageType:
|
|
33
|
-
unreadOnly:
|
|
34
|
-
readOnly:
|
|
42
|
+
pageSize: N,
|
|
43
|
+
messageType: w || void 0,
|
|
44
|
+
unreadOnly: m === "unread" || void 0,
|
|
45
|
+
readOnly: m === "read" || void 0
|
|
35
46
|
});
|
|
36
|
-
|
|
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
|
-
|
|
49
|
+
h([]), k(e instanceof Error ? e.message : String(e));
|
|
39
50
|
} finally {
|
|
40
|
-
|
|
51
|
+
L(!1);
|
|
41
52
|
}
|
|
42
|
-
}, [
|
|
53
|
+
}, [s, w, N, m]), a = H(async () => {
|
|
43
54
|
try {
|
|
44
|
-
const e = await
|
|
45
|
-
|
|
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
|
-
}, [
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}, [
|
|
52
|
-
if (
|
|
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
|
-
|
|
55
|
-
},
|
|
73
|
+
a();
|
|
74
|
+
}, f);
|
|
56
75
|
return () => window.clearInterval(e);
|
|
57
|
-
}, [
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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:
|
|
100
|
+
label: t > 0 ? `${e.label} (${t})` : e.label
|
|
66
101
|
};
|
|
67
102
|
}),
|
|
68
|
-
[
|
|
69
|
-
),
|
|
103
|
+
[_, c]
|
|
104
|
+
), j = async (e) => {
|
|
70
105
|
if (!e.read)
|
|
71
106
|
try {
|
|
72
|
-
await
|
|
73
|
-
} catch (
|
|
74
|
-
|
|
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
|
|
78
|
-
if (
|
|
79
|
-
if (
|
|
80
|
-
|
|
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
|
-
|
|
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__ */
|
|
87
|
-
/* @__PURE__ */
|
|
88
|
-
|
|
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:
|
|
92
|
-
icon: /* @__PURE__ */
|
|
93
|
-
"aria-label":
|
|
94
|
-
onClick: () =>
|
|
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__ */
|
|
98
|
-
|
|
132
|
+
/* @__PURE__ */ p(
|
|
133
|
+
Y,
|
|
99
134
|
{
|
|
100
|
-
title:
|
|
101
|
-
open:
|
|
102
|
-
onClose: () =>
|
|
135
|
+
title: U,
|
|
136
|
+
open: y,
|
|
137
|
+
onClose: () => u(!1),
|
|
103
138
|
size: 420,
|
|
104
139
|
destroyOnClose: !1,
|
|
105
|
-
className:
|
|
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__ */
|
|
112
|
-
|
|
146
|
+
/* @__PURE__ */ n(
|
|
147
|
+
ne,
|
|
113
148
|
{
|
|
114
|
-
className:
|
|
149
|
+
className: r.typeTabs,
|
|
115
150
|
size: "small",
|
|
116
|
-
activeKey:
|
|
117
|
-
onChange: (e) =>
|
|
118
|
-
stateOption:
|
|
151
|
+
activeKey: w || "all",
|
|
152
|
+
onChange: (e) => F(e === "all" ? "" : e),
|
|
153
|
+
stateOption: $,
|
|
119
154
|
isInner: !0
|
|
120
155
|
}
|
|
121
156
|
),
|
|
122
|
-
/* @__PURE__ */
|
|
123
|
-
|
|
157
|
+
/* @__PURE__ */ n("div", { className: r.filterRow, children: /* @__PURE__ */ n(
|
|
158
|
+
re,
|
|
124
159
|
{
|
|
125
160
|
size: "small",
|
|
126
|
-
value:
|
|
127
|
-
onChange: (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
|
-
|
|
136
|
-
/* @__PURE__ */
|
|
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:
|
|
141
|
-
onClick: () => void
|
|
142
|
-
children: /* @__PURE__ */
|
|
143
|
-
/* @__PURE__ */
|
|
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
|
|
146
|
-
return
|
|
180
|
+
const t = ee(e.bodyHtml);
|
|
181
|
+
return t ? /* @__PURE__ */ n(
|
|
147
182
|
"div",
|
|
148
183
|
{
|
|
149
|
-
className:
|
|
150
|
-
dangerouslySetInnerHTML: { __html:
|
|
184
|
+
className: r.itemBodyHtml,
|
|
185
|
+
dangerouslySetInnerHTML: { __html: t }
|
|
151
186
|
}
|
|
152
|
-
) : e.summary ? /* @__PURE__ */
|
|
187
|
+
) : e.summary ? /* @__PURE__ */ n("span", { className: r.itemSummary, children: e.summary }) : null;
|
|
153
188
|
})(),
|
|
154
|
-
|
|
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
|
-
|
|
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 = "
|
|
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:
|
|
4
|
+
bellBtn: r,
|
|
5
|
+
typeTabs: _,
|
|
6
6
|
filterRow: i,
|
|
7
7
|
error: m,
|
|
8
8
|
list: l,
|
|
9
9
|
item: o,
|
|
10
|
-
itemUnread:
|
|
11
|
-
itemTitle:
|
|
12
|
-
itemSummary:
|
|
13
|
-
itemBodyHtml:
|
|
14
|
-
itemMeta:
|
|
10
|
+
itemUnread: d,
|
|
11
|
+
itemTitle: s,
|
|
12
|
+
itemSummary: a,
|
|
13
|
+
itemBodyHtml: n,
|
|
14
|
+
itemMeta: f,
|
|
15
|
+
typeTag: c
|
|
15
16
|
};
|
|
16
17
|
export {
|
|
17
|
-
|
|
18
|
+
r as bellBtn,
|
|
18
19
|
t as bellWrap,
|
|
19
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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,9 +1,10 @@
|
|
|
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';
|
|
6
|
-
export type { CreateActionModalProps, CreateActionFormProps, PersonRoleCascaderProps, PersonRoleCascaderFieldProps, CreateActionPrefill, CreateActionScopeLock, LockedContextField, ActionPersonCascadeOption, ActionPersonOption, CreateActionPersonCatalog, CreateActionSelectOption, CreateActionDimensionOption, CreateActionLoaders, CreateActionSelectPageQuery, CreateActionSelectPageResult, CreateActionSubmitPayload, CreateActionPersonValidateError, CreateActionPersonValidateResult, ActionFilterBarProps, ActionListTableProps, ActionFollowModalProps, ActionFollowView, CancelExecutionModalProps, ActionListFilters, ActionListRowBase, ActionListSelectOption, ActionListColumns, ActionListEmptyConfig, } from './ActionTracking';
|
|
7
|
+
export type { CreateActionModalProps, CreateActionFormProps, PersonRoleCascaderProps, PersonRoleCascaderFieldProps, CreateActionPrefill, CreateActionScopeLock, CreateActionScopeMode, LockedContextField, ActionPersonCascadeOption, ActionPersonOption, CreateActionPersonCatalog, CreateActionSelectOption, CreateActionDimensionOption, CreateActionLoaders, CreateActionSelectPageQuery, CreateActionSelectPageResult, CreateActionSubmitPayload, CreateActionPersonValidateError, CreateActionPersonValidateResult, ActionFilterBarProps, ActionListTableProps, ActionFollowModalProps, ActionFollowView, CancelExecutionModalProps, ActionListFilters, ActionListRowBase, ActionListSelectOption, ActionListColumns, ActionListEmptyConfig, } from './ActionTracking';
|
|
7
8
|
export { MessageTemplateAdmin } from './MessageCenter';
|
|
8
9
|
export type { MessageTemplateAdminProps, MessageTemplateAdminItem, MessageEventCatalogItem, MessageEventCatalogPayload, MessageAudienceRoleOption, MessageAudienceUserOption, MessageTemplateVariable, MessageTemplateVariableAdmin, PushRuleAdminItem, MessageCrudFlags, MessageAdminPermissions, } from './MessageCenter';
|
|
9
10
|
export { generateTemplateCode, normalizeTemplatePlaceholders, applyTemplateVars, resolveMessageAdminPermissions, MSG_CENTER_APP_SWITCH_STORAGE_KEY, SYSTEM_APP_TO_MSG_CENTER_APP_KEY, MSG_CENTER_SWITCHABLE_APP_KEYS, msgCenterAppKeyFromSystemAppCode, filterMsgCenterSwitchableApps, getMsgCenterAppKey, setMsgCenterAppKey, subscribeMsgCenterAppKey, bindMsgCenterAppKeyStorageSync, resolveMsgCenterSwitchState, useMsgCenterAppKey, MsgCenterAppSwitcher, } from './MessageCenter';
|
package/dist/file.js
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
|
-
import { default as
|
|
2
|
-
import { default as
|
|
1
|
+
import { default as r } from "./components/File/FileLink/index.js";
|
|
2
|
+
import { default as l } from "./components/File/FilePreview/index.js";
|
|
3
3
|
import { default as a } from "./components/File/FilePreviewLink/index.js";
|
|
4
|
-
import { default as
|
|
5
|
-
import { FileItem as
|
|
6
|
-
import { downloadFileItem as
|
|
7
|
-
import {
|
|
4
|
+
import { default as m } from "./components/File/FilePreviewModal/index.js";
|
|
5
|
+
import { FileItem as n } from "./components/File/FileItem/index.js";
|
|
6
|
+
import { downloadFileItem as s, getFileDownloadAuthHeaders as p, getFileDownloadUrl as u } from "./components/File/utils/download.js";
|
|
7
|
+
import { fetchAuthedArrayBuffer as x, fetchAuthedObjectUrl as w, fetchWithMarsunAuth as c, needsAuthFetch as A } from "./components/File/utils/authedFetch.js";
|
|
8
|
+
import { getFileExtension as I, getFileIcon as v, getFileTypeName as y, normalizeExtension as D, normalizeFileDisplayItem as P, parseFileNameFromUrl as U } from "./components/File/fileDisplay.js";
|
|
8
9
|
export {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
n as FileItemView,
|
|
11
|
+
r as FileLink,
|
|
12
|
+
l as FilePreview,
|
|
12
13
|
a as FilePreviewLink,
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
m as FilePreviewModal,
|
|
15
|
+
s as downloadFileItem,
|
|
16
|
+
x as fetchAuthedArrayBuffer,
|
|
17
|
+
w as fetchAuthedObjectUrl,
|
|
18
|
+
c as fetchWithMarsunAuth,
|
|
19
|
+
p as getFileDownloadAuthHeaders,
|
|
20
|
+
u as getFileDownloadUrl,
|
|
21
|
+
I as getFileExtension,
|
|
22
|
+
v as getFileIcon,
|
|
23
|
+
y as getFileTypeName,
|
|
24
|
+
A as needsAuthFetch,
|
|
25
|
+
D as normalizeExtension,
|
|
26
|
+
P as normalizeFileDisplayItem,
|
|
27
|
+
U as parseFileNameFromUrl
|
|
23
28
|
};
|
|
24
29
|
//# sourceMappingURL=file.js.map
|
package/dist/file.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|