diff --git a/components/admin/settings/sections/migration-projects-panel.tsx b/components/admin/settings/sections/migration-projects-panel.tsx index 4b93ba1..4cd7bf7 100644 --- a/components/admin/settings/sections/migration-projects-panel.tsx +++ b/components/admin/settings/sections/migration-projects-panel.tsx @@ -1,6 +1,7 @@ "use client" import { useEffect, useState } from "react" +import { Download } from "lucide-react" import { useSearchParams } from "next/navigation" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" @@ -17,6 +18,7 @@ import { OrgSettingsSection } from "@/components/admin/settings/org-settings-for import { type DNSCheckReport, type MailDomain, + type MigrationSharedDrive, type MigrationJob, type MigrationJobAuditItem, type MigrationProject, @@ -25,11 +27,18 @@ import { useCreateMigrationProject, useCutoverMigrationProject, useImportMigrationInvites, + useImportMigrationRoster, useMicrosoftMigrationAdminConsentURL, useMigrationJobAudit, useMigrationJobAuditSummary, useMigrationProjectJobs, useMigrationProjects, + useMigrationRoster, + useMigrationSharedDrives, + useApproveMigrationSharedDrive, + useRejectMigrationSharedDrive, + useUpdateMigrationSharedDriveMode, + downloadMigrationJobAudit, usePreflightCutoverDNS, useResetMigrationJobCursor, useRetryMigrationFailedJobs, @@ -55,6 +64,8 @@ function statusVariant(status: string): "default" | "secondary" | "destructive" case "completed": case "active": case "cutover": + case "claimed": + case "invited": return "default" case "running": case "pending": @@ -89,7 +100,10 @@ export function MigrationProjectsPanel({ domains }: { domains: MailDomain[] }) { const [authMode, setAuthMode] = useState("oauth") const [domainId, setDomainId] = useState("") const [inviteEmail, setInviteEmail] = useState("") + const [alternateEmails, setAlternateEmails] = useState("") const [csvEmails, setCsvEmails] = useState("") + const [rosterCsv, setRosterCsv] = useState("") + const [rosterImportSummary, setRosterImportSummary] = useState(null) const [selectedProjectId, setSelectedProjectId] = useState("") const [msTenant, setMsTenant] = useState("common") const [consentBanner, setConsentBanner] = useState(null) @@ -103,11 +117,20 @@ export function MigrationProjectsPanel({ domains }: { domains: MailDomain[] }) { const activeProject = projects.find((p) => p.id === activeProjectId) const createInvite = useCreateMigrationInvite(activeProjectId) const importInvites = useImportMigrationInvites(activeProjectId) + const importRoster = useImportMigrationRoster(activeProjectId) + const rosterQuery = useMigrationRoster(activeProjectId, Boolean(activeProjectId)) const jobsQuery = useMigrationProjectJobs(activeProjectId, Boolean(activeProjectId)) const retryJob = useRetryMigrationJob(activeProjectId) const resetCursor = useResetMigrationJobCursor(activeProjectId) const retryFailed = useRetryMigrationFailedJobs(activeProjectId) const preflightDNS = usePreflightCutoverDNS(activeProjectId) + const updateSharedDriveMode = useUpdateMigrationSharedDriveMode(activeProjectId) + const sharedDrivesQuery = useMigrationSharedDrives( + activeProjectId, + Boolean(activeProjectId && activeProject?.source_provider === "google") + ) + const approveSharedDrive = useApproveMigrationSharedDrive(activeProjectId) + const rejectSharedDrive = useRejectMigrationSharedDrive(activeProjectId) useEffect(() => { const consent = params.get("microsoft_admin_consent") @@ -380,6 +403,19 @@ export function MigrationProjectsPanel({ domains }: { domains: MailDomain[] }) { )} + {activeProject?.source_provider === "google" && ( + void updateSharedDriveMode.mutateAsync(mode)} + modePending={updateSharedDriveMode.isPending} + onApprove={(driveId) => void approveSharedDrive.mutateAsync(driveId)} + onReject={(driveId) => void rejectSharedDrive.mutateAsync(driveId)} + actionPending={approveSharedDrive.isPending || rejectSharedDrive.isPending} + /> + )} +

Jobs de migration

@@ -418,27 +454,54 @@ export function MigrationProjectsPanel({ domains }: { domains: MailDomain[] }) {
- + +