From 5d6dd3e77767ce52ba24f523c5bbe0dd3c93b315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Grandin?= Date: Mon, 23 Feb 2026 17:46:39 +0100 Subject: [PATCH 1/9] feat(members): adding members to console v5 and tokenization --- apps/console-v5/src/routeTree.gen.ts | 817 +++++++++++------- .../$organizationId/settings/members.tsx | 3 +- .../organizations/feature/src/index.ts | 1 + .../use-available-roles.ts | 4 +- .../use-invite-members/use-invite-members.ts | 4 +- .../src/lib/hooks/use-members/use-members.ts | 4 +- .../create-modal/create-modal.tsx | 57 +- .../row-member/row-member.tsx | 268 ++++++ .../lib/settings-members/settings-members.tsx | 513 +++++++++++ .../create-modal-feature.tsx | 49 -- .../page-organization-members-feature.tsx | 144 --- .../page-organization-members.tsx | 208 ----- .../row-member/row-member.tsx | 328 ------- libs/shared/ui/src/index.ts | 1 + .../button-icon-action-element.tsx | 70 -- .../button-icon-action.stories.tsx | 36 - .../button-icon-action/button-icon-action.tsx | 26 - .../input-select-small/input-select-small.tsx | 8 +- 18 files changed, 1319 insertions(+), 1222 deletions(-) rename libs/{pages/settings/src/lib/ui/page-organization-members => domains/organizations/feature/src/lib/settings-members}/create-modal/create-modal.tsx (58%) create mode 100644 libs/domains/organizations/feature/src/lib/settings-members/row-member/row-member.tsx create mode 100644 libs/domains/organizations/feature/src/lib/settings-members/settings-members.tsx delete mode 100644 libs/pages/settings/src/lib/feature/page-organization-members-feature/create-modal-feature/create-modal-feature.tsx delete mode 100644 libs/pages/settings/src/lib/feature/page-organization-members-feature/page-organization-members-feature.tsx delete mode 100644 libs/pages/settings/src/lib/ui/page-organization-members/page-organization-members.tsx delete mode 100644 libs/pages/settings/src/lib/ui/page-organization-members/row-member/row-member.tsx delete mode 100644 libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action-element/button-icon-action-element.tsx delete mode 100644 libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action.stories.tsx delete mode 100644 libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action.tsx diff --git a/apps/console-v5/src/routeTree.gen.ts b/apps/console-v5/src/routeTree.gen.ts index e4bd1fa622b..1a4116f6ef8 100644 --- a/apps/console-v5/src/routeTree.gen.ts +++ b/apps/console-v5/src/routeTree.gen.ts @@ -1,83 +1,87 @@ /* eslint-disable */ + // @ts-nocheck + // noinspection JSUnusedGlobalSymbols + // This file was automatically generated by TanStack Router. // You should NOT make any changes in this file as it will be overwritten. // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + import { Route as rootRouteImport } from './routes/__root' import { Route as AuthenticatedRouteImport } from './routes/_authenticated' +import { Route as IndexRouteImport } from './routes/index' +import { Route as LoginIndexRouteImport } from './routes/login/index' +import { Route as LoginAuth0CallbackRouteImport } from './routes/login/auth0-callback' +import { Route as AuthenticatedOrganizationRouteRouteImport } from './routes/_authenticated/organization/route' +import { Route as AuthenticatedOrganizationIndexRouteImport } from './routes/_authenticated/organization/index' import { Route as AuthenticatedAcceptInvitationIndexRouteImport } from './routes/_authenticated/accept-invitation/index' -import { Route as AuthenticatedOnboardingPersonalizeRouteImport } from './routes/_authenticated/onboarding/personalize' -import { Route as AuthenticatedOnboardingPlansRouteImport } from './routes/_authenticated/onboarding/plans' import { Route as AuthenticatedOnboardingProjectRouteImport } from './routes/_authenticated/onboarding/project' -import { Route as AuthenticatedOrganizationOrganizationIdClusterIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/$clusterId/index' -import { Route as AuthenticatedOrganizationOrganizationIdAlertsAlertRulesRouteImport } from './routes/_authenticated/organization/$organizationId/alerts/alert-rules' +import { Route as AuthenticatedOnboardingPlansRouteImport } from './routes/_authenticated/onboarding/plans' +import { Route as AuthenticatedOnboardingPersonalizeRouteImport } from './routes/_authenticated/onboarding/personalize' +import { Route as AuthenticatedOrganizationOrganizationIdRouteRouteImport } from './routes/_authenticated/organization/$organizationId/route' +import { Route as AuthenticatedOrganizationOrganizationIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/index' +import { Route as AuthenticatedOrganizationOrganizationIdOverviewRouteImport } from './routes/_authenticated/organization/$organizationId/overview' +import { Route as AuthenticatedOrganizationOrganizationIdClustersRouteImport } from './routes/_authenticated/organization/$organizationId/clusters' +import { Route as AuthenticatedOrganizationOrganizationIdAuditLogsRouteImport } from './routes/_authenticated/organization/$organizationId/audit-logs' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsRouteRouteImport } from './routes/_authenticated/organization/$organizationId/settings/route' +import { Route as AuthenticatedOrganizationOrganizationIdAlertsRouteRouteImport } from './routes/_authenticated/organization/$organizationId/alerts/route' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsIndexRouteImport } from './routes/_authenticated/organization/$organizationId/settings/index' import { Route as AuthenticatedOrganizationOrganizationIdAlertsIndexRouteImport } from './routes/_authenticated/organization/$organizationId/alerts/index' -import { Route as AuthenticatedOrganizationOrganizationIdAlertsIssuesRouteImport } from './routes/_authenticated/organization/$organizationId/alerts/issues' +import { Route as AuthenticatedOrganizationOrganizationIdClusterIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/$clusterId/index' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsWebhookRouteImport } from './routes/_authenticated/organization/$organizationId/settings/webhook' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsRolesRouteImport } from './routes/_authenticated/organization/$organizationId/settings/roles' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsMembersRouteImport } from './routes/_authenticated/organization/$organizationId/settings/members' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsLabelsAnnotationsRouteImport } from './routes/_authenticated/organization/$organizationId/settings/labels-annotations' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsHelmRepositoriesRouteImport } from './routes/_authenticated/organization/$organizationId/settings/helm-repositories' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsGitRepositoryAccessRouteImport } from './routes/_authenticated/organization/$organizationId/settings/git-repository-access' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/settings/general' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsDangerZoneRouteImport } from './routes/_authenticated/organization/$organizationId/settings/danger-zone' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsContainerRegistriesRouteImport } from './routes/_authenticated/organization/$organizationId/settings/container-registries' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsCloudCredentialsRouteImport } from './routes/_authenticated/organization/$organizationId/settings/cloud-credentials' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsBillingSummaryRouteImport } from './routes/_authenticated/organization/$organizationId/settings/billing-summary' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsBillingDetailsRouteImport } from './routes/_authenticated/organization/$organizationId/settings/billing-details' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsApiTokenRouteImport } from './routes/_authenticated/organization/$organizationId/settings/api-token' +import { Route as AuthenticatedOrganizationOrganizationIdSettingsAiCopilotRouteImport } from './routes/_authenticated/organization/$organizationId/settings/ai-copilot' +import { Route as AuthenticatedOrganizationOrganizationIdClusterNewRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/new' import { Route as AuthenticatedOrganizationOrganizationIdAlertsNotificationChannelRouteImport } from './routes/_authenticated/organization/$organizationId/alerts/notification-channel' -import { Route as AuthenticatedOrganizationOrganizationIdAlertsRouteRouteImport } from './routes/_authenticated/organization/$organizationId/alerts/route' -import { Route as AuthenticatedOrganizationOrganizationIdAuditLogsRouteImport } from './routes/_authenticated/organization/$organizationId/audit-logs' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdClusterLogsRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/cluster-logs' +import { Route as AuthenticatedOrganizationOrganizationIdAlertsIssuesRouteImport } from './routes/_authenticated/organization/$organizationId/alerts/issues' +import { Route as AuthenticatedOrganizationOrganizationIdAlertsAlertRulesRouteImport } from './routes/_authenticated/organization/$organizationId/alerts/alert-rules' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/index' import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/index' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdVariablesRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/variables' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdOverviewRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/overview' import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdOverviewRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/overview' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsAdvancedSettingsRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/advanced-settings' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsCredentialsRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/credentials' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsDangerZoneRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/danger-zone' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsEksAnywhereRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/eks-anywhere' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/general' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsImageRegistryRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/image-registry' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsIndexRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/index' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsNetworkRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/network' -import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsResourcesRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/resources' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdClusterLogsRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/cluster-logs' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/settings/route' +import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/route' import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/route' -import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugFeaturesRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/features' -import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/general' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsIndexRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/settings/index' import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugIndexRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/index' -import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugResourcesRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/resources' -import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/route' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsIndexRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/index' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/settings/general' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsDangerZoneRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/settings/danger-zone' import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugSummaryRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/summary' -import { Route as AuthenticatedOrganizationOrganizationIdClusterNewRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/new' -import { Route as AuthenticatedOrganizationOrganizationIdClustersRouteImport } from './routes/_authenticated/organization/$organizationId/clusters' -import { Route as AuthenticatedOrganizationOrganizationIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/index' -import { Route as AuthenticatedOrganizationOrganizationIdOverviewRouteImport } from './routes/_authenticated/organization/$organizationId/overview' +import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugResourcesRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/resources' +import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/general' +import { Route as AuthenticatedOrganizationOrganizationIdClusterCreateSlugFeaturesRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/create/$slug/features' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsResourcesRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/resources' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsNetworkRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/network' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsImageRegistryRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/image-registry' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/general' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsEksAnywhereRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/eks-anywhere' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsDangerZoneRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/danger-zone' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsCredentialsRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/credentials' +import { Route as AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsAdvancedSettingsRouteImport } from './routes/_authenticated/organization/$organizationId/cluster/$clusterId/settings/advanced-settings' import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/index' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdVariablesRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/variables' import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdOverviewRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/overview' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDangerZoneRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/danger-zone' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDeploymentRulesRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/deployment-rules' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/general' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/route' import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsIndexRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/index' import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsPreviewEnvironmentsRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/preview-environments' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/route' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdVariablesRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/variables' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdIndexRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/index' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdOverviewRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/overview' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsDangerZoneRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/settings/danger-zone' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/settings/general' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsIndexRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/settings/index' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/settings/route' -import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdVariablesRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/variables' -import { Route as AuthenticatedOrganizationOrganizationIdRouteRouteImport } from './routes/_authenticated/organization/$organizationId/route' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsAiCopilotRouteImport } from './routes/_authenticated/organization/$organizationId/settings/ai-copilot' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsApiTokenRouteImport } from './routes/_authenticated/organization/$organizationId/settings/api-token' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsBillingDetailsRouteImport } from './routes/_authenticated/organization/$organizationId/settings/billing-details' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsBillingSummaryRouteImport } from './routes/_authenticated/organization/$organizationId/settings/billing-summary' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsCloudCredentialsRouteImport } from './routes/_authenticated/organization/$organizationId/settings/cloud-credentials' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsContainerRegistriesRouteImport } from './routes/_authenticated/organization/$organizationId/settings/container-registries' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsDangerZoneRouteImport } from './routes/_authenticated/organization/$organizationId/settings/danger-zone' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/settings/general' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsGitRepositoryAccessRouteImport } from './routes/_authenticated/organization/$organizationId/settings/git-repository-access' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsHelmRepositoriesRouteImport } from './routes/_authenticated/organization/$organizationId/settings/helm-repositories' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsIndexRouteImport } from './routes/_authenticated/organization/$organizationId/settings/index' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsLabelsAnnotationsRouteImport } from './routes/_authenticated/organization/$organizationId/settings/labels-annotations' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsMembersRouteImport } from './routes/_authenticated/organization/$organizationId/settings/members' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsRolesRouteImport } from './routes/_authenticated/organization/$organizationId/settings/roles' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsRouteRouteImport } from './routes/_authenticated/organization/$organizationId/settings/route' -import { Route as AuthenticatedOrganizationOrganizationIdSettingsWebhookRouteImport } from './routes/_authenticated/organization/$organizationId/settings/webhook' -import { Route as AuthenticatedOrganizationIndexRouteImport } from './routes/_authenticated/organization/index' -import { Route as AuthenticatedOrganizationRouteRouteImport } from './routes/_authenticated/organization/route' -import { Route as IndexRouteImport } from './routes/index' -import { Route as LoginAuth0CallbackRouteImport } from './routes/login/auth0-callback' -import { Route as LoginIndexRouteImport } from './routes/login/index' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsGeneralRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/general' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDeploymentRulesRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/deployment-rules' +import { Route as AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDangerZoneRouteImport } from './routes/_authenticated/organization/$organizationId/project/$projectId/environment/$environmentId/settings/danger-zone' const AuthenticatedRoute = AuthenticatedRouteImport.update({ id: '/_authenticated', @@ -98,36 +102,42 @@ const LoginAuth0CallbackRoute = LoginAuth0CallbackRouteImport.update({ path: '/login/auth0-callback', getParentRoute: () => rootRouteImport, } as any) -const AuthenticatedOrganizationRouteRoute = AuthenticatedOrganizationRouteRouteImport.update({ - id: '/organization', - path: '/organization', - getParentRoute: () => AuthenticatedRoute, -} as any) -const AuthenticatedOrganizationIndexRoute = AuthenticatedOrganizationIndexRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => AuthenticatedOrganizationRouteRoute, -} as any) -const AuthenticatedAcceptInvitationIndexRoute = AuthenticatedAcceptInvitationIndexRouteImport.update({ - id: '/accept-invitation/', - path: '/accept-invitation/', - getParentRoute: () => AuthenticatedRoute, -} as any) -const AuthenticatedOnboardingProjectRoute = AuthenticatedOnboardingProjectRouteImport.update({ - id: '/onboarding/project', - path: '/onboarding/project', - getParentRoute: () => AuthenticatedRoute, -} as any) -const AuthenticatedOnboardingPlansRoute = AuthenticatedOnboardingPlansRouteImport.update({ - id: '/onboarding/plans', - path: '/onboarding/plans', - getParentRoute: () => AuthenticatedRoute, -} as any) -const AuthenticatedOnboardingPersonalizeRoute = AuthenticatedOnboardingPersonalizeRouteImport.update({ - id: '/onboarding/personalize', - path: '/onboarding/personalize', - getParentRoute: () => AuthenticatedRoute, -} as any) +const AuthenticatedOrganizationRouteRoute = + AuthenticatedOrganizationRouteRouteImport.update({ + id: '/organization', + path: '/organization', + getParentRoute: () => AuthenticatedRoute, + } as any) +const AuthenticatedOrganizationIndexRoute = + AuthenticatedOrganizationIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => AuthenticatedOrganizationRouteRoute, + } as any) +const AuthenticatedAcceptInvitationIndexRoute = + AuthenticatedAcceptInvitationIndexRouteImport.update({ + id: '/accept-invitation/', + path: '/accept-invitation/', + getParentRoute: () => AuthenticatedRoute, + } as any) +const AuthenticatedOnboardingProjectRoute = + AuthenticatedOnboardingProjectRouteImport.update({ + id: '/onboarding/project', + path: '/onboarding/project', + getParentRoute: () => AuthenticatedRoute, + } as any) +const AuthenticatedOnboardingPlansRoute = + AuthenticatedOnboardingPlansRouteImport.update({ + id: '/onboarding/plans', + path: '/onboarding/plans', + getParentRoute: () => AuthenticatedRoute, + } as any) +const AuthenticatedOnboardingPersonalizeRoute = + AuthenticatedOnboardingPersonalizeRouteImport.update({ + id: '/onboarding/personalize', + path: '/onboarding/personalize', + getParentRoute: () => AuthenticatedRoute, + } as any) const AuthenticatedOrganizationOrganizationIdRouteRoute = AuthenticatedOrganizationOrganizationIdRouteRouteImport.update({ id: '/$organizationId', @@ -174,13 +184,15 @@ const AuthenticatedOrganizationOrganizationIdSettingsIndexRoute = AuthenticatedOrganizationOrganizationIdSettingsIndexRouteImport.update({ id: '/', path: '/', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdAlertsIndexRoute = AuthenticatedOrganizationOrganizationIdAlertsIndexRouteImport.update({ id: '/', path: '/', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdAlertsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdAlertsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdClusterIdIndexRoute = AuthenticatedOrganizationOrganizationIdClusterIdIndexRouteImport.update({ @@ -192,85 +204,113 @@ const AuthenticatedOrganizationOrganizationIdSettingsWebhookRoute = AuthenticatedOrganizationOrganizationIdSettingsWebhookRouteImport.update({ id: '/webhook', path: '/webhook', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdSettingsRolesRoute = AuthenticatedOrganizationOrganizationIdSettingsRolesRouteImport.update({ id: '/roles', path: '/roles', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdSettingsMembersRoute = AuthenticatedOrganizationOrganizationIdSettingsMembersRouteImport.update({ id: '/members', path: '/members', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdSettingsLabelsAnnotationsRoute = - AuthenticatedOrganizationOrganizationIdSettingsLabelsAnnotationsRouteImport.update({ - id: '/labels-annotations', - path: '/labels-annotations', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdSettingsLabelsAnnotationsRouteImport.update( + { + id: '/labels-annotations', + path: '/labels-annotations', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdSettingsHelmRepositoriesRoute = - AuthenticatedOrganizationOrganizationIdSettingsHelmRepositoriesRouteImport.update({ - id: '/helm-repositories', - path: '/helm-repositories', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdSettingsHelmRepositoriesRouteImport.update( + { + id: '/helm-repositories', + path: '/helm-repositories', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdSettingsGitRepositoryAccessRoute = - AuthenticatedOrganizationOrganizationIdSettingsGitRepositoryAccessRouteImport.update({ - id: '/git-repository-access', - path: '/git-repository-access', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdSettingsGitRepositoryAccessRouteImport.update( + { + id: '/git-repository-access', + path: '/git-repository-access', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdSettingsGeneralRoute = AuthenticatedOrganizationOrganizationIdSettingsGeneralRouteImport.update({ id: '/general', path: '/general', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdSettingsDangerZoneRoute = AuthenticatedOrganizationOrganizationIdSettingsDangerZoneRouteImport.update({ id: '/danger-zone', path: '/danger-zone', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdSettingsContainerRegistriesRoute = - AuthenticatedOrganizationOrganizationIdSettingsContainerRegistriesRouteImport.update({ - id: '/container-registries', - path: '/container-registries', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdSettingsContainerRegistriesRouteImport.update( + { + id: '/container-registries', + path: '/container-registries', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdSettingsCloudCredentialsRoute = - AuthenticatedOrganizationOrganizationIdSettingsCloudCredentialsRouteImport.update({ - id: '/cloud-credentials', - path: '/cloud-credentials', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdSettingsCloudCredentialsRouteImport.update( + { + id: '/cloud-credentials', + path: '/cloud-credentials', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdSettingsBillingSummaryRoute = - AuthenticatedOrganizationOrganizationIdSettingsBillingSummaryRouteImport.update({ - id: '/billing-summary', - path: '/billing-summary', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdSettingsBillingSummaryRouteImport.update( + { + id: '/billing-summary', + path: '/billing-summary', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdSettingsBillingDetailsRoute = - AuthenticatedOrganizationOrganizationIdSettingsBillingDetailsRouteImport.update({ - id: '/billing-details', - path: '/billing-details', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdSettingsBillingDetailsRouteImport.update( + { + id: '/billing-details', + path: '/billing-details', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdSettingsApiTokenRoute = AuthenticatedOrganizationOrganizationIdSettingsApiTokenRouteImport.update({ id: '/api-token', path: '/api-token', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdSettingsAiCopilotRoute = AuthenticatedOrganizationOrganizationIdSettingsAiCopilotRouteImport.update({ id: '/ai-copilot', path: '/ai-copilot', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdSettingsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdClusterNewRoute = AuthenticatedOrganizationOrganizationIdClusterNewRouteImport.update({ @@ -279,210 +319,294 @@ const AuthenticatedOrganizationOrganizationIdClusterNewRoute = getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdAlertsNotificationChannelRoute = - AuthenticatedOrganizationOrganizationIdAlertsNotificationChannelRouteImport.update({ - id: '/notification-channel', - path: '/notification-channel', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdAlertsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdAlertsNotificationChannelRouteImport.update( + { + id: '/notification-channel', + path: '/notification-channel', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdAlertsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdAlertsIssuesRoute = AuthenticatedOrganizationOrganizationIdAlertsIssuesRouteImport.update({ id: '/issues', path: '/issues', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdAlertsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdAlertsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdAlertsAlertRulesRoute = AuthenticatedOrganizationOrganizationIdAlertsAlertRulesRouteImport.update({ id: '/alert-rules', path: '/alert-rules', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdAlertsRouteRoute, + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdAlertsRouteRoute, } as any) const AuthenticatedOrganizationOrganizationIdProjectProjectIdIndexRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdIndexRouteImport.update({ - id: '/project/$projectId/', - path: '/project/$projectId/', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdIndexRouteImport.update( + { + id: '/project/$projectId/', + path: '/project/$projectId/', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdIndexRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdIndexRouteImport.update({ - id: '/cluster/$clusterId/', - path: '/cluster/$clusterId/', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdIndexRouteImport.update( + { + id: '/cluster/$clusterId/', + path: '/cluster/$clusterId/', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdVariablesRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdVariablesRouteImport.update({ - id: '/project/$projectId/variables', - path: '/project/$projectId/variables', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdVariablesRouteImport.update( + { + id: '/project/$projectId/variables', + path: '/project/$projectId/variables', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdOverviewRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdOverviewRouteImport.update({ - id: '/project/$projectId/overview', - path: '/project/$projectId/overview', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdOverviewRouteImport.update( + { + id: '/project/$projectId/overview', + path: '/project/$projectId/overview', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdOverviewRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdOverviewRouteImport.update({ - id: '/cluster/$clusterId/overview', - path: '/cluster/$clusterId/overview', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdOverviewRouteImport.update( + { + id: '/cluster/$clusterId/overview', + path: '/cluster/$clusterId/overview', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdClusterLogsRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdClusterLogsRouteImport.update({ - id: '/cluster/$clusterId/cluster-logs', - path: '/cluster/$clusterId/cluster-logs', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdClusterLogsRouteImport.update( + { + id: '/cluster/$clusterId/cluster-logs', + path: '/cluster/$clusterId/cluster-logs', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRouteImport.update({ - id: '/project/$projectId/settings', - path: '/project/$projectId/settings', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRouteImport.update( + { + id: '/project/$projectId/settings', + path: '/project/$projectId/settings', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute = - AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRouteImport.update({ - id: '/cluster/create/$slug', - path: '/cluster/create/$slug', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRouteImport.update( + { + id: '/cluster/create/$slug', + path: '/cluster/create/$slug', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRouteImport.update({ - id: '/cluster/$clusterId/settings', - path: '/cluster/$clusterId/settings', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRouteImport.update( + { + id: '/cluster/$clusterId/settings', + path: '/cluster/$clusterId/settings', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsIndexRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsIndexRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsIndexRouteImport.update( + { + id: '/', + path: '/', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterCreateSlugIndexRoute = - AuthenticatedOrganizationOrganizationIdClusterCreateSlugIndexRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterCreateSlugIndexRouteImport.update( + { + id: '/', + path: '/', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsIndexRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsIndexRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsIndexRouteImport.update( + { + id: '/', + path: '/', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsGeneralRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsGeneralRouteImport.update({ - id: '/general', - path: '/general', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsGeneralRouteImport.update( + { + id: '/general', + path: '/general', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsDangerZoneRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsDangerZoneRouteImport.update({ - id: '/danger-zone', - path: '/danger-zone', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsDangerZoneRouteImport.update( + { + id: '/danger-zone', + path: '/danger-zone', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterCreateSlugSummaryRoute = - AuthenticatedOrganizationOrganizationIdClusterCreateSlugSummaryRouteImport.update({ - id: '/summary', - path: '/summary', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterCreateSlugSummaryRouteImport.update( + { + id: '/summary', + path: '/summary', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterCreateSlugResourcesRoute = - AuthenticatedOrganizationOrganizationIdClusterCreateSlugResourcesRouteImport.update({ - id: '/resources', - path: '/resources', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterCreateSlugResourcesRouteImport.update( + { + id: '/resources', + path: '/resources', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterCreateSlugGeneralRoute = - AuthenticatedOrganizationOrganizationIdClusterCreateSlugGeneralRouteImport.update({ - id: '/general', - path: '/general', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterCreateSlugGeneralRouteImport.update( + { + id: '/general', + path: '/general', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterCreateSlugFeaturesRoute = - AuthenticatedOrganizationOrganizationIdClusterCreateSlugFeaturesRouteImport.update({ - id: '/features', - path: '/features', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterCreateSlugFeaturesRouteImport.update( + { + id: '/features', + path: '/features', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsResourcesRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsResourcesRouteImport.update({ - id: '/resources', - path: '/resources', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsResourcesRouteImport.update( + { + id: '/resources', + path: '/resources', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsNetworkRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsNetworkRouteImport.update({ - id: '/network', - path: '/network', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsNetworkRouteImport.update( + { + id: '/network', + path: '/network', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsImageRegistryRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsImageRegistryRouteImport.update({ - id: '/image-registry', - path: '/image-registry', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsImageRegistryRouteImport.update( + { + id: '/image-registry', + path: '/image-registry', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsGeneralRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsGeneralRouteImport.update({ - id: '/general', - path: '/general', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsGeneralRouteImport.update( + { + id: '/general', + path: '/general', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsEksAnywhereRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsEksAnywhereRouteImport.update({ - id: '/eks-anywhere', - path: '/eks-anywhere', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsEksAnywhereRouteImport.update( + { + id: '/eks-anywhere', + path: '/eks-anywhere', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsDangerZoneRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsDangerZoneRouteImport.update({ - id: '/danger-zone', - path: '/danger-zone', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsDangerZoneRouteImport.update( + { + id: '/danger-zone', + path: '/danger-zone', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsCredentialsRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsCredentialsRouteImport.update({ - id: '/credentials', - path: '/credentials', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsCredentialsRouteImport.update( + { + id: '/credentials', + path: '/credentials', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsAdvancedSettingsRoute = - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsAdvancedSettingsRouteImport.update({ - id: '/advanced-settings', - path: '/advanced-settings', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsAdvancedSettingsRouteImport.update( + { + id: '/advanced-settings', + path: '/advanced-settings', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdIndexRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdIndexRouteImport.update({ - id: '/project/$projectId/environment/$environmentId/', - path: '/project/$projectId/environment/$environmentId/', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdIndexRouteImport.update( + { + id: '/project/$projectId/environment/$environmentId/', + path: '/project/$projectId/environment/$environmentId/', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdVariablesRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdVariablesRouteImport.update({ - id: '/project/$projectId/environment/$environmentId/variables', - path: '/project/$projectId/environment/$environmentId/variables', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdVariablesRouteImport.update( + { + id: '/project/$projectId/environment/$environmentId/variables', + path: '/project/$projectId/environment/$environmentId/variables', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdOverviewRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdOverviewRouteImport.update({ - id: '/project/$projectId/environment/$environmentId/overview', - path: '/project/$projectId/environment/$environmentId/overview', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdOverviewRouteImport.update( + { + id: '/project/$projectId/environment/$environmentId/overview', + path: '/project/$projectId/environment/$environmentId/overview', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRouteImport.update({ - id: '/project/$projectId/environment/$environmentId/settings', - path: '/project/$projectId/environment/$environmentId/settings', - getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRouteImport.update( + { + id: '/project/$projectId/environment/$environmentId/settings', + path: '/project/$projectId/environment/$environmentId/settings', + getParentRoute: () => AuthenticatedOrganizationOrganizationIdRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsIndexRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsIndexRouteImport.update({ - id: '/', - path: '/', - getParentRoute: () => - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsIndexRouteImport.update( + { + id: '/', + path: '/', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsPreviewEnvironmentsRoute = AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsPreviewEnvironmentsRouteImport.update( { @@ -490,15 +614,17 @@ const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironm path: '/preview-environments', getParentRoute: () => AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute, - } as any + } as any, ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsGeneralRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsGeneralRouteImport.update({ - id: '/general', - path: '/general', - getParentRoute: () => - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsGeneralRouteImport.update( + { + id: '/general', + path: '/general', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute, + } as any, + ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDeploymentRulesRoute = AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDeploymentRulesRouteImport.update( { @@ -506,15 +632,17 @@ const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironm path: '/deployment-rules', getParentRoute: () => AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute, - } as any + } as any, ) const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDangerZoneRoute = - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDangerZoneRouteImport.update({ - id: '/danger-zone', - path: '/danger-zone', - getParentRoute: () => - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute, - } as any) + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsDangerZoneRouteImport.update( + { + id: '/danger-zone', + path: '/danger-zone', + getParentRoute: () => + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute, + } as any, + ) export interface FileRoutesByFullPath { '/': typeof IndexRoute @@ -1484,15 +1612,17 @@ const AuthenticatedOrganizationOrganizationIdAlertsRouteRouteChildren: Authentic { AuthenticatedOrganizationOrganizationIdAlertsAlertRulesRoute: AuthenticatedOrganizationOrganizationIdAlertsAlertRulesRoute, - AuthenticatedOrganizationOrganizationIdAlertsIssuesRoute: AuthenticatedOrganizationOrganizationIdAlertsIssuesRoute, + AuthenticatedOrganizationOrganizationIdAlertsIssuesRoute: + AuthenticatedOrganizationOrganizationIdAlertsIssuesRoute, AuthenticatedOrganizationOrganizationIdAlertsNotificationChannelRoute: AuthenticatedOrganizationOrganizationIdAlertsNotificationChannelRoute, - AuthenticatedOrganizationOrganizationIdAlertsIndexRoute: AuthenticatedOrganizationOrganizationIdAlertsIndexRoute, + AuthenticatedOrganizationOrganizationIdAlertsIndexRoute: + AuthenticatedOrganizationOrganizationIdAlertsIndexRoute, } const AuthenticatedOrganizationOrganizationIdAlertsRouteRouteWithChildren = AuthenticatedOrganizationOrganizationIdAlertsRouteRoute._addFileChildren( - AuthenticatedOrganizationOrganizationIdAlertsRouteRouteChildren + AuthenticatedOrganizationOrganizationIdAlertsRouteRouteChildren, ) interface AuthenticatedOrganizationOrganizationIdSettingsRouteRouteChildren { @@ -1549,7 +1679,7 @@ const AuthenticatedOrganizationOrganizationIdSettingsRouteRouteChildren: Authent const AuthenticatedOrganizationOrganizationIdSettingsRouteRouteWithChildren = AuthenticatedOrganizationOrganizationIdSettingsRouteRoute._addFileChildren( - AuthenticatedOrganizationOrganizationIdSettingsRouteRouteChildren + AuthenticatedOrganizationOrganizationIdSettingsRouteRouteChildren, ) interface AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRouteChildren { @@ -1588,7 +1718,7 @@ const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRouteC const AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRouteWithChildren = AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute._addFileChildren( - AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRouteChildren + AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRouteChildren, ) interface AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRouteChildren { @@ -1615,7 +1745,7 @@ const AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRouteChildren const AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRouteWithChildren = AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRoute._addFileChildren( - AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRouteChildren + AuthenticatedOrganizationOrganizationIdClusterCreateSlugRouteRouteChildren, ) interface AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRouteChildren { @@ -1636,7 +1766,7 @@ const AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRouteC const AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRouteWithChildren = AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRoute._addFileChildren( - AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRouteChildren + AuthenticatedOrganizationOrganizationIdProjectProjectIdSettingsRouteRouteChildren, ) interface AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRouteChildren { @@ -1663,7 +1793,7 @@ const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironm const AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRouteWithChildren = AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRoute._addFileChildren( - AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRouteChildren + AuthenticatedOrganizationOrganizationIdProjectProjectIdEnvironmentEnvironmentIdSettingsRouteRouteChildren, ) interface AuthenticatedOrganizationOrganizationIdRouteRouteChildren { @@ -1696,11 +1826,16 @@ const AuthenticatedOrganizationOrganizationIdRouteRouteChildren: AuthenticatedOr AuthenticatedOrganizationOrganizationIdAlertsRouteRouteWithChildren, AuthenticatedOrganizationOrganizationIdSettingsRouteRoute: AuthenticatedOrganizationOrganizationIdSettingsRouteRouteWithChildren, - AuthenticatedOrganizationOrganizationIdAuditLogsRoute: AuthenticatedOrganizationOrganizationIdAuditLogsRoute, - AuthenticatedOrganizationOrganizationIdClustersRoute: AuthenticatedOrganizationOrganizationIdClustersRoute, - AuthenticatedOrganizationOrganizationIdOverviewRoute: AuthenticatedOrganizationOrganizationIdOverviewRoute, - AuthenticatedOrganizationOrganizationIdIndexRoute: AuthenticatedOrganizationOrganizationIdIndexRoute, - AuthenticatedOrganizationOrganizationIdClusterNewRoute: AuthenticatedOrganizationOrganizationIdClusterNewRoute, + AuthenticatedOrganizationOrganizationIdAuditLogsRoute: + AuthenticatedOrganizationOrganizationIdAuditLogsRoute, + AuthenticatedOrganizationOrganizationIdClustersRoute: + AuthenticatedOrganizationOrganizationIdClustersRoute, + AuthenticatedOrganizationOrganizationIdOverviewRoute: + AuthenticatedOrganizationOrganizationIdOverviewRoute, + AuthenticatedOrganizationOrganizationIdIndexRoute: + AuthenticatedOrganizationOrganizationIdIndexRoute, + AuthenticatedOrganizationOrganizationIdClusterNewRoute: + AuthenticatedOrganizationOrganizationIdClusterNewRoute, AuthenticatedOrganizationOrganizationIdClusterIdIndexRoute: AuthenticatedOrganizationOrganizationIdClusterIdIndexRoute, AuthenticatedOrganizationOrganizationIdClusterClusterIdSettingsRouteRoute: @@ -1733,7 +1868,7 @@ const AuthenticatedOrganizationOrganizationIdRouteRouteChildren: AuthenticatedOr const AuthenticatedOrganizationOrganizationIdRouteRouteWithChildren = AuthenticatedOrganizationOrganizationIdRouteRoute._addFileChildren( - AuthenticatedOrganizationOrganizationIdRouteRouteChildren + AuthenticatedOrganizationOrganizationIdRouteRouteChildren, ) interface AuthenticatedOrganizationRouteRouteChildren { @@ -1741,14 +1876,17 @@ interface AuthenticatedOrganizationRouteRouteChildren { AuthenticatedOrganizationIndexRoute: typeof AuthenticatedOrganizationIndexRoute } -const AuthenticatedOrganizationRouteRouteChildren: AuthenticatedOrganizationRouteRouteChildren = { - AuthenticatedOrganizationOrganizationIdRouteRoute: AuthenticatedOrganizationOrganizationIdRouteRouteWithChildren, - AuthenticatedOrganizationIndexRoute: AuthenticatedOrganizationIndexRoute, -} +const AuthenticatedOrganizationRouteRouteChildren: AuthenticatedOrganizationRouteRouteChildren = + { + AuthenticatedOrganizationOrganizationIdRouteRoute: + AuthenticatedOrganizationOrganizationIdRouteRouteWithChildren, + AuthenticatedOrganizationIndexRoute: AuthenticatedOrganizationIndexRoute, + } -const AuthenticatedOrganizationRouteRouteWithChildren = AuthenticatedOrganizationRouteRoute._addFileChildren( - AuthenticatedOrganizationRouteRouteChildren -) +const AuthenticatedOrganizationRouteRouteWithChildren = + AuthenticatedOrganizationRouteRoute._addFileChildren( + AuthenticatedOrganizationRouteRouteChildren, + ) interface AuthenticatedRouteChildren { AuthenticatedOrganizationRouteRoute: typeof AuthenticatedOrganizationRouteRouteWithChildren @@ -1759,14 +1897,19 @@ interface AuthenticatedRouteChildren { } const AuthenticatedRouteChildren: AuthenticatedRouteChildren = { - AuthenticatedOrganizationRouteRoute: AuthenticatedOrganizationRouteRouteWithChildren, - AuthenticatedOnboardingPersonalizeRoute: AuthenticatedOnboardingPersonalizeRoute, + AuthenticatedOrganizationRouteRoute: + AuthenticatedOrganizationRouteRouteWithChildren, + AuthenticatedOnboardingPersonalizeRoute: + AuthenticatedOnboardingPersonalizeRoute, AuthenticatedOnboardingPlansRoute: AuthenticatedOnboardingPlansRoute, AuthenticatedOnboardingProjectRoute: AuthenticatedOnboardingProjectRoute, - AuthenticatedAcceptInvitationIndexRoute: AuthenticatedAcceptInvitationIndexRoute, + AuthenticatedAcceptInvitationIndexRoute: + AuthenticatedAcceptInvitationIndexRoute, } -const AuthenticatedRouteWithChildren = AuthenticatedRoute._addFileChildren(AuthenticatedRouteChildren) +const AuthenticatedRouteWithChildren = AuthenticatedRoute._addFileChildren( + AuthenticatedRouteChildren, +) const rootRouteChildren: RootRouteChildren = { IndexRoute: IndexRoute, @@ -1774,4 +1917,6 @@ const rootRouteChildren: RootRouteChildren = { LoginAuth0CallbackRoute: LoginAuth0CallbackRoute, LoginIndexRoute: LoginIndexRoute, } -export const routeTree = rootRouteImport._addFileChildren(rootRouteChildren)._addFileTypes() +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/apps/console-v5/src/routes/_authenticated/organization/$organizationId/settings/members.tsx b/apps/console-v5/src/routes/_authenticated/organization/$organizationId/settings/members.tsx index 74e75babc62..2fdebeef19c 100644 --- a/apps/console-v5/src/routes/_authenticated/organization/$organizationId/settings/members.tsx +++ b/apps/console-v5/src/routes/_authenticated/organization/$organizationId/settings/members.tsx @@ -1,9 +1,10 @@ import { createFileRoute } from '@tanstack/react-router' +import { SettingsMembers } from '@qovery/domains/organizations/feature' export const Route = createFileRoute('/_authenticated/organization/$organizationId/settings/members')({ component: RouteComponent, }) function RouteComponent() { - return
Hello "/_authenticated/organization/$organizationId/settings/members"!
+ return } diff --git a/libs/domains/organizations/feature/src/index.ts b/libs/domains/organizations/feature/src/index.ts index 8a6505183f8..3aaec5710d9 100644 --- a/libs/domains/organizations/feature/src/index.ts +++ b/libs/domains/organizations/feature/src/index.ts @@ -98,3 +98,4 @@ export * from './lib/settings-webhook/settings-webhook' export * from './lib/settings-api-token/settings-api-token' export * from './lib/settings-danger-zone/settings-danger-zone' export * from './lib/settings-billing-details/settings-billing-details' +export * from './lib/settings-members/settings-members' diff --git a/libs/domains/organizations/feature/src/lib/hooks/use-available-roles/use-available-roles.ts b/libs/domains/organizations/feature/src/lib/hooks/use-available-roles/use-available-roles.ts index 94bc5b84a43..314408f8590 100644 --- a/libs/domains/organizations/feature/src/lib/hooks/use-available-roles/use-available-roles.ts +++ b/libs/domains/organizations/feature/src/lib/hooks/use-available-roles/use-available-roles.ts @@ -3,9 +3,10 @@ import { queries } from '@qovery/state/util-queries' export interface UseAvailableRolesProps { organizationId: string + suspense?: boolean } -export function useAvailableRoles({ organizationId }: UseAvailableRolesProps) { +export function useAvailableRoles({ organizationId, suspense = false }: UseAvailableRolesProps) { return useQuery({ ...queries.organizations.availableRoles({ organizationId }), select(data) { @@ -14,6 +15,7 @@ export function useAvailableRoles({ organizationId }: UseAvailableRolesProps) { } return data.sort((a, b) => (a.name && b.name ? a.name.localeCompare(b.name) : 0)) }, + suspense, }) } diff --git a/libs/domains/organizations/feature/src/lib/hooks/use-invite-members/use-invite-members.ts b/libs/domains/organizations/feature/src/lib/hooks/use-invite-members/use-invite-members.ts index 8e46c5ad120..5d4842bac17 100644 --- a/libs/domains/organizations/feature/src/lib/hooks/use-invite-members/use-invite-members.ts +++ b/libs/domains/organizations/feature/src/lib/hooks/use-invite-members/use-invite-members.ts @@ -3,9 +3,10 @@ import { queries } from '@qovery/state/util-queries' export interface UseInviteMembersProps { organizationId: string + suspense?: boolean } -export function useInviteMembers({ organizationId }: UseInviteMembersProps) { +export function useInviteMembers({ organizationId, suspense = false }: UseInviteMembersProps) { return useQuery({ ...queries.organizations.inviteMembers({ organizationId }), select(data) { @@ -14,6 +15,7 @@ export function useInviteMembers({ organizationId }: UseInviteMembersProps) { } return data.sort((a, b) => a.email.localeCompare(b.email)) }, + suspense, }) } diff --git a/libs/domains/organizations/feature/src/lib/hooks/use-members/use-members.ts b/libs/domains/organizations/feature/src/lib/hooks/use-members/use-members.ts index 807fe377365..a8fc4805b28 100644 --- a/libs/domains/organizations/feature/src/lib/hooks/use-members/use-members.ts +++ b/libs/domains/organizations/feature/src/lib/hooks/use-members/use-members.ts @@ -3,14 +3,16 @@ import { queries } from '@qovery/state/util-queries' export interface UseMembersProps { organizationId: string + suspense?: boolean } -export function useMembers({ organizationId }: UseMembersProps) { +export function useMembers({ organizationId, suspense = false }: UseMembersProps) { return useQuery({ ...queries.organizations.members({ organizationId }), meta: { notifyOnError: true, }, + suspense, }) } diff --git a/libs/pages/settings/src/lib/ui/page-organization-members/create-modal/create-modal.tsx b/libs/domains/organizations/feature/src/lib/settings-members/create-modal/create-modal.tsx similarity index 58% rename from libs/pages/settings/src/lib/ui/page-organization-members/create-modal/create-modal.tsx rename to libs/domains/organizations/feature/src/lib/settings-members/create-modal/create-modal.tsx index 7ff410c73a1..c5865c8b8cb 100644 --- a/libs/pages/settings/src/lib/ui/page-organization-members/create-modal/create-modal.tsx +++ b/libs/domains/organizations/feature/src/lib/settings-members/create-modal/create-modal.tsx @@ -1,28 +1,49 @@ -import { type OrganizationAvailableRole } from 'qovery-typescript-axios' -import { Controller, useFormContext } from 'react-hook-form' +import { type InviteMemberRequest, type OrganizationAvailableRole } from 'qovery-typescript-axios' +import { Controller, FormProvider, useForm, useFormContext } from 'react-hook-form' import { InputSelect, InputText, ModalCrud } from '@qovery/shared/ui' import { upperCaseFirstLetter } from '@qovery/shared/util-js' +import { useCreateInviteMember } from '../../hooks/use-create-invite-member/use-create-invite-member' export interface CreateModalProps { - availableRoles: OrganizationAvailableRole[] - onSubmit: () => void onClose: () => void - loading?: boolean + availableRoles: OrganizationAvailableRole[] + organizationId?: string } export function CreateModal(props: CreateModalProps) { - const { availableRoles } = props - const { control } = useFormContext() + const { organizationId = '', availableRoles, onClose } = props + const { mutateAsync: createInviteMember, isLoading: isLoadingInviteMember } = useCreateInviteMember() + + const methods = useForm({ + mode: 'onChange', + defaultValues: { + // default value with admin id + role_id: availableRoles[0]?.id, + }, + }) + const { control } = methods + + const onSubmit = methods.handleSubmit(async (data) => { + try { + await createInviteMember({ + organizationId, + inviteMemberRequest: data as InviteMemberRequest, + }) + onClose() + } catch (error) { + console.error(error) + } + }) return ( - -
+ + ( ({ label: upperCaseFirstLetter(availableRole.name), @@ -69,8 +90,8 @@ export function CreateModal(props: CreateModalProps) { /> )} /> -
-
+ + ) } diff --git a/libs/domains/organizations/feature/src/lib/settings-members/row-member/row-member.tsx b/libs/domains/organizations/feature/src/lib/settings-members/row-member/row-member.tsx new file mode 100644 index 00000000000..30f0ee60a95 --- /dev/null +++ b/libs/domains/organizations/feature/src/lib/settings-members/row-member/row-member.tsx @@ -0,0 +1,268 @@ +import { + type InviteMember, + type InviteMemberRequest, + type Member, + type OrganizationAvailableRole, +} from 'qovery-typescript-axios' +import { IconEnum, MemberRoleEnum } from '@qovery/shared/enums' +import { + Avatar, + ButtonPrimitive, + DropdownMenu, + Icon, + Indicator, + InputSelectSmall, + TablePrimitives, + ToastEnum, + Tooltip, + toast, + useModalConfirmation, +} from '@qovery/shared/ui' +import { dateMediumLocalFormat, dateUTCString, timeAgo } from '@qovery/shared/util-dates' +import { useCopyToClipboard } from '@qovery/shared/util-hooks' +import { upperCaseFirstLetter } from '@qovery/shared/util-js' + +export interface RowMemberProps { + member: Member | InviteMember + columnSizes: number[] + transferOwnership?: (user: Member) => void + editMemberRole?: (userId: string, roleId: string) => void + deleteMember?: (userId: string) => void + deleteInviteMember?: (inviteId: string) => void + resendInvite?: (inviteId: string, data: InviteMemberRequest) => void + availableRoles?: OrganizationAvailableRole[] + loadingUpdateRole?: boolean + userIsOwner?: boolean +} + +const { Table } = TablePrimitives + +const getProviderIcon = (id: string): IconEnum | undefined => { + if (id.toUpperCase().includes('GITHUB')) { + return IconEnum.GITHUB + } else if (id.toUpperCase().includes('GITLAB')) { + return IconEnum.GITLAB + } else if (id.toUpperCase().includes('BITBUCKET')) { + return IconEnum.BITBUCKET + } else if (id.toUpperCase().includes('GOOGLE')) { + return IconEnum.GOOGLE + } else if (id.toUpperCase().includes('WINDOWSLIVE')) { + return IconEnum.MICROSOFT + } else { + return undefined + } +} + +export function RowMember(props: RowMemberProps) { + const { + member, + availableRoles, + editMemberRole, + loadingUpdateRole, + columnSizes, + deleteMember, + deleteInviteMember, + transferOwnership, + resendInvite, + userIsOwner, + } = props + + const [, copyToClipboard] = useCopyToClipboard() + const { openModalConfirmation } = useModalConfirmation() + + const name = (member as Member).name?.split(' ') || (member as InviteMember).email.split(' ') + + const isOwner = member.role_name?.toUpperCase() === MemberRoleEnum.OWNER + + const canEditRole = !isOwner && Boolean((member as Member).last_activity_at) + + const roleOptions = + availableRoles?.map((role) => ({ + label: upperCaseFirstLetter(role.name), + value: role.id || role.name || '', + })) ?? [] + const selectedRoleValue = + availableRoles?.find((role) => role.name?.toUpperCase() === member.role_name?.toUpperCase())?.id ?? + member.role_id ?? + '' + + const handleRoleChange = (roleId: string | undefined) => { + if (!roleId) return + editMemberRole?.(member.id, roleId) + } + + return ( + + +
+
+ {name && ( + + + + ) + } + > + + {name[0]?.charAt(0).toUpperCase()} + {name[1]?.charAt(0).toUpperCase()} + + } + /> + + )} +
+

{(member as Member).name}

+ {member.email} +
+
+ {!isOwner && ( + <> + {(member as Member).last_activity_at ? ( + + + + + + + + {userIsOwner ? ( + <> + } + onSelect={() => transferOwnership?.(member as Member)} + > + Transfer ownership + + + + ) : null} + } + onSelect={() => { + openModalConfirmation({ + title: 'Confirm to remove this member', + confirmationMethod: 'action', + name: (member as Member).name, + action: () => deleteMember?.(member.id), + }) + }} + > + Delete member + + + + ) : ( + + + + + + + + } + onSelect={() => { + resendInvite?.(member.id, { email: member.email, role_id: member.role_id }) + }} + > + Resend invite + + } + onSelect={() => { + copyToClipboard((member as InviteMember).invitation_link) + toast(ToastEnum.SUCCESS, 'Copied to your clipboard!') + }} + > + Copy invitation link + + + } + onSelect={() => { + openModalConfirmation({ + title: 'Confirm to remove this invite', + confirmationMethod: 'action', + name: (member as InviteMember).email, + action: () => deleteInviteMember?.(member.id), + }) + }} + > + Revoke invite + + + + )} + + )} +
+
+ +
+ +
+
+ + {(member as Member).last_activity_at ? ( + + + {timeAgo(new Date((member as Member).last_activity_at || ''))} ago + + + ) : ( + {upperCaseFirstLetter((member as InviteMember).invitation_status)} + )} + + + + {dateMediumLocalFormat(member.created_at)} + + +
+ ) +} + +export default RowMember diff --git a/libs/domains/organizations/feature/src/lib/settings-members/settings-members.tsx b/libs/domains/organizations/feature/src/lib/settings-members/settings-members.tsx new file mode 100644 index 00000000000..059cf662c0f --- /dev/null +++ b/libs/domains/organizations/feature/src/lib/settings-members/settings-members.tsx @@ -0,0 +1,513 @@ +import { useAuth0 } from '@auth0/auth0-react' +import { useParams } from '@tanstack/react-router' +import { + type SortingState, + createColumnHelper, + flexRender, + getCoreRowModel, + getFacetedRowModel, + getFacetedUniqueValues, + getFilteredRowModel, + getSortedRowModel, + useReactTable, +} from '@tanstack/react-table' +import { + EnvironmentModeEnum, + type InviteMember, + type InviteMemberRequest, + type Member, + type OrganizationAvailableRole, +} from 'qovery-typescript-axios' +import { Suspense, useEffect, useMemo, useRef, useState } from 'react' +import { match } from 'ts-pattern' +import { SettingsHeading } from '@qovery/shared/console-shared' +import { MemberRoleEnum } from '@qovery/shared/enums' +import { + Button, + Callout, + Icon, + Section, + Skeleton as SkeletonPrimitive, + TableFilter, + TablePrimitives, + useModal, + useModalConfirmation, +} from '@qovery/shared/ui' +import { useDocumentTitle } from '@qovery/shared/util-hooks' +import { pluralize } from '@qovery/shared/util-js' +import { NODE_ENV } from '@qovery/shared/util-node-env' +import { type SerializedError } from '@qovery/shared/utils' +import { useAvailableRoles } from '../hooks/use-available-roles/use-available-roles' +import { useCreateInviteMember } from '../hooks/use-create-invite-member/use-create-invite-member' +import { useDeleteInviteMember } from '../hooks/use-delete-invite-member/use-delete-invite-member' +import { useDeleteMember } from '../hooks/use-delete-member/use-delete-member' +import { useEditMemberRole } from '../hooks/use-edit-member-role/use-edit-member-role' +import { useInviteMembers } from '../hooks/use-invite-members/use-invite-members' +import { useMembers } from '../hooks/use-members/use-members' +import { useTransferOwnershipMemberRole } from '../hooks/use-transfer-ownership-member-role/use-transfer-ownership-member-role' +import CreateModal from './create-modal/create-modal' +import RowMember from './row-member/row-member' + +const { Table } = TablePrimitives + +const Skeleton = () => { + const columnSizes = ['35%', '22%', '21%', '21%'] + + return ( + + + + {columnSizes.map((columnSize, index) => ( + + + + ))} + + + + {Array.from({ length: 10 }).map((_, rowIndex) => ( + + +
+
+ +
+ + +
+
+ +
+
+ + + + + + + + + +
+ ))} +
+
+ ) +} + +interface MembersTableProps { + editMemberRole: (userId: string, roleId: string) => void + deleteMember: (userId: string) => void + deleteInviteMember: (inviteId: string) => void + resendInvite: (inviteId: string, data: InviteMemberRequest) => void + transferOwnership: (user: Member) => void + loadingUpdateRole: { userId: string; loading: boolean } + members?: Member[] + inviteMembers?: InviteMember[] + availableRoles?: OrganizationAvailableRole[] + userId?: string +} + +interface MembersTableWithDataProps extends Omit< + MembersTableProps, + 'members' | 'inviteMembers' | 'availableRoles' +> { + organizationId: string +} + +const MembersTable = (props: MembersTableProps) => { + const { + members = [], + inviteMembers = [], + deleteInviteMember, + availableRoles, + editMemberRole, + loadingUpdateRole, + deleteMember, + transferOwnership, + userId, + resendInvite, + } = props + + const columnSizes = [35, 22, 21, 21] + const membersCountLabel = `${pluralize(members.length, 'Member', 'Members')} (${members.length})` + + const memberColumnHelper = createColumnHelper() + const inviteColumnHelper = createColumnHelper() + + const memberColumns = useMemo( + () => [ + memberColumnHelper.display({ + id: 'member', + header: 'Member', + }), + memberColumnHelper.accessor('role_name', { + header: 'Roles', + enableColumnFilter: true, + enableSorting: false, + filterFn: 'arrIncludesSome', + }), + memberColumnHelper.accessor( + (member) => (member.last_activity_at ? new Date(member.last_activity_at).getTime() : 0), + { + id: 'last_activity_at', + header: 'Last activity', + enableColumnFilter: false, + enableSorting: true, + } + ), + memberColumnHelper.accessor((member) => new Date(member.created_at).getTime(), { + id: 'created_at', + header: 'Member since', + enableColumnFilter: false, + enableSorting: true, + }), + ], + [] + ) + + const inviteColumns = useMemo( + () => [ + inviteColumnHelper.display({ + id: 'invite_member', + header: 'Pending members', + }), + inviteColumnHelper.display({ + id: 'invite_roles', + header: 'Roles', + }), + inviteColumnHelper.display({ + id: 'invite_status', + header: 'Status', + }), + inviteColumnHelper.accessor((member) => new Date(member.created_at).getTime(), { + id: 'created_at', + header: 'Sent since', + enableColumnFilter: false, + enableSorting: true, + }), + ], + [] + ) + + const [memberSorting, setMemberSorting] = useState([]) + const [inviteSorting, setInviteSorting] = useState([]) + + const membersTable = useReactTable({ + data: members, + columns: memberColumns, + state: { + sorting: memberSorting, + }, + onSortingChange: setMemberSorting, + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getFilteredRowModel: getFilteredRowModel(), + getFacetedRowModel: getFacetedRowModel(), + getFacetedUniqueValues: getFacetedUniqueValues(), + // https://github.com/TanStack/table/discussions/3192#discussioncomment-6458134 + defaultColumn: { + minSize: 0, + size: Number.MAX_SAFE_INTEGER, + maxSize: Number.MAX_SAFE_INTEGER, + }, + }) + + const inviteTable = useReactTable({ + data: inviteMembers, + columns: inviteColumns, + state: { + sorting: inviteSorting, + }, + onSortingChange: setInviteSorting, + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + // https://github.com/TanStack/table/discussions/3192#discussioncomment-6458134 + defaultColumn: { + minSize: 0, + size: Number.MAX_SAFE_INTEGER, + maxSize: Number.MAX_SAFE_INTEGER, + }, + }) + + const userIsOwner = members.find((member) => member.id === userId) + + return ( + <> + + + {membersTable.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header, index) => ( + + {header.isPlaceholder ? null : index === 0 ? ( + membersCountLabel + ) : header.column.getCanFilter() ? ( + + ) : header.column.getCanSort() ? ( + + ) : ( + flexRender(header.column.columnDef.header, header.getContext()) + )} + + ))} + + ))} + + + {membersTable.getRowModel().rows.map((row) => ( + + ))} + + + {inviteMembers.length > 0 && ( + + + {inviteTable.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header, index) => ( + + {header.isPlaceholder ? null : header.column.getCanSort() ? ( + + ) : ( + flexRender(header.column.columnDef.header, header.getContext()) + )} + + ))} + + ))} + + + {inviteTable.getRowModel().rows.map((row) => ( + + ))} + + + )} + + ) +} + +const MembersTableWithData = ({ + organizationId, + editMemberRole, + deleteMember, + deleteInviteMember, + resendInvite, + transferOwnership, + loadingUpdateRole, + userId, +}: MembersTableWithDataProps) => { + const { data: members = [] } = useMembers({ organizationId, suspense: true }) + const { data: inviteMembers = [] } = useInviteMembers({ organizationId, suspense: true }) + const { data: availableRoles = [] } = useAvailableRoles({ organizationId, suspense: true }) + + return ( + + ) +} + +export function SettingsMembers() { + useDocumentTitle('Members - Organization settings') + const { organizationId = '' } = useParams({ strict: false }) + const hasPreviousRequestFailed = useRef(false) + + const { error: membersError, isSuccess: isSuccessMembers } = useMembers({ organizationId }) + const { data: availableRoles = [] } = useAvailableRoles({ organizationId }) + + const hasPermissionError = (membersError as SerializedError)?.response?.status === 403 + const shouldShowPermissionError = hasPermissionError || hasPreviousRequestFailed.current + const { mutateAsync: editMemberRole } = useEditMemberRole() + const { mutateAsync: deleteMember } = useDeleteMember() + const { mutateAsync: deleteInviteMember } = useDeleteInviteMember() + const { mutateAsync: transferOwnershipMemberRole } = useTransferOwnershipMemberRole() + const { mutateAsync: createInviteMember } = useCreateInviteMember() + + const { user } = useAuth0() + + const { openModal, closeModal } = useModal() + const [loadingUpdateRole, setLoadingUpdateRole] = useState({ userId: '', loading: false }) + + const { openModalConfirmation } = useModalConfirmation() + + const onClickEditMemberRole = async (userId: string, roleId: string) => { + const data = { user_id: userId, role_id: roleId } + setLoadingUpdateRole({ userId, loading: true }) + + try { + await editMemberRole({ organizationId, memberRoleUpdateRequest: data }) + setLoadingUpdateRole({ userId, loading: false }) + } catch (error) { + console.error(error) + } + } + + const onClickDeleteMember = async (userId: string) => { + try { + await deleteMember({ organizationId, userId }) + } catch (error) { + console.error(error) + } + } + + const onClickRevokeMemberInvite = async (inviteId: string) => { + try { + await deleteInviteMember({ organizationId, inviteId }) + } catch (error) { + console.error(error) + } + } + + const onClickTransferOwnership = (user: Member) => { + openModalConfirmation({ + title: 'Confirm ownership transfer', + description: 'Confirm by entering the member name', + name: user?.name, + mode: NODE_ENV === 'production' ? EnvironmentModeEnum.PRODUCTION : EnvironmentModeEnum.DEVELOPMENT, + action: async () => { + try { + await transferOwnershipMemberRole({ organizationId, userId: user.id }) + } catch (error) { + console.error(error) + } + }, + }) + } + + const onClickResendInvite = async (inviteId: string, data: InviteMemberRequest) => { + try { + await deleteInviteMember({ organizationId, inviteId }) + await createInviteMember({ organizationId, inviteMemberRequest: data }) + } catch (error) { + console.error(error) + } + } + + const onAddMember = () => { + openModal({ + content: , + options: { + fakeModal: true, + }, + }) + } + + useEffect(() => { + if (isSuccessMembers) { + hasPreviousRequestFailed.current = false + } + + if (hasPermissionError) { + hasPreviousRequestFailed.current = true + } + }, [hasPermissionError, isSuccessMembers]) + + return ( +
+
+
+ + + +
+ {shouldShowPermissionError && ( + + + + + + Permission denied + + You do not have the permission to view other members. Please contact your organization administrator. + + + + )} +
+ }> + + +
+
+
+ ) +} diff --git a/libs/pages/settings/src/lib/feature/page-organization-members-feature/create-modal-feature/create-modal-feature.tsx b/libs/pages/settings/src/lib/feature/page-organization-members-feature/create-modal-feature/create-modal-feature.tsx deleted file mode 100644 index e8af31b6cde..00000000000 --- a/libs/pages/settings/src/lib/feature/page-organization-members-feature/create-modal-feature/create-modal-feature.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { type InviteMemberRequest, type OrganizationAvailableRole } from 'qovery-typescript-axios' -import { FormProvider, useForm } from 'react-hook-form' -import { useCreateInviteMember } from '@qovery/domains/organizations/feature' -import CreateModal from '../../../ui/page-organization-members/create-modal/create-modal' - -export interface CreateModalFeatureProps { - onClose: () => void - availableRoles: OrganizationAvailableRole[] - organizationId?: string -} - -export function CreateModalFeature(props: CreateModalFeatureProps) { - const { organizationId = '', availableRoles, onClose } = props - - const { mutateAsync: createInviteMember, isLoading: isLoadingInviteMember } = useCreateInviteMember() - - const methods = useForm({ - mode: 'onChange', - defaultValues: { - // default value with admin id - role_id: availableRoles[0]?.id, - }, - }) - - const onSubmit = methods.handleSubmit(async (data) => { - try { - await createInviteMember({ - organizationId, - inviteMemberRequest: data as InviteMemberRequest, - }) - onClose() - } catch (error) { - console.error(error) - } - }) - - return ( - - - - ) -} - -export default CreateModalFeature diff --git a/libs/pages/settings/src/lib/feature/page-organization-members-feature/page-organization-members-feature.tsx b/libs/pages/settings/src/lib/feature/page-organization-members-feature/page-organization-members-feature.tsx deleted file mode 100644 index e680cf4a066..00000000000 --- a/libs/pages/settings/src/lib/feature/page-organization-members-feature/page-organization-members-feature.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { useAuth0 } from '@auth0/auth0-react' -import { EnvironmentModeEnum, type InviteMemberRequest, type Member } from 'qovery-typescript-axios' -import { useEffect, useRef, useState } from 'react' -import { useParams } from 'react-router-dom' -import { - useAvailableRoles, - useCreateInviteMember, - useDeleteInviteMember, - useDeleteMember, - useEditMemberRole, - useInviteMembers, - useMembers, - useTransferOwnershipMemberRole, -} from '@qovery/domains/organizations/feature' -import { membersMock } from '@qovery/shared/factories' -import { useModal, useModalConfirmation } from '@qovery/shared/ui' -import { useDocumentTitle } from '@qovery/shared/util-hooks' -import { NODE_ENV } from '@qovery/shared/util-node-env' -import { type SerializedError } from '@qovery/shared/utils' -import PageOrganizationMembers from '../../ui/page-organization-members/page-organization-members' -import CreateModalFeature from './create-modal-feature/create-modal-feature' - -export const membersDataMock = membersMock(5) - -export function PageOrganizationMembersFeature() { - useDocumentTitle('Members - Organization settings') - const { organizationId = '' } = useParams() - const hasPreviousRequestFailed = useRef(false) - - const { - data: members = membersDataMock, - isFetched: isFetchedMembers, - error: membersError, - isSuccess: isSuccessMembers, - } = useMembers({ organizationId }) - const { data: inviteMembers = [] } = useInviteMembers({ - organizationId, - }) - const { data: availableRoles = [] } = useAvailableRoles({ organizationId }) - - const hasPermissionError = (membersError as SerializedError)?.response?.status === 403 - const shouldShowPermissionError = hasPermissionError || hasPreviousRequestFailed.current - const { mutateAsync: editMemberRole } = useEditMemberRole() - const { mutateAsync: deleteMember } = useDeleteMember() - const { mutateAsync: deleteInviteMember } = useDeleteInviteMember() - const { mutateAsync: transferOwnershipMemberRole } = useTransferOwnershipMemberRole() - const { mutateAsync: createInviteMember } = useCreateInviteMember() - - const { user } = useAuth0() - - const { openModal, closeModal } = useModal() - const [loadingUpdateRole, setLoadingUpdateRole] = useState({ userId: '', loading: false }) - - const { openModalConfirmation } = useModalConfirmation() - - const onClickEditMemberRole = async (userId: string, roleId: string) => { - const data = { user_id: userId, role_id: roleId } - setLoadingUpdateRole({ userId, loading: true }) - - try { - await editMemberRole({ organizationId, memberRoleUpdateRequest: data }) - setLoadingUpdateRole({ userId, loading: false }) - } catch (error) { - console.error(error) - } - } - - const onClickDeleteMember = async (userId: string) => { - try { - await deleteMember({ organizationId, userId }) - } catch (error) { - console.error(error) - } - } - - const onClickRevokeMemberInvite = async (inviteId: string) => { - try { - await deleteInviteMember({ organizationId, inviteId }) - } catch (error) { - console.error(error) - } - } - - const onClickTransferOwnership = (user: Member) => { - openModalConfirmation({ - title: 'Confirm ownership transfer', - description: 'Confirm by entering the member name', - name: user?.name, - mode: NODE_ENV === 'production' ? EnvironmentModeEnum.PRODUCTION : EnvironmentModeEnum.DEVELOPMENT, - action: async () => { - try { - await transferOwnershipMemberRole({ organizationId, userId: user.id }) - } catch (error) { - console.error(error) - } - }, - }) - } - - const onClickResendInvite = async (inviteId: string, data: InviteMemberRequest) => { - try { - await deleteInviteMember({ organizationId, inviteId }) - await createInviteMember({ organizationId, inviteMemberRequest: data }) - } catch (error) { - console.error(error) - } - } - - useEffect(() => { - if (isSuccessMembers) { - hasPreviousRequestFailed.current = false - } - - if (hasPermissionError) { - hasPreviousRequestFailed.current = true - } - }, [hasPermissionError, isSuccessMembers]) - - return ( - { - openModal({ - content: ( - - ), - }) - }} - /> - ) -} - -export default PageOrganizationMembersFeature diff --git a/libs/pages/settings/src/lib/ui/page-organization-members/page-organization-members.tsx b/libs/pages/settings/src/lib/ui/page-organization-members/page-organization-members.tsx deleted file mode 100644 index 9722480c98d..00000000000 --- a/libs/pages/settings/src/lib/ui/page-organization-members/page-organization-members.tsx +++ /dev/null @@ -1,208 +0,0 @@ -import { - type InviteMember, - type InviteMemberRequest, - type Member, - type OrganizationAvailableRole, -} from 'qovery-typescript-axios' -import { useEffect, useState } from 'react' -import { NeedHelp } from '@qovery/shared/assistant/feature' -import { MemberRoleEnum } from '@qovery/shared/enums' -import { Button, Callout, Heading, Icon, Section, Table, type TableFilterProps } from '@qovery/shared/ui' -import { pluralize } from '@qovery/shared/util-js' -import RowMember from './row-member/row-member' - -export interface PageOrganizationMembersProps { - editMemberRole: (userId: string, roleId: string) => void - deleteMember: (userId: string) => void - deleteInviteMember: (inviteId: string) => void - resendInvite: (inviteId: string, data: InviteMemberRequest) => void - transferOwnership: (user: Member) => void - loadingUpdateRole: { userId: string; loading: boolean } - isFetchedMembers: boolean - members?: Member[] - inviteMembers?: InviteMember[] - availableRoles?: OrganizationAvailableRole[] - hasPermissionError?: boolean - userId?: string - onAddMember?: () => void -} - -const inviteMembersHead = [ - { - title: 'Pending members', - className: 'px-4 py-2 border-r border-neutral-200 h-full', - }, - { - title: 'Roles', - }, - { - title: 'Status', - className: 'px-4', - }, - { - title: 'Sent since', - className: 'px-4', - sort: { - key: 'created_at', - }, - }, -] - -export function PageOrganizationMembers(props: PageOrganizationMembersProps) { - const { - members = [], - inviteMembers = [], - deleteInviteMember, - availableRoles, - editMemberRole, - isFetchedMembers, - loadingUpdateRole, - deleteMember, - transferOwnership, - userId, - hasPermissionError, - onAddMember, - resendInvite, - } = props - - const membersHead = [ - { - title: `${pluralize(members.length, 'Member', 'Members')} ${isFetchedMembers ? `(${members.length})` : ''}`, - className: 'px-4 py-2 border-r border-neutral-200 h-full', - }, - { - title: 'Roles', - filter: [ - { - search: true, - title: 'Filter by role', - key: 'role_name', - }, - ], - }, - { - title: 'Last activity', - className: 'px-4', - sort: { - key: 'last_activity_at', - }, - }, - { - title: 'Member since', - className: 'px-4', - sort: { - key: 'created_at', - }, - }, - ] - - const columnsWidth = '35% 22% 21% 21%' - - const [filterMembers, setFilterMembers] = useState([]) - const [filterInviteMembers, setFilterInviteMembers] = useState([]) - - const [dataMembers, setDataMembers] = useState(members) - const [dataInviteMembers, setDataInviteMembers] = useState(inviteMembers) - - useEffect(() => { - setDataMembers(members) - }, [members, setDataMembers]) - - useEffect(() => { - setDataInviteMembers(inviteMembers) - }, [inviteMembers, setDataInviteMembers]) - - const userIsOwner = dataMembers?.find((member) => member.id === userId) - - return ( -
-
-
-
- Manage your team -

- This section allows you to manage the members of your organization (add / remove) and as well assign a - role to each of them. You can invite someone to join your organization via email. -

- -
- -
- {hasPermissionError && ( - - - - - - Permission denied - - You do not have the permission to view other members. Please contact your organization administrator. - - - - )} - -
- {dataMembers?.map((member: Member, index) => ( - - ))} -
-
- {isFetchedMembers && dataInviteMembers?.length > 0 && ( - -
- {dataInviteMembers?.map((member: InviteMember) => ( - - ))} -
-
- )} -
-
- ) -} - -export default PageOrganizationMembers diff --git a/libs/pages/settings/src/lib/ui/page-organization-members/row-member/row-member.tsx b/libs/pages/settings/src/lib/ui/page-organization-members/row-member/row-member.tsx deleted file mode 100644 index c2d1f514926..00000000000 --- a/libs/pages/settings/src/lib/ui/page-organization-members/row-member/row-member.tsx +++ /dev/null @@ -1,328 +0,0 @@ -import { type IconName } from '@fortawesome/fontawesome-common-types' -import { - type InviteMember, - type InviteMemberRequest, - type Member, - type OrganizationAvailableRole, -} from 'qovery-typescript-axios' -import { useNavigate, useParams } from 'react-router-dom' -import { IconEnum, MemberRoleEnum } from '@qovery/shared/enums' -import { SETTINGS_ROLES_URL, SETTINGS_URL } from '@qovery/shared/routes' -import { - Avatar, - ButtonIconAction, - Icon, - IconAwesomeEnum, - Indicator, - LoaderSpinner, - Menu, - type MenuData, - type MenuItemProps, - Skeleton, - type TableFilterProps, - TableRowFilter, - ToastEnum, - Tooltip, - toast, - useModalConfirmation, -} from '@qovery/shared/ui' -import { dateMediumLocalFormat, dateUTCString, timeAgo } from '@qovery/shared/util-dates' -import { useCopyToClipboard } from '@qovery/shared/util-hooks' -import { upperCaseFirstLetter } from '@qovery/shared/util-js' - -export interface RowMemberProps { - member: Member | InviteMember - loading: boolean - columnsWidth: string - filter: TableFilterProps[] - transferOwnership?: (user: Member) => void - editMemberRole?: (userId: string, roleId: string) => void - deleteMember?: (userId: string) => void - deleteInviteMember?: (inviteId: string) => void - resendInvite?: (inviteId: string, data: InviteMemberRequest) => void - availableRoles?: OrganizationAvailableRole[] - loadingUpdateRole?: boolean - userIsOwner?: boolean -} - -export const RolesIcons: { [key: string]: IconName } = { - ADMIN: 'crown', - BILLING: 'wallet', - DEVOPS: 'gear', - VIEWER: 'eye', -} - -const getProviderIcon = (id: string): IconEnum | undefined => { - if (id.toUpperCase().includes('GITHUB')) { - return IconEnum.GITHUB - } else if (id.toUpperCase().includes('GITLAB')) { - return IconEnum.GITLAB - } else if (id.toUpperCase().includes('BITBUCKET')) { - return IconEnum.BITBUCKET - } else if (id.toUpperCase().includes('GOOGLE')) { - return IconEnum.GOOGLE - } else if (id.toUpperCase().includes('WINDOWSLIVE')) { - return IconEnum.MICROSOFT - } else { - return undefined - } -} - -export function RowMember(props: RowMemberProps) { - const { - member, - availableRoles, - editMemberRole, - loading, - columnsWidth, - loadingUpdateRole, - deleteMember, - deleteInviteMember, - transferOwnership, - resendInvite, - userIsOwner, - filter, - } = props - - const [, copyToClipboard] = useCopyToClipboard() - const { organizationId = '' } = useParams() - const navigate = useNavigate() - const { openModalConfirmation } = useModalConfirmation() - - const name = (member as Member).name?.split(' ') || (member as InviteMember).email.split(' ') - - const isOwner = member.role_name?.toUpperCase() === MemberRoleEnum.OWNER - - const menuItem = (role: OrganizationAvailableRole, customRole: boolean) => ({ - name: upperCaseFirstLetter(role.name), - contentLeft: ( - - ), - onClick: () => editMemberRole && editMemberRole(member.id, role.id || ''), - }) - - const itemsBasicRoles = availableRoles - ? (availableRoles - .map( - (role) => - Object.values(MemberRoleEnum).includes(role.name?.toUpperCase() as MemberRoleEnum) && menuItem(role, false) - ) - .filter(Boolean) as MenuItemProps[]) - : [] - - const itemsCustomRoles = availableRoles - ? (availableRoles - .map( - (role) => - !Object.values(MemberRoleEnum).includes(role.name?.toUpperCase() as MemberRoleEnum) && menuItem(role, true) - ) - .filter(Boolean) as MenuItemProps[]) - : [] - - const menus: MenuData = [ - { - items: itemsBasicRoles, - }, - { - items: itemsCustomRoles, - }, - { - items: [ - { - name: 'Create new role', - onClick: () => navigate(`${SETTINGS_URL(organizationId)}${SETTINGS_ROLES_URL}`), - contentLeft: , - }, - ], - }, - ] - - const buttonActionMember = [ - { - iconLeft: , - menus: [ - { - items: userIsOwner - ? [ - { - name: 'Transfer ownership', - onClick: () => transferOwnership && transferOwnership(member), - contentLeft: , - }, - ] - : [], - }, - { - items: [ - { - name: 'Delete member', - onClick: () => { - openModalConfirmation({ - title: 'Confirm to remove this member', - confirmationMethod: 'action', - name: (member as Member).name, - action: () => deleteMember && deleteMember(member.id), - }) - }, - contentLeft: , - containerClassName: 'text-red-600', - }, - ], - }, - ], - }, - ] - - const buttonActionInviteMember = [ - { - iconLeft: , - menus: [ - { - items: [ - { - name: 'Resend invite', - contentLeft: , - onClick: () => { - resendInvite && resendInvite(member.id, { email: member.email, role_id: member.role_id }) - }, - }, - { - name: 'Copy invitation link', - contentLeft: , - onClick: () => { - copyToClipboard((member as InviteMember).invitation_link) - toast(ToastEnum.SUCCESS, 'Copied to your clipboard!') - }, - }, - ], - }, - { - items: [ - { - name: 'Revoke invite', - onClick: () => { - openModalConfirmation({ - title: 'Confirm to remove this invite', - confirmationMethod: 'action', - name: (member as InviteMember).email, - action: () => deleteInviteMember && deleteInviteMember(member.id), - }) - }, - contentLeft: , - containerClassName: 'text-red-600', - }, - ], - }, - ], - }, - ] - - const input = (role?: MemberRoleEnum | string) => ( - -
- {upperCaseFirstLetter(role)} - {!loadingUpdateRole && role?.toUpperCase() !== MemberRoleEnum.OWNER && (member as Member).last_activity_at && ( - - )} - {loadingUpdateRole && } -
-
- ) - - return ( - -
-
-
- {name && ( - - - - - ) - } - > - - {name[0]?.charAt(0).toUpperCase()} - {name[1]?.charAt(0).toUpperCase()} - - } - /> - - - )} -
- -

{(member as Member).name}

-
- - {member.email} - -
-
- {!isOwner && ( - - {(member as Member).last_activity_at ? ( - - ) : ( - - )} - - )} -
-
- {!isOwner && (member as Member).last_activity_at ? ( - - ) : ( - input(member.role_name) - )} -
-
- - {(member as Member).last_activity_at ? ( - - - {timeAgo(new Date((member as Member).last_activity_at || ''))} ago - - - ) : ( - {upperCaseFirstLetter((member as InviteMember).invitation_status)} - )} - -
-
- - - {dateMediumLocalFormat(member.created_at)} - - -
-
-
- ) -} - -export default RowMember diff --git a/libs/shared/ui/src/index.ts b/libs/shared/ui/src/index.ts index 0977c3a8edc..f2193630b69 100644 --- a/libs/shared/ui/src/index.ts +++ b/libs/shared/ui/src/index.ts @@ -1,6 +1,7 @@ export * from './lib/components/action-toolbar/action-toolbar' export * from './lib/components/callout/callout' export * from './lib/components/button/button' +export * from './lib/components/button-primitive/button-primitive' export * from './lib/components/copy-button/copy-button' export * from './lib/components/description-list/description-list' export * from './lib/components/heading/heading' diff --git a/libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action-element/button-icon-action-element.tsx b/libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action-element/button-icon-action-element.tsx deleted file mode 100644 index f7ea8cf2219..00000000000 --- a/libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action-element/button-icon-action-element.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { type ReactNode } from 'react' -import Button from '../../../button/button' -import { Menu, MenuAlign, type MenuData } from '../../../menu/menu' -import Tooltip from '../../../tooltip/tooltip' - -export interface ButtonIconActionElementProps { - triggerTooltip?: string - iconLeft?: ReactNode - iconRight?: ReactNode - onClick?: () => void - menus?: MenuData - menusClassName?: string - menuAlign?: MenuAlign -} - -export function ButtonIconActionElement(props: ButtonIconActionElementProps) { - const { - triggerTooltip, - iconLeft, - iconRight, - onClick, - menus, - menusClassName = '', - menuAlign = MenuAlign.START, - } = props - - const tooltipWrapper = (content: ReactNode, withRightBorder = false) => { - if (triggerTooltip) { - return ( - - {content} - - ) - } else { - return content - } - } - - if (menus) { - return ( - - {iconLeft} - {iconRight} - - } - triggerTooltip={triggerTooltip} - /> - ) - } else { - return ( - <> - {tooltipWrapper( -
- {iconLeft} - {iconRight} -
, - true - )} - - ) - } -} - -export default ButtonIconActionElement diff --git a/libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action.stories.tsx b/libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action.stories.tsx deleted file mode 100644 index 4f0faf00cff..00000000000 --- a/libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action.stories.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import type { Meta, StoryFn } from '@storybook/react-webpack5' -import Icon from '../../icon/icon' -import { ButtonIconAction, type ButtonIconActionProps } from './button-icon-action' - -export default { - component: ButtonIconAction, - title: 'Buttons/ButtonIconAction', -} as Meta - -const Template: StoryFn = (args) => - -export const Primary = Template.bind({}) -Primary.args = { - actions: [ - { - triggerTooltip: 'More actions', - iconLeft: , - menus: [ - { - items: [ - { - name: 'Deploy', - onClick: () => console.log('Deploy'), - contentLeft: , - }, - { - name: 'Stop', - onClick: () => console.log('Stop'), - contentLeft: , - }, - ], - }, - ], - }, - ], -} diff --git a/libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action.tsx b/libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action.tsx deleted file mode 100644 index 5a921263e40..00000000000 --- a/libs/shared/ui/src/lib/components/buttons/button-icon-action/button-icon-action.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import ButtonIconActionElement, { - type ButtonIconActionElementProps, -} from './button-icon-action-element/button-icon-action-element' - -export interface ButtonIconActionProps { - actions?: ButtonIconActionElementProps[] - className?: string -} - -/** - * @deprecated Use the standard