diff --git a/src/components/molecules/DateRangeSelector.tsx b/src/components/molecules/DateRangeSelector.tsx index 7a4de51d..8e819a64 100644 --- a/src/components/molecules/DateRangeSelector.tsx +++ b/src/components/molecules/DateRangeSelector.tsx @@ -26,7 +26,7 @@ const PRESET_LABELS: Record = { /** * 기본 프리셋 순서 */ -const DEFAULT_PRESETS: DatePreset[] = ['thisYear', 'twoMonthsAgo', 'lastMonth', 'thisMonth', 'yesterday', 'today']; +const DEFAULT_PRESETS: DatePreset[] = ['today', 'yesterday', 'thisMonth', 'lastMonth', 'twoMonthsAgo', 'thisYear' ]; interface DateRangeSelectorProps { /** 시작 날짜 (yyyy-MM-dd 형식) */ diff --git a/src/components/process-management/RuleModal.tsx b/src/components/process-management/RuleModal.tsx index a04bb96e..55e91e3a 100644 --- a/src/components/process-management/RuleModal.tsx +++ b/src/components/process-management/RuleModal.tsx @@ -1,7 +1,7 @@ 'use client'; import { useState, useEffect, useCallback } from 'react'; -import { getItemList, type ItemOption } from './actions'; +import { getItemList, getItemTypeOptions, type ItemOption } from './actions'; import { Dialog, DialogContent, @@ -40,14 +40,8 @@ import type { } from '@/types/process'; import { RULE_TYPE_OPTIONS, MATCHING_TYPE_OPTIONS } from '@/types/process'; -// 품목 유형 옵션 -const ITEM_TYPE_OPTIONS = [ - { value: 'all', label: '전체' }, - { value: '제품', label: '제품' }, - { value: '반제품', label: '반제품' }, - { value: '원자재', label: '원자재' }, - { value: '부자재', label: '부자재' }, -]; +// 품목 유형 기본 옵션 (전체) +const DEFAULT_ITEM_TYPE_OPTION = { value: 'all', label: '전체' }; interface RuleModalProps { open: boolean; @@ -81,6 +75,9 @@ export function RuleModal({ open, onOpenChange, onAdd, editRule }: RuleModalProp const [itemList, setItemList] = useState([]); const [isItemsLoading, setIsItemsLoading] = useState(false); + // 품목 유형 옵션 (common_codes에서 동적 조회) + const [itemTypeOptions, setItemTypeOptions] = useState>([DEFAULT_ITEM_TYPE_OPTION]); + // 품목 목록 로드 (debounced) const loadItems = useCallback(async (q?: string, itemType?: string) => { setIsItemsLoading(true); @@ -131,11 +128,18 @@ export function RuleModal({ open, onOpenChange, onAdd, editRule }: RuleModalProp loadItems(searchKeyword, selectedItemType); }, [selectedItemType]); - // 모달 열릴 때 품목 목록 초기화 (초기 로드 안함) + // 모달 열릴 때 품목 목록 초기화 + 품목유형 옵션 로드 useEffect(() => { - if (open && registrationType === 'individual') { - setItemList([]); - setSearchKeyword(''); + if (open) { + // 품목유형 옵션 로드 (common_codes에서 동적 조회) + getItemTypeOptions().then((options) => { + setItemTypeOptions([DEFAULT_ITEM_TYPE_OPTION, ...options]); + }); + + if (registrationType === 'individual') { + setItemList([]); + setSearchKeyword(''); + } } }, [open, registrationType]); @@ -186,8 +190,8 @@ export function RuleModal({ open, onOpenChange, onAdd, editRule }: RuleModalProp setSelectedItemIds(new Set()); } } else { - // 추가 모드: 초기화 - setRegistrationType('pattern'); + // 추가 모드: 초기화 (개별 품목을 디폴트로) + setRegistrationType('individual'); setDescription(''); setRuleType('품목코드'); setMatchingType('startsWith'); @@ -399,7 +403,7 @@ export function RuleModal({ open, onOpenChange, onAdd, editRule }: RuleModalProp - {ITEM_TYPE_OPTIONS.map((opt) => ( + {itemTypeOptions.map((opt) => ( {opt.label}