fix(mail): bind POP3 imports to stable maildrop identity
Module Package Release / publish-packages (push) Successful in 14s

Release v0.1.28. Coordinated integrity review: GovOPlaN/govoplan-core#298.
This commit is contained in:
2026-09-08 12:19:39 +02:00
parent 480c18c67c
commit d926298214
15 changed files with 830 additions and 44 deletions
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "@govoplan/mail-webui",
"version": "0.1.27",
"version": "0.1.28",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@govoplan/mail-webui",
"version": "0.1.27",
"version": "0.1.28",
"devDependencies": {
"typescript": "^5.7.2"
},
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@govoplan/mail-webui",
"version": "0.1.27",
"version": "0.1.28",
"private": true,
"type": "module",
"main": "src/index.ts",
+1
View File
@@ -349,6 +349,7 @@ export type MailPop3MessagePreview = {
size_bytes: number;
body_preview?: string | null;
already_imported: boolean;
legacy_identity_conflict?: boolean;
};
export type MailPop3PreviewResponse = {
@@ -189,7 +189,7 @@ export default function MailLegacyImportPage({
});
setPreview(next);
setSelectedUidls((current) =>
current.filter((uidl) => next.messages.some((item) => item.uidl === uidl && !item.already_imported))
current.filter((uidl) => next.messages.some((item) => item.uidl === uidl && !item.already_imported && !item.legacy_identity_conflict))
);
} catch (reason) {
setError(adminErrorMessage(reason));
@@ -341,7 +341,7 @@ export default function MailLegacyImportPage({
data-help-context-id="mail.pop3.field.message-selection"
data-help-module-id="mail"
checked={selectedUidls.includes(item.uidl)}
disabled={Boolean(busy) || item.already_imported}
disabled={Boolean(busy) || item.already_imported || item.legacy_identity_conflict}
onChange={() => setSelectedUidls((current) =>
current.includes(item.uidl)
? current.filter((uidl) => uidl !== item.uidl)
@@ -362,8 +362,8 @@ export default function MailLegacyImportPage({
id: "state",
header: "State",
width: 130,
value: (item) => item.already_imported ? "imported" : "available",
render: (item) => <StatusBadge status={item.already_imported ? "inactive" : "success"} label={item.already_imported ? "imported" : "available"} />
value: (item) => item.legacy_identity_conflict ? "legacy identity conflict" : item.already_imported ? "imported" : "available",
render: (item) => <StatusBadge status={item.legacy_identity_conflict ? "warning" : item.already_imported ? "inactive" : "success"} label={item.legacy_identity_conflict ? "review legacy identity" : item.already_imported ? "imported" : "available"} />
}
];