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

@@ -8,6 +8,7 @@ import { Button } from '@/components/ui/button';
import { ContentLoadingSpinner } from '@/components/ui/loading-spinner';
import { Label } from '@/components/ui/label';
import { Input } from '@/components/ui/input';
import { QuantityInput } from '@/components/ui/quantity-input';
import { Card, CardContent } from '@/components/ui/card';
import { Switch } from '@/components/ui/switch';
import {
@@ -198,12 +199,11 @@ export function LeavePolicyManagement() {
<div className="space-y-2">
<Label> </Label>
<div className="flex items-center gap-2">
<Input
type="number"
<QuantityInput
min={0}
max={100}
value={settings.defaultAnnualLeave}
onChange={(e) => updateField('defaultAnnualLeave', parseInt(e.target.value) || 0)}
onChange={(value) => updateField('defaultAnnualLeave', value ?? 0)}
className="w-20"
/>
<span className="text-sm text-muted-foreground"></span>
@@ -214,12 +214,11 @@ export function LeavePolicyManagement() {
<div className="space-y-2">
<Label> </Label>
<div className="flex items-center gap-2">
<Input
type="number"
<QuantityInput
min={0}
max={10}
value={settings.additionalLeavePerYear}
onChange={(e) => updateField('additionalLeavePerYear', parseInt(e.target.value) || 0)}
onChange={(value) => updateField('additionalLeavePerYear', value ?? 0)}
className="w-20"
/>
<span className="text-sm text-muted-foreground"></span>
@@ -230,12 +229,11 @@ export function LeavePolicyManagement() {
<div className="space-y-2">
<Label> </Label>
<div className="flex items-center gap-2">
<Input
type="number"
<QuantityInput
min={0}
max={100}
value={settings.maxAnnualLeave}
onChange={(e) => updateField('maxAnnualLeave', parseInt(e.target.value) || 0)}
onChange={(value) => updateField('maxAnnualLeave', value ?? 0)}
className="w-20"
/>
<span className="text-sm text-muted-foreground"></span>
@@ -276,12 +274,11 @@ export function LeavePolicyManagement() {
<div className="space-y-2">
<Label> </Label>
<div className="flex items-center gap-2">
<Input
type="number"
<QuantityInput
min={0}
max={100}
value={settings.carryOverMaxDays}
onChange={(e) => updateField('carryOverMaxDays', parseInt(e.target.value) || 0)}
onChange={(value) => updateField('carryOverMaxDays', value ?? 0)}
className="w-20"
/>
<span className="text-sm text-muted-foreground"></span>
@@ -292,12 +289,11 @@ export function LeavePolicyManagement() {
<div className="space-y-2">
<Label> </Label>
<div className="flex items-center gap-2">
<Input
type="number"
<QuantityInput
min={0}
max={24}
value={settings.carryOverExpiryMonths}
onChange={(e) => updateField('carryOverExpiryMonths', parseInt(e.target.value) || 0)}
onChange={(value) => updateField('carryOverExpiryMonths', value ?? 0)}
className="w-20"
/>
<span className="text-sm text-muted-foreground"></span>