Lien d'invitation invalide
+Ce lien ne contient pas de jeton de migration.
+Chargement…
+ + } + > +Ce lien ne contient pas de jeton de migration.
++ Connectez-vous avec le même compte que l'adresse invitée ( + {inviteQuery.data?.invite.email ?? "…"}) pour provisionner votre boîte Ultimail. +
+Redirection vers le suivi de migration…
++ Projet {project?.name ?? ""} — {invite?.email} +
+ ++ Connectez-vous avec le compte correspondant à l'invitation ({invite?.email}). Les + alias SSO reconnus (UPN, adresse alternative) sont acceptés si configurés par + l'administrateur. +
+ +{claimErrorMessage(claimMutation.error)}
+ )} + + +Chargement…
+ + } + > +Connectez-vous pour suivre votre migration.
+ ++ {project?.name ?? "Votre migration"} — statut {project?.status ?? "…"} + {project?.delta_mode ? " (sync delta post-bascule MX)" : ""} +
+ ++ Autorisation enregistrée. L'import démarre en arrière-plan. +
+ )} + {oauth === "error" && ( ++ Échec de l'autorisation OAuth. Réessayez ci-dessous. +
+ )} + ++ {onboarding?.waiting_for_admin + ? "Les jobs seront créés après activation du projet par votre administrateur." + : "Aucun job de migration actif pour le moment."} +
+ ) : ( + jobs.map((job) => ( ++ {Math.round(job.stats_json.imported)} éléments importés + {typeof job.stats_json.estimated_total === "number" + ? ` / ~${Math.round(job.stats_json.estimated_total)}` + : ""} +
+ )} + {job.error &&{job.error}
} ++ {domain.name} + {domain.is_platform_domain ? " (plateforme)" : ""} +
+Statut : {domain.status}
+ {domain.verification_token && ( +
+ TXT : _ultisuite-verify.{domain.name} = {domain.verification_token}
+
+ {consentBanner} +
+ )} + ++ Requis pour les migrations Microsoft 365 + {activeProject.auth_mode === "microsoft_app" + ? " en mode app-only (permissions application : Mail.Read, Calendars.Read, Contacts.Read, Files.Read.All)." + : " en mode organisation (permissions applicatives)."} +
+ {activeProject.microsoft_admin_consent_at ? ( ++ Consentement accordé + {activeProject.microsoft_tenant_id + ? ` — tenant ${activeProject.microsoft_tenant_id}` + : ""} + {activeProject.microsoft_admin_consent_at + ? ` (${new Date(activeProject.microsoft_admin_consent_at).toLocaleString()})` + : ""} +
+ ) : activeProject.microsoft_admin_consent_error ? ( +{activeProject.microsoft_admin_consent_error}
+ ) : ( +Consentement non enregistré pour ce projet.
+ )} ++ {cutoverError} +
+ )} + {dnsReport && ( + <> + {dnsSource === "persisted" && activeProject?.cutover_at && ( ++ Rapport enregistré au cutover ( + {new Date(activeProject.cutover_at).toLocaleString()}). +
+ )} + {dnsSource === "live" && ( ++ Vérification DNS live (non enregistrée — lancez la bascule MX pour persister). +
+ )} ++ Aucun rapport DNS enregistré — vérifiez live ou lancez la bascule MX. +
+ )} +
+ DNS : TXT _ultisuite-verify.domaine, MX vers Stalwart, SPF/DKIM/DMARC via
+ Stalwart webadmin.
+
+ Domaine : {report.domain} +
+ )} +
+ Attendu TXT : {report.txt_expected}
+
+ MX attendus : {report.expected_mx.join(", ")} +
+ )} + {report.mx_records && report.mx_records.length > 0 && ( +MX live : {report.mx_records.join(", ")}
+ )} + {report.warnings?.map((w) => ( ++ {w} +
+ ))} + {report.errors?.map((e) => ( ++ {e} +
+ ))} +{project.name}
+Chargement des jobs…
+ } + if (jobs.length === 0) { + return ( ++ Aucun job — invitez des utilisateurs et demandez-leur de claim + OAuth. +
+ ) + } + + return ( +| Utilisateur | +Service | +Statut | +Importés | +Actions | +
|---|---|---|---|---|
| {job.user_email || job.user_id.slice(0, 8)} | +{SERVICE_LABELS[job.service] ?? job.service} | +
+ |
+ {jobImportedCount(job)} | +
+
+
+ {job.status === "failed" && (
+
+ )}
+ {job.status !== "running" && (
+
+ )}
+
+ {job.error && (
+ + {job.error} + + )} + |
+
+ {SERVICE_LABELS[job?.service ?? ""] ?? job?.service} · statut job {job?.status ?? "—"} +
++ Aucun élément enregistré — le job n'a pas encore traité d'items ou la migration + date d'avant l'audit. +
+ )} + + {failedItems.length > 0 && ( +Tous les éléments suivis ont été importés avec succès.
+ )} +{title}
+{item.source_id}
+ {item.rel_path && (
+ {item.rel_path}
+ )}
+ + {item.reason} +
+ )} ++ {waitingForAdminMessage(onboarding.waiting_reason)} +
+ )} + {usesAppOnlyAuth(project) && !onboarding.waiting_for_admin && ( ++ {project?.auth_mode === "microsoft_app" ? ( + <> + Import Microsoft 365 configuré par votre administrateur (authentification app-only). + Aucune autorisation OAuth personnelle requise — l'import démarre automatiquement + une fois le projet actif et le consentement admin accordé. + > + ) : ( + <> + Import Google configuré par votre administrateur (compte de service). Aucune autorisation + OAuth personnelle requise — l'import démarre automatiquement une fois le projet + actif. + > + )} +
+ )} + {onboarding.needs_microsoft_admin_consent && project?.source_provider === "microsoft" && ( ++ L'administrateur de votre organisation Microsoft 365 doit accorder le consentement + admin à l'application Ultimail + {project?.auth_mode === "microsoft_app" + ? " (permissions application : Mail, Calendrier, Contacts, OneDrive)." + : "."}{" "} + {project?.auth_mode !== "microsoft_app" && + "Vous pouvez autoriser votre compte personnel ci-dessous, mais l'import organisationnel peut échouer tant que ce consentement n'est pas fait."} +
+ )} + {onboarding.needs_user_oauth && + !onboarding.has_migration_credentials && + !onboarding.waiting_for_admin && + !usesAppOnlyAuth(project) && ( ++ Étape suivante : autorisez l'accès à votre compte{" "} + {project?.source_provider === "microsoft" ? "Microsoft 365" : "Google Workspace"} pour + lancer l'import de vos données. +
+ )} + {onboarding.has_migration_credentials && !onboarding.waiting_for_admin && ( ++ Autorisation enregistrée — l'import progresse en arrière-plan. +
+ )} +