Merge branch 'more_ci_pages' of _OKE5H2PQKOUfzFFDuD4FA/default/CODE/gitness (#311)

This commit is contained in:
Dan Wilson 2023-08-14 10:01:10 +00:00 committed by Harness
commit 2d5d991708
20 changed files with 2210 additions and 136 deletions

View File

@ -14,6 +14,7 @@ export interface CODEProps {
pipeline?: string
execution?: string
commitSHA?: string
secret?: string
}
export interface CODEQueryProps {
@ -32,7 +33,8 @@ export const pathProps: Readonly<Omit<Required<CODEProps>, 'repoPath' | 'branch'
webhookId: ':webhookId',
pipeline: ':pipeline',
execution: ':execution',
commitSHA: ':commitSHA'
commitSHA: ':commitSHA',
secret: ':secret'
}
export interface CODERoutes {
@ -73,6 +75,7 @@ export interface CODERoutes {
toCODEExecutions: (args: Required<Pick<CODEProps, 'space' | 'pipeline'>>) => string
toCODEExecution: (args: Required<Pick<CODEProps, 'space' | 'pipeline' | 'execution'>>) => string
toCODESecret: (args: Required<Pick<CODEProps, 'space' | 'secret'>>) => string
}
/**
@ -126,5 +129,7 @@ export const routes: CODERoutes = {
toCODEWebhookDetails: ({ repoPath, webhookId }) => `/${repoPath}/webhook/${webhookId}`,
toCODEExecutions: ({ space, pipeline }) => `/pipelines/${space}/pipeline/${pipeline}`,
toCODEExecution: ({ space, pipeline, execution }) => `/pipelines/${space}/pipeline/${pipeline}/execution/${execution}`
toCODEExecution: ({ space, pipeline, execution }) =>
`/pipelines/${space}/pipeline/${pipeline}/execution/${execution}`,
toCODESecret: ({ space, secret }) => `/secrets/${space}/secret/${secret}`
}

View File

@ -30,6 +30,7 @@ import { useStrings } from 'framework/strings'
import { useFeatureFlag } from 'hooks/useFeatureFlag'
import ExecutionList from 'pages/ExecutionList/ExecutionList'
import Execution from 'pages/Execution/Execution'
import Secret from 'pages/Secret/Secret'
export const RouteDestinations: React.FC = React.memo(function RouteDestinations() {
const { getString } = useStrings()
@ -192,6 +193,14 @@ export const RouteDestinations: React.FC = React.memo(function RouteDestinations
</Route>
)}
{OPEN_SOURCE_SECRETS && (
<Route path={routes.toCODESecret({ space: pathProps.space, secret: pathProps.secret })} exact>
<LayoutWithSideNav title={getString('pageTitle.secrets')}>
<Secret />
</LayoutWithSideNav>
</Route>
)}
{OPEN_SOURCE_SECRETS && (
<Route path={routes.toCODESecrets({ space: pathProps.space })} exact>
<LayoutWithSideNav title={getString('pageTitle.secrets')}>

View File

@ -0,0 +1,159 @@
import {
useToaster,
type ButtonProps,
Button,
Dialog,
Layout,
Heading,
FontVariation,
Container,
Formik,
FormikForm,
FormInput,
Intent,
FlexExpander,
Icon
} from '@harness/uicore'
import { useModalHook } from '@harness/use-modal'
import React from 'react'
import { useMutate } from 'restful-react'
import * as yup from 'yup'
import { useStrings } from 'framework/strings'
import type { OpenapiCreateSecretRequest, TypesSecret } from 'services/code'
import { getErrorMessage } from 'utils/Utils'
interface SecretFormData {
value: string
description: string
name: string
}
const formInitialValues: SecretFormData = {
value: '',
description: '',
name: ''
}
export interface NewSecretModalButtonProps extends Omit<ButtonProps, 'onClick' | 'onSubmit'> {
space: string
modalTitle: string
submitButtonTitle?: string
cancelButtonTitle?: string
onSubmit: (data: TypesSecret) => void
}
export const NewSecretModalButton: React.FC<NewSecretModalButtonProps> = ({
space,
modalTitle,
submitButtonTitle,
cancelButtonTitle,
onSubmit,
...props
}) => {
const ModalComponent: React.FC = () => {
const { getString } = useStrings()
const { showError } = useToaster()
const { mutate: createSecret, loading } = useMutate<TypesSecret>({
verb: 'POST',
path: `/api/v1/secrets`
})
const handleSubmit = async (formData: SecretFormData) => {
try {
const payload: OpenapiCreateSecretRequest = {
space_ref: space,
data: formData.value,
description: formData.description,
uid: formData.name
}
const response = await createSecret(payload)
hideModal()
onSubmit(response)
} catch (exception) {
showError(getErrorMessage(exception), 0, getString('secrets.failedToCreate'))
}
}
return (
<Dialog
isOpen
enforceFocus={false}
onClose={hideModal}
title={''}
style={{ width: 700, maxHeight: '95vh', overflow: 'auto' }}>
<Layout.Vertical
padding={{ left: 'xxlarge' }}
style={{ height: '100%' }}
data-testid="add-target-to-flag-modal">
<Heading level={3} font={{ variation: FontVariation.H3 }} margin={{ bottom: 'xlarge' }}>
{modalTitle}
</Heading>
<Container margin={{ right: 'xxlarge' }}>
<Formik
initialValues={formInitialValues}
formName="addSecret"
enableReinitialize={true}
validationSchema={yup.object().shape({
name: yup.string().trim().required(),
value: yup.string().trim().required()
})}
validateOnChange
validateOnBlur
onSubmit={handleSubmit}>
<FormikForm>
<FormInput.Text
name="name"
label={getString('name')}
placeholder={getString('secrets.enterSecretName')}
tooltipProps={{
dataTooltipId: 'secretNameTextField'
}}
inputGroup={{ autoFocus: true }}
/>
<FormInput.Text
name="value"
label={getString('value')}
placeholder={getString('secrets.value')}
tooltipProps={{
dataTooltipId: 'secretDescriptionTextField'
}}
inputGroup={{ type: 'password' }}
/>
<FormInput.Text
name="description"
label={getString('description')}
placeholder={getString('enterDescription')}
tooltipProps={{
dataTooltipId: 'secretDescriptionTextField'
}}
isOptional
/>
<Layout.Horizontal
spacing="small"
padding={{ right: 'xxlarge', top: 'xxxlarge', bottom: 'large' }}
style={{ alignItems: 'center' }}>
<Button
type="submit"
text={getString('secrets.createSecret')}
intent={Intent.PRIMARY}
disabled={loading}
/>
<Button text={cancelButtonTitle || getString('cancel')} minimal onClick={hideModal} />
<FlexExpander />
{loading && <Icon intent={Intent.PRIMARY} name="spinner" size={16} />}
</Layout.Horizontal>
</FormikForm>
</Formik>
</Container>
</Layout.Vertical>
</Dialog>
)
}
const [openModal, hideModal] = useModalHook(ModalComponent, [onSubmit])
return <Button onClick={openModal} {...props} />
}

View File

@ -176,6 +176,7 @@ export interface StringsMap {
expired: string
failed: string
failedToCreateBranch: string
failedToCreatePipeline: string
failedToCreateRepo: string
failedToCreateSpace: string
failedToDeleteBranch: string
@ -449,6 +450,13 @@ export interface StringsMap {
search: string
searchBranches: string
secret: string
'secrets.createSecret': string
'secrets.enterSecretName': string
'secrets.failedToCreate': string
'secrets.name': string
'secrets.newSecretButton': string
'secrets.noData': string
'secrets.value': string
selectBranchPlaceHolder: string
selectRange: string
selectSpace: string
@ -533,6 +541,7 @@ export interface StringsMap {
'validation.spaceNamePatternIsNotValid': string
'validation.uidInvalid': string
'validation.uidRequired': string
value: string
viewAllBranches: string
viewAllTags: string
viewCommitDetails: string

View File

@ -11,6 +11,7 @@ public: Public
private: Private
cancel: Cancel
name: Name
value: Value
help: help
search: Search
description: Description
@ -580,6 +581,7 @@ spaceMemberships:
memberUpdated: Member updated successfully.
memberAdded: Member added successfully.
failedToCreateSpace: Failed to create Space. Please try again.
failedToCreatePipeline: Failed to create Pipeline. Please try again.
enterName: Enter the name
createSpace: Create Space
newSpace: New Space
@ -623,3 +625,11 @@ executions:
name: Execution Name
selectRange: Shift-click to select a range
allCommits: All Commits
secrets:
noData: There are no secrets :(
newSecretButton: New Secret
name: Secret Name
failedToCreate: Failed to create Secret. Please try again.
enterSecretName: Enter Secret name
value: Secret Value
createSecret: Create Secret

View File

@ -1,11 +1,29 @@
import React from 'react'
import { Container, PageHeader } from '@harness/uicore'
import { useParams } from 'react-router-dom'
import { useGet } from 'restful-react'
import { useGetSpaceParam } from 'hooks/useGetSpaceParam'
import type { CODEProps } from 'RouteDefinitions'
import type { TypesExecution } from 'services/code'
import css from './Execution.module.scss'
const Execution = () => {
const space = useGetSpaceParam()
const { pipeline, execution: executionNum } = useParams<CODEProps>()
const {
data: execution
// error,
// loading,
// refetch
// response
} = useGet<TypesExecution>({
path: `/api/v1/pipelines/${space}/${pipeline}/+/executions/${executionNum}`
})
return (
<Container className={css.main}>
<PageHeader title={'THIS IS AN EXECUTION'} />
<PageHeader title={`EXECUTION STATUS = ${execution?.status}`} />
</Container>
)
}

View File

@ -26,6 +26,10 @@
}
}
.withError {
display: grid;
}
.nameContainer {
position: relative;

View File

@ -6,6 +6,7 @@ declare const styles: {
readonly table: string
readonly row: string
readonly noDesc: string
readonly withError: string
readonly nameContainer: string
readonly name: string
readonly pinned: string

View File

@ -1,11 +1,10 @@
import React, { useMemo, useState } from 'react'
import React, { useMemo } from 'react'
import {
Button,
ButtonVariation,
Color,
Container,
FlexExpander,
Icon,
Layout,
PageBody,
PageHeader,
@ -14,68 +13,42 @@ import {
} from '@harness/uicore'
import cx from 'classnames'
import type { CellProps, Column } from 'react-table'
import Keywords from 'react-keywords'
import { useHistory } from 'react-router-dom'
import { useHistory, useParams } from 'react-router-dom'
import { useGet } from 'restful-react'
import { useStrings } from 'framework/strings'
import { LoadingSpinner } from 'components/LoadingSpinner/LoadingSpinner'
import { useAppContext } from 'AppContext'
import { SearchInputWithSpinner } from 'components/SearchInputWithSpinner/SearchInputWithSpinner'
import { NoResultCard } from 'components/NoResultCard/NoResultCard'
import { formatDate } from 'utils/Utils'
import { LIST_FETCHING_LIMIT, PageBrowserProps, formatDate, getErrorMessage, voidFn } from 'utils/Utils'
import type { CODEProps } from 'RouteDefinitions'
import type { TypesExecution } from 'services/code'
import { useGetSpaceParam } from 'hooks/useGetSpaceParam'
import { useQueryParams } from 'hooks/useQueryParams'
import { usePageIndex } from 'hooks/usePageIndex'
import { ResourceListingPagination } from 'components/ResourceListingPagination/ResourceListingPagination'
import noExecutionImage from '../RepositoriesListing/no-repo.svg'
import css from './ExecutionList.module.scss'
interface Execution {
id: number
uid: string
name: string
updated: number
description?: string
isPublic?: boolean
spaceUid: string
pipelineUid: string
}
const executions: Execution[] = [
{
id: 1,
uid: '1',
name: 'Exec 1',
updated: 1687234800,
description: 'This is a description',
isPublic: true,
spaceUid: 'root',
pipelineUid: 'pipeline-1'
},
{
id: 2,
uid: '2',
name: 'Exec 2',
updated: 1730275200,
description: 'This is a description',
isPublic: true,
spaceUid: 'root',
pipelineUid: 'pipeline-2'
},
{
id: 3,
uid: '3',
name: 'Exec 3',
updated: 1773315600,
description: 'This is a description',
isPublic: false,
spaceUid: 'root',
pipelineUid: 'pipeline-3'
}
]
const loading = false
const ExecutionList = () => {
const { routes } = useAppContext()
const space = useGetSpaceParam()
const { pipeline } = useParams<CODEProps>()
const history = useHistory()
const { getString } = useStrings()
const [searchTerm, setSearchTerm] = useState<string | undefined>()
const pageBrowser = useQueryParams<PageBrowserProps>()
const pageInit = pageBrowser.page ? parseInt(pageBrowser.page) : 1
const [page, setPage] = usePageIndex(pageInit)
const {
data: executions,
error,
loading,
refetch,
response
} = useGet<TypesExecution[]>({
path: `/api/v1/pipelines/${space}/${pipeline}/+/executions`,
queryParams: { page, limit: LIST_FETCHING_LIMIT }
})
const NewExecutionButton = (
<Button
@ -85,21 +58,19 @@ const ExecutionList = () => {
icon="plus"></Button>
)
const columns: Column<Execution>[] = useMemo(
const columns: Column<TypesExecution>[] = useMemo(
() => [
{
Header: getString('repos.name'),
width: 'calc(100% - 180px)',
Cell: ({ row }: CellProps<Execution>) => {
Cell: ({ row }: CellProps<TypesExecution>) => {
const record = row.original
return (
<Container className={css.nameContainer}>
<Layout.Horizontal spacing="small" style={{ flexGrow: 1 }}>
<Layout.Vertical flex className={css.name}>
<Text className={css.repoName}>
<Keywords value={searchTerm}>{record.uid}</Keywords>
</Text>
{record.description && <Text className={css.desc}>{record.description}</Text>}
<Text className={css.repoName}>{record.number}</Text>
{record.status && <Text className={css.desc}>{record.status}</Text>}
</Layout.Vertical>
</Layout.Horizontal>
</Container>
@ -109,63 +80,64 @@ const ExecutionList = () => {
{
Header: getString('repos.updated'),
width: '180px',
Cell: ({ row }: CellProps<Execution>) => {
Cell: ({ row }: CellProps<TypesExecution>) => {
return (
<Layout.Horizontal style={{ alignItems: 'center' }}>
<Text color={Color.BLACK} lineClamp={1} rightIconProps={{ size: 10 }} width={120}>
{formatDate(row.original.updated as number)}
</Text>
{row.original.isPublic === false ? <Icon name="lock" size={10} /> : undefined}
</Layout.Horizontal>
)
},
disableSortBy: true
}
],
[getString, searchTerm]
[getString]
)
return (
<Container className={css.main}>
<PageHeader title={getString('pageTitle.executions')} />
<PageBody
className={cx({ [css.withError]: !!error })}
error={error ? getErrorMessage(error) : null}
retryOnError={voidFn(refetch)}
noData={{
when: () => executions.length === 0,
when: () => executions?.length === 0,
image: noExecutionImage,
message: getString('executions.noData'),
button: NewExecutionButton
}}>
<LoadingSpinner visible={loading && !searchTerm} />
<LoadingSpinner visible={loading} />
<Container padding="xlarge">
<Layout.Horizontal spacing="large" className={css.layout}>
{NewExecutionButton}
<FlexExpander />
<SearchInputWithSpinner loading={loading} query={searchTerm} setQuery={setSearchTerm} />
</Layout.Horizontal>
<Container margin={{ top: 'medium' }}>
{!!executions?.length && (
<Table<Execution>
<Table<TypesExecution>
className={css.table}
columns={columns}
data={executions || []}
onRowClick={executionInfo =>
history.push(
routes.toCODEExecution({
space: executionInfo.spaceUid,
pipeline: executionInfo.pipelineUid,
execution: executionInfo.uid
space,
pipeline: pipeline as string,
execution: String(executionInfo.id)
})
)
}
getRowClassName={row => cx(css.row, !row.original.description && css.noDesc)}
getRowClassName={row => cx(css.row, !row.original.number && css.noDesc)}
/>
)}
<NoResultCard showWhen={() => !!executions.length && !!searchTerm?.length} forSearch={true} />
<NoResultCard showWhen={() => !!executions && executions.length === 0} forSearch={true} />
</Container>
{/* <ResourceListingPagination response={response} page={page} setPage={setPage} /> */}
<ResourceListingPagination response={response} page={page} setPage={setPage} />
</Container>
</PageBody>
</Container>

View File

@ -7,6 +7,10 @@
}
}
.withError {
display: grid;
}
.table {
[class*='TableV2--header'] [class*='variation-table-headers'] {
text-transform: none;

View File

@ -3,6 +3,7 @@
declare const styles: {
readonly main: string
readonly layout: string
readonly withError: string
readonly table: string
readonly row: string
readonly noDesc: string

View File

@ -5,7 +5,6 @@ import {
Color,
Container,
FlexExpander,
Icon,
Layout,
PageBody,
PageHeader,
@ -16,62 +15,41 @@ import cx from 'classnames'
import type { CellProps, Column } from 'react-table'
import Keywords from 'react-keywords'
import { useHistory } from 'react-router-dom'
import { useGet } from 'restful-react'
import { useStrings } from 'framework/strings'
import { LoadingSpinner } from 'components/LoadingSpinner/LoadingSpinner'
import { useAppContext } from 'AppContext'
import { SearchInputWithSpinner } from 'components/SearchInputWithSpinner/SearchInputWithSpinner'
import { NoResultCard } from 'components/NoResultCard/NoResultCard'
import { formatDate } from 'utils/Utils'
import { LIST_FETCHING_LIMIT, PageBrowserProps, formatDate, getErrorMessage, voidFn } from 'utils/Utils'
import { useGetSpaceParam } from 'hooks/useGetSpaceParam'
import type { TypesPipeline } from 'services/code'
import { useQueryParams } from 'hooks/useQueryParams'
import { usePageIndex } from 'hooks/usePageIndex'
import { ResourceListingPagination } from 'components/ResourceListingPagination/ResourceListingPagination'
import { useAppContext } from 'AppContext'
import noPipelineImage from '../RepositoriesListing/no-repo.svg'
import css from './PipelineList.module.scss'
interface Pipeline {
id: number
uid: string
name: string
updated: number
description?: string
isPublic?: boolean
spaceUid: string
}
const pipelines: Pipeline[] = [
{
id: 1,
uid: 'pipeline-1',
name: 'Pipeline 1',
updated: 1687234800,
description: 'This is a description',
isPublic: true,
spaceUid: 'root'
},
{
id: 2,
uid: 'pipeline-2',
name: 'Pipeline 2',
updated: 1730275200,
description: 'This is a description',
isPublic: true,
spaceUid: 'root'
},
{
id: 3,
uid: 'pipeline-3',
name: 'Pipeline 3',
updated: 1773315600,
description: 'This is a description',
isPublic: false,
spaceUid: 'root'
}
]
const loading = false
const PipelineList = () => {
const { routes } = useAppContext()
const space = useGetSpaceParam()
const history = useHistory()
const { getString } = useStrings()
const [searchTerm, setSearchTerm] = useState<string | undefined>()
const pageBrowser = useQueryParams<PageBrowserProps>()
const pageInit = pageBrowser.page ? parseInt(pageBrowser.page) : 1
const [page, setPage] = usePageIndex(pageInit)
const {
data: pipelines,
error,
loading,
refetch,
response
} = useGet<TypesPipeline[]>({
path: `/api/v1/spaces/${space}/pipelines`,
queryParams: { page, limit: LIST_FETCHING_LIMIT, query: searchTerm }
})
const NewPipelineButton = (
<Button
@ -81,12 +59,12 @@ const PipelineList = () => {
icon="plus"></Button>
)
const columns: Column<Pipeline>[] = useMemo(
const columns: Column<TypesPipeline>[] = useMemo(
() => [
{
Header: getString('pipelines.name'),
width: 'calc(100% - 180px)',
Cell: ({ row }: CellProps<Pipeline>) => {
Cell: ({ row }: CellProps<TypesPipeline>) => {
const record = row.original
return (
<Container className={css.nameContainer}>
@ -105,13 +83,12 @@ const PipelineList = () => {
{
Header: getString('repos.updated'),
width: '180px',
Cell: ({ row }: CellProps<Pipeline>) => {
Cell: ({ row }: CellProps<TypesPipeline>) => {
return (
<Layout.Horizontal style={{ alignItems: 'center' }}>
<Text color={Color.BLACK} lineClamp={1} rightIconProps={{ size: 10 }} width={120}>
{formatDate(row.original.updated as number)}
</Text>
{row.original.isPublic === false ? <Icon name="lock" size={10} /> : undefined}
</Layout.Horizontal>
)
},
@ -125,8 +102,11 @@ const PipelineList = () => {
<Container className={css.main}>
<PageHeader title={getString('pageTitle.pipelines')} />
<PageBody
className={cx({ [css.withError]: !!error })}
error={error ? getErrorMessage(error) : null}
retryOnError={voidFn(refetch)}
noData={{
when: () => pipelines.length === 0,
when: () => pipelines?.length === 0 && searchTerm === undefined,
image: noPipelineImage,
message: getString('pipelines.noData'),
button: NewPipelineButton
@ -142,20 +122,23 @@ const PipelineList = () => {
<Container margin={{ top: 'medium' }}>
{!!pipelines?.length && (
<Table<Pipeline>
<Table<TypesPipeline>
className={css.table}
columns={columns}
data={pipelines || []}
onRowClick={pipelineInfo =>
history.push(routes.toCODEExecutions({ space: pipelineInfo.spaceUid, pipeline: pipelineInfo.uid }))
history.push(routes.toCODEExecutions({ space, pipeline: pipelineInfo.uid as string }))
}
getRowClassName={row => cx(css.row, !row.original.description && css.noDesc)}
/>
)}
<NoResultCard showWhen={() => !!pipelines.length && !!searchTerm?.length} forSearch={true} />
<NoResultCard
showWhen={() => !!pipelines && pipelines?.length === 0 && !!searchTerm?.length}
forSearch={true}
/>
</Container>
{/* <ResourceListingPagination response={response} page={page} setPage={setPage} /> */}
<ResourceListingPagination response={response} page={page} setPage={setPage} />
</Container>
</PageBody>
</Container>

View File

@ -0,0 +1,4 @@
.main {
min-height: var(--page-min-height, 100%);
background-color: var(--primary-bg) !important;
}

View File

@ -0,0 +1,6 @@
/* eslint-disable */
// this is an auto-generated file
declare const styles: {
readonly main: string
}
export default styles

View File

@ -0,0 +1,31 @@
import React from 'react'
import { Container, PageHeader } from '@harness/uicore'
import { useParams } from 'react-router-dom'
import { useGet } from 'restful-react'
import type { CODEProps } from 'RouteDefinitions'
import { useGetSpaceParam } from 'hooks/useGetSpaceParam'
import type { TypesSecret } from 'services/code'
import css from './Secret.module.scss'
const Execution = () => {
const space = useGetSpaceParam()
const { secret: secretName } = useParams<CODEProps>()
const {
data: secret
// error,
// loading,
// refetch
// response
} = useGet<TypesSecret>({
path: `/api/v1/secrets/${space}/${secretName}/+`
})
return (
<Container className={css.main}>
<PageHeader title={`THIS IS A SECRET = ${secret?.uid}`} />
</Container>
)
}
export default Execution

View File

@ -1,4 +1,86 @@
.main {
min-height: var(--page-height);
background-color: var(--primary-bg) !important;
.layout {
align-items: center;
}
}
.withError {
display: grid;
}
.table {
[class*='TableV2--header'] [class*='variation-table-headers'] {
text-transform: none;
color: var(--grey-400);
font-weight: 500;
font-size: 13px;
}
.row {
height: 80px;
box-shadow: 0px 0px 1px rgba(40, 41, 61, 0.08), 0px 0.5px 2px rgba(96, 97, 112, 0.16);
overflow: hidden;
&.noDesc > div {
height: 44px;
}
}
}
.nameContainer {
position: relative;
.name {
flex-grow: 1;
align-items: baseline !important;
width: calc(100% - 100px) !important;
> span {
width: 100%;
> span {
width: 100%;
}
}
& + span:last-of-type {
align-self: center;
}
}
.pinned {
transform: rotate(-90deg);
position: absolute;
top: 7px;
left: -43px;
font-size: var(--font-size-xsmall) !important;
padding: 6px 14px;
}
.repoName {
font-weight: 600 !important;
font-size: 16px !important;
line-height: 24px !important;
color: var(--grey-800);
.repoScope {
color: var(--grey-400);
padding: 2px 6px;
font-size: var(--font-size-xsmall) !important;
border-radius: 4px;
border: 1px solid var(--grey-200);
display: inline-block;
margin-left: var(--spacing-medium);
text-transform: uppercase;
line-height: 16px;
}
}
.desc {
color: var(--grey-500);
font-size: var(--font-size-small);
padding-top: var(--spacing-xsmall) !important;
}
}

View File

@ -2,5 +2,16 @@
// this is an auto-generated file
declare const styles: {
readonly main: string
readonly layout: string
readonly withError: string
readonly table: string
readonly row: string
readonly noDesc: string
readonly nameContainer: string
readonly name: string
readonly pinned: string
readonly repoName: string
readonly repoScope: string
readonly desc: string
}
export default styles

View File

@ -1,16 +1,151 @@
import React from 'react'
import { Container, PageHeader } from '@harness/uicore'
import React, { useMemo, useState } from 'react'
import {
ButtonVariation,
Color,
Container,
FlexExpander,
Layout,
PageBody,
PageHeader,
TableV2 as Table,
Text
} from '@harness/uicore'
import cx from 'classnames'
import type { CellProps, Column } from 'react-table'
import Keywords from 'react-keywords'
import { useHistory } from 'react-router-dom'
import { useGet } from 'restful-react'
import { useStrings } from 'framework/strings'
import { LoadingSpinner } from 'components/LoadingSpinner/LoadingSpinner'
import { SearchInputWithSpinner } from 'components/SearchInputWithSpinner/SearchInputWithSpinner'
import { NoResultCard } from 'components/NoResultCard/NoResultCard'
import { LIST_FETCHING_LIMIT, PageBrowserProps, formatDate, getErrorMessage, voidFn } from 'utils/Utils'
import type { TypesSecret } from 'services/code'
import { usePageIndex } from 'hooks/usePageIndex'
import { useQueryParams } from 'hooks/useQueryParams'
import { useGetSpaceParam } from 'hooks/useGetSpaceParam'
import { ResourceListingPagination } from 'components/ResourceListingPagination/ResourceListingPagination'
import { NewSecretModalButton } from 'components/NewSecretModalButton/NewSecretModalButton'
import { useAppContext } from 'AppContext'
import noSecretsImage from '../RepositoriesListing/no-repo.svg'
import css from './SecretList.module.scss'
const PipelineList = () => {
const SecretList = () => {
const { routes } = useAppContext()
const space = useGetSpaceParam()
const history = useHistory()
const { getString } = useStrings()
const [searchTerm, setSearchTerm] = useState<string | undefined>()
const pageBrowser = useQueryParams<PageBrowserProps>()
const pageInit = pageBrowser.page ? parseInt(pageBrowser.page) : 1
const [page, setPage] = usePageIndex(pageInit)
const {
data: secrets,
error,
loading,
refetch,
response
} = useGet<TypesSecret[]>({
path: `/api/v1/spaces/${space}/secrets`,
queryParams: { page, limit: LIST_FETCHING_LIMIT, query: searchTerm }
})
const NewSecretButton = (
<NewSecretModalButton
space={space}
modalTitle={getString('secrets.newSecretButton')}
text={getString('secrets.newSecretButton')}
variation={ButtonVariation.PRIMARY}
icon="plus"
onSubmit={secretInfo =>
history.push(routes.toCODESecret({ space, secret: secretInfo.uid as string }))
}></NewSecretModalButton>
)
const columns: Column<TypesSecret>[] = useMemo(
() => [
{
Header: getString('secrets.name'),
width: 'calc(100% - 180px)',
Cell: ({ row }: CellProps<TypesSecret>) => {
const record = row.original
return (
<Container className={css.nameContainer}>
<Layout.Horizontal spacing="small" style={{ flexGrow: 1 }}>
<Layout.Vertical flex className={css.name}>
<Text className={css.repoName}>
<Keywords value={searchTerm}>{record.uid}</Keywords>
</Text>
{record.description && <Text className={css.desc}>{record.description}</Text>}
</Layout.Vertical>
</Layout.Horizontal>
</Container>
)
}
},
{
Header: getString('repos.updated'),
width: '180px',
Cell: ({ row }: CellProps<TypesSecret>) => {
return (
<Layout.Horizontal style={{ alignItems: 'center' }}>
<Text color={Color.BLACK} lineClamp={1} rightIconProps={{ size: 10 }} width={120}>
{formatDate(row.original.updated as number)}
</Text>
</Layout.Horizontal>
)
},
disableSortBy: true
}
],
[getString, searchTerm]
)
return (
<Container className={css.main}>
<PageHeader title={getString('pageTitle.secrets')} />
<PageBody
className={cx({ [css.withError]: !!error })}
error={error ? getErrorMessage(error) : null}
retryOnError={voidFn(refetch)}
noData={{
when: () => secrets?.length === 0 && searchTerm === undefined,
image: noSecretsImage,
message: getString('secrets.noData'),
button: NewSecretButton
}}>
<LoadingSpinner visible={loading && !searchTerm} />
<Container padding="xlarge">
<Layout.Horizontal spacing="large" className={css.layout}>
{NewSecretButton}
<FlexExpander />
<SearchInputWithSpinner loading={loading} query={searchTerm} setQuery={setSearchTerm} />
</Layout.Horizontal>
<Container margin={{ top: 'medium' }}>
{!!secrets?.length && (
<Table<TypesSecret>
className={css.table}
columns={columns}
data={secrets || []}
onRowClick={secretInfo =>
history.push(routes.toCODESecret({ space: 'root', secret: secretInfo.uid as string }))
}
getRowClassName={row => cx(css.row, !row.original.description && css.noDesc)}
/>
)}
<NoResultCard
showWhen={() => !!secrets && secrets?.length === 0 && !!searchTerm?.length}
forSearch={true}
/>
</Container>
<ResourceListingPagination response={response} page={page} setPage={setPage} />
</Container>
</PageBody>
</Container>
)
}
export default PipelineList
export default SecretList

View File

@ -45,6 +45,8 @@ export type EnumPullReqReviewerType = 'assigned' | 'requested' | 'self_assigned'
export type EnumPullReqState = 'closed' | 'merged' | 'open'
export type EnumScmType = 'GITNESS' | 'GITHUB' | 'GITLAB' | 'UNKNOWN'
export type EnumTokenType = string
export type EnumWebhookExecutionResult = 'fatal_error' | 'retriable_error' | 'success' | null
@ -67,13 +69,13 @@ export interface GitrpcBlamePart {
lines?: string[] | null
}
export type GitrpcCommit = {
export interface GitrpcCommit {
author?: GitrpcSignature
committer?: GitrpcSignature
message?: string
sha?: string
title?: string
} | null
}
export type GitrpcFileAction = 'CREATE' | 'UPDATE' | 'DELETE' | 'MOVE'
@ -82,6 +84,12 @@ export interface GitrpcIdentity {
name?: string
}
export interface GitrpcPathDetails {
last_commit?: GitrpcCommit
path?: string
size?: number
}
export interface GitrpcSignature {
identity?: GitrpcIdentity
when?: string
@ -150,10 +158,24 @@ export interface OpenapiCreateBranchRequest {
target?: string
}
export interface OpenapiCreateExecutionRequest {
status?: string
}
export interface OpenapiCreatePathRequest {
path?: string
}
export interface OpenapiCreatePipelineRequest {
config_path?: string
default_branch?: string
description?: string
repo_ref?: string
repo_type?: EnumScmType
space_ref?: string
uid?: string
}
export interface OpenapiCreatePullReqRequest {
description?: string
is_draft?: boolean
@ -179,6 +201,13 @@ export interface OpenapiCreateRepositoryRequest {
uid?: string
}
export interface OpenapiCreateSecretRequest {
data?: string
description?: string
space_ref?: string
uid?: string
}
export interface OpenapiCreateSpaceRequest {
description?: string
is_public?: boolean
@ -243,6 +272,10 @@ export interface OpenapiMoveSpaceRequest {
uid?: string | null
}
export interface OpenapiPathsDetailsRequest {
paths?: string[] | null
}
export interface OpenapiRegisterRequest {
display_name?: string
email?: string
@ -270,6 +303,16 @@ export interface OpenapiUpdateAdminRequest {
admin?: boolean
}
export interface OpenapiUpdateExecutionRequest {
status?: string
}
export interface OpenapiUpdatePipelineRequest {
config_path?: string
description?: string
uid?: string
}
export interface OpenapiUpdatePullReqRequest {
description?: string
title?: string
@ -280,6 +323,12 @@ export interface OpenapiUpdateRepoRequest {
is_public?: boolean | null
}
export interface OpenapiUpdateSecretRequest {
data?: string
description?: string
uid?: string
}
export interface OpenapiUpdateSpaceRequest {
description?: string | null
is_public?: boolean | null
@ -376,6 +425,10 @@ export interface RepoMergeCheck {
mergeable?: boolean
}
export interface RepoPathsDetailsOutput {
details?: GitrpcPathDetails[] | null
}
export interface RepoSubmoduleContent {
commit_sha?: string
url?: string
@ -431,6 +484,44 @@ export interface TypesDiffStats {
files_changed?: number
}
export interface TypesExecution {
action?: string
after?: string
author_avatar?: string
author_email?: string
author_login?: string
author_name?: string
before?: string
created?: number
cron?: string
debug?: boolean
deploy_id?: number
deploy_to?: string
error?: string
event?: string
finished?: number
id?: number
link?: string
message?: string
number?: number
params?: string
parent?: number
pipeline_id?: number
ref?: string
repo_id?: number
sender?: string
source?: string
source_repo?: string
started?: number
status?: string
target?: string
timestamp?: number
title?: string
trigger?: string
updated?: number
version?: number
}
export interface TypesIdentity {
email?: string
name?: string
@ -473,6 +564,22 @@ export interface TypesPath {
value?: string
}
export interface TypesPipeline {
config_path?: string
created?: number
default_branch?: string
description?: string
id?: number
repo_id?: number
repo_name?: string
repo_type?: EnumScmType
seq?: number
space_id?: number
uid?: string
updated?: number
version?: number
}
export interface TypesPrincipalInfo {
created?: number
display_name?: string
@ -574,6 +681,16 @@ export interface TypesRepository {
updated?: number
}
export interface TypesSecret {
created?: number
description?: string
id?: number
space_id?: number
uid?: string
updated?: number
version?: number
}
export interface TypesServiceAccount {
admin?: boolean
blocked?: boolean
@ -859,6 +976,274 @@ export type UseOpLogoutProps = Omit<UseMutateProps<void, UsererrorError, void, v
export const useOpLogout = (props: UseOpLogoutProps) =>
useMutate<void, UsererrorError, void, void, void>('POST', `/logout`, { base: getConfig('code'), ...props })
export type CreatePipelineProps = Omit<
MutateProps<TypesPipeline, UsererrorError, void, OpenapiCreatePipelineRequest, void>,
'path' | 'verb'
>
export const CreatePipeline = (props: CreatePipelineProps) => (
<Mutate<TypesPipeline, UsererrorError, void, OpenapiCreatePipelineRequest, void>
verb="POST"
path={`/pipelines`}
base={getConfig('code')}
{...props}
/>
)
export type UseCreatePipelineProps = Omit<
UseMutateProps<TypesPipeline, UsererrorError, void, OpenapiCreatePipelineRequest, void>,
'path' | 'verb'
>
export const useCreatePipeline = (props: UseCreatePipelineProps) =>
useMutate<TypesPipeline, UsererrorError, void, OpenapiCreatePipelineRequest, void>('POST', `/pipelines`, {
base: getConfig('code'),
...props
})
export type DeletePipelineProps = Omit<MutateProps<void, UsererrorError, void, string, void>, 'path' | 'verb'>
export const DeletePipeline = (props: DeletePipelineProps) => (
<Mutate<void, UsererrorError, void, string, void>
verb="DELETE"
path={`/pipelines`}
base={getConfig('code')}
{...props}
/>
)
export type UseDeletePipelineProps = Omit<UseMutateProps<void, UsererrorError, void, string, void>, 'path' | 'verb'>
export const useDeletePipeline = (props: UseDeletePipelineProps) =>
useMutate<void, UsererrorError, void, string, void>('DELETE', `/pipelines`, { base: getConfig('code'), ...props })
export interface FindPipelinePathParams {
pipeline_ref: string
}
export type FindPipelineProps = Omit<GetProps<TypesPipeline, UsererrorError, void, FindPipelinePathParams>, 'path'> &
FindPipelinePathParams
export const FindPipeline = ({ pipeline_ref, ...props }: FindPipelineProps) => (
<Get<TypesPipeline, UsererrorError, void, FindPipelinePathParams>
path={`/pipelines/${pipeline_ref}`}
base={getConfig('code')}
{...props}
/>
)
export type UseFindPipelineProps = Omit<
UseGetProps<TypesPipeline, UsererrorError, void, FindPipelinePathParams>,
'path'
> &
FindPipelinePathParams
export const useFindPipeline = ({ pipeline_ref, ...props }: UseFindPipelineProps) =>
useGet<TypesPipeline, UsererrorError, void, FindPipelinePathParams>(
(paramsInPath: FindPipelinePathParams) => `/pipelines/${paramsInPath.pipeline_ref}`,
{ base: getConfig('code'), pathParams: { pipeline_ref }, ...props }
)
export interface UpdatePipelinePathParams {
pipeline_ref: string
}
export type UpdatePipelineProps = Omit<
MutateProps<TypesPipeline, UsererrorError, void, OpenapiUpdatePipelineRequest, UpdatePipelinePathParams>,
'path' | 'verb'
> &
UpdatePipelinePathParams
export const UpdatePipeline = ({ pipeline_ref, ...props }: UpdatePipelineProps) => (
<Mutate<TypesPipeline, UsererrorError, void, OpenapiUpdatePipelineRequest, UpdatePipelinePathParams>
verb="PATCH"
path={`/pipelines/${pipeline_ref}`}
base={getConfig('code')}
{...props}
/>
)
export type UseUpdatePipelineProps = Omit<
UseMutateProps<TypesPipeline, UsererrorError, void, OpenapiUpdatePipelineRequest, UpdatePipelinePathParams>,
'path' | 'verb'
> &
UpdatePipelinePathParams
export const useUpdatePipeline = ({ pipeline_ref, ...props }: UseUpdatePipelineProps) =>
useMutate<TypesPipeline, UsererrorError, void, OpenapiUpdatePipelineRequest, UpdatePipelinePathParams>(
'PATCH',
(paramsInPath: UpdatePipelinePathParams) => `/pipelines/${paramsInPath.pipeline_ref}`,
{ base: getConfig('code'), pathParams: { pipeline_ref }, ...props }
)
export interface ListExecutionsQueryParams {
/**
* The page to return.
*/
page?: number
/**
* The maximum number of results to return.
*/
limit?: number
}
export interface ListExecutionsPathParams {
pipeline_ref: string
}
export type ListExecutionsProps = Omit<
GetProps<TypesExecution[], UsererrorError, ListExecutionsQueryParams, ListExecutionsPathParams>,
'path'
> &
ListExecutionsPathParams
export const ListExecutions = ({ pipeline_ref, ...props }: ListExecutionsProps) => (
<Get<TypesExecution[], UsererrorError, ListExecutionsQueryParams, ListExecutionsPathParams>
path={`/pipelines/${pipeline_ref}/executions`}
base={getConfig('code')}
{...props}
/>
)
export type UseListExecutionsProps = Omit<
UseGetProps<TypesExecution[], UsererrorError, ListExecutionsQueryParams, ListExecutionsPathParams>,
'path'
> &
ListExecutionsPathParams
export const useListExecutions = ({ pipeline_ref, ...props }: UseListExecutionsProps) =>
useGet<TypesExecution[], UsererrorError, ListExecutionsQueryParams, ListExecutionsPathParams>(
(paramsInPath: ListExecutionsPathParams) => `/pipelines/${paramsInPath.pipeline_ref}/executions`,
{ base: getConfig('code'), pathParams: { pipeline_ref }, ...props }
)
export interface CreateExecutionPathParams {
pipeline_ref: string
}
export type CreateExecutionProps = Omit<
MutateProps<TypesExecution, UsererrorError, void, OpenapiCreateExecutionRequest, CreateExecutionPathParams>,
'path' | 'verb'
> &
CreateExecutionPathParams
export const CreateExecution = ({ pipeline_ref, ...props }: CreateExecutionProps) => (
<Mutate<TypesExecution, UsererrorError, void, OpenapiCreateExecutionRequest, CreateExecutionPathParams>
verb="POST"
path={`/pipelines/${pipeline_ref}/executions`}
base={getConfig('code')}
{...props}
/>
)
export type UseCreateExecutionProps = Omit<
UseMutateProps<TypesExecution, UsererrorError, void, OpenapiCreateExecutionRequest, CreateExecutionPathParams>,
'path' | 'verb'
> &
CreateExecutionPathParams
export const useCreateExecution = ({ pipeline_ref, ...props }: UseCreateExecutionProps) =>
useMutate<TypesExecution, UsererrorError, void, OpenapiCreateExecutionRequest, CreateExecutionPathParams>(
'POST',
(paramsInPath: CreateExecutionPathParams) => `/pipelines/${paramsInPath.pipeline_ref}/executions`,
{ base: getConfig('code'), pathParams: { pipeline_ref }, ...props }
)
export interface DeleteExecutionPathParams {
pipeline_ref: string
}
export type DeleteExecutionProps = Omit<
MutateProps<void, UsererrorError, void, string, DeleteExecutionPathParams>,
'path' | 'verb'
> &
DeleteExecutionPathParams
export const DeleteExecution = ({ pipeline_ref, ...props }: DeleteExecutionProps) => (
<Mutate<void, UsererrorError, void, string, DeleteExecutionPathParams>
verb="DELETE"
path={`/pipelines/${pipeline_ref}/executions`}
base={getConfig('code')}
{...props}
/>
)
export type UseDeleteExecutionProps = Omit<
UseMutateProps<void, UsererrorError, void, string, DeleteExecutionPathParams>,
'path' | 'verb'
> &
DeleteExecutionPathParams
export const useDeleteExecution = ({ pipeline_ref, ...props }: UseDeleteExecutionProps) =>
useMutate<void, UsererrorError, void, string, DeleteExecutionPathParams>(
'DELETE',
(paramsInPath: DeleteExecutionPathParams) => `/pipelines/${paramsInPath.pipeline_ref}/executions`,
{ base: getConfig('code'), pathParams: { pipeline_ref }, ...props }
)
export interface FindExecutionPathParams {
pipeline_ref: string
execution_number: string
}
export type FindExecutionProps = Omit<GetProps<TypesExecution, UsererrorError, void, FindExecutionPathParams>, 'path'> &
FindExecutionPathParams
export const FindExecution = ({ pipeline_ref, execution_number, ...props }: FindExecutionProps) => (
<Get<TypesExecution, UsererrorError, void, FindExecutionPathParams>
path={`/pipelines/${pipeline_ref}/executions/${execution_number}`}
base={getConfig('code')}
{...props}
/>
)
export type UseFindExecutionProps = Omit<
UseGetProps<TypesExecution, UsererrorError, void, FindExecutionPathParams>,
'path'
> &
FindExecutionPathParams
export const useFindExecution = ({ pipeline_ref, execution_number, ...props }: UseFindExecutionProps) =>
useGet<TypesExecution, UsererrorError, void, FindExecutionPathParams>(
(paramsInPath: FindExecutionPathParams) =>
`/pipelines/${paramsInPath.pipeline_ref}/executions/${paramsInPath.execution_number}`,
{ base: getConfig('code'), pathParams: { pipeline_ref, execution_number }, ...props }
)
export interface UpdateExecutionPathParams {
pipeline_ref: string
execution_number: string
}
export type UpdateExecutionProps = Omit<
MutateProps<TypesExecution, UsererrorError, void, OpenapiUpdateExecutionRequest, UpdateExecutionPathParams>,
'path' | 'verb'
> &
UpdateExecutionPathParams
export const UpdateExecution = ({ pipeline_ref, execution_number, ...props }: UpdateExecutionProps) => (
<Mutate<TypesExecution, UsererrorError, void, OpenapiUpdateExecutionRequest, UpdateExecutionPathParams>
verb="PATCH"
path={`/pipelines/${pipeline_ref}/executions/${execution_number}`}
base={getConfig('code')}
{...props}
/>
)
export type UseUpdateExecutionProps = Omit<
UseMutateProps<TypesExecution, UsererrorError, void, OpenapiUpdateExecutionRequest, UpdateExecutionPathParams>,
'path' | 'verb'
> &
UpdateExecutionPathParams
export const useUpdateExecution = ({ pipeline_ref, execution_number, ...props }: UseUpdateExecutionProps) =>
useMutate<TypesExecution, UsererrorError, void, OpenapiUpdateExecutionRequest, UpdateExecutionPathParams>(
'PATCH',
(paramsInPath: UpdateExecutionPathParams) =>
`/pipelines/${paramsInPath.pipeline_ref}/executions/${paramsInPath.execution_number}`,
{ base: getConfig('code'), pathParams: { pipeline_ref, execution_number }, ...props }
)
export interface ListPrincipalsQueryParams {
/**
* The substring by which the principals are filtered.
@ -1637,6 +2022,69 @@ export const useMoveRepository = ({ repo_ref, ...props }: UseMoveRepositoryProps
{ base: getConfig('code'), pathParams: { repo_ref }, ...props }
)
export interface PathDetailsQueryParams {
/**
* The git reference (branch / tag / commitID) that will be used to retrieve the data. If no value is provided the default branch of the repository is used.
*/
git_ref?: string
}
export interface PathDetailsPathParams {
repo_ref: string
}
export type PathDetailsProps = Omit<
MutateProps<
RepoPathsDetailsOutput,
UsererrorError,
PathDetailsQueryParams,
OpenapiPathsDetailsRequest,
PathDetailsPathParams
>,
'path' | 'verb'
> &
PathDetailsPathParams
export const PathDetails = ({ repo_ref, ...props }: PathDetailsProps) => (
<Mutate<
RepoPathsDetailsOutput,
UsererrorError,
PathDetailsQueryParams,
OpenapiPathsDetailsRequest,
PathDetailsPathParams
>
verb="POST"
path={`/repos/${repo_ref}/path-details`}
base={getConfig('code')}
{...props}
/>
)
export type UsePathDetailsProps = Omit<
UseMutateProps<
RepoPathsDetailsOutput,
UsererrorError,
PathDetailsQueryParams,
OpenapiPathsDetailsRequest,
PathDetailsPathParams
>,
'path' | 'verb'
> &
PathDetailsPathParams
export const usePathDetails = ({ repo_ref, ...props }: UsePathDetailsProps) =>
useMutate<
RepoPathsDetailsOutput,
UsererrorError,
PathDetailsQueryParams,
OpenapiPathsDetailsRequest,
PathDetailsPathParams
>('POST', (paramsInPath: PathDetailsPathParams) => `/repos/${paramsInPath.repo_ref}/path-details`, {
base: getConfig('code'),
pathParams: { repo_ref },
...props
})
export interface ListRepositoryPathsQueryParams {
/**
* The page to return.
@ -2988,6 +3436,103 @@ export type UseListLicensesProps = Omit<UseGetProps<ListLicensesResponse, Userer
export const useListLicenses = (props: UseListLicensesProps) =>
useGet<ListLicensesResponse, UsererrorError, void, void>(`/resources/license`, { base: getConfig('code'), ...props })
export type CreateSecretProps = Omit<
MutateProps<TypesSecret, UsererrorError, void, OpenapiCreateSecretRequest, void>,
'path' | 'verb'
>
export const CreateSecret = (props: CreateSecretProps) => (
<Mutate<TypesSecret, UsererrorError, void, OpenapiCreateSecretRequest, void>
verb="POST"
path={`/secrets`}
base={getConfig('code')}
{...props}
/>
)
export type UseCreateSecretProps = Omit<
UseMutateProps<TypesSecret, UsererrorError, void, OpenapiCreateSecretRequest, void>,
'path' | 'verb'
>
export const useCreateSecret = (props: UseCreateSecretProps) =>
useMutate<TypesSecret, UsererrorError, void, OpenapiCreateSecretRequest, void>('POST', `/secrets`, {
base: getConfig('code'),
...props
})
export type DeleteSecretProps = Omit<MutateProps<void, UsererrorError, void, string, void>, 'path' | 'verb'>
export const DeleteSecret = (props: DeleteSecretProps) => (
<Mutate<void, UsererrorError, void, string, void>
verb="DELETE"
path={`/secrets`}
base={getConfig('code')}
{...props}
/>
)
export type UseDeleteSecretProps = Omit<UseMutateProps<void, UsererrorError, void, string, void>, 'path' | 'verb'>
export const useDeleteSecret = (props: UseDeleteSecretProps) =>
useMutate<void, UsererrorError, void, string, void>('DELETE', `/secrets`, { base: getConfig('code'), ...props })
export interface FindSecretPathParams {
secret_ref: string
}
export type FindSecretProps = Omit<GetProps<TypesSecret, UsererrorError, void, FindSecretPathParams>, 'path'> &
FindSecretPathParams
export const FindSecret = ({ secret_ref, ...props }: FindSecretProps) => (
<Get<TypesSecret, UsererrorError, void, FindSecretPathParams>
path={`/secrets/${secret_ref}`}
base={getConfig('code')}
{...props}
/>
)
export type UseFindSecretProps = Omit<UseGetProps<TypesSecret, UsererrorError, void, FindSecretPathParams>, 'path'> &
FindSecretPathParams
export const useFindSecret = ({ secret_ref, ...props }: UseFindSecretProps) =>
useGet<TypesSecret, UsererrorError, void, FindSecretPathParams>(
(paramsInPath: FindSecretPathParams) => `/secrets/${paramsInPath.secret_ref}`,
{ base: getConfig('code'), pathParams: { secret_ref }, ...props }
)
export interface UpdateSecretPathParams {
secret_ref: string
}
export type UpdateSecretProps = Omit<
MutateProps<TypesSecret, UsererrorError, void, OpenapiUpdateSecretRequest, UpdateSecretPathParams>,
'path' | 'verb'
> &
UpdateSecretPathParams
export const UpdateSecret = ({ secret_ref, ...props }: UpdateSecretProps) => (
<Mutate<TypesSecret, UsererrorError, void, OpenapiUpdateSecretRequest, UpdateSecretPathParams>
verb="PATCH"
path={`/secrets/${secret_ref}`}
base={getConfig('code')}
{...props}
/>
)
export type UseUpdateSecretProps = Omit<
UseMutateProps<TypesSecret, UsererrorError, void, OpenapiUpdateSecretRequest, UpdateSecretPathParams>,
'path' | 'verb'
> &
UpdateSecretPathParams
export const useUpdateSecret = ({ secret_ref, ...props }: UseUpdateSecretProps) =>
useMutate<TypesSecret, UsererrorError, void, OpenapiUpdateSecretRequest, UpdateSecretPathParams>(
'PATCH',
(paramsInPath: UpdateSecretPathParams) => `/secrets/${paramsInPath.secret_ref}`,
{ base: getConfig('code'), pathParams: { secret_ref }, ...props }
)
export type CreateSpaceProps = Omit<
MutateProps<TypesSpace, UsererrorError, void, OpenapiCreateSpaceRequest, void>,
'path' | 'verb'
@ -3381,6 +3926,51 @@ export const useDeletePath = ({ space_ref, ...props }: UseDeletePathProps) =>
{ base: getConfig('code'), pathParams: { space_ref }, ...props }
)
export interface ListPipelinesQueryParams {
/**
* The substring which is used to filter the repositories by their path name.
*/
query?: string
/**
* The page to return.
*/
page?: number
/**
* The maximum number of results to return.
*/
limit?: number
}
export interface ListPipelinesPathParams {
space_ref: string
}
export type ListPipelinesProps = Omit<
GetProps<TypesPipeline[], UsererrorError, ListPipelinesQueryParams, ListPipelinesPathParams>,
'path'
> &
ListPipelinesPathParams
export const ListPipelines = ({ space_ref, ...props }: ListPipelinesProps) => (
<Get<TypesPipeline[], UsererrorError, ListPipelinesQueryParams, ListPipelinesPathParams>
path={`/spaces/${space_ref}/pipelines`}
base={getConfig('code')}
{...props}
/>
)
export type UseListPipelinesProps = Omit<
UseGetProps<TypesPipeline[], UsererrorError, ListPipelinesQueryParams, ListPipelinesPathParams>,
'path'
> &
ListPipelinesPathParams
export const useListPipelines = ({ space_ref, ...props }: UseListPipelinesProps) =>
useGet<TypesPipeline[], UsererrorError, ListPipelinesQueryParams, ListPipelinesPathParams>(
(paramsInPath: ListPipelinesPathParams) => `/spaces/${paramsInPath.space_ref}/pipelines`,
{ base: getConfig('code'), pathParams: { space_ref }, ...props }
)
export interface ListReposQueryParams {
/**
* The substring which is used to filter the repositories by their path name.
@ -3434,6 +4024,51 @@ export const useListRepos = ({ space_ref, ...props }: UseListReposProps) =>
{ base: getConfig('code'), pathParams: { space_ref }, ...props }
)
export interface ListSecretsQueryParams {
/**
* The substring which is used to filter the repositories by their path name.
*/
query?: string
/**
* The page to return.
*/
page?: number
/**
* The maximum number of results to return.
*/
limit?: number
}
export interface ListSecretsPathParams {
space_ref: string
}
export type ListSecretsProps = Omit<
GetProps<TypesSecret[], UsererrorError, ListSecretsQueryParams, ListSecretsPathParams>,
'path'
> &
ListSecretsPathParams
export const ListSecrets = ({ space_ref, ...props }: ListSecretsProps) => (
<Get<TypesSecret[], UsererrorError, ListSecretsQueryParams, ListSecretsPathParams>
path={`/spaces/${space_ref}/secrets`}
base={getConfig('code')}
{...props}
/>
)
export type UseListSecretsProps = Omit<
UseGetProps<TypesSecret[], UsererrorError, ListSecretsQueryParams, ListSecretsPathParams>,
'path'
> &
ListSecretsPathParams
export const useListSecrets = ({ space_ref, ...props }: UseListSecretsProps) =>
useGet<TypesSecret[], UsererrorError, ListSecretsQueryParams, ListSecretsPathParams>(
(paramsInPath: ListSecretsPathParams) => `/spaces/${paramsInPath.space_ref}/secrets`,
{ base: getConfig('code'), pathParams: { space_ref }, ...props }
)
export interface ListServiceAccountsPathParams {
space_ref: string
}

File diff suppressed because it is too large Load Diff