@nocobase/portal-template-default 1.0.16 → 1.0.18
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/.env.example +0 -4
- package/AGENTS.md +10 -0
- package/README.MD +4 -0
- package/dist/assets/{LineDraw-vPRTWiQ5.js → LineDraw-B3HsIvjF.js} +1 -1
- package/dist/assets/{SymbolDraw-DOl_Tss3.js → SymbolDraw-C5oA6gYo.js} +1 -1
- package/dist/assets/{VisualMapping-j08W3KBm.js → VisualMapping-CjyVXYl-.js} +1 -1
- package/dist/assets/auth-method-demo-B4sxmO2B.js +1 -0
- package/dist/assets/auto-login-provider-DPtJmWC-.js +1 -0
- package/dist/assets/{auto-login-provider-Bukw7zEe.js → auto-login-provider-pxf3kSYY.js} +2 -2
- package/dist/assets/auto-redirect-provider-B51i6R_U.js +1 -0
- package/dist/assets/auto-redirect-provider-CDA_97es.js +1 -0
- package/dist/assets/auto-redirect-provider-CeJOAYfx.js +1 -0
- package/dist/assets/calendar-B41MfAkB.js +1 -0
- package/dist/assets/{cas-sign-in-button-BQn3Mttx.js → cas-sign-in-button-DmkMYnGb.js} +1 -1
- package/dist/assets/{components-BT5mL9gW.js → components-DLLYm5Qd.js} +3 -3
- package/dist/assets/{configuration-gate-BJoadoA6.js → configuration-gate-CdktspSj.js} +1 -1
- package/dist/assets/{createClipPathFromCoordSys-m8IbnJ1z.js → createClipPathFromCoordSys-BKzf1iWj.js} +1 -1
- package/dist/assets/createSeriesDataSimply-Dcpkokbc.js +1 -0
- package/dist/assets/{customGraphicKeyframeAnimation-CYLPurwK.js → customGraphicKeyframeAnimation-BYcy-PGj.js} +1 -1
- package/dist/assets/demo-BpC2e3zt.js +1 -0
- package/dist/assets/demo-CEA7jJM2.js +1 -0
- package/dist/assets/demo-CX_Zf30k.js +1 -0
- package/dist/assets/demo-CyvGiwq2.js +1 -0
- package/dist/assets/demo-DJgGXOii.js +1 -0
- package/dist/assets/demo-GTMcYVzl.js +1 -0
- package/dist/assets/demo-O2QwJ70o.js +1 -0
- package/dist/assets/{dingtalk-sign-in-button-DSluFaP9.js → dingtalk-sign-in-button-K_2ZYQNC.js} +1 -1
- package/dist/assets/{echarts-preview-mRXoEciY.js → echarts-preview-CTj0x24f.js} +1 -1
- package/dist/assets/{echarts-runtime-CvLr4Slh.js → echarts-runtime-BTfAtt-4.js} +3 -3
- package/dist/assets/{echarts-runtime-advanced-BC1tvfQ0.js → echarts-runtime-advanced-Xg4WXsLl.js} +1 -1
- package/dist/assets/{echarts-runtime-common-DhNaV5B8.js → echarts-runtime-common-Dfe5ONoi.js} +1 -1
- package/dist/assets/{echarts-runtime-components-BiioS8t1.js → echarts-runtime-components-BNoMvPY0.js} +1 -1
- package/dist/assets/{echarts-runtime-hierarchy-CAWqYvFh.js → echarts-runtime-hierarchy-bEvX8V8l.js} +1 -1
- package/dist/assets/{floating-RVbHvIiD.js → floating-CVEm6jgD.js} +2 -2
- package/dist/assets/index-0O4dSmNz.js +59 -0
- package/dist/assets/index-BBKV6O5d.css +1 -0
- package/dist/assets/{index-BysibBZu.js → index-Bliz6Sy2.js} +2 -2
- package/dist/assets/index-CMoFG_fD.js +1064 -0
- package/dist/assets/{index-Dw20Lzpp.js → index-N5q0Lo-n.js} +3 -3
- package/dist/assets/{index-C-tdHirk.js → index-dDkRfkPI.js} +1 -1
- package/dist/assets/index-s-Gc7krA.js +38 -0
- package/dist/assets/{labelHelper-DbITmOUW.js → labelHelper-CSRwI3Ku.js} +1 -1
- package/dist/assets/ldap-sign-in-form-BoVMVmwm.js +1 -0
- package/dist/assets/{oidc-sign-in-button-Cgpa8Qzj.js → oidc-sign-in-button-5pd4bZSW.js} +1 -1
- package/dist/assets/{page-context-AU6RU0Qi.js → page-context-o6ISleo3.js} +4 -4
- package/dist/assets/prompt-card-xoH-b2hL.js +1 -0
- package/dist/assets/prompt-output-7ZS2-d1_.js +1 -0
- package/dist/assets/saml-sign-in-button-CN2l8pSN.js +1 -0
- package/dist/assets/{sectorHelper-C6L782Ue.js → sectorHelper-D1jHcZDN.js} +1 -1
- package/dist/assets/shortcut-DUGrhOUX.js +47 -0
- package/dist/assets/{sms-sign-in-form-Bo2WLZuP.js → sms-sign-in-form-ajsTToFF.js} +1 -1
- package/dist/assets/{static.browser-CoPxsICt.js → static.browser-exfE5oYi.js} +1 -1
- package/dist/assets/switch-BVTKHDeA.js +1 -0
- package/dist/assets/{tool-cards-ipgJ_3Ec.js → tool-cards-CQklNnUU.js} +3 -3
- package/dist/assets/{use-authenticator-sign-in-BzFeh7qe.js → use-authenticator-sign-in-B8OPLh-w.js} +1 -1
- package/dist/assets/use-dingtalk-sign-in-DsX00uPU.js +1 -0
- package/dist/assets/{use-wecom-sign-in-PPIMLvGa.js → use-wecom-sign-in-Di3WFrU1.js} +1 -1
- package/dist/assets/{wecom-sign-in-button-rUq9RW8R.js → wecom-sign-in-button-BO8h0tS8.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/index.raw.html +2 -2
- package/package.json +9 -1
- package/src/App.tsx +5 -2
- package/src/app/extension.ts +2 -0
- package/src/app/extensions.tsx +18 -6
- package/src/app/route-access-guard.tsx +22 -0
- package/src/app/route-runtime.ts +200 -0
- package/src/app/routes.tsx +2 -2
- package/src/components/app-shell/header.tsx +56 -1
- package/src/components/app-shell/sidebar.tsx +14 -2
- package/src/components/data-table/data-table-filter.tsx +7 -4
- package/src/extensions/nocobase-acl/README.md +28 -14
- package/src/extensions/nocobase-acl/demo/index.tsx +87 -15
- package/src/extensions/nocobase-acl/demo/prompt-generator.tsx +1 -0
- package/src/extensions/nocobase-mail/README.md +74 -0
- package/src/extensions/nocobase-mail/components/index.ts +79 -0
- package/src/extensions/nocobase-mail/components/mail-api.ts +423 -0
- package/src/extensions/nocobase-mail/components/mail-attachment-list.tsx +67 -0
- package/src/extensions/nocobase-mail/components/mail-compose-attachments.tsx +166 -0
- package/src/extensions/nocobase-mail/components/mail-compose.tsx +1071 -0
- package/src/extensions/nocobase-mail/components/mail-detail.tsx +653 -0
- package/src/extensions/nocobase-mail/components/mail-draft-autosave.ts +26 -0
- package/src/extensions/nocobase-mail/components/mail-empty.tsx +48 -0
- package/src/extensions/nocobase-mail/components/mail-filters.tsx +277 -0
- package/src/extensions/nocobase-mail/components/mail-inbox.tsx +544 -0
- package/src/extensions/nocobase-mail/components/mail-inline-images.ts +69 -0
- package/src/extensions/nocobase-mail/components/mail-label-badge.tsx +25 -0
- package/src/extensions/nocobase-mail/components/mail-label-manager.tsx +271 -0
- package/src/extensions/nocobase-mail/components/mail-labels-editor.tsx +267 -0
- package/src/extensions/nocobase-mail/components/mail-mass-tracking.tsx +271 -0
- package/src/extensions/nocobase-mail/components/mail-note-editor.tsx +99 -0
- package/src/extensions/nocobase-mail/components/mail-recipient-input.tsx +260 -0
- package/src/extensions/nocobase-mail/components/mail-reply-quote.ts +28 -0
- package/src/extensions/nocobase-mail/components/mail-rich-editor.tsx +287 -0
- package/src/extensions/nocobase-mail/components/mail-send-actions.tsx +238 -0
- package/src/extensions/nocobase-mail/components/mail-senders.ts +61 -0
- package/src/extensions/nocobase-mail/components/mail-settings-drawer.tsx +708 -0
- package/src/extensions/nocobase-mail/components/mail-showcase-layout.tsx +64 -0
- package/src/extensions/nocobase-mail/components/mail-signature-manager.tsx +258 -0
- package/src/extensions/nocobase-mail/components/mail-signatures.ts +25 -0
- package/src/extensions/nocobase-mail/components/mail-table.tsx +476 -0
- package/src/extensions/nocobase-mail/components/mail-template-manager.tsx +204 -0
- package/src/extensions/nocobase-mail/components/mail-toolbar.tsx +155 -0
- package/src/extensions/nocobase-mail/components/mail-unread.tsx +111 -0
- package/src/extensions/nocobase-mail/components/types.ts +297 -0
- package/src/extensions/nocobase-mail/components/use-mail-compose.tsx +262 -0
- package/src/extensions/nocobase-mail/components/use-mail-mass-messages.ts +54 -0
- package/src/extensions/nocobase-mail/components/use-mail-messages.ts +113 -0
- package/src/extensions/nocobase-mail/components/use-mail-signatures.ts +122 -0
- package/src/extensions/nocobase-mail/components/use-mail-templates.ts +54 -0
- package/src/extensions/nocobase-mail/extension.tsx +105 -0
- package/src/extensions/nocobase-mail/index.ts +1 -0
- package/src/extensions/nocobase-mail/mail-demo-pages.tsx +503 -0
- package/src/extensions/nocobase-mail/mail-pages.tsx +201 -0
- package/src/extensions/nocobase-mail/tests/mail-quote-html-regression.mjs +51 -0
- package/src/extensions/nocobase-mail/tests/mail-regression.mjs +649 -0
- package/src/extensions/nocobase-users-example/app-routes.tsx +125 -0
- package/src/extensions/nocobase-users-example/extension.tsx +2 -100
- package/src/extensions/nocobase-users-example/index.ts +1 -1
- package/src/lib/nocobase/acl/menu.ts +17 -3
- package/src/lib/nocobase/acl/types.ts +4 -0
- package/src/locales/en-US.ts +2 -1
- package/src/locales/zh-CN.ts +2 -1
- package/src/providers/runtime-config.ts +18 -0
- package/src/routes.tsx +10 -0
- package/src/vite-env.d.ts +3 -0
- package/vite.config.ts +8 -0
- package/dist/assets/auth-method-demo-B2qcpY8z.js +0 -1
- package/dist/assets/auto-login-provider-BMtzvdxG.js +0 -1
- package/dist/assets/auto-redirect-provider-C6GNPg5r.js +0 -1
- package/dist/assets/auto-redirect-provider-D5c6kN2R.js +0 -1
- package/dist/assets/auto-redirect-provider-iTzGEDpU.js +0 -1
- package/dist/assets/calendar-Dv2RNnsr.js +0 -1
- package/dist/assets/card-C9Hpeq1c.js +0 -1
- package/dist/assets/createSeriesDataSimply-DKUV5b5e.js +0 -1
- package/dist/assets/demo-BWGOwqtJ.js +0 -1
- package/dist/assets/demo-BWbcvkya.js +0 -1
- package/dist/assets/demo-DIASSPgn.js +0 -1
- package/dist/assets/demo-DuZ6asUU.js +0 -1
- package/dist/assets/demo-Dxcy4bDE.js +0 -1
- package/dist/assets/demo-YpEC76uw.js +0 -1
- package/dist/assets/demo-wzkoR8T2.js +0 -1
- package/dist/assets/index-CBZbj45X.js +0 -58
- package/dist/assets/index-CgkdZ6Oc.js +0 -686
- package/dist/assets/index-NH3aqqQz.css +0 -1
- package/dist/assets/index-hSBzW-VA.js +0 -43
- package/dist/assets/ldap-sign-in-form-BOMNDTkK.js +0 -1
- package/dist/assets/prompt-card-FWugRgi-.js +0 -1
- package/dist/assets/prompt-output-DMTuTNab.js +0 -1
- package/dist/assets/saml-sign-in-button-qt8bMeoQ.js +0 -1
- package/dist/assets/shortcut-Bu7jT_-w.js +0 -47
- package/dist/assets/switch-DQkkIE7G.js +0 -1
- package/dist/assets/use-dingtalk-sign-in-mrq6K5Yx.js +0 -1
- package/src/extensions/nocobase-users-example/layout.tsx +0 -16
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { useMemo, useState } from "react";
|
|
2
|
+
import { useNavigate, useSearchParams } from "react-router";
|
|
3
|
+
import { Settings } from "lucide-react";
|
|
4
|
+
import {
|
|
5
|
+
MailBoxType,
|
|
6
|
+
MailComposeForm,
|
|
7
|
+
MailFilters,
|
|
8
|
+
MailInbox,
|
|
9
|
+
MailMassTracking,
|
|
10
|
+
MailSettingsDrawer,
|
|
11
|
+
type ComposeInitialValues,
|
|
12
|
+
type MailColumnId,
|
|
13
|
+
type MailFilterValue,
|
|
14
|
+
} from "./components";
|
|
15
|
+
import {
|
|
16
|
+
MailShowcasePage,
|
|
17
|
+
MailShowcaseSection,
|
|
18
|
+
} from "./components/mail-showcase-layout";
|
|
19
|
+
import { Card, CardContent } from "@/components/ui/card";
|
|
20
|
+
import { Button } from "@/components/ui/button";
|
|
21
|
+
import { MailRecipientSelectionDemo } from "./mail-demo-pages";
|
|
22
|
+
|
|
23
|
+
const PERSONAL_COLUMNS: MailColumnId[] = [
|
|
24
|
+
"from",
|
|
25
|
+
"to",
|
|
26
|
+
"subject",
|
|
27
|
+
"boxType",
|
|
28
|
+
"date",
|
|
29
|
+
"isRead",
|
|
30
|
+
"labels",
|
|
31
|
+
];
|
|
32
|
+
export function MailManagerPage() {
|
|
33
|
+
const [searchParams, setSearchParams] = useSearchParams();
|
|
34
|
+
const [settingsOpen, setSettingsOpen] = useState(false);
|
|
35
|
+
const filterValue = useMemo<MailFilterValue>(() => {
|
|
36
|
+
const folder = searchParams.get("folder");
|
|
37
|
+
const label = Number(searchParams.get("label"));
|
|
38
|
+
const read = searchParams.get("read");
|
|
39
|
+
return {
|
|
40
|
+
boxType: Object.values(MailBoxType).includes(folder as MailBoxType)
|
|
41
|
+
? (folder as MailBoxType)
|
|
42
|
+
: undefined,
|
|
43
|
+
isRead: read === "read" ? true : read === "unread" ? false : undefined,
|
|
44
|
+
labelId: Number.isFinite(label) && label > 0 ? label : undefined,
|
|
45
|
+
isTodo:
|
|
46
|
+
searchParams.get("todo") === "1" || searchParams.get("starred") === "1"
|
|
47
|
+
? true
|
|
48
|
+
: undefined,
|
|
49
|
+
};
|
|
50
|
+
}, [searchParams]);
|
|
51
|
+
|
|
52
|
+
const updateParams = (next: MailFilterValue) => {
|
|
53
|
+
const params = new URLSearchParams();
|
|
54
|
+
if (next.boxType) params.set("folder", next.boxType);
|
|
55
|
+
if (next.isRead !== undefined) {
|
|
56
|
+
params.set("read", next.isRead ? "read" : "unread");
|
|
57
|
+
}
|
|
58
|
+
if (next.labelId) params.set("label", String(next.labelId));
|
|
59
|
+
if (next.isTodo) params.set("todo", "1");
|
|
60
|
+
setSearchParams(params, { replace: true });
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<MailShowcasePage
|
|
65
|
+
title="My mailbox"
|
|
66
|
+
description="Read, reply to, and manage messages from your connected mailboxes."
|
|
67
|
+
badge="Personal mail"
|
|
68
|
+
>
|
|
69
|
+
<MailShowcaseSection
|
|
70
|
+
eyebrow="Personal mailbox"
|
|
71
|
+
title="Browse and work through your messages"
|
|
72
|
+
description="Use tree filters to find messages, then read, reply, and manage them from the inbox."
|
|
73
|
+
>
|
|
74
|
+
<div className="grid min-h-0 gap-4 lg:grid-cols-[220px_minmax(0,1fr)]">
|
|
75
|
+
<aside className="self-start rounded-xl border bg-card p-4 shadow-[0_1px_2px_rgba(0,0,0,0.04)] lg:sticky lg:top-4">
|
|
76
|
+
<div className="mb-3">
|
|
77
|
+
<h3 className="text-sm font-semibold">Filters</h3>
|
|
78
|
+
</div>
|
|
79
|
+
<MailFilters
|
|
80
|
+
value={filterValue}
|
|
81
|
+
onChange={updateParams}
|
|
82
|
+
orientation="vertical"
|
|
83
|
+
/>
|
|
84
|
+
</aside>
|
|
85
|
+
<main className="min-w-0">
|
|
86
|
+
<MailInbox
|
|
87
|
+
scope="personal"
|
|
88
|
+
boxType={filterValue.boxType}
|
|
89
|
+
isRead={filterValue.isRead}
|
|
90
|
+
labelId={filterValue.labelId}
|
|
91
|
+
filter={filterValue.isTodo ? { isTodo: true } : undefined}
|
|
92
|
+
columns={PERSONAL_COLUMNS}
|
|
93
|
+
toolbarActions={
|
|
94
|
+
<Button
|
|
95
|
+
variant="outline"
|
|
96
|
+
size="sm"
|
|
97
|
+
onClick={() => setSettingsOpen(true)}
|
|
98
|
+
>
|
|
99
|
+
<Settings /> Settings
|
|
100
|
+
</Button>
|
|
101
|
+
}
|
|
102
|
+
/>
|
|
103
|
+
</main>
|
|
104
|
+
</div>
|
|
105
|
+
</MailShowcaseSection>
|
|
106
|
+
<MailSettingsDrawer open={settingsOpen} onOpenChange={setSettingsOpen} />
|
|
107
|
+
</MailShowcasePage>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function MailBulkPage() {
|
|
112
|
+
const [jobsRevision, setJobsRevision] = useState(0);
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<MailShowcasePage
|
|
116
|
+
title="Bulk mail"
|
|
117
|
+
description="Send one separate message per recipient and track every delivery job."
|
|
118
|
+
badge="Bulk delivery"
|
|
119
|
+
>
|
|
120
|
+
<MailShowcaseSection
|
|
121
|
+
eyebrow="Bulk composer"
|
|
122
|
+
title="Prepare one message for multiple recipients"
|
|
123
|
+
description="Add at least two recipients. Each recipient receives an individual message."
|
|
124
|
+
>
|
|
125
|
+
<Card className="gap-0 py-0">
|
|
126
|
+
<CardContent className="max-w-2xl p-6">
|
|
127
|
+
<MailComposeForm
|
|
128
|
+
bulkOnly
|
|
129
|
+
allowScheduleSend={false}
|
|
130
|
+
allowBulkSend
|
|
131
|
+
onSent={() => setJobsRevision((revision) => revision + 1)}
|
|
132
|
+
/>
|
|
133
|
+
</CardContent>
|
|
134
|
+
</Card>
|
|
135
|
+
</MailShowcaseSection>
|
|
136
|
+
|
|
137
|
+
<MailShowcaseSection
|
|
138
|
+
eyebrow="Delivery status"
|
|
139
|
+
title="Track bulk jobs"
|
|
140
|
+
description="Track delivery progress, cancel active jobs, and retry failed recipients."
|
|
141
|
+
>
|
|
142
|
+
<MailMassTracking key={jobsRevision} />
|
|
143
|
+
</MailShowcaseSection>
|
|
144
|
+
</MailShowcasePage>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function MailComposePage() {
|
|
149
|
+
const navigate = useNavigate();
|
|
150
|
+
const [searchParams] = useSearchParams();
|
|
151
|
+
const initial = useMemo<ComposeInitialValues>(
|
|
152
|
+
() => ({
|
|
153
|
+
to: searchParams.get("to") ?? undefined,
|
|
154
|
+
cc: searchParams.get("cc") ?? undefined,
|
|
155
|
+
subject: searchParams.get("subject") ?? undefined,
|
|
156
|
+
body: searchParams.get("body") ?? undefined,
|
|
157
|
+
}),
|
|
158
|
+
[searchParams]
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
return (
|
|
162
|
+
<MailShowcasePage
|
|
163
|
+
title="Compose and send"
|
|
164
|
+
description="Compose directly, send to selected user records, or reply from a live mail table."
|
|
165
|
+
badge="Sending patterns"
|
|
166
|
+
>
|
|
167
|
+
<MailShowcaseSection
|
|
168
|
+
eyebrow="Standalone composer"
|
|
169
|
+
title="Compose a message"
|
|
170
|
+
description="Send from a connected mailbox or prefill fields through URL parameters."
|
|
171
|
+
>
|
|
172
|
+
<Card className="gap-0 py-0">
|
|
173
|
+
<CardContent className="max-w-2xl p-6">
|
|
174
|
+
<MailComposeForm
|
|
175
|
+
initial={initial}
|
|
176
|
+
showCancel
|
|
177
|
+
onSent={() => navigate("..")}
|
|
178
|
+
onCancel={() => navigate("..")}
|
|
179
|
+
/>
|
|
180
|
+
</CardContent>
|
|
181
|
+
</Card>
|
|
182
|
+
</MailShowcaseSection>
|
|
183
|
+
|
|
184
|
+
<MailShowcaseSection
|
|
185
|
+
eyebrow="Record-driven sending"
|
|
186
|
+
title="Send to selected users"
|
|
187
|
+
description="Select one or more user records and open compose with their addresses in To."
|
|
188
|
+
>
|
|
189
|
+
<MailRecipientSelectionDemo />
|
|
190
|
+
</MailShowcaseSection>
|
|
191
|
+
|
|
192
|
+
<MailShowcaseSection
|
|
193
|
+
eyebrow="Reply workflow"
|
|
194
|
+
title="Reply from a mail table"
|
|
195
|
+
description="Open any message to try Reply, conditional Reply all, and Forward."
|
|
196
|
+
>
|
|
197
|
+
<MailInbox scope="personal" columns={PERSONAL_COLUMNS} />
|
|
198
|
+
</MailShowcaseSection>
|
|
199
|
+
</MailShowcasePage>
|
|
200
|
+
);
|
|
201
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { createServer } from "vite";
|
|
4
|
+
|
|
5
|
+
const server = await createServer({
|
|
6
|
+
appType: "custom",
|
|
7
|
+
logLevel: "silent",
|
|
8
|
+
server: { middlewareMode: true },
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
const { buildComposeInitial } = await server.ssrLoadModule(
|
|
13
|
+
"/registry/nocobase-mail/components/use-mail-compose.tsx"
|
|
14
|
+
);
|
|
15
|
+
const composeSource = await readFile(
|
|
16
|
+
new URL("../components/mail-compose.tsx", import.meta.url),
|
|
17
|
+
"utf8"
|
|
18
|
+
);
|
|
19
|
+
const originalHtml =
|
|
20
|
+
'<div><strong>Formatted sender</strong><p style="color:red">Original content</p></div>';
|
|
21
|
+
const reply = buildComposeInitial(
|
|
22
|
+
{
|
|
23
|
+
id: 1,
|
|
24
|
+
mailId: "message-1",
|
|
25
|
+
email: "team@example.com",
|
|
26
|
+
from: "customer@example.com",
|
|
27
|
+
to: "team@example.com",
|
|
28
|
+
subject: "Formatted message",
|
|
29
|
+
date: "2026-07-30T10:00:00.000Z",
|
|
30
|
+
bodyText: "Formatted sender Original content",
|
|
31
|
+
bodyHtml: originalHtml,
|
|
32
|
+
attachments: [],
|
|
33
|
+
},
|
|
34
|
+
"reply"
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
assert.equal(reply.replyBody, originalHtml);
|
|
38
|
+
assert.equal(
|
|
39
|
+
reply.reference?.html,
|
|
40
|
+
originalHtml,
|
|
41
|
+
"keeps the original HTML available to the quoted-message preview"
|
|
42
|
+
);
|
|
43
|
+
assert.match(
|
|
44
|
+
composeSource,
|
|
45
|
+
/srcDoc=\{contentHtml\}/,
|
|
46
|
+
"renders the quoted-message preview as isolated HTML instead of plain text"
|
|
47
|
+
);
|
|
48
|
+
console.log("mail quote HTML regression checks passed");
|
|
49
|
+
} finally {
|
|
50
|
+
await server.close();
|
|
51
|
+
}
|