Skip to content

Commit 31c2b06

Browse files
authored
Merge pull request #8 from jorgedlcruz/features/v0.3.0
v0.3.0: Job Creation Wizards, VRO Integration & Enhanced Reliability
2 parents 2f67ae5 + c4fb908 commit 31c2b06

File tree

58 files changed

+2535
-78
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+2535
-78
lines changed

app/(app)/vbr/dashboard/page.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export default function VBRPage() {
5757
const [
5858
jobsData,
5959
sessionsData,
60-
reposData,
60+
serverInfoData,
6161
licenseData,
6262
malwareData,
6363
securityData
@@ -69,17 +69,15 @@ export default function VBRPage() {
6969
orderAsc: false,
7070
createdAfterFilter: fromDate.toISOString()
7171
}),
72-
// veeamApi.getRepositories(),
73-
fetch('/api/vbr/ServerInfo').then(res => res.json()),
72+
veeamApi.getServerInfo(),
7473
veeamApi.getLicenseInfo(),
7574
veeamApi.getMalwareEvents({ limit: 10 }),
7675
veeamApi.getSecurityBestPractices()
7776
])
7877

7978
setJobs(jobsData)
8079
setSessions(sessionsData)
81-
// setRepositories(reposData)
82-
setServerInfo(reposData) // ServerInfo logic seems mixed up in original code? using reposData variable for serverInfo fetch result. Keeping consistent strictly with what I see.
80+
setServerInfo(serverInfoData)
8381
setLicense(licenseData)
8482
setMalwareEvents(malwareData)
8583
setSecurityItems(securityData)

app/(app)/vbr/jobs/_components/backup-jobs-table.tsx

Lines changed: 236 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ import {
3535
DropdownMenuLabel,
3636
DropdownMenuSeparator,
3737
DropdownMenuTrigger,
38+
DropdownMenuSub,
39+
DropdownMenuSubContent,
40+
DropdownMenuSubTrigger,
41+
DropdownMenuPortal,
3842
} from "@/components/ui/dropdown-menu"
3943
import { VeeamBackupJob } from "@/lib/types/veeam"
4044
import { veeamApi } from "@/lib/api/veeam-client"
@@ -48,7 +52,23 @@ import {
4852
HelpCircle,
4953
MoreHorizontal,
5054
Columns,
51-
ArrowUpDown
55+
ArrowUpDown,
56+
PlusIcon,
57+
Monitor,
58+
Server,
59+
Cloud,
60+
File,
61+
Copy,
62+
RefreshCw,
63+
FolderOpen,
64+
Filter,
65+
MonitorCheck,
66+
Building,
67+
HardDrive,
68+
Laptop,
69+
Terminal,
70+
LayoutGrid,
71+
Database
5272
} from "lucide-react"
5373
import { toast } from "sonner"
5474

