Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Commit d5347c3

Browse files
authored
πŸ› μ˜μ–΄ ν•„λ“œ κ°•μ œ (#400)
1 parent 3dffdcd commit d5347c3

File tree

17 files changed

+423
-228
lines changed

17 files changed

+423
-228
lines changed

β€Žapp/[locale]/about/directions/edit/DirectionEditor.tsxβ€Ž

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,16 @@ export default function DirectionEditor({ data }: { data: WithLanguage<Direction
4848
<LanguagePicker onChange={setLanguage} selected={language} />
4949

5050
<Fieldset.HTML>
51-
{language === 'ko' && <Form.HTML name="htmlKo" options={{ required: true }} />}
52-
{language === 'en' && <Form.HTML name="htmlEn" />}
51+
<Form.HTML
52+
name="htmlKo"
53+
options={{ required: 'ν•œκ΅­μ–΄ μ°Ύμ•„μ˜€λŠ” 길을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
54+
isHidden={language === 'en'}
55+
/>
56+
<Form.HTML
57+
name="htmlEn"
58+
options={{ required: 'μ˜μ–΄ μ°Ύμ•„μ˜€λŠ” 길을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
59+
isHidden={language === 'ko'}
60+
/>
5361
</Fieldset.HTML>
5462
<Form.Action onCancel={onCancel} onSubmit={onSubmit} />
5563
</Form>

β€Žapp/[locale]/about/facilities/create/page.tsxβ€Ž

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
import { Fragment, useState } from 'react';
3+
import { useState } from 'react';
44
import { FormProvider, useForm } from 'react-hook-form';
55

66
import { postFacilityAction } from '@/actions/about';
@@ -33,11 +33,20 @@ export default function FacilityCreator() {
3333
});
3434
const [selectedLanguage, setSelectedLanguage] = useState<Language>('ko');
3535

36-
const { handleSubmit } = formMethods;
36+
const { handleSubmit, setError } = formMethods;
3737

3838
const onCancel = () => router.push(facilitiesPath);
3939

4040
const onSubmit = handleSubmit(async (_formData) => {
41+
if (_formData.ko.locations.length === 0) {
42+
setError('ko.locations', { message: 'ν•œκ΅­μ–΄ μ‹œμ„€ μœ„μΉ˜λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.' });
43+
return;
44+
}
45+
if (_formData.en.locations.length === 0) {
46+
setError('en.locations', { message: 'μ˜μ–΄ μ‹œμ„€ μœ„μΉ˜λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.' });
47+
return;
48+
}
49+
4150
const formData = contentToFormData('CREATE', {
4251
requestObject: _formData,
4352
image: _formData.imageURL,
@@ -51,22 +60,40 @@ export default function FacilityCreator() {
5160
<FormProvider {...formMethods}>
5261
<LanguagePicker onChange={setSelectedLanguage} selected={selectedLanguage} />
5362

54-
{['ko', 'en'].map(
55-
(language) =>
56-
language === selectedLanguage && (
57-
<Fragment key={language}>
58-
<Fieldset title="μ‹œμ„€λͺ…" mb="mb-8" titleMb="mb-2" required>
59-
<Form.Text name={`${language}.name`} maxWidth="max-w-[30rem]" />
60-
</Fieldset>
61-
<Fieldset title="μ‹œμ„€ μ„€λͺ…" mb="mb-10" titleMb="mb-2" required>
62-
<Form.HTML name={`${language}.description`} options={{ required: true }} />
63-
</Fieldset>
64-
<Fieldset title="μ‹œμ„€ μœ„μΉ˜" mb="mb-8" titleMb="mb-2" required>
65-
<Form.TextList name={`${language}.locations`} placeholder="예: 301동 315호" />
66-
</Fieldset>
67-
</Fragment>
68-
),
69-
)}
63+
<Fieldset title="μ‹œμ„€λͺ…" mb="mb-8" titleMb="mb-2" required>
64+
<Form.Text
65+
name="ko.name"
66+
maxWidth="max-w-[30rem]"
67+
options={{ required: 'ν•œκ΅­μ–΄ μ‹œμ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
68+
isHidden={selectedLanguage === 'en'}
69+
/>
70+
<Form.Text
71+
name="en.name"
72+
maxWidth="max-w-[30rem]"
73+
options={{ required: 'μ˜μ–΄ μ‹œμ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
74+
isHidden={selectedLanguage === 'ko'}
75+
/>
76+
</Fieldset>
77+
<Fieldset title="μ‹œμ„€ μ„€λͺ…" mb="mb-10" titleMb="mb-2" required>
78+
<Form.HTML
79+
name="ko.description"
80+
options={{ required: 'ν•œκ΅­μ–΄ μ‹œμ„€ μ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
81+
isHidden={selectedLanguage === 'en'}
82+
/>
83+
<Form.HTML
84+
name="en.description"
85+
options={{ required: 'μ˜μ–΄ μ‹œμ„€ μ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
86+
isHidden={selectedLanguage === 'ko'}
87+
/>
88+
</Fieldset>
89+
<Fieldset title="μ‹œμ„€ μœ„μΉ˜" mb="mb-8" titleMb="mb-2" required>
90+
{selectedLanguage === 'ko' && (
91+
<Form.TextList name="ko.locations" placeholder="예: 301동 315호" />
92+
)}
93+
{selectedLanguage === 'en' && (
94+
<Form.TextList name="en.locations" placeholder="예: 301동 315호" />
95+
)}
96+
</Fieldset>
7097

7198
<Fieldset title="μ‹œμ„€ 사진" mb="mb-12" titleMb="mb-2">
7299
<label className="mb-3 whitespace-pre-wrap text-sm font-normal tracking-wide text-neutral-500">

β€Žapp/[locale]/about/facilities/edit/FacilityEditor.tsxβ€Ž

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,20 @@ export default function FacilityEditor({ data }: { data: WithLanguage<Facility>
3333
});
3434
const [selectedLanguage, setSelectedLanguage] = useState<Language>('ko');
3535

36-
const { handleSubmit } = formMethods;
36+
const { handleSubmit, setError } = formMethods;
3737

3838
const onCancel = () => router.push(facilitiesPath);
3939

4040
const onSubmit = handleSubmit(async (formData) => {
41+
if (formData.ko.locations.length === 0) {
42+
setError('ko.locations', { message: 'ν•œκ΅­μ–΄ μ‹œμ„€ μœ„μΉ˜λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.' });
43+
return;
44+
}
45+
if (formData.en.locations.length === 0) {
46+
setError('en.locations', { message: 'μ˜μ–΄ μ‹œμ„€ μœ„μΉ˜λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.' });
47+
return;
48+
}
49+
4150
const requestObject = {
4251
...formData,
4352
removeImage: data.ko.imageURL !== null && formData.imageURL === null,
@@ -57,22 +66,40 @@ export default function FacilityEditor({ data }: { data: WithLanguage<Facility>
5766
<FormProvider {...formMethods}>
5867
<LanguagePicker onChange={setSelectedLanguage} selected={selectedLanguage} />
5968

60-
{['ko', 'en'].map(
61-
(language) =>
62-
language === selectedLanguage && (
63-
<>
64-
<Fieldset title="μ‹œμ„€λͺ…" mb="mb-8" titleMb="mb-2" required>
65-
<Form.Text name={`${language}.name`} maxWidth="max-w-[30rem]" />
66-
</Fieldset>
67-
<Fieldset title="μ‹œμ„€ μ„€λͺ…" mb="mb-10" titleMb="mb-2" required>
68-
<Form.HTML name={`${language}.description`} options={{ required: true }} />
69-
</Fieldset>
70-
<Fieldset title="μ‹œμ„€ μœ„μΉ˜" mb="mb-8" titleMb="mb-2" required>
71-
<Form.TextList name={`${language}.locations`} placeholder="예: 301동 315호" />
72-
</Fieldset>
73-
</>
74-
),
75-
)}
69+
<Fieldset title="μ‹œμ„€λͺ…" mb="mb-8" titleMb="mb-2" required>
70+
<Form.Text
71+
name="ko.name"
72+
maxWidth="max-w-[30rem]"
73+
options={{ required: 'ν•œκ΅­μ–΄ μ‹œμ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
74+
isHidden={selectedLanguage === 'en'}
75+
/>
76+
<Form.Text
77+
name="en.name"
78+
maxWidth="max-w-[30rem]"
79+
options={{ required: 'μ˜μ–΄ μ‹œμ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
80+
isHidden={selectedLanguage === 'ko'}
81+
/>
82+
</Fieldset>
83+
<Fieldset title="μ‹œμ„€ μ„€λͺ…" mb="mb-10" titleMb="mb-2" required>
84+
<Form.HTML
85+
name="ko.description"
86+
options={{ required: 'ν•œκ΅­μ–΄ μ‹œμ„€ μ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
87+
isHidden={selectedLanguage === 'en'}
88+
/>
89+
<Form.HTML
90+
name="en.description"
91+
options={{ required: 'μ˜μ–΄ μ‹œμ„€ μ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
92+
isHidden={selectedLanguage === 'ko'}
93+
/>
94+
</Fieldset>
95+
<Fieldset title="μ‹œμ„€ μœ„μΉ˜" mb="mb-8" titleMb="mb-2" required>
96+
{selectedLanguage === 'ko' && (
97+
<Form.TextList name="ko.locations" placeholder="예: 301동 315호" />
98+
)}
99+
{selectedLanguage === 'en' && (
100+
<Form.TextList name="en.locations" placeholder="예: 301동 315호" />
101+
)}
102+
</Fieldset>
76103

77104
<Fieldset title="μ‹œμ„€ 사진" mb="mb-12" titleMb="mb-2">
78105
<label className="mb-3 whitespace-pre-wrap text-sm font-normal tracking-wide text-neutral-500">

β€Žapp/[locale]/about/future-careers/description/edit/CareerDescriptionEditor.tsxβ€Ž

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,16 @@ export default function CareerDescriptionEditor({ data }: { data: WithLanguage<s
3939
<Form>
4040
<LanguagePicker onChange={setLanguage} selected={language} />
4141
<Fieldset.HTML>
42-
{language === 'ko' && <Form.HTML name="ko" options={{ required: true }} />}
43-
{language === 'en' && <Form.HTML name="en" />}
42+
<Form.HTML
43+
name="ko"
44+
options={{ required: 'ν•œκ΅­μ–΄ λ‚΄μš©μ„ μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
45+
isHidden={language === 'en'}
46+
/>
47+
<Form.HTML
48+
name="en"
49+
options={{ required: 'μ˜μ–΄ λ‚΄μš©μ„ μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
50+
isHidden={language === 'ko'}
51+
/>
4452
</Fieldset.HTML>
4553
<Form.Action onCancel={onCancel} onSubmit={onSubmit} />
4654
</Form>

β€Žapp/[locale]/about/student-clubs/components/ClubEditor.tsxβ€Ž

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,29 @@ export default function ClubEditor({ defaultValues, onSubmit }: Props) {
3535
<LanguagePicker onChange={setLanguage} selected={language} />
3636

3737
<Fieldset.Title>
38-
{language === 'ko' && <Form.Text name="ko.name" options={{ required: true }} />}
39-
{language === 'en' && <Form.Text name="en.name" />}
38+
<Form.Text
39+
name="ko.name"
40+
options={{ required: 'ν•œκ΅­μ–΄ 동아리 이름을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
41+
isHidden={language === 'en'}
42+
/>
43+
<Form.Text
44+
name="en.name"
45+
options={{ required: 'μ˜μ–΄ 동아리 이름을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
46+
isHidden={language === 'ko'}
47+
/>
4048
</Fieldset.Title>
4149

4250
<Fieldset.HTML>
43-
{language === 'ko' && <Form.HTML name="ko.description" options={{ required: true }} />}
44-
{language === 'en' && <Form.HTML name="en.description" />}
51+
<Form.HTML
52+
name="ko.description"
53+
options={{ required: 'ν•œκ΅­μ–΄ 동아리 μ†Œκ°œλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
54+
isHidden={language === 'en'}
55+
/>
56+
<Form.HTML
57+
name="en.description"
58+
options={{ required: 'μ˜μ–΄ 동아리 μ†Œκ°œλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
59+
isHidden={language === 'ko'}
60+
/>
4561
</Fieldset.HTML>
4662

4763
<Fieldset.Image>

β€Žapp/[locale]/academics/components/scholarship/ScholarshipEditor.tsxβ€Ž

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,23 +53,32 @@ export default function ScholarshipEditor({
5353
<FormProvider {...formMethods}>
5454
<Form>
5555
<LanguagePicker selected={language} onChange={setLanguage} />
56-
{language === 'ko' && <Editor language="ko" />}
57-
{language === 'en' && <Editor language="en" />}
56+
<Fieldset.Title>
57+
<Form.Text
58+
name="koName"
59+
options={{ required: 'ν•œκ΅­μ–΄ μž₯ν•™κΈˆ 이름을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
60+
isHidden={language === 'en'}
61+
/>
62+
<Form.Text
63+
name="enName"
64+
options={{ required: 'μ˜μ–΄ μž₯ν•™κΈˆ 이름을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
65+
isHidden={language === 'ko'}
66+
/>
67+
</Fieldset.Title>
68+
<Fieldset.HTML>
69+
<Form.HTML
70+
name="koDescription"
71+
options={{ required: 'ν•œκ΅­μ–΄ μž₯ν•™κΈˆ μ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
72+
isHidden={language === 'en'}
73+
/>
74+
<Form.HTML
75+
name="enDescription"
76+
options={{ required: 'μ˜μ–΄ μž₯ν•™κΈˆ μ„€λͺ…을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
77+
isHidden={language === 'ko'}
78+
/>
79+
</Fieldset.HTML>
5880
<Form.Action onCancel={onCancel} onSubmit={handleSubmit(onSubmit)} />
5981
</Form>
6082
</FormProvider>
6183
);
6284
}
63-
64-
const Editor = ({ language }: { language: Language }) => {
65-
return (
66-
<>
67-
<Fieldset.Title>
68-
<Form.Text name={`${language}Name`} options={{ required: true }} />
69-
</Fieldset.Title>
70-
<Fieldset.HTML>
71-
<Form.HTML name={`${language}Description`} options={{ required: true }} />
72-
</Fieldset.HTML>
73-
</>
74-
);
75-
};

β€Žapp/[locale]/admissions/components/AdmissionsEditor.tsxβ€Ž

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,20 @@ export default function AdmissionsEditor({
4242
<FormProvider {...formMethods}>
4343
<Form>
4444
<LanguagePicker selected={language} onChange={setLanguage} />
45-
{language === 'ko' && <Editor language="ko" />}
46-
{language === 'en' && <Editor language="en" />}
45+
<Fieldset.HTML>
46+
<Form.HTML
47+
name="ko"
48+
options={{ required: 'ν•œκ΅­μ–΄ μž…ν•™ 본문을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
49+
isHidden={language === 'en'}
50+
/>
51+
<Form.HTML
52+
name="en"
53+
options={{ required: 'μ˜μ–΄ μž…ν•™ 본문을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
54+
isHidden={language === 'ko'}
55+
/>
56+
</Fieldset.HTML>
4757
<Form.Action onCancel={onCancel} onSubmit={handleSubmit(onSubmit)} />
4858
</Form>
4959
</FormProvider>
5060
);
5161
}
52-
53-
const Editor = ({ language }: { language: Language }) => {
54-
return (
55-
<Fieldset.HTML>
56-
<Form.HTML name={language} options={{ required: true }} />
57-
</Fieldset.HTML>
58-
);
59-
};

β€Žapp/[locale]/people/faculty/components/FacultyEditor.tsxβ€Ž

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,40 @@ export default function FacultyEditor({
9191
</Fieldset>
9292

9393
<LanguagePicker selected={language} onChange={setLanguage} />
94+
95+
{/* ν•„μˆ˜κ°’ 처리λ₯Ό μœ„ν•΄ 이름과 μ§ν•¨λ§Œ 뢄리 */}
96+
<Fieldset title="이름" mb="mb-5" titleMb="mb-2" required>
97+
<Form.Text
98+
name={`ko.name`}
99+
maxWidth="max-w-[30rem]"
100+
options={{ required: 'ν•œκ΅­μ–΄ 이름을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
101+
isHidden={language === 'en'}
102+
/>
103+
<Form.Text
104+
name={`en.name`}
105+
maxWidth="max-w-[30rem]"
106+
options={{ required: 'μ˜μ–΄ 이름을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
107+
isHidden={language === 'ko'}
108+
/>
109+
</Fieldset>
110+
111+
<Fieldset title="직함" mb="mb-10" titleMb="mb-2" required>
112+
<Form.Text
113+
name="ko.academicRank"
114+
maxWidth="max-w-[30rem]"
115+
placeholder="예: ꡐ수, 쑰ꡐ수, λͺ…μ˜ˆκ΅μˆ˜ λ“±"
116+
options={{ required: 'ν•œκ΅­μ–΄ 직함을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
117+
isHidden={language === 'en'}
118+
/>
119+
<Form.Text
120+
name="en.academicRank"
121+
maxWidth="max-w-[30rem]"
122+
placeholder="예: ꡐ수, 쑰ꡐ수, λͺ…μ˜ˆκ΅μˆ˜ λ“±"
123+
options={{ required: 'μ˜μ–΄ 직함을 μž…λ ₯ν•΄μ£Όμ„Έμš”.' }}
124+
isHidden={language === 'ko'}
125+
/>
126+
</Fieldset>
127+
94128
{language === 'ko' && <Editor language="ko" labs={labs} />}
95129
{language === 'en' && <Editor language="en" labs={labs} />}
96130

@@ -114,23 +148,6 @@ const Editor = ({
114148
}) => {
115149
return (
116150
<>
117-
<Fieldset title="이름" mb="mb-5" titleMb="mb-2" required>
118-
<Form.Text
119-
name={`${language}.name`}
120-
maxWidth="max-w-[30rem]"
121-
options={{ required: true }}
122-
/>
123-
</Fieldset>
124-
125-
<Fieldset title="직함" mb="mb-10" titleMb="mb-2" required>
126-
<Form.Text
127-
name={`${language}.academicRank`}
128-
maxWidth="max-w-[30rem]"
129-
placeholder="예: ꡐ수, 쑰ꡐ수, λͺ…μ˜ˆκ΅μˆ˜ λ“±"
130-
options={{ required: true }}
131-
/>
132-
</Fieldset>
133-
134151
<DateSection language={language} />
135152

136153
<Fieldset title="사진" mb="mb-12" titleMb="mb-2">

0 commit comments

Comments
Β (0)