From 922596d452cabec959d96a9ef9a2948a650e5920 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Mon, 28 Oct 2024 21:11:28 -0500 Subject: [PATCH 1/4] add badges and fix loadiing --- .../_components/JobTableStatusIcon.tsx | 7 + .../[versionId]/PolicyApprovalRow.tsx | 2 +- .../[versionId]/TargetReleaseTable.tsx | 276 +++++++++++------- 3 files changed, 175 insertions(+), 110 deletions(-) diff --git a/apps/webservice/src/app/[workspaceSlug]/_components/JobTableStatusIcon.tsx b/apps/webservice/src/app/[workspaceSlug]/_components/JobTableStatusIcon.tsx index f75caf281..4436cfb08 100644 --- a/apps/webservice/src/app/[workspaceSlug]/_components/JobTableStatusIcon.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/_components/JobTableStatusIcon.tsx @@ -3,6 +3,7 @@ import { IconCircleCheck, IconCircleX, IconClock, + IconExclamationCircle, IconLoader2, } from "@tabler/icons-react"; @@ -31,6 +32,12 @@ export const JobTableStatusIcon: React.FC<{ return ( ); + if (status === JobStatus.ActionRequired) + return ( + + ); return ; }; diff --git a/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/PolicyApprovalRow.tsx b/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/PolicyApprovalRow.tsx index 40634f6dd..0c57e361d 100644 --- a/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/PolicyApprovalRow.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/PolicyApprovalRow.tsx @@ -73,7 +73,7 @@ export const PolicyApprovalRow: React.FC = ({ {status === "pending" ? (
{environmentApprovals.map((approval) => ( @@ -91,98 +131,92 @@ const CollapsibleTableRow: React.FC = ({
- {isExpanded && ( - <> - {jobs?.map((job, idx) => { - const linksMetadata = job.job.metadata.find( - (m) => m.key === String(ReservedMetadataKey.Links), - )?.value; - - const links = - linksMetadata != null - ? (JSON.parse(linksMetadata) as Record) - : null; - - return ( - setJobId(job.job.id)} - > - - - {job.target.name} - - - -
- - {capitalCase(job.job.status)} -
-
- {job.type} - - {job.job.externalId != null ? ( - - {job.job.externalId} - - ) : ( - - No external ID - + {isExpanded || + (isOpen && ( + <> + {jobs.map((job, idx) => { + const linksMetadata = job.job.metadata.find( + (m) => m.key === String(ReservedMetadataKey.Links), + )?.value; + + const links = + linksMetadata != null + ? (JSON.parse(linksMetadata) as Record) + : null; + + return ( + - - {links != null && ( + onClick={() => setJobId(job.job.id)} + > + {job.target.name} +
- {Object.entries(links).map(([label, url]) => ( - - - {label} - - ))} + + {capitalCase(job.job.status)}
- )} -
- e.stopPropagation()}> -
- - - -
-
-
- ); - })} - - )} +
+ {job.type} + + {job.job.externalId != null ? ( + + {job.job.externalId} + + ) : ( + + No external ID + + )} + + e.stopPropagation()}> + {links != null && ( +
+ {Object.entries(links).map(([label, url]) => ( + + + {label} + + ))} +
+ )} +
+ e.stopPropagation()}> +
+ + + +
+
+
+ ); + })} + + ))} ); }; @@ -199,6 +233,14 @@ export const TargetReleaseTable: React.FC = ({ environments, }) => { const { filter, setFilter } = useJobFilter(); + const releaseJobTriggerQuery = api.job.config.byReleaseId.useQuery( + { releaseId: release.id, filter }, + { + refetchInterval: 5_000, + placeholderData: (prev) => prev, + initialData: [], + }, + ); return ( <> @@ -212,18 +254,34 @@ export const TargetReleaseTable: React.FC = ({ - - - {environments.map((environment) => ( - + {_.range(30).map((i) => ( + ))} - -
+ + )} + + {releaseJobTriggerQuery.data.length > 0 && ( + + + {environments.map((environment) => ( + + ))} + +
+ )} ); }; From c0c094951f2aa0bd40216c88c9164d22548d6e3e Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Mon, 28 Oct 2024 21:20:28 -0500 Subject: [PATCH 2/4] fix --- .../releases/[versionId]/TargetReleaseTable.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx b/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx index ee253216d..07826541d 100644 --- a/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx @@ -1,6 +1,6 @@ "use client"; -import type { Environment } from "@ctrlplane/db/schema"; +import type { Environment, Target } from "@ctrlplane/db/schema"; import type { JobStatus } from "@ctrlplane/validators/jobs"; import React, { Fragment, useState } from "react"; import Link from "next/link"; @@ -46,11 +46,7 @@ type CollapsibleTableRowProps = { metadata: Array<{ key: string; value: string }>; externalId: string | null; }; - target: { - id: string; - name: string; - lockedAt: Date | null; - }; + target: Target; type: string; }>; }; From 6c17f0407866f3b0eb56f7696aea2aef16e91284 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Mon, 28 Oct 2024 22:26:16 -0500 Subject: [PATCH 3/4] fix logic --- .../[versionId]/TargetReleaseTable.tsx | 177 +++++++++--------- 1 file changed, 89 insertions(+), 88 deletions(-) diff --git a/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx b/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx index 07826541d..056af54d9 100644 --- a/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx @@ -31,6 +31,7 @@ import { PolicyApprovalRow } from "./PolicyApprovalRow"; type CollapsibleTableRowProps = { environment: Environment; + environmentCount: number; deploymentName: string; release: { id: string; @@ -53,12 +54,15 @@ type CollapsibleTableRowProps = { const CollapsibleTableRow: React.FC = ({ environment, + environmentCount, deploymentName, release, releaseJobTriggerData, }) => { const { setJobId } = useJobDrawer(); - const [isExpanded, setIsExpanded] = useState(false); + const jobs = releaseJobTriggerData.filter( + (job) => job.environmentId === environment.id, + ); const approvalsQ = api.environment.policy.approval.byReleaseId.useQuery({ releaseId: release.id, @@ -69,13 +73,10 @@ const CollapsibleTableRow: React.FC = ({ (approval) => approval.policyId === environment.policyId, ); - const jobs = releaseJobTriggerData.filter( - (job) => job.environmentId === environment.id, - ); - - const isOpen = jobs.length < 10 && approvals.length < 3; + const isOpen = jobs.length < 10 && environmentCount < 3; + const [isExpanded, setIsExpanded] = useState(isOpen); - if (jobs.length === 0) return; + if (jobs.length === 0) return null; return ( @@ -127,92 +128,91 @@ const CollapsibleTableRow: React.FC = ({ - {isExpanded || - (isOpen && ( - <> - {jobs.map((job, idx) => { - const linksMetadata = job.job.metadata.find( - (m) => m.key === String(ReservedMetadataKey.Links), - )?.value; + {isExpanded && ( + <> + {jobs.map((job, idx) => { + const linksMetadata = job.job.metadata.find( + (m) => m.key === String(ReservedMetadataKey.Links), + )?.value; - const links = - linksMetadata != null - ? (JSON.parse(linksMetadata) as Record) - : null; + const links = + linksMetadata != null + ? (JSON.parse(linksMetadata) as Record) + : null; - return ( - setJobId(job.job.id)} + > + {job.target.name} + +
+ + {capitalCase(job.job.status)} +
+
+ {job.type} + + {job.job.externalId != null ? ( + + {job.job.externalId} + + ) : ( + + No external ID + )} - onClick={() => setJobId(job.job.id)} - > - {job.target.name} - + + e.stopPropagation()}> + {links != null && (
- - {capitalCase(job.job.status)} + {Object.entries(links).map(([label, url]) => ( + + + {label} + + ))}
-
- {job.type} - - {job.job.externalId != null ? ( - - {job.job.externalId} - - ) : ( - - No external ID - - )} - - e.stopPropagation()}> - {links != null && ( -
- {Object.entries(links).map(([label, url]) => ( - - - {label} - - ))} -
- )} -
- e.stopPropagation()}> -
- - - -
-
-
- ); - })} - - ))} + )} + + e.stopPropagation()}> +
+ + + +
+
+ + ); + })} + + )}
); }; @@ -270,6 +270,7 @@ export const TargetReleaseTable: React.FC = ({ Date: Mon, 28 Oct 2024 22:38:24 -0500 Subject: [PATCH 4/4] fix the job.target.name link --- .../[versionId]/TargetReleaseTable.tsx | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx b/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx index 056af54d9..d1285faab 100644 --- a/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/systems/[systemSlug]/deployments/[deploymentSlug]/releases/[versionId]/TargetReleaseTable.tsx @@ -4,6 +4,7 @@ import type { Environment, Target } from "@ctrlplane/db/schema"; import type { JobStatus } from "@ctrlplane/validators/jobs"; import React, { Fragment, useState } from "react"; import Link from "next/link"; +import { usePathname } from "next/navigation"; import { IconChevronRight, IconDots, @@ -59,6 +60,7 @@ const CollapsibleTableRow: React.FC = ({ release, releaseJobTriggerData, }) => { + const pathname = usePathname(); const { setJobId } = useJobDrawer(); const jobs = releaseJobTriggerData.filter( (job) => job.environmentId === environment.id, @@ -95,25 +97,19 @@ const CollapsibleTableRow: React.FC = ({ /> {environment.name}
- {Object.entries( - jobs.reduce( - (acc, { job }) => { - acc[job.status] = (acc[job.status] || 0) + 1; - return acc; - }, - {} as Record, + {Object.entries(_.groupBy(jobs, (job) => job.job.status)).map( + ([status, groupedJobs]) => ( + + + {groupedJobs.length} + ), - ).map(([status, count]) => ( - - - {count} - - ))} + )}
@@ -149,7 +145,14 @@ const CollapsibleTableRow: React.FC = ({ )} onClick={() => setJobId(job.job.id)} > - {job.target.name} + e.stopPropagation()}> + + {job.target.name} + +