Skip to content
This repository was archived by the owner on Jun 13, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed apps/web/public/static/image/logo.png
Binary file not shown.
5 changes: 5 additions & 0 deletions apps/web/src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -112,4 +112,9 @@
-webkit-appearance: none;
margin: 0;
}
input[type=number] {
-moz-appearance:textfield;
}
}


87 changes: 46 additions & 41 deletions apps/web/src/app/register/info/form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ import FormCard from "@/app/register/form-card";
import FormStepper from "@/app/register/form-stepper";
import DatePicker from "@/components/date-picker";
import RadioGroupBoolean from "@/components/radio-group-boolean";
import BloodGroupSelector from "@/components/select/bloodgroup-dynselect";
import GenderSelector from "@/components/select/gender-selector";
import GraduationSelector from "@/components/select/graduation-dynselect";
import ParentRelationSelector from "@/components/select/parentrelation-dynselect";
import PreferFoodSelector from "@/components/select/preferfood-dynselect";
import ReligionSelector from "@/components/select/religion-dynselect";
import TitleSelector from "@/components/select/title-selector";
import Spinner from "@/components/spinner";
import { Button } from "@/components/ui/button";
Expand Down Expand Up @@ -68,7 +73,14 @@ interface InfoFormProps {
function InfoForm(props: InfoFormProps) {
const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema),
defaultValues: props.data,
defaultValues: {
...props.data,
graduation: props.data.graduation || "มัธยมศึกษาปีที่ 4",
blood_group: props.data.blood_group || "A",
prefer_food: props.data.prefer_food || "ปกติ",
parent_relation: props.data.parent_relation || "มารดา",
religion: props.data.religion || "พุทธ",
},
});

