Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Button } from "@ctrlplane/ui/button";

import { ApprovalDialog } from "~/app/[workspaceSlug]/(appv2)/systems/[systemSlug]/_components/release/ApprovalDialog";
import { ApprovalDialog } from "~/app/[workspaceSlug]/(appv2)/(deploy)/_components/release/ApprovalDialog";
import { api } from "~/trpc/react";
import { Cancelled, Failing, Loading, Passing, Waiting } from "./StatusIcons";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { SidebarTrigger } from "@ctrlplane/ui/sidebar";
import { ReactFlowProvider } from "~/app/[workspaceSlug]/(appv2)/_components/reactflow/ReactFlowProvider";
import { Sidebars } from "~/app/[workspaceSlug]/sidebars";
import { api } from "~/trpc/server";
import { FlowDiagram } from "./flow-diagram/FlowDiagram";
import { FlowDiagram } from "./_components/flow-diagram/FlowDiagram";

type PageProps = {
params: Promise<{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type { EnvironmentPolicyApproval, User } from "@ctrlplane/db/schema";

import { Button } from "@ctrlplane/ui/button";

import { ApprovalDialog } from "~/app/[workspaceSlug]/(appv2)/systems/[systemSlug]/_components/release/ApprovalDialog";
import { ApprovalDialog } from "~/app/[workspaceSlug]/(appv2)/(deploy)/_components/release/ApprovalDialog";

type EnvironmentApprovalRowProps = {
approval: EnvironmentPolicyApproval & { user?: User | null };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { usePathname } from "next/navigation";

import { Button } from "@ctrlplane/ui/button";

import { CreateReleaseDialog } from "~/app/[workspaceSlug]/(appv2)/systems/[systemSlug]/_components/release/CreateRelease";
import { CreateReleaseDialog } from "~/app/[workspaceSlug]/(appv2)/(deploy)/_components/release/CreateRelease";
import { CreateReleaseChannelDialog } from "../channels/CreateReleaseChannelDialog";
import { CreateVariableDialog } from "../variables/CreateVariableDialog";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { JobStatus } from "@ctrlplane/validators/jobs";
import { ReleaseStatus } from "@ctrlplane/validators/releases";

import { useReleaseChannelDrawer } from "~/app/[workspaceSlug]/(app)/_components/release-channel-drawer/useReleaseChannelDrawer";
import { ApprovalDialog } from "~/app/[workspaceSlug]/(appv2)/systems/[systemSlug]/_components/release/ApprovalDialog";
import { ApprovalDialog } from "~/app/[workspaceSlug]/(appv2)/(deploy)/_components/release/ApprovalDialog";
import { api } from "~/trpc/react";
import { DeployButton } from "./DeployButton";
import { Release } from "./TableCells";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ import {
JobStatus,
} from "@ctrlplane/validators/jobs";

import { DeploymentBarChart } from "~/app/[workspaceSlug]/(appv2)/systems/[systemSlug]/_components/deployments/charts/DeploymentBarChart";
import { ReleaseDropdownMenu } from "~/app/[workspaceSlug]/(appv2)/systems/[systemSlug]/_components/release/ReleaseDropdownMenu";
import { DeploymentBarChart } from "~/app/[workspaceSlug]/(appv2)/(deploy)/_components/deployments/charts/DeploymentBarChart";
import { ReleaseDropdownMenu } from "~/app/[workspaceSlug]/(appv2)/(deploy)/_components/release/ReleaseDropdownMenu";
import {
getStatusColor,
statusColor,
} from "~/app/[workspaceSlug]/(appv2)/systems/[systemSlug]/_utils/status-color";
} from "~/app/[workspaceSlug]/(appv2)/(deploy)/_utils/status-color";
import { api } from "~/trpc/react";

const ReleaseIcon: React.FC<{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
"use client";

import type * as SCHEMA from "@ctrlplane/db/schema";
import { useParams } from "next/navigation";
import { IconMenu2 } from "@tabler/icons-react";

import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@ctrlplane/ui/breadcrumb";
import { Separator } from "@ctrlplane/ui/separator";
import { SidebarTrigger } from "@ctrlplane/ui/sidebar";

import { Sidebars } from "~/app/[workspaceSlug]/sidebars";
import { urls } from "~/app/urls";

type SystemBreadcrumbProps = {
system: SCHEMA.System;
page: string;
};

export const SystemBreadcrumb: React.FC<SystemBreadcrumbProps> = ({
system,
page,
}) => {
const { workspaceSlug } = useParams<{ workspaceSlug: string }>();
const workspaceUrls = urls.workspace(workspaceSlug);
const systemsUrl = workspaceUrls.systems();
const systemUrl = workspaceUrls.system(system.slug).baseUrl();
return (
<div className="flex items-center gap-2">
<SidebarTrigger name={Sidebars.System}>
<IconMenu2 className="h-4 w-4" />
</SidebarTrigger>
<Separator orientation="vertical" className="mr-2 h-4" />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem className="hidden md:block">
<BreadcrumbLink href={systemsUrl}>Systems</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem className="hidden md:block">
<BreadcrumbLink href={systemUrl}>{system.name}</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem className="hidden md:block">
<BreadcrumbPage>{page}</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</div>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import { IconLoader2 } from "@tabler/icons-react";
import { cn } from "@ctrlplane/ui";
import { Badge } from "@ctrlplane/ui/badge";

import { DeploymentOptionsDropdown } from "~/app/[workspaceSlug]/(appv2)/systems/[systemSlug]/_components/deployments/dropdown/DeploymentOptionsDropdown";
import { LazyDeploymentEnvironmentCell } from "~/app/[workspaceSlug]/(appv2)/systems/[systemSlug]/_components/deployments/environment-cell/DeploymentEnvironmentCell";
import { DeploymentOptionsDropdown } from "~/app/[workspaceSlug]/(appv2)/(deploy)/_components/deployments/dropdown/DeploymentOptionsDropdown";
import { LazyDeploymentEnvironmentCell } from "~/app/[workspaceSlug]/(appv2)/(deploy)/_components/deployments/environment-cell/DeploymentEnvironmentCell";
import { urls } from "~/app/urls";
import { api } from "~/trpc/react";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,11 @@
import { notFound } from "next/navigation";
import { IconMenu2 } from "@tabler/icons-react";

import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbList,
BreadcrumbPage,
} from "@ctrlplane/ui/breadcrumb";
import { Button } from "@ctrlplane/ui/button";
import { Separator } from "@ctrlplane/ui/separator";
import { SidebarTrigger } from "@ctrlplane/ui/sidebar";

import { CreateDeploymentDialog } from "~/app/[workspaceSlug]/(appv2)/_components/deployments/CreateDeployment";
import { PageHeader } from "~/app/[workspaceSlug]/(appv2)/_components/PageHeader";
import { Sidebars } from "~/app/[workspaceSlug]/sidebars";
import { api } from "~/trpc/server";
import { SystemBreadcrumb } from "../_components/SystemBreadcrumb";
import DeploymentTable from "./TableDeployments";

export default async function EnvironmentsPage(props: {
Expand All @@ -36,19 +27,7 @@ export default async function EnvironmentsPage(props: {
return (
<div className="flex min-w-0 flex-col overflow-x-auto">
<PageHeader className="flex items-center justify-between">
<div className="flex items-center gap-2">
<SidebarTrigger name={Sidebars.System}>
<IconMenu2 className="h-4 w-4" />
</SidebarTrigger>
<Separator orientation="vertical" className="mr-2 h-4" />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem className="hidden md:block">
<BreadcrumbPage>Deployments</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</div>
<SystemBreadcrumb system={system} page="Deployments" />

<CreateDeploymentDialog systemId={system.id}>
<Button
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,8 @@
import { notFound } from "next/navigation";
import { IconMenu2 } from "@tabler/icons-react";

import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbList,
BreadcrumbPage,
} from "@ctrlplane/ui/breadcrumb";
import { Separator } from "@ctrlplane/ui/separator";
import { SidebarTrigger } from "@ctrlplane/ui/sidebar";

import { PageHeader } from "~/app/[workspaceSlug]/(appv2)/_components/PageHeader";
import { Sidebars } from "~/app/[workspaceSlug]/sidebars";
import { api } from "~/trpc/server";
import { SystemBreadcrumb } from "../_components/SystemBreadcrumb";
import { EnvironmentRow } from "./EnvironmentRow";

export default async function EnvironmentsPage(props: {
Expand All @@ -27,17 +17,7 @@ export default async function EnvironmentsPage(props: {
return (
<div>
<PageHeader>
<SidebarTrigger name={Sidebars.System}>
<IconMenu2 className="h-4 w-4" />
</SidebarTrigger>
<Separator orientation="vertical" className="mr-2 h-4" />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem className="hidden md:block">
<BreadcrumbPage>Environments</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
<SystemBreadcrumb system={system} page="Environments" />
</PageHeader>

{environments.map((environment) => (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ import {
SidebarProvider,
} from "@ctrlplane/ui/sidebar";

import { SystemSelector } from "~/app/[workspaceSlug]/(appv2)/(deploy)/(sidebar)/systems/SystemSelector";
import { SidebarLink } from "~/app/[workspaceSlug]/(appv2)/resources/(sidebar)/SidebarLink";
import { Sidebars } from "~/app/[workspaceSlug]/sidebars";
import { api } from "~/trpc/server";
import { SidebarLink } from "../../../resources/(sidebar)/SidebarLink";
import { SystemSelector } from "../../SystemSelector";

export const generateMetadata = async (props: {
params: Promise<{ workspaceSlug: string; systemSlug: string }>;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,11 @@
import Link from "next/link";
import { notFound } from "next/navigation";
import { IconMenu2 } from "@tabler/icons-react";

import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbList,
BreadcrumbPage,
} from "@ctrlplane/ui/breadcrumb";
import { buttonVariants } from "@ctrlplane/ui/button";
import { Separator } from "@ctrlplane/ui/separator";
import { SidebarTrigger } from "@ctrlplane/ui/sidebar";

import { PageHeader } from "~/app/[workspaceSlug]/(appv2)/_components/PageHeader";
import { Sidebars } from "~/app/[workspaceSlug]/sidebars";
import { api } from "~/trpc/server";
import { SystemBreadcrumb } from "../_components/SystemBreadcrumb";
import { RunbookGettingStarted } from "./RunbookGettingStarted";
import { RunbookRow } from "./RunbookRow";

Expand All @@ -30,19 +21,7 @@ export default async function RunbooksPage(props: {
return (
<div>
<PageHeader className="flex w-full items-center justify-between">
<div className="flex items-center gap-2">
<SidebarTrigger name={Sidebars.System}>
<IconMenu2 className="h-4 w-4" />
</SidebarTrigger>
<Separator orientation="vertical" className="mr-2 h-4" />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem className="hidden md:block">
<BreadcrumbPage>Runbooks</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</div>
<SystemBreadcrumb system={system} page="Runbooks" />

<Link
href={`/${params.workspaceSlug}/systems/${params.systemSlug}/runbooks/create`}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,12 @@
import { notFound } from "next/navigation";
import { IconMenu2 } from "@tabler/icons-react";

import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbList,
BreadcrumbPage,
} from "@ctrlplane/ui/breadcrumb";
import { Button } from "@ctrlplane/ui/button";
import { Separator } from "@ctrlplane/ui/separator";
import { SidebarTrigger } from "@ctrlplane/ui/sidebar";

import { PageHeader } from "~/app/[workspaceSlug]/(appv2)/_components/PageHeader";
import { DeleteSystemDialog } from "~/app/[workspaceSlug]/(appv2)/_components/system/DeleteSystemDialog";
import { Sidebars } from "~/app/[workspaceSlug]/sidebars";
import { api } from "~/trpc/server";
import { SystemBreadcrumb } from "../_components/SystemBreadcrumb";
import { GeneralSettings } from "./GeneralSettings";

export default async function SystemSettingsPage(props: {
Expand All @@ -25,17 +17,7 @@ export default async function SystemSettingsPage(props: {
return (
<div className="flex flex-col">
<PageHeader>
<SidebarTrigger name={Sidebars.System}>
<IconMenu2 className="h-4 w-4" />
</SidebarTrigger>
<Separator orientation="vertical" className="mr-2 h-4" />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem className="hidden md:block">
<BreadcrumbPage>Settings</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
<SystemBreadcrumb system={system} page="Settings" />
</PageHeader>

<div className="container max-w-2xl space-y-8 overflow-y-auto py-8">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { notFound } from "next/navigation";

import { PageHeader } from "~/app/[workspaceSlug]/(appv2)/_components/PageHeader";
import { api } from "~/trpc/server";
import { SystemBreadcrumb } from "../_components/SystemBreadcrumb";
import { VariableSetGettingStarted } from "./GettingStartedVariableSets";
import { VariableSetsTable } from "./VariableSetsTable";

export default async function SystemVariableSetsPage(props: {
params: Promise<{ workspaceSlug: string; systemSlug: string }>;
}) {
const params = await props.params;
const workspace = await api.workspace
.bySlug(params.workspaceSlug)
.catch(() => notFound());
if (!workspace) notFound();
const system = await api.system.bySlug(params).catch(() => notFound());

const variableSets = await api.variableSet.bySystemId(system.id);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add error handling for variable sets fetch

The variable sets fetch lacks error handling, which could lead to unhandled promise rejections if the API call fails.

- const variableSets = await api.variableSet.bySystemId(system.id);
+ const variableSets = await api.variableSet.bySystemId(system.id)
+   .catch((error) => {
+     console.error("Failed to fetch variable sets:", error);
+     return [];
+   });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const variableSets = await api.variableSet.bySystemId(system.id);
const variableSets = await api.variableSet.bySystemId(system.id)
.catch((error) => {
console.error("Failed to fetch variable sets:", error);
return [];
});

return (
<div>
<PageHeader>
<SystemBreadcrumb system={system} page="Variables" />
</PageHeader>

{variableSets.length === 0 && (
<VariableSetGettingStarted
systemId={system.id}
environments={system.environments}
/>
)}
{variableSets.length !== 0 && (
<VariableSetsTable variableSets={variableSets} />
)}
</div>
);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import type { Metadata } from "next";
import { notFound } from "next/navigation";
import { IconMenu2 } from "@tabler/icons-react";

import { Button } from "@ctrlplane/ui/button";
import { SidebarTrigger } from "@ctrlplane/ui/sidebar";

import { DeploymentsCard } from "~/app/[workspaceSlug]/(appv2)/_components/deployments/Card";
import { CreateDeploymentDialog } from "~/app/[workspaceSlug]/(appv2)/_components/deployments/CreateDeployment";
import { PageHeader } from "~/app/[workspaceSlug]/(appv2)/_components/PageHeader";
import { Sidebars } from "~/app/[workspaceSlug]/sidebars";
import { api } from "~/trpc/server";
import { DeploymentsCard } from "../_components/deployments/Card";
import { CreateDeploymentDialog } from "../_components/deployments/CreateDeployment";

export const metadata: Metadata = {
title: "Deployments | Ctrlplane",
Expand All @@ -21,15 +25,18 @@ export default async function DeploymentsPage(props: Props) {
if (workspace == null) notFound();

return (
<div className="container m-8 mx-auto space-y-8">
<div className="flex w-full justify-between">
<h2 className="text-2xl font-bold">Deployments</h2>
<div className="flex flex-col">
<PageHeader className="z-10 flex items-center justify-between">
<SidebarTrigger name={Sidebars.Deployments}>
<IconMenu2 className="h-4 w-4" />
</SidebarTrigger>
<CreateDeploymentDialog>
<Button variant="outline" size="sm">
Create Deployment
</Button>
</CreateDeploymentDialog>
</div>
</PageHeader>

<DeploymentsCard workspaceId={workspace.id} />
</div>
);
Expand Down
Loading
Loading