refactor: CEO 대시보드 mockData/modalConfigs 정리 및 BillManagement 간소화

- mockData 불필요 데이터 대폭 제거
- modalConfigs (cardManagement, entertainment, monthlyExpense, vat, welfare) 정리
- CEODashboard 컴포넌트 개선
- BillManagementClient 간소화
This commit is contained in:
유병철
2026-03-05 21:22:17 +09:00
parent 1675f3edcf
commit bec933b3b4
8 changed files with 77 additions and 1588 deletions

View File

@@ -10,7 +10,7 @@
* - tableHeaderActions: 거래처, 구분, 상태 필터
*/
import { useState, useMemo, useCallback } from 'react';
import { useState, useMemo, useCallback, useEffect, useRef } from 'react';
import { useRouter } from 'next/navigation';
import { formatNumber } from '@/lib/utils/amount';
import { useDateRange } from '@/hooks';
@@ -32,8 +32,6 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
import { Label } from '@/components/ui/label';
import {
UniversalListPage,
type UniversalListConfig,
@@ -148,6 +146,16 @@ export function BillManagementClient({
}
}, [searchQuery, billTypeFilter, statusFilter, vendorFilter, startDate, endDate, sortOption, itemsPerPage]);
// ===== 필터 변경 시 자동 재조회 =====
const isInitialMount = useRef(true);
useEffect(() => {
if (isInitialMount.current) {
isInitialMount.current = false;
return;
}
loadData(1);
}, [loadData]);
// ===== 체크박스 핸들러 =====
const toggleSelection = useCallback((id: string) => {
setSelectedItems(prev => {
@@ -348,32 +356,8 @@ export function BillManagementClient({
);
},
// 모바일 필터 설정
filterConfig: [
{
key: 'vendorFilter',
label: '거래처',
type: 'single',
options: vendorOptions.filter(o => o.value !== 'all'),
},
{
key: 'billType',
label: '구분',
type: 'single',
options: BILL_TYPE_FILTER_OPTIONS.filter(o => o.value !== 'all'),
},
{
key: 'status',
label: '상태',
type: 'single',
options: BILL_STATUS_FILTER_OPTIONS.filter(o => o.value !== 'all'),
},
],
initialFilters: {
vendorFilter: vendorFilter,
billType: billTypeFilter,
status: statusFilter,
},
// 모바일 필터 설정 (tableHeaderActions와 중복 방지를 위해 비워둠)
filterConfig: [],
filterTitle: '어음 필터',
// 날짜 선택기
@@ -392,44 +376,12 @@ export function BillManagementClient({
icon: Plus,
},
// 헤더 액션: 수취/발행 라디오 + 상태 선택 + 저장
// 모바일: 라디오/상태필터는 숨기고 저장만 표시 (filterConfig 바텀시트와 중복 방지)
// 데스크톱: 모두 표시
// 헤더 액션: 저장 버튼만 (필터는 tableHeaderActions에서 통합 관리)
headerActions: () => (
<div className="flex items-center gap-3" style={{ display: 'flex' }}>
<div className="hidden xl:flex items-center gap-3">
<RadioGroup
value={billTypeFilter}
onValueChange={(value) => { setBillTypeFilter(value); loadData(1); }}
className="flex items-center gap-3"
>
<div className="flex items-center space-x-1">
<RadioGroupItem value="received" id="received" />
<Label htmlFor="received" className="cursor-pointer text-sm whitespace-nowrap"></Label>
</div>
<div className="flex items-center space-x-1">
<RadioGroupItem value="issued" id="issued" />
<Label htmlFor="issued" className="cursor-pointer text-sm whitespace-nowrap"></Label>
</div>
</RadioGroup>
<Select value={statusFilter} onValueChange={setStatusFilter}>
<SelectTrigger className="min-w-[100px] w-auto">
<SelectValue placeholder="상태" />
</SelectTrigger>
<SelectContent>
{BILL_STATUS_FILTER_OPTIONS.map((option) => (
<SelectItem key={option.value} value={option.value}>
{option.label}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<Button onClick={handleSave} size="sm" disabled={isLoading}>
<Save className="h-4 w-4 mr-1" />
</Button>
</div>
<Button onClick={handleSave} size="sm" disabled={isLoading}>
<Save className="h-4 w-4 mr-1" />
</Button>
),
// 테이블 헤더 액션 (필터)
@@ -448,7 +400,7 @@ export function BillManagementClient({
</SelectContent>
</Select>
<Select value={billTypeFilter} onValueChange={(value) => { setBillTypeFilter(value); loadData(1); }}>
<Select value={billTypeFilter} onValueChange={setBillTypeFilter}>
<SelectTrigger className="min-w-[100px] w-auto">
<SelectValue placeholder="구분" />
</SelectTrigger>
@@ -461,7 +413,7 @@ export function BillManagementClient({
</SelectContent>
</Select>
<Select value={statusFilter} onValueChange={(value) => { setStatusFilter(value); loadData(1); }}>
<Select value={statusFilter} onValueChange={setStatusFilter}>
<SelectTrigger className="min-w-[110px] w-auto">
<SelectValue placeholder="보관중" />
</SelectTrigger>