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

@@ -13,6 +13,8 @@ import { IntegratedDetailTemplate } from '@/components/templates/IntegratedDetai
import { qualityInspectionCreateConfig } from './inspectionConfig';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { QuantityInput } from '@/components/ui/quantity-input';
import { NumberInput } from '@/components/ui/number-input';
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Alert, AlertDescription } from '@/components/ui/alert';
@@ -217,10 +219,9 @@ export function InspectionCreate() {
</div>
<div className="space-y-2">
<Label></Label>
<Input
type="number"
<QuantityInput
value={formData.quantity}
onChange={(e) => handleInputChange('quantity', parseInt(e.target.value) || 0)}
onChange={(value) => handleInputChange('quantity', value ?? 0)}
placeholder="수량 입력"
/>
</div>
@@ -315,11 +316,11 @@ export function InspectionCreate() {
) : (
<div className="space-y-2">
<Label> ({(item as MeasurementItem).unit}) *</Label>
<Input
type="number"
step="0.1"
value={(item as MeasurementItem).measuredValue || ''}
onChange={(e) => handleMeasurementChange(item.id, e.target.value)}
<NumberInput
step={0.1}
allowDecimal
value={(item as MeasurementItem).measuredValue ?? undefined}
onChange={(value) => handleMeasurementChange(item.id, String(value ?? ''))}
placeholder={`측정값 입력 (${(item as MeasurementItem).unit})`}
/>
</div>

View File

@@ -14,6 +14,7 @@ import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';
import { NumberInput } from '@/components/ui/number-input';
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
import { Badge } from '@/components/ui/badge';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -512,11 +513,11 @@ export function InspectionDetail({ id }: InspectionDetailProps) {
) : (
<div className="space-y-2">
<Label> ({(item as MeasurementItem).unit}) *</Label>
<Input
type="number"
step="0.1"
value={(item as MeasurementItem).measuredValue || ''}
onChange={(e) => handleMeasurementChange(item.id, e.target.value)}
<NumberInput
step={0.1}
allowDecimal
value={(item as MeasurementItem).measuredValue ?? undefined}
onChange={(value) => handleMeasurementChange(item.id, String(value ?? ''))}
placeholder={`측정값 입력 (${(item as MeasurementItem).unit})`}
/>
<p className="text-xs text-muted-foreground">

View File

@@ -25,7 +25,7 @@ import {
type StatCard,
type ListParams,
} from '@/components/templates/UniversalListPage';
import { ListMobileCard, InfoField } from '@/components/organisms/ListMobileCard';
import { ListMobileCard, InfoField } from '@/components/organisms/MobileCard';
import { getInspections, getInspectionStats } from './actions';
import { isNextRedirectError } from '@/lib/utils/redirect-error';
import { statusColorMap, inspectionTypeLabels } from './mockData';