return (
Expand Down Expand Up @@ -173,14 +185,13 @@ function InfoForm(props: InfoFormProps) {
disabled={props.hasSubmit}
control={form.control}
name="religion"
render={({ field }) => (
<FormItem>
<FormLabel>ศาสนา</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
render={({ field: { onChange, value, ...fieldProps } }) => (
<ReligionSelector
{...fieldProps}
value={value}
onValueChange={onChange}
disabled={props.hasSubmit}
/>
)}
/>
</div>
Expand Down Expand Up @@ -253,14 +264,13 @@ function InfoForm(props: InfoFormProps) {
disabled={props.hasSubmit}
control={form.control}
name="graduation"
render={({ field }) => (
<FormItem>
<FormLabel>ระดับชั้นการศึกษา</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
render={({ field: { onChange, value, ...fieldProps } }) => (
<GraduationSelector
{...fieldProps}
value={value}
onValueChange={onChange}
disabled={props.hasSubmit}
/>
)}
/>
<FormField
Expand Down Expand Up @@ -300,14 +310,13 @@ function InfoForm(props: InfoFormProps) {
disabled={props.hasSubmit}
control={form.control}
name="blood_group"
render={({ field }) => (
<FormItem>
<FormLabel>กรุ๊ปเลือด</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
render={({ field: { onChange, value, ...fieldProps } }) => (
<BloodGroupSelector
{...fieldProps}
value={value}
onValueChange={onChange}
disabled={props.hasSubmit}
/>
)}
/>
<FormField
Expand Down Expand Up @@ -394,15 +403,12 @@ function InfoForm(props: InfoFormProps) {
control={form.control}
name="prefer_food"
render={({ field }) => (
<FormItem>
<FormLabel>
อาหารที่รับประทาน (ปกติ/อิสลาม/มังสวิรัติ/อื่น ๆ โปรดระบุ)
</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
<PreferFoodSelector
{...field}
value={field.value}
onValueChange={field.onChange}
disabled={props.hasSubmit}
/>
)}
/>
</div>
Expand All @@ -429,13 +435,12 @@ function InfoForm(props: InfoFormProps) {
control={form.control}
name="parent_relation"
render={({ field }) => (
<FormItem>
<FormLabel>ความสัมพันธ์กับผู้ปกครอง</FormLabel>
<FormControl>
<Input {...field} />
</FormControl>
<FormMessage />
</FormItem>
<ParentRelationSelector
{...field}
value={field.value}
onValueChange={field.onChange}
disabled={props.hasSubmit}
/>
)}
/>
<FormField
Expand Down
38 changes: 38 additions & 0 deletions apps/web/src/components/select/bloodgroup-dynselect.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { SelectProps } from ".";
import DynamicSelect from "./dynamic-select";

function BloodGroupSelector({
onValueChange = () => {},
...props
}: SelectProps) {
const preset = [
{
value: "A",
label: "A",
},
{
value: "B",
label: "B",
},
{
value: "O",
label: "O",
},
{
value: "AB",
label: "AB",
},
];

return (
<DynamicSelect
{...props}
onValueChange={onValueChange}
preset={preset}
formLabel="กรุ๊ปเลือด"
placeholder="ระบุกรุ๊ปเลือดอื่น ๆ"
/>
);
}

export default BloodGroupSelector;
79 changes: 79 additions & 0 deletions apps/web/src/components/select/dynamic-select.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { useEffect, useState } from "react";
import CustomSelect, { SelectProps } from ".";
import { FormControl, FormItem, FormLabel, FormMessage } from "../ui/form";
import { Input } from "../ui/input";

interface PresetEa {
value: string;
label: string;
}

interface DynamicSelectProps extends Omit<SelectProps, "onValueChange"> {
onValueChange: (data: string) => void;
preset: PresetEa[];
formLabel: string;
}

export default function DynamicSelect(props: DynamicSelectProps) {
const preset = props.preset;
const options = [...preset, { value: "Other", label: "อื่น ๆ" }];

const [selected, setSelected] = useState(() => {
return preset.some((item) => item.value === props.value)
? props.value
: "Other";
});

useEffect(() => {
const newSelected = preset.some((item) => item.value === props.value)
? props.value
: "Other";
setSelected(newSelected);
}, [props.value, preset]);

const handleSelectChange = (value: string) => {
setSelected(value);
if (value === "Other") {
props.onValueChange("");
} else {
props.onValueChange(value);
}
};

return (
<div className="flex gap-x-2">
<div className="flex-1">
<FormItem>
<FormLabel>{props.formLabel}</FormLabel>
<FormControl>
<CustomSelect
value={selected}
onValueChange={handleSelectChange}
options={options}
disabled={props.disabled}
/>
</FormControl>
<FormMessage />
</FormItem>
</div>
{selected === "Other" && (
<div className="flex-1">
<FormItem>
<FormLabel>{props.placeholder}</FormLabel>
<FormControl>
<Input
placeholder={props.placeholder}
value={props.value}
onChange={(e) => {
e.preventDefault();
props.onValueChange(e.target.value);
}}
disabled={props.disabled}
/>
</FormControl>
</FormItem>
</div>
)}
</div>
);
}
42 changes: 42 additions & 0 deletions apps/web/src/components/select/graduation-dynselect.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { SelectProps } from ".";
import DynamicSelect from "./dynamic-select";

function GraduationSelector({
onValueChange = () => {},
...props
}: SelectProps) {
const preset = [
{
value: "มัธยมศึกษาปีที่ 4",
label: "มัธยมศึกษาปีที่ 4",
},
{
value: "มัธยมศึกษาปีที่ 5",
label: "มัธยมศึกษาปีที่ 5",
},
{
value: "ปวช. 1",
label: "ปวช. 1",
},
{
value: "ปวช. 2",
label: "ปวช. 2",
},
{
value: "ปวช. 3",
label: "ปวช. 3",
},
];

return (
<DynamicSelect
{...props}
onValueChange={onValueChange}
preset={preset}
formLabel="ระดับชั้นการศึกษา"
placeholder="ระบุระดับชั้นการศึกษาอื่น ๆ"
/>
);
}

export default GraduationSelector;
30 changes: 30 additions & 0 deletions apps/web/src/components/select/parentrelation-dynselect.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { SelectProps } from ".";
import DynamicSelect from "./dynamic-select";

function ParentRelationSelector({
onValueChange = () => {},
...props
}: SelectProps) {
const preset = [
{
value: "บิดา",
label: "บิดา",
},
{
value: "มารดา",
label: "มารดา",
},
];

return (
<DynamicSelect
{...props}
onValueChange={onValueChange}
preset={preset}
formLabel="ความสัมพันธ์กับผู้ปกครอง"
placeholder="ระบุความสัมพันธ์"
/>
);
}

export default ParentRelationSelector;
34 changes: 34 additions & 0 deletions apps/web/src/components/select/preferfood-dynselect.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { SelectProps } from ".";
import DynamicSelect from "./dynamic-select";

function PreferFoodSelector({
onValueChange = () => {},
...props
}: SelectProps) {
const preset = [
{
value: "ปกติ",
label: "ปกติ",
},
{
value: "ฮาลาล",
label: "ฮาลาล",
},
{
value: "มังสวิรัติ",
label: "มังสวิรัติ",
},
];

return (
<DynamicSelect
{...props}
onValueChange={onValueChange}
preset={preset}
formLabel="อาหารที่รับประทาน"
placeholder="ระบุอาหารอื่น ๆ"
/>
);
}

export default PreferFoodSelector;
Loading
Loading