Skip to content

Commit a7c126b

Browse files
authored
Merge branch 'master' into master
2 parents e4f7117 + a4b24fa commit a7c126b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+2633
-448
lines changed
Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +0,0 @@
1-
version: '3'
2-
services:
3-
web:
4-
build:
5-
context: .
6-
dockerfile: Dockerfile
7-
args: {}
8-
image: nginx:latest
9-
container_name: x
10-
ports:
11-
- 80:80
12-
- 90:90
13-
- 70:70
14-
networks:
15-
p:
16-
driver: bridge

app/models/compose_models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,4 @@ class DockerCompose(BaseModel):
3333
version: str = "3"
3434
services: Dict[str, Service] = {"web":Service(), "web2":Service()}
3535
networks: Union[Optional[Dict[str, PreCreatedNetwork]],Optional[Dict[str, Network]]] = {"app_network": {"driver":"bridge"}}
36-
37-
36+

web/.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
VITE_API_CLIENT_BASE_URL=""

web/package-lock.json

Lines changed: 104 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

web/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
"preview": "vite preview"
1111
},
1212
"dependencies": {
13+
"@hookform/resolvers": "^3.9.1",
1314
"@radix-ui/react-dialog": "^1.1.2",
15+
"@radix-ui/react-form": "^0.1.0",
1416
"@radix-ui/react-separator": "^1.1.0",
1517
"@radix-ui/react-slot": "^1.1.0",
1618
"@radix-ui/react-tooltip": "^1.1.4",
@@ -21,12 +23,14 @@
2123
"lucide-react": "^0.462.0",
2224
"react": "^18.3.1",
2325
"react-dom": "^18.3.1",
26+
"react-hook-form": "^7.53.2",
2427
"react-router": "^7.0.1",
2528
"react-select": "^5.8.3",
2629
"react-spinners": "^0.14.1",
2730
"sonner": "^1.7.0",
2831
"tailwind-merge": "^2.5.5",
2932
"tailwindcss-animate": "^1.0.7",
33+
"zod": "^3.23.8",
3034
"zustand": "^5.0.1"
3135
},
3236
"devDependencies": {

web/src/App.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,35 @@ import {
1212
Installation,
1313
S3,
1414
} from '@/pages';
15+
import { AnsibleLayout } from './pages/ansible/components/layout';
16+
import DockerAnsible from './pages/ansible/docker/docker';
17+
import NginxAnsible from './pages/ansible/nginx/nginx';
18+
import KubernetesAnsible from './pages/ansible/kuber/kuber';
19+
import DockerCompose from './pages/docker-compose/docker-compose';
1520

1621
function App() {
1722
const location = useLocation();
1823
return (
1924
<div>
20-
<div className="container mx-auto border-l border-r border-gray-700 h-dvh max-w-7xl">
25+
<div className="container mx-auto h-dvh max-w-7xl border-l border-r border-gray-700">
2126
<Routes location={location}>
2227
<Route element={<MainLayout />}>
2328
<Route index element={<Basic />} />
2429
<Route path="bug-fix" element={<BugFix />} />
2530
<Route path="helm-template" element={<HelmTemplate />} />
31+
<Route path="docker-compose" element={<DockerCompose />} />
2632
<Route path="terraform-template" element={<TerraformTemplate />}>
2733
<Route path="docker" element={<Docker />} />
2834
<Route path="ec2" element={<EC2 />} />
2935
<Route path="s3" element={<S3 />} />
3036
<Route path="iam" element={<IAM />} />
3137
<Route path="argocd" element={<Argocd />} />
3238
</Route>
39+
<Route path="ansible-template" element={<AnsibleLayout />}>
40+
<Route path="docker" element={<DockerAnsible />} />
41+
<Route path="nginx" element={<NginxAnsible />} />
42+
<Route path="kuber" element={<KubernetesAnsible />} />
43+
</Route>
3344
<Route path="installation" element={<Installation />} />
3445
</Route>
3546
</Routes>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
2+
import * as Form from '@radix-ui/react-form';
3+
import { useFormContext } from 'react-hook-form';
4+
import { FormFieldProps } from '../../types/form.types';
5+
import { cn } from '@/lib/utils';
6+
7+
interface FormCheckboxProps extends FormFieldProps {
8+
labelPosition?: 'left' | 'right';
9+
checkboxClassName?: string;
10+
}
11+
12+
export const FormCheckbox = ({
13+
name,
14+
label,
15+
error,
16+
labelPosition = 'right',
17+
checkboxClassName,
18+
...props
19+
}: FormCheckboxProps) => {
20+
const {
21+
register,
22+
formState: { errors },
23+
} = useFormContext();
24+
25+
const fieldError = errors[name];
26+
const errorMessage = fieldError?.message as string;
27+
28+
return (
29+
<Form.Field className="form-field" name={name}>
30+
<div className={cn(
31+
'flex items-center gap-2',
32+
labelPosition === 'right' ? 'flex-row' : 'flex-row-reverse justify-end'
33+
)}>
34+
<Form.Control asChild>
35+
<input
36+
type="checkbox"
37+
className={cn(
38+
'toggle border-gray-500 bg-gray-500',
39+
'checked:bg-orange-base checked:hover:bg-orange-base/70',
40+
checkboxClassName
41+
)}
42+
{...register(name)}
43+
{...props}
44+
/>
45+
</Form.Control>
46+
<Form.Label className="form-label cursor-pointer">{label}</Form.Label>
47+
</div>
48+
{errorMessage && (
49+
<Form.Message className="form-message mt-1 text-red-500">
50+
{errorMessage}
51+
</Form.Message>
52+
)}
53+
</Form.Field>
54+
);
55+
};
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import * as Form from '@radix-ui/react-form';
2+
import { useFormContext } from 'react-hook-form';
3+
import { FormFieldProps } from '../../types/form.types';
4+
import { getNestedValue } from '@/lib/helper';
5+
import { cn } from '@/lib/utils';
6+
7+
export const FormInput = ({
8+
name,
9+
label,
10+
error,
11+
isNumber,
12+
inputType,
13+
inputClass,
14+
...props
15+
}: FormFieldProps) => {
16+
const {
17+
register,
18+
formState: { errors },
19+
} = useFormContext();
20+
21+
const fieldError = getNestedValue(errors, name);
22+
const errorMessage = fieldError?.message as string;
23+
24+
return (
25+
<Form.Field
26+
className={cn('form-field relative', {
27+
'mb-6': errorMessage,
28+
})}
29+
name={name}
30+
>
31+
{label && (
32+
<div className="flex items-baseline justify-between mb-1">
33+
<Form.Label className="form-label">{label}</Form.Label>
34+
</div>
35+
)}
36+
<Form.Control asChild>
37+
<input
38+
type={inputType}
39+
className={cn(
40+
'w-full rounded-md border border-gray-500 px-3 py-2 outline-none transition-all focus:border-orange-base',
41+
props.className,
42+
{
43+
'border-red-500 dark:border': errorMessage,
44+
},
45+
)}
46+
{...register(name, { ...(isNumber && { valueAsNumber: true }) })}
47+
{...props}
48+
/>
49+
</Form.Control>
50+
{errorMessage && (
51+
<div className="absolute left-0 top-full">
52+
<Form.Message className="ml-auto text-sm text-red-500 form-message">
53+
{errorMessage}
54+
</Form.Message>
55+
</div>
56+
)}
57+
</Form.Field>
58+
);
59+
};

0 commit comments

Comments
 (0)