feat: 급여관리 개선 + 설비관리 신규 + 팝업관리/카드관리/가격표 개선

- 급여관리: 상세/등록 다이얼로그 리팩토링, actions/types 확장
- 설비관리: 설비현황/점검/수리 4개 페이지 신규 추가
- 팝업관리: PopupDetail/PopupForm 개선
- 카드관리: CardForm 개선
- IntegratedListTemplateV2, SearchFilter, useColumnSettings 개선
- CLAUDE.md: 페이지 모드 라우팅 패턴 규칙 추가
- 공통 페이지 패턴 가이드 확장
This commit is contained in:
유병철
2026-03-12 21:48:37 +09:00
parent 945a371cdf
commit ca5a9325c6
40 changed files with 10284 additions and 1867 deletions

View File

@@ -18,7 +18,7 @@ import { formatNumber } from '@/lib/utils/amount';
import {
DollarSign,
Package,
ArrowLeft,
X,
Save,
Calculator,
TrendingUp,
@@ -27,6 +27,7 @@ import {
CheckCircle2,
Lock,
} from 'lucide-react';
import { useMenuStore } from '@/stores/menuStore';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
@@ -90,6 +91,7 @@ export function PricingFormClient({
onFinalize,
}: PricingFormClientProps) {
const router = useRouter();
const sidebarCollapsed = useMenuStore((state) => state.sidebarCollapsed);
const isEditMode = mode === 'edit';
// 품목 정보 (신규: itemInfo, 수정: initialData)
@@ -711,40 +713,38 @@ export function PricingFormClient({
</CardContent>
</Card>
{/* 버튼 영역 */}
<div className="flex gap-2 justify-between">
{/* 하단 버튼 (sticky 하단 바) */}
<div className={`fixed bottom-4 left-4 right-4 px-4 py-3 bg-background/95 backdrop-blur rounded-xl border shadow-lg z-50 transition-all duration-300 md:bottom-6 md:px-6 md:right-[48px] ${sidebarCollapsed ? 'md:left-[156px]' : 'md:left-[316px]'} flex items-center justify-between`}>
<div className="flex gap-2">
<Button
variant="outline"
onClick={() => router.push('/sales/pricing-management')}
>
<X className="h-4 w-4 mr-1" />
</Button>
{isEditMode && initialData?.revisions && initialData.revisions.length > 0 && (
<Button variant="outline" onClick={() => setShowHistoryDialog(true)}>
<History className="h-4 w-4 mr-2" />
<History className="h-4 w-4 mr-1" />
({initialData.currentRevision})
</Button>
)}
</div>
<div className="flex gap-2">
<Button
variant="outline"
onClick={() => router.push('/sales/pricing-management')}
className="min-w-[100px]"
>
<ArrowLeft className="h-4 w-4 mr-2" />
</Button>
{isEditMode && initialData && !initialData.isFinal && (
<Button
onClick={() => setShowFinalizeDialog(true)}
className="min-w-[100px] bg-purple-600 hover:bg-purple-700"
className="bg-purple-600 hover:bg-purple-700"
>
<CheckCircle2 className="h-4 w-4 mr-2" />
<CheckCircle2 className="h-4 w-4 mr-1" />
</Button>
)}
<Button
onClick={() => handleSave()}
className="min-w-[100px] bg-blue-600 hover:bg-blue-700"
disabled={initialData?.isFinal || isSaving}
>
<Save className="h-4 w-4 mr-2" />
<Save className="h-4 w-4 mr-1" />
{initialData?.isFinal ? '확정됨' : '저장'}
</Button>
</div>