Skip to content

Commit

Permalink
feat: Add multi-cluster management (#1153)
Browse files Browse the repository at this point in the history
  • Loading branch information
floreks authored Jul 13, 2023
1 parent 799c5e1 commit 7503c7d
Show file tree
Hide file tree
Showing 32 changed files with 885 additions and 315 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ function BillingStartTrialModal({
onClose,
}: BillingStartTrialModalProps) {
const [beginTrial, { loading, error }] = useBeginTrialMutation({
onCompleted: onClose,
onCompleted: () => {
onClose()
window.location.reload()
},
})

return (
Expand Down
3 changes: 2 additions & 1 deletion www/src/components/account/queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,11 @@ export const USERS_Q = gql`
$serviceAccount: Boolean
$all: Boolean
$cursor: String
$first: Int = 20
) {
users(
q: $q
first: 20
first: $first
after: $cursor
serviceAccount: $serviceAccount
all: $all
Expand Down
15 changes: 14 additions & 1 deletion www/src/components/cluster/ClusterAdminsModal.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
import { Button, Modal } from '@pluralsh/design-system'
import { Flex } from 'honorable'
import { useState } from 'react'
import { useContext, useState } from 'react'
import { useMutation } from '@apollo/client'

import subscriptionContext from '../../contexts/SubscriptionContext'

import { BindingInput } from '../account/Typeaheads'
import { GqlError } from '../utils/Alert'
import { UPDATE_SERVICE_ACCOUNT } from '../account/queries'
import { sanitize } from '../account/utils'

import UpgradeNeededModal from './UpgradeNeededModal'

export function ClusterAdminsModal({ open, setOpen, serviceAccount }) {
const { isPaidPlan, isTrialPlan } = useContext(subscriptionContext)
const [bindings, setBindings] = useState(
serviceAccount.impersonationPolicy?.bindings || []
)
Expand All @@ -21,6 +26,14 @@ export function ClusterAdminsModal({ open, setOpen, serviceAccount }) {
onCompleted: () => setOpen(false),
})

if (!(isPaidPlan || isTrialPlan))
return (
<UpgradeNeededModal
open={open}
onClose={() => setOpen(false)}
/>
)

return (
<Modal
header="Cluster administrators"
Expand Down
15 changes: 14 additions & 1 deletion www/src/components/cluster/ClusterDependencyModal.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
import { ArrowLeftIcon, Button, Modal } from '@pluralsh/design-system'
import { Div, Flex } from 'honorable'
import { Dispatch, useCallback, useState } from 'react'
import { Dispatch, useCallback, useContext, useState } from 'react'
import { useMutation } from '@apollo/client'

import subscriptionContext from '../../contexts/SubscriptionContext'

import { Cluster } from '../../generated/graphql'
import { ClusterPicker } from '../utils/ClusterPicker'
import { GqlError } from '../utils/Alert'

import { CLUSTERS, CREATE_CLUSTER_DEPENDENCY } from '../overview/queries'

import UpgradeNeededModal from './UpgradeNeededModal'

type ClusterDependencyModalProps = {
open: boolean
setOpen: Dispatch<boolean>
Expand All @@ -20,6 +24,7 @@ export function ClusterDependencyModal({
setOpen,
destination,
}: ClusterDependencyModalProps) {
const { isPaidPlan, isTrialPlan } = useContext(subscriptionContext)
const [source, setSource] = useState<Cluster | undefined>()

const close = useCallback(() => {
Expand Down Expand Up @@ -49,6 +54,14 @@ export function ClusterDependencyModal({
[destination]
)

if (!(isPaidPlan || isTrialPlan))
return (
<UpgradeNeededModal
open={open}
onClose={close}
/>
)

return (
<Modal
portal
Expand Down
55 changes: 55 additions & 0 deletions www/src/components/cluster/UpgradeNeededModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { Button, Modal, WarningIcon } from '@pluralsh/design-system'
import { ReactElement } from 'react'
import { useNavigate } from 'react-router-dom'
import styled from 'styled-components'

const Wrap = styled.div((_) => ({
display: 'flex',
flexDirection: 'column',
}))

const Message = styled.div(({ theme }) => ({
...theme.partials.text.body2,
marginBottom: theme.spacing.large,
}))

const Header = styled.div(({ theme }) => ({
...theme.partials.text.overline,
display: 'flex',
}))

function UpgradeNeededModal({ open, onClose }): ReactElement {
const navigate = useNavigate()

return (
<Modal
BackdropProps={{ zIndex: 20 }}
header={
<Header>
<WarningIcon
color="icon-warning"
marginRight="xsmall"
/>
Upgrade needed
</Header>
}
open={open}
onClose={() => onClose()}
style={{ padding: 0 }}
>
<Wrap>
<Message>
Upgrade to Plural Professional to access multi-cluster-management.
</Message>
<Button
alignSelf="flex-end"
onClick={() => navigate('/account/billing')}
>
Review plans
</Button>
</Wrap>
</Modal>
)
}

export default UpgradeNeededModal
24 changes: 24 additions & 0 deletions www/src/components/overview/CreateClusterAction.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Button } from '@pluralsh/design-system'
import { ReactElement, useState } from 'react'

import CreateClusterModal from './CreateClusterModal'

function CreateClusterButton(): ReactElement {
const [createClusterModalOpen, setCreateClusterModalOpen] = useState(false)

return (
<>
<Button onClick={() => setCreateClusterModalOpen(true)}>
Create cluster
</Button>
{createClusterModalOpen && (
<CreateClusterModal
open={createClusterModalOpen}
onClose={() => setCreateClusterModalOpen(false)}
/>
)}
</>
)
}

export default CreateClusterButton
Loading

0 comments on commit 7503c7d

Please sign in to comment.