From 943c9745a5fe84343094a1ca2498d43752f24148 Mon Sep 17 00:00:00 2001 From: iatopilskii Date: Thu, 28 Nov 2024 18:52:18 +0100 Subject: [PATCH 01/10] feat: add create repo page --- apps/gitness/src/App.tsx | 13 +- .../src/pages-v2/repo/repo-create-page.tsx | 73 ++++ .../src/pages/repo/repo-create-page.tsx | 2 +- packages/ui/src/components/checkbox.tsx | 35 ++ packages/ui/src/components/index.ts | 6 + packages/ui/src/components/select.tsx | 4 +- packages/ui/src/components/spacer.tsx | 1 + packages/ui/src/components/textarea.tsx | 8 +- packages/ui/src/components/toast/index.ts | 2 + packages/ui/src/components/toast/toast.tsx | 115 +++++++ packages/ui/src/components/toast/toaster.tsx | 24 ++ packages/ui/src/components/toast/use-toast.ts | 158 +++++++++ .../ui/src/views/layouts/SandboxLayout.tsx | 5 +- packages/ui/src/views/repo/index.ts | 3 + .../ui/src/views/repo/repo-create/index.tsx | 313 ++++++++++++++++++ .../views/repo/repo-list/repo-list-page.tsx | 4 +- 16 files changed, 754 insertions(+), 12 deletions(-) create mode 100644 apps/gitness/src/pages-v2/repo/repo-create-page.tsx create mode 100644 packages/ui/src/components/checkbox.tsx create mode 100644 packages/ui/src/components/toast/index.ts create mode 100644 packages/ui/src/components/toast/toast.tsx create mode 100644 packages/ui/src/components/toast/toaster.tsx create mode 100644 packages/ui/src/components/toast/use-toast.ts create mode 100644 packages/ui/src/views/repo/repo-create/index.tsx diff --git a/apps/gitness/src/App.tsx b/apps/gitness/src/App.tsx index ffa05844b2..d4ba512b35 100644 --- a/apps/gitness/src/App.tsx +++ b/apps/gitness/src/App.tsx @@ -37,6 +37,7 @@ import PullRequestLayout from './layouts/PullRequestLayout' import RepoLayoutV1 from './layouts/RepoLayout' import SandboxPullRequestListPage from './pages-v2/pull-request/pull-request-list' import { RepoCode } from './pages-v2/repo/repo-code' +import { CreateRepo } from './pages-v2/repo/repo-create-page' import RepoLayout from './pages-v2/repo/repo-layout' import ReposListPage from './pages-v2/repo/repo-list' import { RepoSidebar } from './pages-v2/repo/repo-sidebar' @@ -68,7 +69,7 @@ import PullRequestListPage from './pages/pull-request/pull-request-list-page' import { RepoBranchesListPage } from './pages/repo/repo-branch-list' import { RepoBranchSettingsRulesPageContainer } from './pages/repo/repo-branch-rules-container' import RepoCommitsPage from './pages/repo/repo-commits' -import { CreateRepo } from './pages/repo/repo-create-page' +import { CreateRepoV1 } from './pages/repo/repo-create-page' import { RepoFiles } from './pages/repo/repo-files' import { RepoHeader } from './pages/repo/repo-header' import { RepoImportContainer } from './pages/repo/repo-import-container' @@ -200,6 +201,14 @@ export default function App() { } ] }, + { + path: ':spaceId/repos/create', + element: + }, + { + path: ':spaceId/repos/import', + element: + }, { path: 'theme', element: @@ -464,7 +473,7 @@ export default function App() { }, { path: ':spaceId/repos/create', - element: + element: }, { path: ':spaceId/repos/import', diff --git a/apps/gitness/src/pages-v2/repo/repo-create-page.tsx b/apps/gitness/src/pages-v2/repo/repo-create-page.tsx new file mode 100644 index 0000000000..ae292083d2 --- /dev/null +++ b/apps/gitness/src/pages-v2/repo/repo-create-page.tsx @@ -0,0 +1,73 @@ +import { useState } from 'react' +import { useNavigate } from 'react-router-dom' + +import { + CreateRepositoryErrorResponse, + OpenapiCreateRepositoryRequest, + useCreateRepositoryMutation, + useListGitignoreQuery, + useListLicensesQuery +} from '@harnessio/code-service-client' +import { RepoCreatePage as RepoCreatePageView } from '@harnessio/ui/views' +import { FormFields } from '@harnessio/views' + +import { useGetSpaceURLParam } from '../../framework/hooks/useGetSpaceParam' + +export const CreateRepo = () => { + const createRepositoryMutation = useCreateRepositoryMutation({}) + const spaceId = useGetSpaceURLParam() + const navigate = useNavigate() + const [apiError, setApiError] = useState(null) + + const onSubmit = (data: FormFields) => { + const repositoryRequest: OpenapiCreateRepositoryRequest = { + default_branch: 'main', + parent_ref: spaceId, + description: data.description, + git_ignore: data.gitignore, + license: data.license, + is_public: data.access === '1', + readme: true, + identifier: data.name + } + + createRepositoryMutation.mutate( + { + queryParams: {}, + body: repositoryRequest + }, + { + onSuccess: ({ body: data }) => { + setApiError(null) + navigate(`/spaces/${spaceId}/repos/${data?.identifier}`) + }, + onError: (error: CreateRepositoryErrorResponse) => { + const message = error.message || 'An unknown error occurred.' + setApiError(message) + } + } + ) + } + + const { data: { body: gitIgnoreOptions } = {} } = useListGitignoreQuery({}) + + const { data: { body: licenseOptions } = {} } = useListLicensesQuery({}) + + const onCancel = () => { + navigate(`/spaces/${spaceId}/repos`) + } + + return ( + <> + + + ) +} diff --git a/apps/gitness/src/pages/repo/repo-create-page.tsx b/apps/gitness/src/pages/repo/repo-create-page.tsx index 9f6e71a196..55e29160b9 100644 --- a/apps/gitness/src/pages/repo/repo-create-page.tsx +++ b/apps/gitness/src/pages/repo/repo-create-page.tsx @@ -12,7 +12,7 @@ import { FormFields, RepoCreatePageForm } from '@harnessio/views' import { useGetSpaceURLParam } from '../../framework/hooks/useGetSpaceParam' -export const CreateRepo = () => { +export const CreateRepoV1 = () => { const createRepositoryMutation = useCreateRepositoryMutation({}) const spaceId = useGetSpaceURLParam() const navigate = useNavigate() diff --git a/packages/ui/src/components/checkbox.tsx b/packages/ui/src/components/checkbox.tsx new file mode 100644 index 0000000000..8007ef4a93 --- /dev/null +++ b/packages/ui/src/components/checkbox.tsx @@ -0,0 +1,35 @@ +import * as React from 'react' + +import * as CheckboxPrimitive from '@radix-ui/react-checkbox' +import { CheckIcon } from '@radix-ui/react-icons' +import { cn } from '@utils/cn' + +import { Label } from './label' + +interface CheckboxProps extends React.ComponentPropsWithoutRef { + label?: string +} + +const Checkbox = React.forwardRef, CheckboxProps>( + ({ className, label, ...props }, ref) => ( +
+ + + + + + {label && ( + + )} +
+ ) +) +Checkbox.displayName = CheckboxPrimitive.Root.displayName + +export { Checkbox } diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index 77e1f4af85..46168d225e 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -25,6 +25,11 @@ export * from './no-data' export * from './tabs' export * from './command' export * from './search-files' +export * from './input' +export * from './radio-group' +export * from './textarea' +export * from './checkbox' +export * as FormFieldSet from './form-field-set' export * from './skeleton' export * from './table' export * from './commit-copy-actions' @@ -46,6 +51,7 @@ export * as SearchBox from './search-box' export * as NavbarProjectChooser from './navbar-project-chooser' export * as StackedList from './stacked-list' export * as ButtonGroup from './button-group' +export * as Toast from './toast' export * as FileExplorer from './file-explorer' export type * from './navbar/types' diff --git a/packages/ui/src/components/select.tsx b/packages/ui/src/components/select.tsx index cdb9f42969..930b0bf5ba 100644 --- a/packages/ui/src/components/select.tsx +++ b/packages/ui/src/components/select.tsx @@ -2,7 +2,7 @@ import * as React from 'react' -import { CaretSortIcon, CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons' +import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons' import * as SelectPrimitive from '@radix-ui/react-select' import { cn } from '@utils/cn' @@ -26,7 +26,7 @@ const SelectTrigger = React.forwardRef< > {children} - + )) diff --git a/packages/ui/src/components/spacer.tsx b/packages/ui/src/components/spacer.tsx index 088732bc9d..36ac9c9d3f 100644 --- a/packages/ui/src/components/spacer.tsx +++ b/packages/ui/src/components/spacer.tsx @@ -9,6 +9,7 @@ const spacerVariants = cva('mt-4 block', { 1: 'mt-1', 1.5: 'mt-1.5', 2: 'mt-2', + 2.5: 'mt-2.5', 3: 'mt-3', 4: 'mt-4', 5: 'mt-5', diff --git a/packages/ui/src/components/textarea.tsx b/packages/ui/src/components/textarea.tsx index 3d1f5f9ee4..9953bf7dd6 100644 --- a/packages/ui/src/components/textarea.tsx +++ b/packages/ui/src/components/textarea.tsx @@ -1,14 +1,14 @@ -import { forwardRef, TextareaHTMLAttributes } from 'react' +import * as React from 'react' import { cn } from '@utils/cn' -export interface TextareaProps extends TextareaHTMLAttributes {} +export type TextareaProps = React.TextareaHTMLAttributes -const Textarea = forwardRef(({ className, ...props }, ref) => { +const Textarea = React.forwardRef(({ className, ...props }, ref) => { return (