Skip to content

Commit 71c7dd3

Browse files
authored
Merge pull request #77 from mehdi-parvizi/add-template-generator-and-download-section
Add template generator and download section
2 parents b5a3e55 + 2fa446c commit 71c7dd3

31 files changed

+1798
-957
lines changed

web/package-lock.json

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

web/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
},
2828
"devDependencies": {
2929
"@eslint/js": "^9.13.0",
30+
"@types/node": "^22.9.0",
3031
"@types/react": "^18.3.12",
3132
"@types/react-dom": "^18.3.1",
3233
"@vitejs/plugin-react": "^4.3.3",
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { Checkbox as ChakraCheckbox } from "@chakra-ui/react"
2+
import * as React from "react"
3+
4+
export interface CheckboxProps extends ChakraCheckbox.RootProps {
5+
icon?: React.ReactNode
6+
inputProps?: React.InputHTMLAttributes<HTMLInputElement>
7+
rootRef?: React.Ref<HTMLLabelElement>
8+
}
9+
10+
export const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(
11+
function Checkbox(props, ref) {
12+
const { icon, children, inputProps, rootRef, ...rest } = props
13+
return (
14+
<ChakraCheckbox.Root ref={rootRef} {...rest}>
15+
<ChakraCheckbox.HiddenInput ref={ref} {...inputProps} />
16+
<ChakraCheckbox.Control>
17+
{icon || <ChakraCheckbox.Indicator />}
18+
</ChakraCheckbox.Control>
19+
{children != null && (
20+
<ChakraCheckbox.Label>{children}</ChakraCheckbox.Label>
21+
)}
22+
</ChakraCheckbox.Root>
23+
)
24+
},
25+
)

web/src/components/internal-ui/ChatBox.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { Box } from "@chakra-ui/react";
22
import ChatBubble from "./ChatBubble";
33
import { Message } from "../../features/model";
4-
import usePost from "../../hooks/usePost";
5-
import { ENDPOINTS, UserType } from "../../features/constants";
4+
import { Endpoints, UserType } from "../../features/constants";
65
import useGptStore from "../../utils/store";
76
import { useEffect } from "react";
87
import { v4 as uuid } from "uuid";
98
import { useLocation } from "react-router-dom";
9+
import usePost from "../../hooks/usePost";
1010

1111
interface Props {
1212
messageData: Message[];
13-
endpoint: ENDPOINTS;
13+
endpoint: Endpoints;
1414
request: any;
1515
id: string;
1616
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { useFormContext } from "react-hook-form";
2+
3+
import { HStack } from "@chakra-ui/react";
4+
5+
interface Props {
6+
fieldName: string;
7+
label: string;
8+
}
9+
10+
const CheckBox = ({ fieldName, label }: Props) => {
11+
const { register } = useFormContext();
12+
return (
13+
<>
14+
<HStack alignItems={"center"} justifyContent={"center"}>
15+
<p>{label}</p>
16+
<input
17+
className=" w-4 h-4 accent-orange-700"
18+
{...register(fieldName)}
19+
type="checkbox"
20+
/>
21+
</HStack>
22+
</>
23+
);
24+
};
25+
26+
export default CheckBox;

web/src/components/internal-ui/Input.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
11
import { useFormContext } from "react-hook-form";
22
import { BasicGenFields, BugFixFields } from "../../features/constants";
33
import { validateForm } from "../../utils/formValidator";
4+
import { CSSProperties } from "react";
45

56
interface Props {
67
fieldName: string;
78
label?: string;
89
placeholder?: string;
10+
disabled?: boolean;
11+
style?: CSSProperties;
912
}
1013

11-
const Input = ({ fieldName, label, placeholder = "Placeholder" }: Props) => {
14+
const Input = ({
15+
fieldName,
16+
label,
17+
placeholder,
18+
style,
19+
disabled = false,
20+
}: Props) => {
1221
const {
1322
register,
1423
formState: { errors },
@@ -29,15 +38,19 @@ const Input = ({ fieldName, label, placeholder = "Placeholder" }: Props) => {
2938
</div>
3039
{!showTextArea ? (
3140
<input
41+
disabled={disabled}
3242
className={defaultStyle}
3343
{...register(fieldName, validateForm(fieldName))}
3444
placeholder={placeholder}
45+
style={style}
3546
/>
3647
) : (
3748
<textarea
3849
className={`overflow-y-auto w-[50rem] ${defaultStyle}`}
3950
{...register(fieldName, validateForm(fieldName))}
4051
placeholder={placeholder}
52+
style={style}
53+
disabled={disabled}
4154
/>
4255
)}
4356
{error && (

web/src/components/ui/menu.tsx

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
"use client"
2+
3+
import { AbsoluteCenter, Menu as ChakraMenu, Portal } from "@chakra-ui/react"
4+
import * as React from "react"
5+
import { LuCheck, LuChevronRight } from "react-icons/lu"
6+
7+
interface MenuContentProps extends ChakraMenu.ContentProps {
8+
portalled?: boolean
9+
portalRef?: React.RefObject<HTMLElement>
10+
}
11+
12+
export const MenuContent = React.forwardRef<HTMLDivElement, MenuContentProps>(
13+
function MenuContent(props, ref) {
14+
const { portalled = true, portalRef, ...rest } = props
15+
return (
16+
<Portal disabled={!portalled} container={portalRef}>
17+
<ChakraMenu.Positioner>
18+
<ChakraMenu.Content ref={ref} {...rest} />
19+
</ChakraMenu.Positioner>
20+
</Portal>
21+
)
22+
},
23+
)
24+
25+
export const MenuArrow = React.forwardRef<
26+
HTMLDivElement,
27+
ChakraMenu.ArrowProps
28+
>(function MenuArrow(props, ref) {
29+
return (
30+
<ChakraMenu.Arrow ref={ref} {...props}>
31+
<ChakraMenu.ArrowTip />
32+
</ChakraMenu.Arrow>
33+
)
34+
})
35+
36+
export const MenuCheckboxItem = React.forwardRef<
37+
HTMLDivElement,
38+
ChakraMenu.CheckboxItemProps
39+
>(function MenuCheckboxItem(props, ref) {
40+
return (
41+
<ChakraMenu.CheckboxItem ref={ref} {...props}>
42+
<ChakraMenu.ItemIndicator hidden={false}>
43+
<LuCheck />
44+
</ChakraMenu.ItemIndicator>
45+
{props.children}
46+
</ChakraMenu.CheckboxItem>
47+
)
48+
})
49+
50+
export const MenuRadioItem = React.forwardRef<
51+
HTMLDivElement,
52+
ChakraMenu.RadioItemProps
53+
>(function MenuRadioItem(props, ref) {
54+
const { children, ...rest } = props
55+
return (
56+
<ChakraMenu.RadioItem ps="8" ref={ref} {...rest}>
57+
<AbsoluteCenter axis="horizontal" left="4" asChild>
58+
<ChakraMenu.ItemIndicator>
59+
<LuCheck />
60+
</ChakraMenu.ItemIndicator>
61+
</AbsoluteCenter>
62+
<ChakraMenu.ItemText>{children}</ChakraMenu.ItemText>
63+
</ChakraMenu.RadioItem>
64+
)
65+
})
66+
67+
export const MenuItemGroup = React.forwardRef<
68+
HTMLDivElement,
69+
ChakraMenu.ItemGroupProps
70+
>(function MenuItemGroup(props, ref) {
71+
const { title, children, ...rest } = props
72+
return (
73+
<ChakraMenu.ItemGroup ref={ref} {...rest}>
74+
{title && (
75+
<ChakraMenu.ItemGroupLabel userSelect="none">
76+
{title}
77+
</ChakraMenu.ItemGroupLabel>
78+
)}
79+
{children}
80+
</ChakraMenu.ItemGroup>
81+
)
82+
})
83+
84+
export interface MenuTriggerItemProps extends ChakraMenu.ItemProps {
85+
startIcon?: React.ReactNode
86+
}
87+
88+
export const MenuTriggerItem = React.forwardRef<
89+
HTMLDivElement,
90+
MenuTriggerItemProps
91+
>(function MenuTriggerItem(props, ref) {
92+
const { startIcon, children, ...rest } = props
93+
return (
94+
<ChakraMenu.TriggerItem ref={ref} {...rest}>
95+
{startIcon}
96+
{children}
97+
<LuChevronRight />
98+
</ChakraMenu.TriggerItem>
99+
)
100+
})
101+
102+
export const MenuRadioItemGroup = ChakraMenu.RadioItemGroup
103+
export const MenuContextTrigger = ChakraMenu.ContextTrigger
104+
export const MenuRoot = ChakraMenu.Root
105+
export const MenuSeparator = ChakraMenu.Separator
106+
107+
export const MenuItem = ChakraMenu.Item
108+
export const MenuItemText = ChakraMenu.ItemText
109+
export const MenuItemCommand = ChakraMenu.ItemCommand
110+
export const MenuTrigger = ChakraMenu.Trigger

web/src/features/basicGen/BasicGen.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FormProvider } from "react-hook-form";
22
import Input from "../../components/internal-ui/Input";
3-
import { basicGenDefaultValues, BasicGenFields, ENDPOINTS } from "../constants";
3+
import { basicGenDefaultValues, BasicGenFields, Endpoints } from "../constants";
44
import { Button, HStack, Stack } from "@chakra-ui/react";
55

66
import useGptStore from "../../utils/store";
@@ -35,7 +35,7 @@ const BasicGen = () => {
3535
<Input fieldName={BasicGenFields.SERVICE} label="Service" />
3636
</div>
3737
<ChatBox
38-
endpoint={ENDPOINTS.postBasic}
38+
endpoint={Endpoints.POST_BASIC}
3939
request={request}
4040
messageData={messages}
4141
id={request?.requestId ?? ""}

web/src/features/bugFix/BugFix.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Input from "../../components/internal-ui/Input";
66
import useFormHandler from "../../hooks/useFormHandler";
77
import { bugFixMapper } from "../../utils/mapperFunctions";
88
import useGptStore from "../../utils/store";
9-
import { bugFixDefaultValues, BugFixFields, ENDPOINTS } from "../constants";
9+
import { bugFixDefaultValues, BugFixFields, Endpoints } from "../constants";
1010
import { ApiRequestBugFix, BugFixFormData } from "../model";
1111

1212
const BugFix = () => {
@@ -32,7 +32,7 @@ const BugFix = () => {
3232
<Input fieldName={BugFixFields.VERSION} label="Version" />
3333
</div>
3434
<ChatBox
35-
endpoint={ENDPOINTS.postFix}
35+
endpoint={Endpoints.POST_FIX}
3636
request={request}
3737
messageData={messages}
3838
id={request?.requestId ?? ""}

web/src/features/constants.ts

Lines changed: 72 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,27 @@
1+
import {
2+
BasicGenFormData,
3+
BugFixFormData,
4+
TerraformDockerFormData,
5+
TerraformEc2FormData,
6+
TerraformIAMFormData,
7+
TerraformS3FormData,
8+
} from "./model";
9+
10+
export enum Endpoints {
11+
POST_BASIC = "/IaC-basic",
12+
POST_FIX = "/IaC-bugfix",
13+
POST_INSTALL = "/IaC-install",
14+
POST_IAC_T_DOCKER = "/IaC-template/docker",
15+
POST_IAC_T_EC2 = "/IaC-template/aws/ec2",
16+
POST_IAC_T_S3 = "/IaC-template/aws/s3",
17+
POST_IAC_T_IAM = "/IaC-template/aws/iam",
18+
POST_IAC_HELM = "/Helm-template",
19+
GET_DOWNLOAD_TERRAFORM = "/download-folder",
20+
GET_DOWNLOAD_HELM = "/download-helm",
21+
GET_DIRECTORY = "/list-directory",
22+
DOWNLOAD_LINK = "http://localhost/download-folderMyTerraform",
23+
}
24+
125
export enum BasicGenFields {
226
MIN_TOKEN = "minToken",
327
MAX_TOKEN = "maxToken",
@@ -13,32 +37,66 @@ export enum BugFixFields {
1337
BUG_DESCRIPTION = "bugDescription",
1438
}
1539

40+
export enum TerraformDockerFields {
41+
DOCKER_IMAGE = "dockerImage",
42+
DOCKER_CONTAINER = "dockerContainer",
43+
}
44+
45+
export enum TerraformEC2Fields {
46+
KEY_PAIR = "keyPair",
47+
SECURITY_GROUP = "securityGroup",
48+
AWS_INSTANCE = "awsInstance",
49+
AMI_FROM_INSTANCE = "amiFromInstance",
50+
}
51+
52+
export enum TerraformS3Fields {
53+
S3_BUCKET = "s3Bucket",
54+
BUCKET_VERSIONING = "bucketVersioning",
55+
}
56+
57+
export enum TerraformIAMFields {
58+
IAM_USER = "iamUser",
59+
IAM_GROUP = "iamGroup",
60+
}
61+
1662
export enum UserType {
1763
USER = "user",
1864
BOT = "bot",
1965
}
2066

21-
export enum ENDPOINTS {
22-
postBasic = "/IaC-basic",
23-
postFix = "/IaC-bugfix",
24-
postInstall = "/IaC-install",
25-
PostIacTemp = "/IaC-template",
26-
PostIacHelm = "/Helm-template",
27-
getDonwload = "/download",
28-
getDirectory = "/list-directory",
29-
}
30-
31-
export const basicGenDefaultValues = {
67+
export const basicGenDefaultValues: BasicGenFormData = {
3268
minToken: 100,
3369
maxToken: 500,
3470
service: "terraform",
35-
input: undefined,
71+
input: "",
3672
};
3773

38-
export const bugFixDefaultValues = {
74+
export const bugFixDefaultValues: BugFixFormData = {
3975
minToken: 100,
4076
maxToken: 500,
4177
service: "terraform",
4278
version: "latest",
43-
bugDescription: undefined,
79+
bugDescription: "",
80+
};
81+
82+
export const terraformDockerDefaultValues: TerraformDockerFormData = {
83+
dockerImage: false,
84+
dockerContainer: false,
85+
};
86+
87+
export const terraformEc2DefaultValues: TerraformEc2FormData = {
88+
keyPair: false,
89+
amiFromInstance: false,
90+
awsInstance: false,
91+
securityGroup: false,
92+
};
93+
94+
export const terraformS3DefaultValues: TerraformS3FormData = {
95+
s3Bucket: false,
96+
bucketVersioning: false,
97+
};
98+
99+
export const terraformIamDefaultValues: TerraformIAMFormData = {
100+
iamUser: false,
101+
iamGroup: false,
44102
};

0 commit comments

Comments
 (0)