feat: [CDE-670]: New gitspace infra screens (#3560)

* fix: Applied prettier
* fix: lint issues
* fix: Resolved the PR comments
* fix: lint issues
* feat: New gitspace infra screens
main
Neel Khamar 2025-03-25 06:42:33 +00:00 committed by Harness
parent 4fc663ed04
commit a86659cb45
29 changed files with 1051 additions and 8 deletions

View File

@ -50,7 +50,8 @@ const App: React.FC<AppProps> = React.memo(function App({
currentUserProfileURL = '',
defaultSettingsURL = '',
isPublicAccessEnabledOnResources = false,
isCurrentSessionPublic = !!window.publicAccessOnGitness
isCurrentSessionPublic = !!window.publicAccessOnGitness,
accountInfo = {}
}: AppProps) {
const [strings, setStrings] = useState<LanguageRecord>()
const getRequestOptions = useCallback(
@ -100,7 +101,8 @@ const App: React.FC<AppProps> = React.memo(function App({
currentUserProfileURL,
defaultSettingsURL,
isPublicAccessEnabledOnResources,
isCurrentSessionPublic
isCurrentSessionPublic,
accountInfo
}}>
<IconoirProvider
iconProps={{

View File

@ -56,7 +56,8 @@ const AppContext = React.createContext<AppContextProps>({
routingId: '',
defaultSettingsURL: '',
isPublicAccessEnabledOnResources: false,
isCurrentSessionPublic: !!window.publicAccessOnGitness
isCurrentSessionPublic: !!window.publicAccessOnGitness,
accountInfo: noop
})
export const AppContextProvider: React.FC<{ value: AppProps }> = React.memo(function AppContextProvider({

View File

@ -87,6 +87,8 @@ export interface AppProps {
isCurrentSessionPublic: boolean
module?: string
accountInfo?: Unknown
arAppStore?: {
repositoryIdentifier?: string
artifactIdentifier?: string

View File

@ -54,6 +54,7 @@ ReactDOM.render(
defaultSettingsURL=""
isPublicAccessEnabledOnResources
isCurrentSessionPublic={!!window.publicAccessOnGitness}
accountInfo={noop}
/>,
document.getElementById('react-root')
)

View File

@ -17,11 +17,13 @@
export interface CDEProps {
space?: string
gitspaceId?: string
accountId?: string
}
export const pathProps: Readonly<Required<CDEProps>> = {
space: ':space*',
gitspaceId: ':gitspaceId'
gitspaceId: ':gitspaceId',
accountId: ':accountId'
}
export interface CDERoutes {
@ -29,11 +31,17 @@ export interface CDERoutes {
toCDEGitspaceDetail: (args: Required<Pick<CDEProps, 'space' | 'gitspaceId'>>) => string
toCDEGitspacesCreate: (args: Required<Pick<CDEProps, 'space'>>) => string
toCDEGitspacesEdit: (args: Required<Pick<CDEProps, 'space' | 'gitspaceId'>>) => string
toCDEGitspaceInfra: (args: Required<Pick<CDEProps, 'accountId'>>) => string
toCDEInfraConfigure: (args: Required<Pick<CDEProps, 'accountId'>>) => string
toModuleRoute: (args: Required<Pick<CDEProps, 'accountId'>>) => string
}
export const routes: CDERoutes = {
toCDEGitspaces: ({ space }) => `/${space}/gitspaces`,
toCDEGitspaceDetail: ({ space, gitspaceId }) => `/${space}/gitspaces/${gitspaceId}`,
toCDEGitspacesCreate: ({ space }) => `/${space}/gitspaces/create`,
toCDEGitspacesEdit: ({ space, gitspaceId }) => `/${space}/gitspaces/edit/${gitspaceId}`
toCDEGitspacesEdit: ({ space, gitspaceId }) => `/${space}/gitspaces/edit/${gitspaceId}`,
toCDEGitspaceInfra: ({ accountId }) => `/account/${accountId}/module/cde/gitspace-infrastructure`,
toCDEInfraConfigure: ({ accountId }) => `/account/${accountId}/module/cde/gitspace-infrastructure/configure`,
toModuleRoute: ({ accountId }) => `/account/${accountId}/module/cde`
}

View File

@ -32,7 +32,9 @@ module.exports = {
'./App': './src/App.tsx',
'./Gitspaces': './src/cde-gitness/pages/GitspaceCreate/GitspaceCreate.tsx',
'./GitspaceDetail': './src/cde-gitness/pages/GitspaceDetails/GitspaceDetails.tsx',
'./GitspaceList': './src/cde-gitness/pages/GitspaceListing/GitspaceListing.tsx'
'./GitspaceList': './src/cde-gitness/pages/GitspaceListing/GitspaceListing.tsx',
'./GitspaceInfra': './src/cde-gitness/pages/GitspaceInfra/GitspaceInfraHomePage.tsx',
'./GitspaceInfraDetail': './src/cde-gitness/pages/InfraConfigure/InfraConfigure.tsx'
},
shared: Object.assign(
{},

View File

@ -0,0 +1,88 @@
/*
* Copyright 2024 Harness, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
.main {
display: flex;
align-items: center;
flex-direction: column;
margin-top: 4% !important;
.titleContainer {
width: 50%;
}
.cardMain {
width: 50%;
}
.cardTitle {
font-size: 16px !important;
}
}
.subContainers {
margin: var(--spacing-xlarge) 0 !important;
margin-bottom: 0px !important;
}
.customBreadcumbStyles {
[class*='Layout--horizontal']:last-child > span[class*='bp3-icon'] {
/* Your styles here */
display: none !important;
}
}
.infraLogo {
margin: 0 auto !important;
width: 318px !important;
height: 318px !important;
}
.containerHeading {
margin-bottom: var(--spacing-small) !important;
font-weight: 600 !important;
font-size: var(--font-size-medium) !important;
text-align: center;
}
.infraDescription {
margin-bottom: var(--spacing-xlarge) !important;
font-size: var(--font-size-normal) !important;
font-weight: 400 !important;
text-align: center;
}
.configureButton {
padding: var(--spacing-medium) var(--spacing-medium) !important;
width: fit-content !important;
font-size: var(--font-size-small) !important;
font-weight: 200 !important;
margin: 0 auto var(--spacing-xxlarge) auto !important;
}
.supportText {
font-weight: 400 !important;
font-size: var(--font-size-small) !important;
text-align: center !important;
width: 100% !important;
}
.learnMoreText {
font-weight: 400 !important;
font-size: var(--font-size-small) !important;
color: var(--primary-7) !important;
cursor: pointer;
}

View File

@ -0,0 +1,30 @@
/*
* Copyright 2023 Harness, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* eslint-disable */
// This is an auto-generated file
export declare const cardMain: string
export declare const cardTitle: string
export declare const configureButton: string
export declare const containerHeading: string
export declare const customBreadcumbStyles: string
export declare const infraDescription: string
export declare const infraLogo: string
export declare const learnMoreText: string
export declare const main: string
export declare const subContainers: string
export declare const supportText: string
export declare const titleContainer: string

View File

@ -0,0 +1,51 @@
import React from 'react'
import { Breadcrumbs, Button, ButtonVariation, Page } from '@harnessio/uicore'
import { useAppContext } from 'AppContext'
import { useStrings } from 'framework/strings'
import { routes } from 'cde-gitness/RouteDefinitions'
import NoDataCard from './NoDataCard'
import css from './GitspaceInfraHomePage.module.scss'
const GitspaceInfraHomePage = () => {
const { getString } = useStrings()
const { accountInfo } = useAppContext()
const data = null
return (
<>
<Page.Header
title={getString('cde.gitspaceInfra')}
content={
data ? (
<Button
icon="Edit"
iconProps={{ size: 12 }}
variation={ButtonVariation.SECONDARY}
text={getString('cde.edit')}
/>
) : (
<></>
)
}
breadcrumbs={
<Breadcrumbs
className={css.customBreadcumbStyles}
links={[
{
url: routes.toModuleRoute({ accountId: accountInfo?.identifier }),
label: `${getString('cde.account')}: ${accountInfo?.name}`
},
{
url: routes.toCDEGitspaceInfra({ accountId: accountInfo?.identifier }),
label: getString('cde.gitspaceInfra')
}
]}
/>
}
/>
<Page.Body className={css.main}>{data ? <>Data</> : <NoDataCard />}</Page.Body>
</>
)
}
export default GitspaceInfraHomePage

View File

@ -0,0 +1,42 @@
import React from 'react'
import { Button, ButtonVariation, Container, Layout, Text } from '@harnessio/uicore'
import { Color } from '@harnessio/design-system'
import { Link, useHistory } from 'react-router-dom'
import { routes } from 'cde-gitness/RouteDefinitions'
import { useStrings } from 'framework/strings'
import { useAppContext } from 'AppContext'
import InfraLogo from '../../../icons/infra_home_icon.svg?url'
import css from './GitspaceInfraHomePage.module.scss'
const NoDataCard = () => {
const { getString } = useStrings()
const history = useHistory()
const { accountInfo } = useAppContext()
return (
<Container className={css.titleContainer}>
<Layout.Vertical spacing="small" margin={{ bottom: 'medium' }}>
<img src={InfraLogo} className={css.infraLogo} />
<Text className={css.containerHeading} color={Color.BLACK}>
{getString('cde.configureGitspaceInfra')}
</Text>
<Text className={css.infraDescription}>{getString('cde.gitspaceInfraHome.description')}</Text>
<Button
onClick={() => history.push(routes.toCDEInfraConfigure({ accountId: accountInfo?.identifier }))}
font={{ size: 'small' }}
className={css.configureButton}
variation={ButtonVariation.PRIMARY}>
{getString('cde.gitspaceInfraHome.configureGCPButton')}
</Button>
<Text className={css.supportText} icon="info-messaging">
{getString('cde.gitspaceInfraHome.gcpSupportText')}
<Link to={'/'} className={css.learnMoreText} style={{ paddingLeft: '4px' }}>
{getString('cde.gitspaceInfraHome.learnMore')}
</Link>
</Text>
</Layout.Vertical>
</Container>
)
}
export default NoDataCard

View File

@ -0,0 +1,56 @@
.main {
padding: 64px 264px !important;
}
.pageTitle {
font-size: var(--spacing-medium) !important;
font-weight: 600 !important;
}
.bodyContainer {
background-color: var(--grey-0) !important;
border-radius: 4px !important;
border: 1px solid var(--grey-100) !important;
padding: var(--spacing-xlarge) !important;
margin-bottom: var(--spacing-large) !important;
}
.formFooter {
padding: var(--spacing-medium) 0 !important;
width: 100% !important;
display: flex;
justify-content: space-between !important;
}
.listTitle {
font-size: var(--font-size-normal) !important;
font-weight: 400 !important;
img {
margin-right: var(--spacing-small) !important;
}
}
.buttonStyle {
width: fit-content !important;
margin-top: var(--spacing-medium) !important;
margin-bottom: var(--spacing-xlarge) !important;
margin-left: var(--spacing-xlarge) !important;
}
.codeBlockContainer {
padding-left: var(--spacing-xlarge) !important;
[class*='CodeBlock'] {
width: 70% !important;
min-width: 350px !important;
border-radius: var(--spacing-small) !important;
background-color: var(--grey-1000) !important;
color: var(--grey-0) !important;
pre {
font-size: var(--font-size-normal) !important;
padding-left: var(--spacing-small) !important;
}
}
}

View File

@ -0,0 +1,25 @@
/*
* Copyright 2023 Harness, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* eslint-disable */
// This is an auto-generated file
export declare const bodyContainer: string
export declare const buttonStyle: string
export declare const codeBlockContainer: string
export declare const formFooter: string
export declare const listTitle: string
export declare const main: string
export declare const pageTitle: string

View File

@ -0,0 +1,68 @@
import React from 'react'
import { Button, ButtonVariation, CodeBlock, Layout, Page, Text } from '@harnessio/uicore'
import { Color } from '@harnessio/design-system'
import { useHistory } from 'react-router-dom'
import { useAppContext } from 'AppContext'
import { useStrings } from 'framework/strings'
import { routes } from 'cde-gitness/RouteDefinitions'
import Index1 from '../../../../icons/num1.svg?url'
import Index2 from '../../../../icons/num2.svg?url'
import css from './DownloadAndApply.module.scss'
interface InfraDetailProps {
onTabChange: (key: string) => void
tabOptions: { [key: string]: string }
}
const DownloadAndApplySection = ({ onTabChange, tabOptions }: InfraDetailProps) => {
const { getString } = useStrings()
const { accountInfo } = useAppContext()
const history = useHistory()
return (
<Page.Body className={css.main}>
<Layout.Vertical spacing={'medium'}>
<Text className={css.pageTitle} color={Color.GREY_1000}>
{getString('cde.downloadAndApplySection.title')}
</Text>
<Layout.Vertical spacing="medium" className={css.bodyContainer}>
<Layout.Vertical spacing={'medium'}>
<Text icon={<img src={Index1} width={16} />} className={css.listTitle}>
{getString('cde.downloadAndApplySection.downloadGeneratedYaml')}
</Text>
<Button
className={css.buttonStyle}
icon={'download-manifests-inverse'}
iconProps={{ size: 14 }}
text={getString('cde.downloadAndApplySection.downloadYaml')}
variation={ButtonVariation.PRIMARY}
/>
</Layout.Vertical>
<Layout.Vertical spacing="none">
<Text icon={<img src={Index2} width={16} />} className={css.listTitle}>
{getString('cde.downloadAndApplySection.applyYamlText')}
</Text>
<Layout.Vertical spacing={'medium'} className={css.codeBlockContainer}>
<CodeBlock allowCopy format="pre" snippet={'tofu apply [options] [plan file]'} />
<CodeBlock allowCopy format="pre" snippet={'tofu apply [options] [plan file]'} />
</Layout.Vertical>
</Layout.Vertical>
</Layout.Vertical>
<Layout.Horizontal className={css.formFooter}>
<Button
text={getString('cde.downloadAndApplySection.back')}
icon="chevron-left"
variation={ButtonVariation.SECONDARY}
onClick={() => onTabChange(tabOptions.tab1)}
/>
<Button
text={getString('cde.downloadAndApplySection.done')}
variation={ButtonVariation.PRIMARY}
onClick={() => history.push(routes.toCDEGitspaceInfra({ accountId: accountInfo?.identifier }))}
/>
</Layout.Horizontal>
</Layout.Vertical>
</Page.Body>
)
}
export default DownloadAndApplySection

View File

@ -0,0 +1,30 @@
.customBreadcumbStyles {
[class*='Layout--horizontal']:last-child > span[class*='bp3-icon'] {
/* Your styles here */
display: none !important;
}
}
.learnMoreLink {
font-weight: 500 !important;
font-size: var(--font-size-normal) !important;
cursor: pointer !important;
.bp3-icon {
padding-left: var(--spacing-small) !important;
}
}
.tabContainer {
width: 100% !important;
[class*='bp3-tab-list'] {
background-color: var(--grey-0) !important;
border-bottom: 1px solid var(--grey-200) !important;
padding: 0 var(--spacing-xlarge) !important;
}
[class*='bp3-tab'] {
margin-right: 0 !important;
}
}

View File

@ -0,0 +1,22 @@
/*
* Copyright 2023 Harness, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* eslint-disable */
// This is an auto-generated file
export declare const bp3Icon: string
export declare const customBreadcumbStyles: string
export declare const learnMoreLink: string
export declare const tabContainer: string

View File

@ -0,0 +1,96 @@
import React, { useState } from 'react'
import { Breadcrumbs, Container, Heading, Layout, Page, Tabs, Text } from '@harnessio/uicore'
import { Icon } from '@harnessio/icons'
import { Color, FontVariation } from '@harnessio/design-system'
import { useAppContext } from 'AppContext'
import { useStrings } from 'framework/strings'
import { routes } from 'cde-gitness/RouteDefinitions'
import InfraDetails from './InfraDetails/InfraDetails'
import DownloadAndApplySection from './DownloadAndApply/DownloadAndApply'
import GCPIcon from '../../../icons/google-cloud.svg?url'
import css from './InfraConfigure.module.scss'
const InfraConfigurePage = () => {
const { getString } = useStrings()
const { accountInfo } = useAppContext()
const tabOptions = {
tab1: 'infra-details',
tab2: 'download-and-apply'
}
const [tab, selectedTab] = useState(tabOptions.tab1)
const onTabChange = (key: string) => {
selectedTab(key)
}
return (
<>
<Page.Header
title={
<Layout.Horizontal>
<img src={GCPIcon} width={24} />
<Heading level={4} font={{ variation: FontVariation.H4 }} padding={{ left: 'small' }}>
{getString('cde.configureGCPInfra')}
</Heading>
</Layout.Horizontal>
}
content={
<Text
rightIcon="share"
color={Color.PRIMARY_7}
rightIconProps={{ size: 12, color: Color.PRIMARY_7 }}
className={css.learnMoreLink}
onClick={() => {
window.open('/', '_blank')
}}>
{getString('cde.configureInfra.learnMoreAboutHybrid')}
</Text>
}
breadcrumbs={
<Breadcrumbs
className={css.customBreadcumbStyles}
links={[
{
url: routes.toModuleRoute({ accountId: accountInfo?.identifier }),
label: `${getString('cde.account')}: ${accountInfo?.name}`
},
{
url: routes.toCDEGitspaceInfra({ accountId: accountInfo?.identifier }),
label: getString('cde.gitspaceInfra')
},
{
url: routes.toCDEInfraConfigure({ accountId: accountInfo?.identifier }),
label: getString('cde.configureInfra.configure')
}
]}
/>
}
/>
<Page.Body>
<Container className={css.tabContainer}>
<Tabs
id={'horizontalTabs'}
selectedTabId={tab}
tabList={[
{
id: tabOptions.tab1,
title: getString('cde.configureInfra.provideInfraDetails'),
disabled: tab !== tabOptions.tab1,
panel: <InfraDetails onTabChange={onTabChange} tabOptions={tabOptions} />
},
{ id: '', title: <Icon name="chevron-right" size={16} />, disabled: true },
{
id: tabOptions.tab2,
title: getString('cde.configureInfra.downloadAndApply'),
disabled: tab !== tabOptions.tab2,
panel: <DownloadAndApplySection onTabChange={onTabChange} tabOptions={tabOptions} />
}
]}
/>
</Container>
</Page.Body>
</>
)
}
export default InfraConfigurePage

View File

@ -0,0 +1,48 @@
import React from 'react'
import { Container, FormInput, Label, Layout, Text } from '@harnessio/uicore'
import { Color } from '@harnessio/design-system'
import { useStrings } from 'framework/strings'
import css from './InfraDetails.module.scss'
const BasicDetails = () => {
const { getString } = useStrings()
return (
<Layout.Vertical spacing="medium" className={css.containerSpacing}>
<Text className={css.basicDetailsHeading}>{getString('cde.configureInfra.basicDetails')}</Text>
<Container className={css.basicDetailsBody}>
<Label>
<Layout.Horizontal className={css.inlineContainer}>
<Text className={css.inputLabel}>{getString('cde.configureInfra.name')}</Text>
<Layout.Horizontal>
<Text className={css.inputLabel}>{getString('cde.configureInfra.id')}: </Text>
<Text
color={Color.PRIMARY_7}
rightIcon="code-edit"
className={css.valueText}
rightIconProps={{ size: 16 }}>
Dhruv Test
</Text>
</Layout.Horizontal>
</Layout.Horizontal>
</Label>
<FormInput.Text name="name" placeholder={getString('cde.configureInfra.name')} />
<FormInput.Text
name="domain"
className={css.inputWithNote}
label={
<Text
rightIcon="info"
className={css.inputLabel}
rightIconProps={{ color: Color.PRIMARY_7, size: 12, margin: 5 }}>
{getString('cde.configureInfra.domain')}
</Text>
}
placeholder={getString('cde.configureInfra.domain')}
/>
<Text className={css.noteText}>{getString('cde.configureInfra.basicNoteText')}</Text>
</Container>
</Layout.Vertical>
)
}
export default BasicDetails

View File

@ -0,0 +1,26 @@
import React from 'react'
import { Container, Layout, Text } from '@harnessio/uicore'
import { Color } from '@harnessio/design-system'
import { useStrings } from 'framework/strings'
import css from './InfraDetails.module.scss'
const ConfigureLocations = () => {
const { getString } = useStrings()
return (
<Layout.Vertical spacing="small" className={css.containerSpacing}>
<Text className={css.basicDetailsHeading}>{getString('cde.configureInfra.configureLocations')}</Text>
<Layout.Horizontal spacing="small">
<Text color={Color.GREY_400} className={css.headerLinkText}>
{getString('cde.configureInfra.configureLocationNote')}
</Text>
<Text color={Color.PRIMARY_7} className={css.headerLinkText}>
{getString('cde.configureInfra.learnMore')}
</Text>
</Layout.Horizontal>
<Container className={css.basicDetailsBody}></Container>
</Layout.Vertical>
)
}
export default ConfigureLocations

View File

@ -0,0 +1,38 @@
import React from 'react'
import { Container, FormInput, Layout, Text } from '@harnessio/uicore'
import { Color } from '@harnessio/design-system'
import { useStrings } from 'framework/strings'
import css from './InfraDetails.module.scss'
const GatewayDetails = () => {
const { getString } = useStrings()
return (
<Layout.Vertical spacing="medium" className={css.containerSpacing}>
<Text className={css.basicDetailsHeading}>{getString('cde.configureInfra.gateway')}</Text>
<Container className={css.basicDetailsBody}>
<FormInput.Text
name="domain"
className={css.inputWithNote}
label={
<Text
rightIcon="info"
className={css.inputLabel}
rightIconProps={{ color: Color.PRIMARY_7, size: 12, margin: 5 }}>
{getString('cde.configureInfra.numberOfInstance')}
</Text>
}
placeholder={getString('cde.configureInfra.numberOfInstance')}
/>
<Text className={css.noteText}>{getString('cde.configureInfra.gatewayNoteText')}</Text>
<FormInput.Text
className={css.inputWithMargin}
name="machineType"
label={getString('cde.configureInfra.machineType')}
placeholder={getString('cde.configureInfra.machineType')}
/>
</Container>
</Layout.Vertical>
)
}
export default GatewayDetails

View File

@ -0,0 +1,66 @@
.main {
padding: 40px 160px !important;
}
.basicDetailsContainer {
width: 100% !important;
}
.basicDetailsHeading {
font-size: var(--font-size-normal) !important;
font-weight: 600 !important;
color: var(--grey-800) !important;
}
.basicDetailsBody {
background-color: var(--grey-0) !important;
border-radius: var(--spacing-small) !important;
padding: var(--spacing-xlarge) !important;
border: 1px solid var(--grey-100) !important;
}
.noteText {
font-size: 12px !important;
font-weight: 400 !important;
}
.inputLabel {
font-size: 13px !important;
font-weight: 500 !important;
}
.inlineContainer {
width: 100% !important;
display: flex !important;
justify-content: space-between;
}
.valueText {
font-size: 13px !important;
font-weight: 400 !important;
padding-left: 4px !important;
}
.inputWithNote {
margin-bottom: 4px !important;
}
.containerSpacing {
margin-bottom: var(--spacing-large) !important;
}
.inputWithMargin {
margin-top: var(--spacing-medium) !important;
}
.headerLinkText {
font-size: 13px !important;
font-weight: 400 !important;
}
.formFooter {
padding: var(--spacing-medium) 0 !important;
width: 100% !important;
display: flex;
justify-content: space-between !important;
}

View File

@ -0,0 +1,31 @@
/*
* Copyright 2023 Harness, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* eslint-disable */
// This is an auto-generated file
export declare const basicDetailsBody: string
export declare const basicDetailsContainer: string
export declare const basicDetailsHeading: string
export declare const containerSpacing: string
export declare const formFooter: string
export declare const headerLinkText: string
export declare const inlineContainer: string
export declare const inputLabel: string
export declare const inputWithMargin: string
export declare const inputWithNote: string
export declare const main: string
export declare const noteText: string
export declare const valueText: string

View File

@ -0,0 +1,61 @@
import React from 'react'
import { Button, ButtonVariation, Container, Formik, FormikForm, Layout, Page } from '@harnessio/uicore'
import { useHistory } from 'react-router-dom'
import { useStrings } from 'framework/strings'
import { routes } from 'cde-gitness/RouteDefinitions'
import { useAppContext } from 'AppContext'
import BasicDetails from './BasicDetails'
import GatewayDetails from './GatewayDetails'
import ConfigureLocations from './ConfigureLocations'
import css from './InfraDetails.module.scss'
interface InfraDetailProps {
onTabChange: (key: string) => void
tabOptions: { [key: string]: string }
}
const InfraDetails = ({ onTabChange, tabOptions }: InfraDetailProps) => {
const { getString } = useStrings()
const { accountInfo } = useAppContext()
const history = useHistory()
return (
<Page.Body className={css.main}>
<Container className={css.basicDetailsContainer}>
<Formik
formName="edit-layout-name"
onSubmit={() => {
// handleSubmit(values)
}}
initialValues={{}}
enableReinitialize>
{() => {
return (
<FormikForm>
<Layout.Vertical spacing="medium">
<BasicDetails />
<GatewayDetails />
<ConfigureLocations />
<Layout.Horizontal className={css.formFooter}>
<Button
text={getString('cde.configureInfra.cancel')}
variation={ButtonVariation.TERTIARY}
onClick={() => history.push(routes.toCDEGitspaceInfra({ accountId: accountInfo?.identifier }))}
/>
<Button
text={getString('cde.configureInfra.downloadAndApply')}
rightIcon="chevron-right"
variation={ButtonVariation.PRIMARY}
onClick={() => onTabChange(tabOptions.tab2)}
/>
</Layout.Horizontal>
</Layout.Vertical>
</FormikForm>
)
}}
</Formik>
</Container>
</Page.Body>
)
}
export default InfraDetails

View File

@ -33,6 +33,8 @@ cpu: CPU
memory: Memory
disk: Disk
created: Created
edit: Edit
account: Account
regionSelectWarning: Select a region first
gitspaceUpdateSuccess: Gitspace updated successfully
regionValidationMessage: Region is required
@ -55,6 +57,39 @@ createImport: creating or importing repositories
regionAndMachineSize: Region & Machine Size
copied: Copied
id: ID
gitspaceInfra: Gitspace Infrastructure
configureGCPInfra: Configure GCP Infrastructure
configureGitspaceInfra: Configure Gitspace Infrastructure
gitspaceInfraHome:
configureGCPButton: Configure GCP infrastructure
description: Configure an infrastructure with locations and machines to be used as one of the infrastructure while creating a Gitspace
gcpSupportText: Currently we support GCP based infrastructure only.
learnMore: Learn more about Gitspace Infrastructure
configureInfra:
configure: Configure
learnMoreAboutHybrid: Learn more about hybrid infra
provideInfraDetails: Provide Infrastructure Details
downloadAndApply: Download and Apply YAML
basicDetails: Basic Details
learnMore: Learn More
cancel: Cancel
id: Id
name: Name
domain: Domain
gateway: Gateway
numberOfInstance: Number of instances
machineType: Machine Type
configureLocations: Configure Locations
configureLocationNote: Users will only be able to host gitspaces in these locations only.
gatewayNoteText: More number of instances better reliability of running the Gitspace. However more number of instances incur more costs
basicNoteText: The domain on which all the gitspaces created by this infra will be accessible
downloadAndApplySection:
title: Download and apply YAML to terraform module
back: Back
done: Done
downloadYaml: Download YAML
downloadGeneratedYaml: Download the generated YAML file
applyYamlText: Apply the YAML in the terraform module and run following commands
sshSelect:
30days: 30 Days
90days: 90 Days

View File

@ -1258,12 +1258,32 @@ export interface StringsMap {
yours: string
zoomIn: string
zoomOut: string
'cde.account': string
'cde.branchPlaceholder': string
'cde.branchValidationMessage': string
'cde.changes': string
'cde.changesTooltip.description': string
'cde.changesTooltip.learnMore': string
'cde.cloudDeveloperExperience': string
'cde.configureGCPInfra': string
'cde.configureGitspaceInfra': string
'cde.configureInfra.basicDetails': string
'cde.configureInfra.basicNoteText': string
'cde.configureInfra.cancel': string
'cde.configureInfra.configure': string
'cde.configureInfra.configureLocationNote': string
'cde.configureInfra.configureLocations': string
'cde.configureInfra.domain': string
'cde.configureInfra.downloadAndApply': string
'cde.configureInfra.gateway': string
'cde.configureInfra.gatewayNoteText': string
'cde.configureInfra.id': string
'cde.configureInfra.learnMore': string
'cde.configureInfra.learnMoreAboutHybrid': string
'cde.configureInfra.machineType': string
'cde.configureInfra.name': string
'cde.configureInfra.numberOfInstance': string
'cde.configureInfra.provideInfraDetails': string
'cde.copied': string
'cde.cpu': string
'cde.create.branchPlaceholder': string
@ -1310,6 +1330,13 @@ export interface StringsMap {
'cde.details.stopProvising': string
'cde.details.wrongIdentifier': string
'cde.disk': string
'cde.downloadAndApplySection.applyYamlText': string
'cde.downloadAndApplySection.back': string
'cde.downloadAndApplySection.done': string
'cde.downloadAndApplySection.downloadGeneratedYaml': string
'cde.downloadAndApplySection.downloadYaml': string
'cde.downloadAndApplySection.title': string
'cde.edit': string
'cde.editGitspace': string
'cde.errorCard.contactUs': string
'cde.errorCard.learnMore': string
@ -1320,6 +1347,11 @@ export interface StringsMap {
'cde.eventTimeline': string
'cde.getStarted': string
'cde.gitspaceDetail': string
'cde.gitspaceInfra': string
'cde.gitspaceInfraHome.configureGCPButton': string
'cde.gitspaceInfraHome.description': string
'cde.gitspaceInfraHome.gcpSupportText': string
'cde.gitspaceInfraHome.learnMore': string
'cde.gitspaceOwners.allGitspaces': string
'cde.gitspaceOwners.myGitspaces': string
'cde.gitspaceStatus.active': string

View File

@ -0,0 +1 @@
<svg height="206" preserveAspectRatio="xMidYMid" viewBox="0 0 256 206" width="256" xmlns="http://www.w3.org/2000/svg"><path d="m170.2517 56.8186 22.253-22.253 1.483-9.37c-40.551-36.873-105.012-32.692-141.567 8.724-10.154 11.503-17.687 25.844-21.704 40.653l7.97-1.123 44.505-7.339 3.436-3.514c19.797-21.742 53.27-24.667 76.128-6.168z" fill="#ea4335"/><path d="m224.2048 73.9182c-5.115-18.836-15.616-35.769-30.217-48.722l-31.232 31.232c13.188 10.776 20.701 27.01 20.379 44.037v5.544c15.351 0 27.797 12.445 27.797 27.796 0 15.352-12.446 27.485-27.797 27.485h-55.671l-5.466 5.934v33.34l5.466 5.231h55.671c39.93.311 72.552-31.494 72.863-71.424.188-24.203-11.745-46.893-31.793-60.453" fill="#4285f4"/><path d="m71.8704 205.7957h55.593v-44.506h-55.593c-3.961-.001-7.797-.852-11.399-2.498l-7.887 2.42-22.409 22.253-1.952 7.574c12.567 9.489 27.9 14.825 43.647 14.757" fill="#34a853"/><path d="m71.8704 61.4255c-39.931.238-72.107 32.802-71.869 72.732.133 22.298 10.547 43.288 28.222 56.881l32.248-32.247c-13.991-6.321-20.208-22.786-13.887-36.776 6.32-13.99 22.786-20.207 36.775-13.887 6.165 2.785 11.102 7.723 13.887 13.887l32.248-32.247c-13.721-17.937-35.041-28.424-57.624-28.343" fill="#fbbc05"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,170 @@
<svg width="324" height="324" viewBox="0 0 324 324" fill="none" xmlns="http://www.w3.org/2000/svg">
<g filter="url(#filter0_f_1531_56747)">
<circle cx="162" cy="162" r="90.8533" fill="#CEE7FE"/>
</g>
<circle cx="162" cy="162" r="101.183" fill="#F5FAFF" stroke="white" stroke-width="5.63431"/>
<mask id="mask0_1531_56747" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="64" y="64" width="196" height="196">
<circle cx="162" cy="162" r="97.8962" fill="white"/>
</mask>
<g mask="url(#mask0_1531_56747)">
<foreignObject x="168.053" y="180.221" width="65.3013" height="62.4444"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(1.7px);clip-path:url(#bgblur_0_1531_56747_clip_path);height:100%;width:100%"></div></foreignObject><g filter="url(#filter1_i_1531_56747)" data-figma-bg-blur-radius="3.40041">
<rect width="67.5548" height="21.86" transform="matrix(0.865973 -0.500091 2.20252e-08 1 171.454 217.405)" fill="#268EEC"/>
</g>
<foreignObject x="162.037" y="174.262" width="81.2081" height="70.6911"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(11.33px);clip-path:url(#bgblur_1_1531_56747_clip_path);height:100%;width:100%"></div></foreignObject><g filter="url(#filter2_ii_1531_56747)" data-figma-bg-blur-radius="22.6546">
<rect width="41.4549" height="4.65063" transform="matrix(0.865973 -0.500091 2.20252e-08 1 184.691 217.647)" fill="#3FD9D9"/>
</g>
<foreignObject x="65.6845" y="147.553" width="126.531" height="112.338"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(10.38px);clip-path:url(#bgblur_2_1531_56747_clip_path);height:100%;width:100%"></div></foreignObject><g filter="url(#filter3_i_1531_56747)" data-figma-bg-blur-radius="20.7613">
<rect width="98.1654" height="21.7243" transform="matrix(0.865973 0.500091 -2.20252e-08 1 86.4458 168.314)" fill="#2574DD"/>
</g>
<foreignObject x="60.3929" y="108.482" width="195.606" height="134.976"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(13.03px);clip-path:url(#bgblur_3_1531_56747_clip_path);height:100%;width:100%"></div></foreignObject><g filter="url(#filter4_i_1531_56747)" data-figma-bg-blur-radius="26.0529">
<rect width="98.1654" height="67.5439" transform="matrix(0.865973 0.500091 0.865973 -0.500091 86.4458 168.313)" fill="url(#paint0_radial_1531_56747)" fill-opacity="0.6"/>
</g>
<foreignObject x="69.3989" y="159.596" width="48.6449" height="49.562"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(11.33px);clip-path:url(#bgblur_4_1531_56747_clip_path);height:100%;width:100%"></div></foreignObject><g filter="url(#filter5_ii_1531_56747)" data-figma-bg-blur-radius="22.6546">
<rect width="3.85162" height="3.76363" rx="1.88181" transform="matrix(0.866025 0.5 -2.20305e-08 1 92.0535 181.532)" fill="#3FD9D9"/>
</g>
<foreignObject x="78.6669" y="165.157" width="48.6449" height="49.562"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(11.33px);clip-path:url(#bgblur_5_1531_56747_clip_path);height:100%;width:100%"></div></foreignObject><g filter="url(#filter6_ii_1531_56747)" data-figma-bg-blur-radius="22.6546">
<rect width="3.85162" height="3.76363" rx="1.88181" transform="matrix(0.866025 0.5 -2.20305e-08 1 101.322 187.093)" fill="#3FD9D9"/>
</g>
<foreignObject x="87.935" y="170.718" width="48.6449" height="49.562"><div xmlns="http://www.w3.org/1999/xhtml" style="backdrop-filter:blur(11.33px);clip-path:url(#bgblur_6_1531_56747_clip_path);height:100%;width:100%"></div></foreignObject><g filter="url(#filter7_ii_1531_56747)" data-figma-bg-blur-radius="22.6546">
<rect width="3.85162" height="3.76363" rx="1.88181" transform="matrix(0.866025 0.5 -2.20305e-08 1 110.59 192.655)" fill="#3FD9D9"/>
</g>
<path d="M115.769 140.326C115.769 145.924 116.872 151.467 119.014 156.639C121.156 161.811 124.296 166.51 128.255 170.469C132.213 174.427 136.912 177.567 142.084 179.709C147.256 181.852 152.8 182.954 158.398 182.954C163.996 182.954 169.539 181.852 174.711 179.709C179.883 177.567 184.582 174.427 188.541 170.469C192.499 166.51 195.639 161.811 197.781 156.639C199.924 151.467 201.026 145.924 201.026 140.326C201.026 134.727 199.924 129.184 197.781 124.012C195.639 118.84 192.499 114.141 188.541 110.183C184.582 106.224 179.883 103.084 174.711 100.942C169.539 98.7995 163.996 97.6969 158.398 97.6969C152.8 97.6969 147.256 98.7995 142.084 100.942C136.912 103.084 132.213 106.224 128.255 110.183C124.296 114.141 121.156 118.84 119.014 124.012C116.872 129.184 115.769 134.727 115.769 140.326Z" fill="#E5ECFF"/>
<path d="M115.769 140.325C115.769 145.923 116.872 151.466 119.014 156.638C121.156 161.81 124.296 166.51 128.255 170.468C132.213 174.427 136.912 177.567 142.084 179.709C147.256 181.851 152.8 182.954 158.398 182.954C163.996 182.954 169.539 181.851 174.711 179.709C179.883 177.567 184.582 174.427 188.541 170.468C192.499 166.51 195.639 161.81 197.781 156.638C199.924 151.466 201.026 145.923 201.026 140.325C201.026 134.727 199.924 129.184 197.781 124.012C195.639 118.84 192.499 114.14 188.541 110.182C184.582 106.224 179.883 103.084 174.711 100.941C169.539 98.799 163.996 97.6964 158.398 97.6964C152.8 97.6964 147.256 98.799 142.084 100.941C136.912 103.084 132.213 106.224 128.255 110.182C124.296 114.14 121.156 118.84 119.014 124.012C116.872 129.184 115.769 134.727 115.769 140.325Z" fill="url(#paint1_radial_1531_56747)"/>
<path d="M148.258 168.749C136.073 162.662 118.818 163.679 129.987 140.326C133.881 132.17 126.533 128.153 117.949 126.879C116.541 131.104 115.769 135.623 115.769 140.326C115.769 162.993 133.465 181.509 155.789 182.868C156.193 178.264 155.165 172.202 148.258 168.749ZM174.648 137.289C174.648 137.289 179.718 143.375 171.599 145.408C163.48 147.441 158.41 151.494 160.431 159.613C162.451 167.732 160.431 167.732 171.599 166.716C182.767 165.699 185.804 155.547 185.804 153.527C185.804 151.494 188.854 140.338 182.755 137.289C176.669 134.239 175.652 132.206 174.648 137.289Z" fill="#CEE7FE"/>
<path d="M214.705 131.545C213.934 125.998 207.431 122.018 195.908 120.022H195.883C196.679 121.491 197.389 123.01 198.014 124.577C205.57 126.255 210.248 128.998 210.689 132.108C211.178 135.586 206.451 140.081 198.038 144.134C188.707 148.641 175.91 152.192 162.01 154.139C148.111 156.086 134.836 156.184 124.623 154.421C115.426 152.829 109.634 149.804 109.156 146.338C108.801 143.779 111.275 140.668 115.977 137.582C115.953 137.546 115.916 137.521 115.892 137.497C116.002 135.795 116.222 134.129 116.528 132.5C108.385 137.08 104.454 142.028 105.14 146.914C105.911 152.461 112.414 156.441 123.937 158.438C129.007 159.307 134.775 159.748 140.972 159.748C147.768 159.748 155.091 159.221 162.574 158.18C176.877 156.172 190.091 152.498 199.802 147.808C210.321 142.714 215.477 137.093 214.705 131.545Z" fill="#F9DA10"/>
<path d="M160.455 97.7459C159.782 97.7214 159.096 97.6969 158.41 97.6969C143.053 97.6969 129.607 105.816 122.1 117.989C128.64 117.915 134.089 114.854 135.632 110.727C136.771 110.837 137.935 110.898 139.122 110.898C146.384 110.898 152.826 108.767 156.891 105.473C158.006 106.318 159.635 106.845 161.447 106.845C161.521 106.845 161.582 106.845 161.643 106.832C162.304 110.016 165.268 118.87 177.636 118.564C177.636 118.564 185.168 118.381 188.67 133.627C188.67 133.627 196.52 136.762 198.7 126.426C193.152 110.323 178.236 98.5909 160.455 97.7459Z" fill="#96C7F2"/>
<path d="M150.93 121.552C150.93 122.061 151.045 122.564 151.267 123.033C151.49 123.503 151.816 123.929 152.228 124.289C152.639 124.648 153.128 124.933 153.665 125.128C154.203 125.322 154.779 125.422 155.361 125.422C155.942 125.422 156.519 125.322 157.056 125.128C157.594 124.933 158.082 124.648 158.493 124.289C158.905 123.929 159.231 123.503 159.454 123.033C159.676 122.564 159.791 122.061 159.791 121.552C159.791 121.044 159.676 120.541 159.454 120.071C159.231 119.602 158.905 119.175 158.493 118.816C158.082 118.456 157.594 118.171 157.056 117.977C156.519 117.782 155.942 117.682 155.361 117.682C154.779 117.682 154.203 117.782 153.665 117.977C153.128 118.171 152.639 118.456 152.228 118.816C151.816 119.175 151.49 119.602 151.267 120.071C151.045 120.541 150.93 121.044 150.93 121.552Z" fill="#E1F0FF"/>
<g filter="url(#filter8_f_1531_56747)">
<path d="M172.579 124.712C172.848 124.908 173.138 125.071 173.431 125.19C173.725 125.309 174.016 125.384 174.29 125.408C174.563 125.433 174.812 125.408 175.024 125.334C175.235 125.26 175.405 125.139 175.522 124.978C175.639 124.817 175.703 124.618 175.708 124.394C175.714 124.17 175.661 123.925 175.554 123.673C175.447 123.42 175.287 123.165 175.083 122.922C174.88 122.679 174.637 122.454 174.367 122.258C174.098 122.062 173.809 121.899 173.515 121.78C173.222 121.66 172.93 121.586 172.657 121.561C172.384 121.537 172.134 121.562 171.923 121.636C171.711 121.71 171.542 121.831 171.424 121.992C171.307 122.153 171.244 122.351 171.238 122.575C171.233 122.799 171.285 123.044 171.392 123.297C171.499 123.55 171.659 123.805 171.863 124.047C172.067 124.29 172.31 124.516 172.579 124.712Z" fill="#E1F0FF"/>
</g>
</g>
<defs>
<filter id="filter0_f_1531_56747" x="0.717583" y="0.717827" width="322.564" height="322.564" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="35.2145" result="effect1_foregroundBlur_1531_56747"/>
</filter>
<filter id="filter1_i_1531_56747" x="168.053" y="180.221" width="65.3013" height="62.4444" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="0.356861" operator="erode" in="SourceAlpha" result="effect1_innerShadow_1531_56747"/>
<feOffset dx="0.340041" dy="0.356861"/>
<feGaussianBlur stdDeviation="1.70021"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_1531_56747"/>
</filter>
<clipPath id="bgblur_0_1531_56747_clip_path" transform="translate(-168.053 -180.221)"><rect width="67.5548" height="21.86" transform="matrix(0.865973 -0.500091 2.20252e-08 1 171.454 217.405)"/>
</clipPath><filter id="filter2_ii_1531_56747" x="162.037" y="174.262" width="81.2081" height="70.6911" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="0.356861"/>
<feGaussianBlur stdDeviation="0.17843"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_1531_56747"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="0.356861" operator="erode" in="SourceAlpha" result="effect2_innerShadow_1531_56747"/>
<feOffset dx="0.340041" dy="0.356861"/>
<feGaussianBlur stdDeviation="1.70021"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_1531_56747" result="effect2_innerShadow_1531_56747"/>
</filter>
<clipPath id="bgblur_1_1531_56747_clip_path" transform="translate(-162.037 -174.262)"><rect width="41.4549" height="4.65063" transform="matrix(0.865973 -0.500091 2.20252e-08 1 184.691 217.647)"/>
</clipPath><filter id="filter3_i_1531_56747" x="65.6845" y="147.553" width="126.531" height="112.338" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="0.233597" operator="erode" in="SourceAlpha" result="effect1_innerShadow_1531_56747"/>
<feOffset dx="0.222588" dy="0.233597"/>
<feGaussianBlur stdDeviation="1.11294"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_1531_56747"/>
</filter>
<clipPath id="bgblur_2_1531_56747_clip_path" transform="translate(-65.6845 -147.553)"><rect width="98.1654" height="21.7243" transform="matrix(0.865973 0.500091 -2.20252e-08 1 86.4458 168.314)"/>
</clipPath><filter id="filter4_i_1531_56747" x="60.3929" y="108.482" width="195.606" height="134.976" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="0.356862" operator="erode" in="SourceAlpha" result="effect1_innerShadow_1531_56747"/>
<feOffset dx="0.340043" dy="0.356862"/>
<feGaussianBlur stdDeviation="1.70021"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_1531_56747"/>
</filter>
<clipPath id="bgblur_3_1531_56747_clip_path" transform="translate(-60.3929 -108.482)"><rect width="98.1654" height="67.5439" transform="matrix(0.865973 0.500091 0.865973 -0.500091 86.4458 168.313)"/>
</clipPath><filter id="filter5_ii_1531_56747" x="69.3989" y="159.596" width="48.6449" height="49.562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="0.356861"/>
<feGaussianBlur stdDeviation="0.17843"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_1531_56747"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="0.356861" operator="erode" in="SourceAlpha" result="effect2_innerShadow_1531_56747"/>
<feOffset dx="0.340041" dy="0.356861"/>
<feGaussianBlur stdDeviation="1.70021"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_1531_56747" result="effect2_innerShadow_1531_56747"/>
</filter>
<clipPath id="bgblur_4_1531_56747_clip_path" transform="translate(-69.3989 -159.596)"><rect width="3.85162" height="3.76363" rx="1.88181" transform="matrix(0.866025 0.5 -2.20305e-08 1 92.0535 181.532)"/>
</clipPath><filter id="filter6_ii_1531_56747" x="78.6669" y="165.157" width="48.6449" height="49.562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="0.356861"/>
<feGaussianBlur stdDeviation="0.17843"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_1531_56747"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="0.356861" operator="erode" in="SourceAlpha" result="effect2_innerShadow_1531_56747"/>
<feOffset dx="0.340041" dy="0.356861"/>
<feGaussianBlur stdDeviation="1.70021"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_1531_56747" result="effect2_innerShadow_1531_56747"/>
</filter>
<clipPath id="bgblur_5_1531_56747_clip_path" transform="translate(-78.6669 -165.157)"><rect width="3.85162" height="3.76363" rx="1.88181" transform="matrix(0.866025 0.5 -2.20305e-08 1 101.322 187.093)"/>
</clipPath><filter id="filter7_ii_1531_56747" x="87.935" y="170.718" width="48.6449" height="49.562" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dx="0.356861"/>
<feGaussianBlur stdDeviation="0.17843"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.1 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_1531_56747"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feMorphology radius="0.356861" operator="erode" in="SourceAlpha" result="effect2_innerShadow_1531_56747"/>
<feOffset dx="0.340041" dy="0.356861"/>
<feGaussianBlur stdDeviation="1.70021"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0.9875 0 0 0 0 0.9875 0 0 0 0.2 0"/>
<feBlend mode="normal" in2="effect1_innerShadow_1531_56747" result="effect2_innerShadow_1531_56747"/>
</filter>
<clipPath id="bgblur_6_1531_56747_clip_path" transform="translate(-87.935 -170.718)"><rect width="3.85162" height="3.76363" rx="1.88181" transform="matrix(0.866025 0.5 -2.20305e-08 1 110.59 192.655)"/>
</clipPath><filter id="filter8_f_1531_56747" x="160.333" y="110.648" width="26.2796" height="25.6738" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="5.45217" result="effect1_foregroundBlur_1531_56747"/>
</filter>
<radialGradient id="paint0_radial_1531_56747" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(81.9261 6.03841) rotate(106.757) scale(105.269 163.206)">
<stop stop-color="#2574DD"/>
<stop offset="0.546894" stop-color="#0C8EE8" stop-opacity="0.699888"/>
<stop offset="1" stop-color="#1DEFC9" stop-opacity="0.04"/>
</radialGradient>
<radialGradient id="paint1_radial_1531_56747" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(158.398 140.325) rotate(69.095) scale(45.6319 52.4826)">
<stop stop-color="#2574DD"/>
<stop offset="1" stop-color="#0880EA"/>
</radialGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

4
web/src/icons/num1.svg Normal file
View File

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="10" cy="10" r="10" fill="#D9DAE5"/>
<path d="M10.9425 5.27273V14H9.36151V6.81108H9.31037L7.26918 8.11506V6.66619L9.43821 5.27273H10.9425Z" fill="#6B6D85"/>
</svg>

After

Width:  |  Height:  |  Size: 271 B

4
web/src/icons/num2.svg Normal file
View File

@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="10" cy="10" r="10" fill="#D9DAE5"/>
<path d="M6.54901 14V12.858L9.57884 9.88778C9.86861 9.59517 10.1101 9.33523 10.3033 9.10795C10.4964 8.88068 10.6413 8.66051 10.7379 8.44744C10.8345 8.23437 10.8828 8.0071 10.8828 7.76562C10.8828 7.49006 10.8203 7.25426 10.6953 7.05824C10.5703 6.85938 10.3984 6.70597 10.1797 6.59801C9.96094 6.49006 9.71236 6.43608 9.43395 6.43608C9.14702 6.43608 8.8956 6.49574 8.67969 6.61506C8.46378 6.73153 8.29616 6.89773 8.17685 7.11364C8.06037 7.32955 8.00213 7.58665 8.00213 7.88494H6.49787C6.49787 7.33097 6.62429 6.84943 6.87713 6.44034C7.12997 6.03125 7.47798 5.71449 7.92116 5.49006C8.36719 5.26562 8.87855 5.15341 9.45526 5.15341C10.0405 5.15341 10.5547 5.26278 10.9979 5.48153C11.4411 5.70028 11.7848 6 12.0291 6.38068C12.2763 6.76136 12.3999 7.19602 12.3999 7.68466C12.3999 8.01136 12.3374 8.33239 12.2124 8.64773C12.0874 8.96307 11.8672 9.3125 11.5518 9.69602C11.2393 10.0795 10.8004 10.544 10.2351 11.0895L8.73082 12.6193V12.679H12.532V14H6.54901Z" fill="#6B6D85"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -32,6 +32,7 @@ export interface TestWrapperProps {
defaultSettingsURL?: string
isPublicAccessEnabledOnResources?: boolean
isCurrentSessionPublic?: boolean
accountInfo?: Unknown
}
export default function TestWrapper(props: PropsWithChildren<TestWrapperProps>) {
@ -49,7 +50,8 @@ export default function TestWrapper(props: PropsWithChildren<TestWrapperProps>)
currentUserProfileURL = '',
defaultSettingsURL = '',
isPublicAccessEnabledOnResources = false,
isCurrentSessionPublic = false
isCurrentSessionPublic = false,
accountInfo = null
} = props
const search = QueryString.stringify(queryParams, { addQueryPrefix: true })
const routePath = compile(path)(pathParams) + search
@ -73,7 +75,8 @@ export default function TestWrapper(props: PropsWithChildren<TestWrapperProps>)
currentUserProfileURL,
defaultSettingsURL,
isPublicAccessEnabledOnResources,
isCurrentSessionPublic
isCurrentSessionPublic,
accountInfo
}}>
<StringsContextProvider initialStrings={stringsData} getString={getString}>
<RestfulProvider base="/">