필터 최소값 수정

This commit is contained in:
2025-12-17 18:27:34 +09:00
parent a3f0d8bc62
commit 4d0f8f3b6b
4 changed files with 44 additions and 23 deletions

View File

@@ -553,8 +553,8 @@ export default function CowOverviewPage() {
> >
<BarChart3 className="hidden sm:block h-6 w-6 shrink-0" /> <BarChart3 className="hidden sm:block h-6 w-6 shrink-0" />
<span className="font-bold text-sm sm:text-xl"></span> <span className="font-bold text-sm sm:text-xl"></span>
<span className={`text-xs sm:text-sm px-1.5 sm:px-2.5 py-0.5 sm:py-1 rounded font-semibold shrink-0 ${hasGenomeData ? 'bg-green-500 text-white' : 'bg-slate-300 text-slate-600'}`}> <span className={`text-xs sm:text-sm px-1.5 sm:px-2.5 py-0.5 sm:py-1 rounded font-semibold shrink-0 ${hasGenomeData && isValidGenomeAnalysis(genomeRequest?.chipSireName, genomeRequest?.chipDamName, cow?.cowId) ? 'bg-green-500 text-white' : 'bg-slate-300 text-slate-600'}`}>
{hasGenomeData ? '완료' : '미검사'} {hasGenomeData && isValidGenomeAnalysis(genomeRequest?.chipSireName, genomeRequest?.chipDamName, cow?.cowId) ? '완료' : '미검사'}
</span> </span>
</TabsTrigger> </TabsTrigger>
<TabsTrigger <TabsTrigger
@@ -563,6 +563,9 @@ export default function CowOverviewPage() {
> >
<Dna className="hidden sm:block h-6 w-6 shrink-0" /> <Dna className="hidden sm:block h-6 w-6 shrink-0" />
<span className="font-bold text-sm sm:text-xl"></span> <span className="font-bold text-sm sm:text-xl"></span>
<span className={`text-xs sm:text-sm px-1.5 sm:px-2.5 py-0.5 sm:py-1 rounded font-semibold shrink-0 ${hasGeneData && isValidGenomeAnalysis(genomeRequest?.chipSireName, genomeRequest?.chipDamName, cow?.cowId) ? 'bg-green-500 text-white' : 'bg-slate-300 text-slate-600'}`}>
{hasGeneData && isValidGenomeAnalysis(genomeRequest?.chipSireName, genomeRequest?.chipDamName, cow?.cowId) ? '완료' : '미검사'}
</span>
</TabsTrigger> </TabsTrigger>
<TabsTrigger <TabsTrigger
value="reproduction" value="reproduction"
@@ -891,26 +894,26 @@ export default function CowOverviewPage() {
<Card className="bg-white border border-border rounded-xl overflow-hidden"> <Card className="bg-white border border-border rounded-xl overflow-hidden">
<CardContent className="p-0"> <CardContent className="p-0">
<div className="grid grid-cols-3 divide-x divide-border"> <div className="grid grid-cols-1 sm:grid-cols-3 divide-y sm:divide-y-0 sm:divide-x divide-border">
<div className="p-4"> <div className="p-3 sm:p-4 flex justify-between sm:block">
<div className="text-xs font-medium text-muted-foreground mb-1"></div> <div className="text-xs font-medium text-muted-foreground sm:mb-1"></div>
<div className="text-sm font-semibold text-foreground truncate"> <div className="text-sm font-semibold text-foreground">
{genomeData[0]?.request?.requestDt {genomeData[0]?.request?.requestDt
? new Date(genomeData[0].request.requestDt).toLocaleDateString('ko-KR') ? new Date(genomeData[0].request.requestDt).toLocaleDateString('ko-KR')
: '-'} : '-'}
</div> </div>
</div> </div>
<div className="p-4"> <div className="p-3 sm:p-4 flex justify-between sm:block">
<div className="text-xs font-medium text-muted-foreground mb-1"> </div> <div className="text-xs font-medium text-muted-foreground sm:mb-1"> </div>
<div className="text-sm font-semibold text-foreground truncate"> <div className="text-sm font-semibold text-foreground">
{genomeData[0]?.request?.chipReportDt {genomeData[0]?.request?.chipReportDt
? new Date(genomeData[0].request.chipReportDt).toLocaleDateString('ko-KR') ? new Date(genomeData[0].request.chipReportDt).toLocaleDateString('ko-KR')
: '-'} : '-'}
</div> </div>
</div> </div>
<div className="p-4"> <div className="p-3 sm:p-4 flex justify-between sm:block">
<div className="text-xs font-medium text-muted-foreground mb-1"> </div> <div className="text-xs font-medium text-muted-foreground sm:mb-1"> </div>
<div className="text-sm font-semibold text-foreground truncate"> <div className="text-sm font-semibold text-foreground">
{genomeData[0]?.request?.chipType || '-'} {genomeData[0]?.request?.chipType || '-'}
</div> </div>
</div> </div>
@@ -1185,6 +1188,7 @@ export default function CowOverviewPage() {
</Card> </Card>
{/* 분석불가 메시지 */} {/* 분석불가 메시지 */}
<h3 className="text-lg lg:text-xl font-bold text-foreground"> </h3>
<Card className="bg-slate-100 border border-slate-300 rounded-2xl"> <Card className="bg-slate-100 border border-slate-300 rounded-2xl">
<CardContent className="p-8 text-center"> <CardContent className="p-8 text-center">
<BarChart3 className="h-12 w-12 text-slate-400 mx-auto mb-4" /> <BarChart3 className="h-12 w-12 text-slate-400 mx-auto mb-4" />
@@ -1457,6 +1461,9 @@ export default function CowOverviewPage() {
{/* 유전자 검색 및 필터 섹션 */} {/* 유전자 검색 및 필터 섹션 */}
<h3 className="text-lg lg:text-xl font-bold text-foreground"> </h3> <h3 className="text-lg lg:text-xl font-bold text-foreground"> </h3>
{/* 친자확인 결과에 따른 분기 */}
{isValidGenomeAnalysis(genomeRequest?.chipSireName, genomeRequest?.chipDamName, cow?.cowId) ? (
<>
<div className="flex flex-col gap-3 sm:gap-3 p-3.5 max-sm:p-3 sm:px-4 sm:py-3 rounded-xl bg-slate-50/50 border border-slate-200/50"> <div className="flex flex-col gap-3 sm:gap-3 p-3.5 max-sm:p-3 sm:px-4 sm:py-3 rounded-xl bg-slate-50/50 border border-slate-200/50">
{/* 검색창 */} {/* 검색창 */}
<div className="relative w-full"> <div className="relative w-full">
@@ -1828,6 +1835,20 @@ export default function CowOverviewPage() {
</> </>
) )
})()} })()}
</>
) : (
<Card className="bg-slate-100 border border-slate-300 rounded-2xl">
<CardContent className="p-8 text-center">
<Dna className="h-12 w-12 text-slate-400 mx-auto mb-4" />
<h3 className="text-lg font-semibold text-slate-700 mb-2">
{getInvalidReason(genomeRequest?.chipSireName, genomeRequest?.chipDamName, cow?.cowId) || '유전자 분석 불가'}
</h3>
<p className="text-sm text-slate-500">
{getInvalidMessage(genomeRequest?.chipSireName, genomeRequest?.chipDamName, cow?.cowId).replace('유전체', '유전자')}
</p>
</CardContent>
</Card>
)}
</> </>
) : ( ) : (
<Card className="bg-slate-50 border border-border rounded-2xl"> <Card className="bg-slate-50 border border-border rounded-2xl">

View File

@@ -765,7 +765,7 @@ function MyCowContent() {
value={sortOrder} value={sortOrder}
onValueChange={(value) => setSortOrder(value as 'asc' | 'desc')} onValueChange={(value) => setSortOrder(value as 'asc' | 'desc')}
> >
<SelectTrigger className="w-full sm:w-[100px] h-10 sm:h-9 text-sm border-slate-200 bg-white"> <SelectTrigger className="w-full sm:w-[120px] h-10 sm:h-9 text-sm border-slate-200 bg-white">
<SelectValue /> <SelectValue />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>

View File

@@ -141,7 +141,7 @@ function SortableTraitItem({
size="sm" size="sm"
className="h-6 w-6 p-0" className="h-6 w-6 p-0"
onClick={() => onWeightChange(-1)} onClick={() => onWeightChange(-1)}
disabled={weight <= 0} disabled={weight <= 1}
> >
- -
</Button> </Button>
@@ -396,11 +396,11 @@ export function GlobalFilterDialog({ externalOpen, onExternalOpenChange, geneCou
}) })
} }
// 가중치 변경 // 가중치 변경 (1~10 범위)
const updateTraitWeight = (traitName: string, delta: number) => { const updateTraitWeight = (traitName: string, delta: number) => {
setLocalFilters(prev => { setLocalFilters(prev => {
const current = prev.traitWeights[traitName as TraitName] || 0 const current = prev.traitWeights[traitName as TraitName] || 1
const newValue = Math.min(10, Math.max(0, current + delta)) const newValue = Math.min(10, Math.max(1, current + delta))
return { return {
...prev, ...prev,
traitWeights: { ...prev.traitWeights, [traitName]: newValue } traitWeights: { ...prev.traitWeights, [traitName]: newValue }
@@ -991,7 +991,7 @@ export function GlobalFilterDialog({ externalOpen, onExternalOpenChange, geneCou
e.stopPropagation() e.stopPropagation()
updateTraitWeight(trait, -1) updateTraitWeight(trait, -1)
}} }}
disabled={(localFilters.traitWeights[trait as TraitName] || 0) <= 0} disabled={(localFilters.traitWeights[trait as TraitName] || 1) <= 1}
> >
- -
</Button> </Button>

View File

@@ -131,16 +131,16 @@ export const DEFAULT_FILTER_SETTINGS: GlobalFilterSettings = {
selectedTraits: ["도체중", "등심단면적", "등지방두께", "근내지방도", "체장", "체고", "흉위"], selectedTraits: ["도체중", "등심단면적", "등지방두께", "근내지방도", "체장", "체고", "흉위"],
pinnedTraits: [], pinnedTraits: [],
traitWeights: { traitWeights: {
// 성장형질 (점수: 0 ~ 10) // 성장형질 (점수: 1 ~ 10, 미선택 시 0)
"12개월령체중": 0, "12개월령체중": 0,
// 경제형질 (점수: 0 ~ 10) // 경제형질 (점수: 1 ~ 10, 미선택 시 0)
도체중: 1, 도체중: 1,
등심단면적: 1, 등심단면적: 1,
등지방두께: 1, 등지방두께: 1,
근내지방도: 1, 근내지방도: 1,
// 체형형질 (점수: 0 ~ 10) - DB 형질명과 일치 // 체형형질 (점수: 1 ~ 10, 미선택 시 0) - DB 형질명과 일치
체고: 1, 체고: 1,
십자: 0, 십자: 0,
체장: 1, 체장: 1,
@@ -152,7 +152,7 @@ export const DEFAULT_FILTER_SETTINGS: GlobalFilterSettings = {
곤폭: 0, 곤폭: 0,
흉위: 1, 흉위: 1,
// 부위별무게 (점수: 0 ~ 10) - DB 형질명과 일치 // 부위별무게 (점수: 1 ~ 10, 미선택 시 0) - DB 형질명과 일치
안심weight: 0, 안심weight: 0,
등심weight: 0, 등심weight: 0,
채끝weight: 0, 채끝weight: 0,
@@ -164,7 +164,7 @@ export const DEFAULT_FILTER_SETTINGS: GlobalFilterSettings = {
양지weight: 0, 양지weight: 0,
갈비weight: 0, 갈비weight: 0,
// 부위별비율 (점수: 0 ~ 10) - DB 형질명과 일치 // 부위별비율 (점수: 1 ~ 10, 미선택 시 0) - DB 형질명과 일치
안심rate: 0, 안심rate: 0,
등심rate: 0, 등심rate: 0,
채끝rate: 0, 채끝rate: 0,