-
+
{t('views:repos.viewAll', 'View all {{type}}', {
type: activeTab === BranchSelectorTab.BRANCHES ? t('views:repos.branches') : t('views:repos.tags')
})}
diff --git a/packages/ui/src/views/repo/index.ts b/packages/ui/src/views/repo/index.ts
index 19e47e186d..733c3ba620 100644
--- a/packages/ui/src/views/repo/index.ts
+++ b/packages/ui/src/views/repo/index.ts
@@ -8,6 +8,9 @@ export * from '@views/repo/repo-layout'
// repo sidebar
export * from '@views/repo/repo-sidebar'
+// repo create
+export * from '@views/repo/repo-create'
+
// repo summary
export * from '@views/repo/repo-summary/repo-summary'
diff --git a/packages/ui/src/views/repo/repo-create/index.tsx b/packages/ui/src/views/repo/repo-create/index.tsx
new file mode 100644
index 0000000000..977cf399bb
--- /dev/null
+++ b/packages/ui/src/views/repo/repo-create/index.tsx
@@ -0,0 +1,289 @@
+import { useEffect } from 'react'
+import { useForm, type SubmitHandler } from 'react-hook-form'
+
+import {
+ Button,
+ ButtonGroup,
+ Checkbox,
+ ControlGroup,
+ Fieldset,
+ Input,
+ Message,
+ MessageTheme,
+ Option,
+ RadioButton,
+ RadioGroup,
+ Select,
+ SelectContent,
+ SelectItem,
+ Spacer,
+ StyledLink,
+ Text,
+ Textarea
+} from '@/components'
+import { SandboxLayout } from '@/views'
+import { zodResolver } from '@hookform/resolvers/zod'
+import { z } from 'zod'
+
+// Define the form schema with optional fields for gitignore and license
+const formSchema = z.object({
+ name: z.string().min(1, { message: 'Please provide a name' }),
+ description: z.string(),
+ gitignore: z.string().optional(),
+ license: z.string().optional(),
+ access: z.enum(['1', '2'], { errorMap: () => ({ message: 'Please select who has access' }) }),
+ readme: z.boolean()
+})
+
+export type FormFields = z.infer // Automatically generate a type from the schema
+
+interface RepoCreatePageProps {
+ onFormSubmit: (data: FormFields) => void
+ onFormCancel: () => void
+ isLoading: boolean
+ isSuccess: boolean
+ gitIgnoreOptions?: string[]
+ licenseOptions?: { value?: string; label?: string }[]
+}
+
+export function RepoCreatePage({
+ onFormSubmit,
+ onFormCancel,
+ isLoading,
+ isSuccess,
+ gitIgnoreOptions,
+ licenseOptions
+}: RepoCreatePageProps) {
+ const {
+ register,
+ handleSubmit,
+ setValue,
+ watch,
+ reset,
+ formState: { errors, isValid }
+ } = useForm({
+ resolver: zodResolver(formSchema),
+ mode: 'onChange',
+ defaultValues: {
+ name: '',
+ description: '',
+ gitignore: '',
+ license: '',
+ access: '2',
+ readme: false
+ }
+ })
+
+ const accessValue = watch('access')
+ const gitignoreValue = watch('gitignore')
+ const licenseValue = watch('license')
+ const readmeValue = watch('readme')
+
+ const handleSelectChange = (fieldName: keyof FormFields, value: string) => {
+ setValue(fieldName, value, { shouldValidate: true })
+ }
+
+ const handleAccessChange = (value: '1' | '2') => {
+ setValue('access', value, { shouldValidate: true })
+ }
+
+ const handleReadmeChange = (value: boolean) => {
+ setValue('readme', value, { shouldValidate: true })
+ }
+
+ useEffect(() => {
+ if (isSuccess) {
+ reset()
+ }
+ }, [isSuccess, reset])
+
+ const onSubmit: SubmitHandler = data => {
+ onFormSubmit(data)
+ }
+
+ const handleCancel = () => {
+ onFormCancel()
+ }
+
+ return (
+
+
+
+
+ Create a new repository
+
+
+
+ A repository contains all project files, including the revision history. Already have a project repository
+ elsewhere?{' '}
+
+ Import a repository.
+
+
+
+
+
+
+ )
+}
diff --git a/packages/ui/src/views/repo/repo-list/repo-list-page.tsx b/packages/ui/src/views/repo/repo-list/repo-list-page.tsx
index e39d426474..d6120ae3d5 100644
--- a/packages/ui/src/views/repo/repo-list/repo-list-page.tsx
+++ b/packages/ui/src/views/repo/repo-list/repo-list-page.tsx
@@ -410,7 +410,9 @@ const SandboxRepoListPage: FC = ({
filterHandlers={filterHandlers}
t={t}
/>
-
+
{(filterHandlers.activeFilters.length > 0 || filterHandlers.activeSorts.length > 0) && }
diff --git a/packages/ui/src/views/repo/repo-sidebar/index.tsx b/packages/ui/src/views/repo/repo-sidebar/index.tsx
index adede730ed..b4f53780cb 100644
--- a/packages/ui/src/views/repo/repo-sidebar/index.tsx
+++ b/packages/ui/src/views/repo/repo-sidebar/index.tsx
@@ -54,7 +54,7 @@ export const RepoSidebar = ({
useTranslationStore={useTranslationStore}
/>
)}
-
+
-
+
= ({
return (
- {title}
+ {title}
{description?.length && !isEditingDescription && (
-
{description}
+
{description}
)}
{isEditingDescription && (
@@ -95,7 +95,7 @@ const SummaryPanel: FC = ({
)}
- {timestamp &&
Created {timestamp}}
+ {timestamp &&
Created {timestamp}}
{details &&
diff --git a/packages/ui/src/views/repo/repo-summary/repo-summary.tsx b/packages/ui/src/views/repo/repo-summary/repo-summary.tsx
index 2180dfa2d1..006893b093 100644
--- a/packages/ui/src/views/repo/repo-summary/repo-summary.tsx
+++ b/packages/ui/src/views/repo/repo-summary/repo-summary.tsx
@@ -130,7 +130,7 @@ export function RepoSummaryView({
-
+
-
+
-
+
+
diff --git a/packages/views/src/components/form-field-set.tsx b/packages/views/src/components/form-field-set.tsx
index 8e3548855f..38a7d1e41d 100644
--- a/packages/views/src/components/form-field-set.tsx
+++ b/packages/views/src/components/form-field-set.tsx
@@ -65,6 +65,7 @@ const themeClassMap: Record = {
[MessageTheme.DEFAULT]: 'text-tertiary-background'
}
+/** @deprecated: Use Fieldset from @harnessio/ui/components instead */
function Root({ children, box, shaded, className }: RootProps) {
return (