diff --git a/frontend/src/views/IntegrationsPage/components/IntegrationsSection/ConfiguredIntegrationItem.tsx b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/ConfiguredIntegrationItem.tsx new file mode 100644 index 000000000..a621fac3d --- /dev/null +++ b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/ConfiguredIntegrationItem.tsx @@ -0,0 +1,229 @@ +import { + faArrowRight, + faCalendarCheck, + faRefresh, + faWarning, + faXmark +} from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { format } from "date-fns"; +import { integrationSlugNameMapping } from "public/data/frequentConstants"; + +import { ProjectPermissionCan } from "@app/components/permissions"; +import { Button, FormLabel, IconButton, Tag, Tooltip } from "@app/components/v2"; +import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; +import { IntegrationMappingBehavior } from "@app/hooks/api/integrations/types"; +import { TIntegration } from "@app/hooks/api/types"; + +type IProps = { + integration: TIntegration; + environments: Array<{ name: string; slug: string; id: string }>; + onRemoveIntegration: VoidFunction; + onManualSyncIntegration: VoidFunction; +}; + +export const ConfiguredIntegrationItem = ({ + integration, + environments, + onRemoveIntegration, + onManualSyncIntegration +}: IProps) => { + return ( +
+
+
+ +
+ {environments.find((e) => e.id === integration.envId)?.name || "-"} +
+
+
+ +
+ {integration.secretPath} +
+
+
+ +
+
+ + {/* eslint-disable-next-line no-nested-ternary */} + {integration.metadata?.githubVisibility === "selected" + ? "Syncing to selected repositories in the organization. " + : integration.metadata?.githubVisibility === "private" + ? "Syncing to all private repositories in the organization" + : "Syncing to all public and private repositories in the organization"} +
+ ) : undefined + } + label="Integration" + /> +
+ {integrationSlugNameMapping[integration.integration]} +
+
+ {integration.integration === "qovery" && ( +
+
+ +
+ {integration?.owner || "-"} +
+
+
+ +
+ {integration?.targetService || "-"} +
+
+
+ +
+ {integration?.targetEnvironment || "-"} +
+
+
+ )} + {!( + integration.integration === "aws-secret-manager" && + integration.metadata?.mappingBehavior === IntegrationMappingBehavior.ONE_TO_ONE + ) && ( +
+ +
+ {(integration.integration === "hashicorp-vault" && + `${integration.app} - path: ${integration.path}`) || + (integration.scope === "github-org" && `${integration.owner}`) || + (["aws-parameter-store", "rundeck"].includes(integration.integration) && + `${integration.path}`) || + (integration.scope?.startsWith("github-") && + `${integration.owner}/${integration.app}`) || + integration.app} +
+
+ )} + {(integration.integration === "vercel" || + integration.integration === "netlify" || + integration.integration === "railway" || + integration.integration === "gitlab" || + integration.integration === "teamcity" || + integration.integration === "bitbucket" || + (integration.integration === "github" && integration.scope === "github-env")) && ( +
+ +
+ {integration.targetEnvironment || integration.targetEnvironmentId} +
+
+ )} + {integration.integration === "checkly" && integration.targetService && ( +
+ +
+ {integration.targetService} +
+
+ )} + {integration.integration === "terraform-cloud" && integration.targetService && ( +
+ +
+ {integration.targetService} +
+
+ )} + {(integration.integration === "checkly" || integration.integration === "github") && ( +
+ +
+ {integration?.metadata?.secretSuffix || "-"} +
+
+ )} +
+
+ {integration.isSynced != null && integration.lastUsed != null && ( + + +
+ +
Last sync
+
+
+ {format(new Date(integration.lastUsed), "yyyy-MM-dd, hh:mm aaa")} +
+ {!integration.isSynced && ( + <> +
+ +
Fail reason
+
+
{integration.syncMessage}
+ + )} +
+ } + > +
+
{integration.isSynced ? "Synced" : "Not synced"}
+ {!integration.isSynced && } +
+ + + )} +
+ + + +
+ + {(isAllowed: boolean) => ( +
+ + onRemoveIntegration()} + ariaLabel="delete" + isDisabled={!isAllowed} + colorSchema="danger" + variant="star" + > + + + +
+ )} +
+ + + ); +}; diff --git a/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx index 0be10f129..46037dfb4 100644 --- a/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx +++ b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx @@ -1,27 +1,10 @@ -import { faCalendarCheck } from "@fortawesome/free-regular-svg-icons"; -import { faArrowRight, faRefresh, faWarning, faXmark } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { format } from "date-fns"; -import { integrationSlugNameMapping } from "public/data/frequentConstants"; - -import { ProjectPermissionCan } from "@app/components/permissions"; -import { - Button, - Checkbox, - DeleteActionModal, - EmptyState, - FormLabel, - IconButton, - Skeleton, - Tag, - Tooltip -} from "@app/components/v2"; -import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; +import { Checkbox, DeleteActionModal, EmptyState, Skeleton } from "@app/components/v2"; import { usePopUp, useToggle } from "@app/hooks"; import { useSyncIntegration } from "@app/hooks/api/integrations/queries"; -import { IntegrationMappingBehavior } from "@app/hooks/api/integrations/types"; import { TIntegration } from "@app/hooks/api/types"; +import { ConfiguredIntegrationItem } from "./ConfiguredIntegrationItem"; + type Props = { environments: Array<{ name: string; slug: string; id: string }>; integrations?: TIntegration[]; @@ -72,207 +55,22 @@ export const IntegrationsSection = ({ {!isLoading && (
{integrations?.map((integration) => ( -
-
-
- -
- {environments.find((e) => e.id === integration.envId)?.name || "-"} -
-
-
- -
- {integration.secretPath} -
-
-
- -
-
- -
- {integrationSlugNameMapping[integration.integration]} -
-
- {integration.integration === "qovery" && ( -
-
- -
- {integration?.owner || "-"} -
-
-
- -
- {integration?.targetService || "-"} -
-
-
- -
- {integration?.targetEnvironment || "-"} -
-
-
- )} - {!( - integration.integration === "aws-secret-manager" && - integration.metadata?.mappingBehavior === IntegrationMappingBehavior.ONE_TO_ONE - ) && ( -
- -
- {(integration.integration === "hashicorp-vault" && - `${integration.app} - path: ${integration.path}`) || - (integration.scope === "github-org" && `${integration.owner}`) || - (["aws-parameter-store", "rundeck"].includes(integration.integration) && - `${integration.path}`) || - (integration.scope?.startsWith("github-") && - `${integration.owner}/${integration.app}`) || - integration.app} -
-
- )} - {(integration.integration === "vercel" || - integration.integration === "netlify" || - integration.integration === "railway" || - integration.integration === "gitlab" || - integration.integration === "teamcity" || - integration.integration === "bitbucket" || - (integration.integration === "github" && integration.scope === "github-env")) && ( -
- -
- {integration.targetEnvironment || integration.targetEnvironmentId} -
-
- )} - {integration.integration === "checkly" && integration.targetService && ( -
- -
- {integration.targetService} -
-
- )} - {integration.integration === "terraform-cloud" && integration.targetService && ( -
- -
- {integration.targetService} -
-
- )} - {(integration.integration === "checkly" || - integration.integration === "github") && ( -
- -
- {integration?.metadata?.secretSuffix || "-"} -
-
- )} -
-
- {integration.isSynced != null && integration.lastUsed != null && ( - - -
- -
Last sync
-
-
- {format(new Date(integration.lastUsed), "yyyy-MM-dd, hh:mm aaa")} -
- {!integration.isSynced && ( - <> -
- -
Fail reason
-
-
- {integration.syncMessage} -
- - )} -
- } - > -
-
{integration.isSynced ? "Synced" : "Not synced"}
- {!integration.isSynced && } -
- - - )} -
- - - -
- - {(isAllowed: boolean) => ( -
- - { - setShouldDeleteSecrets.off(); - handlePopUpOpen("deleteConfirmation", integration); - }} - ariaLabel="delete" - isDisabled={!isAllowed} - colorSchema="danger" - variant="star" - > - - - -
- )} -
-
-
+ { + syncIntegration({ + workspaceId, + id: integration.id, + lastUsed: integration.lastUsed as string + }); + }} + onRemoveIntegration={() => { + setShouldDeleteSecrets.off(); + handlePopUpOpen("deleteConfirmation", integration); + }} + integration={integration} + environments={environments} + /> ))} )}