diff --git a/assets/src/components/apps/app/App.tsx b/assets/src/components/apps/app/App.tsx index 6611e8fbc0..3b8de5c53f 100644 --- a/assets/src/components/apps/app/App.tsx +++ b/assets/src/components/apps/app/App.tsx @@ -77,6 +77,14 @@ export function getDocsData(docs: Repository['docs']) { }) } +const SYSTEM_APPS = [ + 'bootstrap', + 'ingress-nginx', + 'monitoring', + 'postgres', + 'mysql', +] + export const getDirectory = ({ app = null, docs = null, @@ -115,6 +123,11 @@ export const getDirectory = ({ label: 'Configuration', enabled: config?.gitStatus?.cloned, }, + { + path: 'uninstall', + label: 'Uninstall', + enabled: !SYSTEM_APPS.includes(app.name), + }, { path: 'docs', label: `${capitalize(app?.name)} docs`, diff --git a/assets/src/components/apps/app/uninstall/Uninstall.tsx b/assets/src/components/apps/app/uninstall/Uninstall.tsx new file mode 100644 index 0000000000..4b3148f48a --- /dev/null +++ b/assets/src/components/apps/app/uninstall/Uninstall.tsx @@ -0,0 +1,82 @@ +import { Button, Card, Input } from '@pluralsh/design-system' +import { GqlError } from 'components/utils/Alert' +import { ScrollablePage } from 'components/utils/layout/ScrollablePage' +import { BuildType, useCreateBuildMutation } from 'generated/graphql' +import { Flex, P } from 'honorable' +import { useState } from 'react' +import { useNavigate, useParams } from 'react-router-dom' + +export default function Uninstall() { + const navigate = useNavigate() + const { appName } = useParams() + const [confirm, setConfirm] = useState('') + const [mutation, { error }] = useCreateBuildMutation({ + variables: { + attributes: { + repository: appName!, + type: BuildType.Destroy, + }, + }, + onCompleted: ({ createBuild }) => + createBuild && navigate(`/builds/${createBuild.id}`), + }) + + return ( + + + + {error && ( + + )} +

+ Uninstall {appName} +

+

+ To uninstall the application, type the application’s name {appName}{' '} + to confirm. This is action is destructive and can result in + underlying data from the application being deleted. +

+ + setConfirm(value)} + width="100%" + placeholder={appName} + maxWidth={400} + /> + + +
+
+
+ ) +} diff --git a/assets/src/generated/graphql.ts b/assets/src/generated/graphql.ts index c0f65e1f5d..3cb0e1b87f 100644 --- a/assets/src/generated/graphql.ts +++ b/assets/src/generated/graphql.ts @@ -2238,6 +2238,13 @@ export type PluralContextQueryVariables = Exact<{ [key: string]: never; }>; export type PluralContextQuery = { __typename?: 'RootQueryType', pluralContext?: { __typename?: 'PluralContext', buckets?: Array | null, configuration: Map, domains?: Array | null } | null }; +export type CreateBuildMutationVariables = Exact<{ + attributes: BuildAttributes; +}>; + + +export type CreateBuildMutation = { __typename?: 'RootMutationType', createBuild?: { __typename?: 'Build', id: string } | null }; + export type GroupMemberFragment = { __typename?: 'GroupMember', user?: { __typename?: 'User', id: string, pluralId?: string | null, name: string, email: string, profile?: string | null, backgroundColor?: string | null, readTimestamp?: Date | null, roles?: { __typename?: 'UserRoles', admin?: boolean | null } | null } | null, group?: { __typename?: 'Group', id: string, name: string, description?: string | null, insertedAt?: Date | null, updatedAt?: Date | null } | null }; export type GroupFragment = { __typename?: 'Group', id: string, name: string, description?: string | null, insertedAt?: Date | null, updatedAt?: Date | null }; @@ -2668,6 +2675,39 @@ export function usePluralContextLazyQuery(baseOptions?: Apollo.LazyQueryHookOpti export type PluralContextQueryHookResult = ReturnType; export type PluralContextLazyQueryHookResult = ReturnType; export type PluralContextQueryResult = Apollo.QueryResult; +export const CreateBuildDocument = gql` + mutation CreateBuild($attributes: BuildAttributes!) { + createBuild(attributes: $attributes) { + id + } +} + `; +export type CreateBuildMutationFn = Apollo.MutationFunction; + +/** + * __useCreateBuildMutation__ + * + * To run a mutation, you first call `useCreateBuildMutation` within a React component and pass it any options that fit your needs. + * When your component renders, `useCreateBuildMutation` returns a tuple that includes: + * - A mutate function that you can call at any time to execute the mutation + * - An object with fields that represent the current status of the mutation's execution + * + * @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2; + * + * @example + * const [createBuildMutation, { data, loading, error }] = useCreateBuildMutation({ + * variables: { + * attributes: // value for 'attributes' + * }, + * }); + */ +export function useCreateBuildMutation(baseOptions?: Apollo.MutationHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useMutation(CreateBuildDocument, options); + } +export type CreateBuildMutationHookResult = ReturnType; +export type CreateBuildMutationResult = Apollo.MutationResult; +export type CreateBuildMutationOptions = Apollo.BaseMutationOptions; export const GroupsDocument = gql` query Groups($q: String, $cursor: String) { groups(q: $q, first: 20, after: $cursor) { diff --git a/assets/src/graph/builds.graphql b/assets/src/graph/builds.graphql new file mode 100644 index 0000000000..be9fa73f25 --- /dev/null +++ b/assets/src/graph/builds.graphql @@ -0,0 +1,5 @@ +mutation CreateBuild($attributes: BuildAttributes!) { + createBuild(attributes: $attributes) { + id + } +} diff --git a/assets/src/routes/appsRoutes.tsx b/assets/src/routes/appsRoutes.tsx index 430a75c9e9..5aa9bc6e6b 100644 --- a/assets/src/routes/appsRoutes.tsx +++ b/assets/src/routes/appsRoutes.tsx @@ -6,6 +6,8 @@ import AppDocs from 'components/apps/app/docs/AppDocs' import Credentials from 'components/apps/app/credentials/Credentials' +import Uninstall from 'components/apps/app/uninstall/Uninstall' + import Apps from '../components/apps/Apps' import App from '../components/apps/app/App' import Dashboards from '../components/apps/app/dashboards/Dashboards' @@ -76,6 +78,10 @@ export const appsRoutes = [ path="oidc" element={} /> + } + /> } diff --git a/plural/helm/console/Chart.lock b/plural/helm/console/Chart.lock index aa38800389..1a2745aa83 100644 --- a/plural/helm/console/Chart.lock +++ b/plural/helm/console/Chart.lock @@ -1,6 +1,6 @@ dependencies: - name: test-base repository: https://pluralsh.github.io/module-library - version: 0.1.5 -digest: sha256:3f26cde94279968f94b0650b52785e5c9a257298d1e96f110f735bb0b41d89f8 -generated: "2022-08-10T16:36:19.429156439+02:00" + version: 0.1.10 +digest: sha256:c06b16641a45c3fb3c429b1d8cb5e61a860a58976b87b02b6e01c1826b10f13c +generated: "2023-06-14T16:25:44.06288-04:00" diff --git a/plural/helm/console/Chart.yaml b/plural/helm/console/Chart.yaml index 364e23f458..c3c642f6b8 100644 --- a/plural/helm/console/Chart.yaml +++ b/plural/helm/console/Chart.yaml @@ -2,9 +2,9 @@ apiVersion: v2 appVersion: 0.4.15 description: A chart for plural console name: console -version: 0.7.61 +version: 0.7.62 dependencies: - name: test-base repository: https://pluralsh.github.io/module-library - version: 0.1.5 + version: 0.1.10 condition: test-base.enabled diff --git a/plural/helm/console/charts/test-base-0.1.10.tgz b/plural/helm/console/charts/test-base-0.1.10.tgz new file mode 100644 index 0000000000..3d969faab3 Binary files /dev/null and b/plural/helm/console/charts/test-base-0.1.10.tgz differ diff --git a/plural/helm/console/charts/test-base-0.1.5.tgz b/plural/helm/console/charts/test-base-0.1.5.tgz deleted file mode 100644 index 8c11744d10..0000000000 Binary files a/plural/helm/console/charts/test-base-0.1.5.tgz and /dev/null differ diff --git a/plural/helm/console/values.yaml b/plural/helm/console/values.yaml index 1c37ed6021..a1a375742e 100644 --- a/plural/helm/console/values.yaml +++ b/plural/helm/console/values.yaml @@ -130,27 +130,8 @@ test-base: enabled: false application: console testName: console-integration - promoteTag: warm + promoteTag: stable secret: CYPRESS_EMAIL: "" CYPRESS_PASSWORD: "" CYPRESS_BASE_URL: "" - steps: - - name: watch - description: it wait until the console app crd is ready - template: - container: - image: gcr.io/pluralsh/test-base:0.1.6 - args: ["console"] - - name: cypress - description: runs cypress E2E tests for the console - template: - container: - args: ["--browser=chromium"] - image: dkr.plural.sh/console/console-cypress:v0.2.5-5-g5d88b72 - envFrom: - - secretRef: - name: console-test-base-env - requests: - cpu: 1.8 - memory: 7.9Gi