feat(WEB): 입력 컴포넌트 공통화 및 UI 개선

- 숫자/통화/전화번호/사업자번호 등 특수 입력 컴포넌트 추가
- MobileCard 컴포넌트 통합 (ListMobileCard 제거)
- IntegratedListTemplateV2 페이지네이션 버그 수정 (NaN 이슈)
- IntegratedDetailTemplate 타이틀 중복 수정
- 문서 시스템 컴포넌트 추가
- 헤더 벨 아이콘 포커스 스타일 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-01-21 20:56:17 +09:00
parent cfa72fe19b
commit 835c06ce94
190 changed files with 8575 additions and 2354 deletions

View File

@@ -14,6 +14,8 @@ import { Input } from '../ui/input';
import { Textarea } from '../ui/textarea';
import { RadioGroup, RadioGroupItem } from '../ui/radio-group';
import { Label } from '../ui/label';
import { PhoneInput } from '../ui/phone-input';
import { BusinessNumberInput } from '../ui/business-number-input';
import { Building2, UserCircle, Phone, FileText } from 'lucide-react';
import { toast } from 'sonner';
import { Alert, AlertDescription } from '../ui/alert';
@@ -202,11 +204,11 @@ export function ClientRegistration({
htmlFor="businessNo"
type="custom"
>
<Input
<BusinessNumberInput
id="businessNo"
placeholder="10자리 숫자 (예: 123-45-67890)"
placeholder="123-45-67890"
value={formData.businessNo}
onChange={(e) => handleFieldChange('businessNo', e.target.value)}
onChange={(value) => handleFieldChange('businessNo', value)}
/>
</FormField>
@@ -329,29 +331,29 @@ export function ClientRegistration({
htmlFor="phone"
type="custom"
>
<Input
<PhoneInput
id="phone"
placeholder="02-1234-5678"
value={formData.phone}
onChange={(e) => handleFieldChange('phone', e.target.value)}
onChange={(value) => handleFieldChange('phone', value)}
/>
</FormField>
<FormField label="모바일" htmlFor="mobile" type="custom">
<Input
<PhoneInput
id="mobile"
placeholder="010-1234-5678"
value={formData.mobile}
onChange={(e) => handleFieldChange('mobile', e.target.value)}
onChange={(value) => handleFieldChange('mobile', value)}
/>
</FormField>
<FormField label="팩스" htmlFor="fax" type="custom">
<Input
<PhoneInput
id="fax"
placeholder="02-1234-5678"
value={formData.fax}
onChange={(e) => handleFieldChange('fax', e.target.value)}
onChange={(value) => handleFieldChange('fax', value)}
/>
</FormField>
</FormFieldGrid>
@@ -389,11 +391,11 @@ export function ClientRegistration({
</FormField>
<FormField label="담당자 전화" htmlFor="managerTel" type="custom">
<Input
<PhoneInput
id="managerTel"
placeholder="010-1234-5678"
value={formData.managerTel}
onChange={(e) => handleFieldChange('managerTel', e.target.value)}
onChange={(value) => handleFieldChange('managerTel', value)}
/>
</FormField>
</FormFieldGrid>

View File

@@ -26,19 +26,11 @@ export const clientFields: FieldDefinition[] = [
{
key: 'businessNo',
label: '사업자등록번호',
type: 'text',
type: 'businessNumber',
required: true,
placeholder: '10자리 숫자 (예: 123-45-67890)',
placeholder: '000-00-00000',
validation: [
{ type: 'required', message: '사업자등록번호를 입력해주세요.' },
{
type: 'custom',
message: '사업자등록번호는 10자리 숫자여야 합니다.',
validate: (value) => {
const digits = String(value || '').replace(/-/g, '').trim();
return /^\d{10}$/.test(digits);
},
},
],
},
{
@@ -101,19 +93,19 @@ export const clientFields: FieldDefinition[] = [
{
key: 'phone',
label: '전화번호',
type: 'tel',
type: 'phone',
placeholder: '02-1234-5678',
},
{
key: 'mobile',
label: '모바일',
type: 'tel',
type: 'phone',
placeholder: '010-1234-5678',
},
{
key: 'fax',
label: '팩스',
type: 'tel',
type: 'phone',
placeholder: '02-1234-5678',
},
{
@@ -143,7 +135,7 @@ export const clientFields: FieldDefinition[] = [
{
key: 'managerTel',
label: '담당자 전화',
type: 'tel',
type: 'phone',
placeholder: '010-1234-5678',
},
{