@@ -293,7 +313,10 @@ export function BackupJobsTable({ data, loading = false, onRefresh }: BackupJobs
293313
try {
294314
switch (action) {
295315
case 'start':
296-
await veeamApi.startJob(job.id);
316+
const startPayload = job.type === 'BackupCopy'
317+
? { performActiveFull: false, startChainedJobs: false, syncRestorePoints: "Latest" }
318+
: undefined;
319+
await veeamApi.startJob(job.id, startPayload);
297320
toast.success('Job started successfully');
298321
break;
299322
case 'stop':
@@ -397,6 +420,217 @@ export function BackupJobsTable({ data, loading = false, onRefresh }: BackupJobs
397420
<div className="w-full space-y-4">
398421
<div className="flex items-center justify-between">
399422
<div className="flex flex-1 items-center space-x-2">
423+
<DropdownMenu>
424+
<DropdownMenuTrigger asChild>
425+
<Button>
426+
<PlusIcon className="mr-2 h-4 w-4" />
427+
Create Job
428+
</Button>
429+
</DropdownMenuTrigger>
430+
<DropdownMenuContent align="start" className="w-56">
431+
<DropdownMenuSub>
432+
<DropdownMenuSubTrigger>
433+
<HardDrive className="mr-2 h-4 w-4 text-green-600" />
434+
<span>Backup</span>
435+
</DropdownMenuSubTrigger>
436+
<DropdownMenuPortal>
437+
<DropdownMenuSubContent className="w-56">
438+
<DropdownMenuSub>
439+
<DropdownMenuSubTrigger>
440+
<Server className="mr-2 h-4 w-4 text-green-600" />
441+
<span>Virtual machine...</span>
442+
</DropdownMenuSubTrigger>
443+
<DropdownMenuPortal>
444+
<DropdownMenuSubContent>
445+
<DropdownMenuItem asChild>
446+
<Link href="/vbr/jobs/create" className="cursor-pointer w-full flex items-center">
447+
<Server className="mr-2 h-4 w-4 text-blue-500" />
448+
<span className="ml-2">VMware vSphere</span>
449+
</Link>
450+
</DropdownMenuItem>
451+
<DropdownMenuItem asChild>
452+
<Link href="/vbr/jobs/create?platform=hyperv" className="cursor-pointer w-full flex items-center">
453+
<Server className="mr-2 h-4 w-4 text-blue-500" />
454+
<span className="ml-2">Microsoft Hyper-V</span>
455+
</Link>
456+
</DropdownMenuItem>
457+
</DropdownMenuSubContent>
458+
</DropdownMenuPortal>
459+
</DropdownMenuSub>
460+
461+
<DropdownMenuItem disabled>
462+
<Monitor className="mr-2 h-4 w-4 text-orange-500" />
463+
Windows computer...
464+
</DropdownMenuItem>
465+
<DropdownMenuItem disabled>
466+
<Terminal className="mr-2 h-4 w-4 text-yellow-500" />
467+
Linux computer...
468+
</DropdownMenuItem>
469+
<DropdownMenuItem disabled>
470+
<Laptop className="mr-2 h-4 w-4 text-gray-500" />
471+
Mac computer...
472+
</DropdownMenuItem>
473+
<DropdownMenuItem disabled>
474+
<Terminal className="mr-2 h-4 w-4 text-green-800" />
475+
Unix computer...
476+
</DropdownMenuItem>
477+
478+
<DropdownMenuSub>
479+
<DropdownMenuSubTrigger>
480+
<LayoutGrid className="mr-2 h-4 w-4 text-gray-400" />
481+
<span>Application</span>
482+
</DropdownMenuSubTrigger>
483+
<DropdownMenuPortal>
484+
<DropdownMenuSubContent>
485+
<DropdownMenuItem disabled>Oracle Database</DropdownMenuItem>
486+
<DropdownMenuItem disabled>SAP HANA</DropdownMenuItem>
487+
<DropdownMenuItem disabled>Microsoft SQL Server</DropdownMenuItem>
488+
</DropdownMenuSubContent>
489+
</DropdownMenuPortal>
490+
</DropdownMenuSub>
491+
492+
<DropdownMenuItem disabled>
493+
<LayoutGrid className="mr-2 h-4 w-4 text-green-500" />
494+
Object storage...
495+
</DropdownMenuItem>
496+
<DropdownMenuItem disabled>
497+
<FolderOpen className="mr-2 h-4 w-4 text-gray-500" />
498+
File share...
499+
</DropdownMenuItem>
500+
501+
<DropdownMenuSub>
502+
<DropdownMenuSubTrigger>
503+
<Building className="mr-2 h-4 w-4 text-blue-500" />
504+
<span>Microsoft Entra ID...</span>
505+
</DropdownMenuSubTrigger>
506+
<DropdownMenuPortal>
507+
<DropdownMenuSubContent>
508+
<DropdownMenuItem asChild>
509+
<Link href="/vbr/jobs/create-entraid?type=tenant" className="cursor-pointer">
510+
Tenant
511+
</Link>
512+
</DropdownMenuItem>
513+
<DropdownMenuItem asChild>
514+
<Link href="/vbr/jobs/create-entraid?type=audit" className="cursor-pointer">
515+
Logs
516+
</Link>
517+
</DropdownMenuItem>
518+
</DropdownMenuSubContent>
519+
</DropdownMenuPortal>
520+
</DropdownMenuSub>
521+
522+
<DropdownMenuSub>
523+
<DropdownMenuSubTrigger>
524+
<Cloud className="mr-2 h-4 w-4 text-orange-400" />
525+
<span>AWS</span>
526+
</DropdownMenuSubTrigger>
527+
<DropdownMenuPortal>
528+
<DropdownMenuSubContent className="w-48">
529+
<DropdownMenuSub>
530+
<DropdownMenuSubTrigger>
531+
<Server className="mr-2 h-4 w-4 text-orange-400" />
532+
<span>EC2</span>
533+
</DropdownMenuSubTrigger>
534+
<DropdownMenuPortal>
535+
<DropdownMenuSubContent>
536+
<DropdownMenuItem disabled>EC2...</DropdownMenuItem>
537+
<DropdownMenuItem disabled>EC2 SLA-Based...</DropdownMenuItem>
538+
</DropdownMenuSubContent>
539+
</DropdownMenuPortal>
540+
</DropdownMenuSub>
541+
<DropdownMenuItem disabled><Database className="mr-2 h-4 w-4 text-blue-400" /> RDS...</DropdownMenuItem>
542+
<DropdownMenuItem disabled><HardDrive className="mr-2 h-4 w-4 text-green-400" /> EFS...</DropdownMenuItem>
543+
<DropdownMenuItem disabled><Database className="mr-2 h-4 w-4 text-purple-400" /> DynamoDB...</DropdownMenuItem>
544+
<DropdownMenuItem disabled><HardDrive className="mr-2 h-4 w-4 text-green-500" /> FSx...</DropdownMenuItem>
545+
<DropdownMenuItem disabled><Database className="mr-2 h-4 w-4 text-red-500" /> Redshift...</DropdownMenuItem>
546+
<DropdownMenuItem disabled><Database className="mr-2 h-4 w-4 text-red-400" /> Redshift Serverless...</DropdownMenuItem>
547+
</DropdownMenuSubContent>
548+
</DropdownMenuPortal>
549+
</DropdownMenuSub>
550+
551+
<DropdownMenuSub>
552+
<DropdownMenuSubTrigger>
553+
<Cloud className="mr-2 h-4 w-4 text-blue-600" />
554+
<span>Microsoft Azure</span>
555+
</DropdownMenuSubTrigger>
556+
<DropdownMenuPortal>
557+
<DropdownMenuSubContent>
558+
<DropdownMenuItem disabled>Virtual machine...</DropdownMenuItem>
559+
<DropdownMenuItem disabled>SQL databases...</DropdownMenuItem>
560+
<DropdownMenuItem disabled>Azure files...</DropdownMenuItem>
561+
</DropdownMenuSubContent>
562+
</DropdownMenuPortal>
563+
</DropdownMenuSub>
564+
</DropdownMenuSubContent>
565+
</DropdownMenuPortal>
566+
</DropdownMenuSub>
567+
568+
<DropdownMenuSub>
569+
<DropdownMenuSubTrigger>
570+
<Copy className="mr-2 h-4 w-4 text-green-500" />
571+
<span>Replication</span>
572+
</DropdownMenuSubTrigger>
573+
<DropdownMenuPortal>
574+
<DropdownMenuSubContent>
575+
<DropdownMenuItem disabled><Server className="mr-2 h-4 w-4 text-blue-500" /> VMware vSphere</DropdownMenuItem>
576+
<DropdownMenuItem disabled><Server className="mr-2 h-4 w-4 text-blue-500" /> Microsoft Hyper-V</DropdownMenuItem>
577+
</DropdownMenuSubContent>
578+
</DropdownMenuPortal>
579+
</DropdownMenuSub>
580+
581+
<DropdownMenuSub>
582+
<DropdownMenuSubTrigger>
583+
<RefreshCw className="mr-2 h-4 w-4 text-green-500" />
584+
<span>CDP policy</span>
585+
</DropdownMenuSubTrigger>
586+
<DropdownMenuPortal>
587+
<DropdownMenuSubContent>
588+
<DropdownMenuItem disabled><Server className="mr-2 h-4 w-4 text-blue-500" /> VMware vSphere</DropdownMenuItem>
589+
<DropdownMenuItem disabled><RefreshCw className="mr-2 h-4 w-4 text-green-500" /> Universal CDP</DropdownMenuItem>
590+
</DropdownMenuSubContent>
591+
</DropdownMenuPortal>
592+
</DropdownMenuSub>
593+
594+
<DropdownMenuSeparator />
595+
596+
<DropdownMenuItem disabled>
597+
<MonitorCheck className="mr-2 h-4 w-4 text-green-500" />
598+
SureBackup...
599+
</DropdownMenuItem>
600+
601+
<DropdownMenuSub>
602+
<DropdownMenuSubTrigger>
603+
<Copy className="mr-2 h-4 w-4 text-green-500" />
604+
<span>Backup copy...</span>
605+
</DropdownMenuSubTrigger>
606+
<DropdownMenuPortal>
607+
<DropdownMenuSubContent>
608+
<DropdownMenuItem asChild>
609+
<Link href="/vbr/jobs/create-backup-copy" className="cursor-pointer">Image-level backup</Link>
610+
</DropdownMenuItem>
611+
<DropdownMenuItem disabled>Storage copy</DropdownMenuItem>
612+
</DropdownMenuSubContent>
613+
</DropdownMenuPortal>
614+
</DropdownMenuSub>
615+
616+
<DropdownMenuItem disabled>
617+
<Copy className="mr-2 h-4 w-4 text-gray-500" />
618+
VM copy...
619+
</DropdownMenuItem>
620+
621+
<DropdownMenuItem disabled>
622+
<File className="mr-2 h-4 w-4 text-green-500" />
623+
File copy...
624+
</DropdownMenuItem>
625+
626+
<DropdownMenuSeparator />
627+
628+
<DropdownMenuItem disabled>
629+
<Filter className="mr-2 h-4 w-4 text-green-500" />
630+
Add view...
631+
</DropdownMenuItem>
632+
</DropdownMenuContent>
633+
</DropdownMenu>
400634
<Input
401635
placeholder="Filter jobs..."
402636
value={(table.getColumn("name")?.getFilterValue() as string) ?? ""}

0 commit comments

Comments
 (0)