mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-26 00:05:45 +00:00
refactor(FE): Handle ideal/outside ranges in uniformity tooltip
This commit is contained in:
@@ -39,9 +39,8 @@ const UniformityChart = ({
|
|||||||
name: range.range,
|
name: range.range,
|
||||||
uv: range.bird_count,
|
uv: range.bird_count,
|
||||||
isIdeal: range.is_ideal_range,
|
isIdeal: range.is_ideal_range,
|
||||||
idealCount: range.is_ideal_range
|
idealRange: range.ideal_range,
|
||||||
? weekData.ideal_range.total_ideal_birds
|
outsideRange: range.outside_range,
|
||||||
: undefined,
|
|
||||||
}));
|
}));
|
||||||
}, [chartData]);
|
}, [chartData]);
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ interface BarChartData {
|
|||||||
name: string;
|
name: string;
|
||||||
uv: number;
|
uv: number;
|
||||||
isIdeal?: boolean;
|
isIdeal?: boolean;
|
||||||
idealCount?: number;
|
idealRange?: string;
|
||||||
|
outsideRange?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface UniformityBarChartProps {
|
interface UniformityBarChartProps {
|
||||||
@@ -40,30 +41,117 @@ function CustomTooltip({ payload, label, active }: CustomTooltipProps) {
|
|||||||
const chartData = data.payload as BarChartData;
|
const chartData = data.payload as BarChartData;
|
||||||
const labelStr = String(label);
|
const labelStr = String(label);
|
||||||
|
|
||||||
if (chartData.isIdeal && chartData.idealCount !== undefined) {
|
// If the range has both ideal and outside ranges (like 340-344)
|
||||||
|
if (chartData.idealRange && chartData.outsideRange) {
|
||||||
|
return (
|
||||||
|
<div className='bg-[#18181B] p-2.5 shadow-sm text-white rounded-2xl rounded-bl-none'>
|
||||||
|
<p className='m-0 font-bold text-white/50'>Uniformity 2025</p>
|
||||||
|
<div className='flex flex-col gap-2 mt-2'>
|
||||||
|
<div className='flex items-center justify-between'>
|
||||||
|
<div className='flex items-center gap-2'>
|
||||||
|
<div className='w-5 h-5 bg-[#0069E0] rounded-md'></div>
|
||||||
|
<span className='text-sm'>Ideal</span>
|
||||||
|
</div>
|
||||||
|
<span className='text-sm font-medium'>
|
||||||
|
{chartData.idealRange}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className='flex items-center justify-between'>
|
||||||
|
<div className='flex items-center gap-2'>
|
||||||
|
<div className='w-5 h-5 bg-[#EF4444] rounded-md'></div>
|
||||||
|
<span className='text-sm'>Outside</span>
|
||||||
|
</div>
|
||||||
|
<span className='text-sm font-medium'>
|
||||||
|
{chartData.outsideRange}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className='border-t border-white/20 pt-2 mt-1'>
|
||||||
|
<div className='flex items-center justify-between'>
|
||||||
|
<span className='text-white/70 text-sm'>Total Birds:</span>
|
||||||
|
<span className='font-semibold'>{payload[0].value}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='text-center text-xs text-white/50'>{labelStr}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the range has only ideal range
|
||||||
|
if (chartData.idealRange) {
|
||||||
return (
|
return (
|
||||||
<div className='bg-[#18181B] p-2.5 shadow-sm text-white rounded-2xl rounded-bl-none'>
|
<div className='bg-[#18181B] p-2.5 shadow-sm text-white rounded-2xl rounded-bl-none'>
|
||||||
<p className='m-0 font-bold text-white/50'>Uniformity 2025</p>
|
<p className='m-0 font-bold text-white/50'>Uniformity 2025</p>
|
||||||
<div className='flex items-center gap-2 mt-2 justify-between'>
|
<div className='flex items-center gap-2 mt-2 justify-between'>
|
||||||
<div className='flex items-center gap-2'>
|
<div className='flex items-center gap-2'>
|
||||||
<div className='w-5 h-5 bg-[#0069E0] rounded-md'></div>
|
<div className='w-5 h-5 bg-[#0069E0] rounded-md'></div>
|
||||||
{chartData.idealCount} of Birds
|
<span className='text-sm'>Ideal</span>
|
||||||
</div>
|
</div>
|
||||||
<span>{labelStr}</span>
|
<span className='text-sm font-medium'>{chartData.idealRange}</span>
|
||||||
|
</div>
|
||||||
|
<div className='border-t border-white/20 pt-2 mt-2'>
|
||||||
|
<div className='flex items-center justify-between'>
|
||||||
|
<span className='text-white/70 text-sm'>Birds:</span>
|
||||||
|
<span className='font-semibold'>{payload[0].value}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='text-center text-xs text-white/50 mt-1'>
|
||||||
|
{labelStr}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the range has only outside range
|
||||||
|
if (chartData.outsideRange) {
|
||||||
|
return (
|
||||||
|
<div className='bg-[#18181B] p-2.5 shadow-sm text-white rounded-2xl rounded-bl-none'>
|
||||||
|
<p className='m-0 font-bold text-white/50'>Uniformity 2025</p>
|
||||||
|
<div className='flex items-center gap-2 mt-2 justify-between'>
|
||||||
|
<div className='flex items-center gap-2'>
|
||||||
|
<div className='w-5 h-5 bg-[#EF4444] rounded-md'></div>
|
||||||
|
<span className='text-sm'>Outside</span>
|
||||||
|
</div>
|
||||||
|
<span className='text-sm font-medium'>
|
||||||
|
{chartData.outsideRange}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div className='border-t border-white/20 pt-2 mt-2'>
|
||||||
|
<div className='flex items-center justify-between'>
|
||||||
|
<span className='text-white/70 text-sm'>Birds:</span>
|
||||||
|
<span className='font-semibold'>{payload[0].value}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className='text-center text-xs text-white/50 mt-1'>
|
||||||
|
{labelStr}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback for backward compatibility
|
||||||
return (
|
return (
|
||||||
<div className='bg-[#18181B] p-2.5 shadow-sm text-white rounded-2xl rounded-bl-none'>
|
<div className='bg-[#18181B] p-2.5 shadow-sm text-white rounded-2xl rounded-bl-none'>
|
||||||
<p className='m-0 font-bold text-white/50'>Uniformity 2025</p>
|
<p className='m-0 font-bold text-white/50'>Uniformity 2025</p>
|
||||||
<div className='flex items-center gap-2 mt-2 justify-between'>
|
<div className='flex items-center gap-2 mt-2 justify-between'>
|
||||||
<div className='flex items-center gap-2'>
|
<div className='flex items-center gap-2'>
|
||||||
<div className='w-5 h-5 bg-[#0069E0] rounded-md'></div>
|
<div
|
||||||
{payload[0].value} of Birds
|
className='w-5 h-5 rounded-md'
|
||||||
|
style={{
|
||||||
|
backgroundColor: chartData.isIdeal ? '#0069E0' : '#EF4444',
|
||||||
|
}}
|
||||||
|
></div>
|
||||||
|
<span className='text-sm'>
|
||||||
|
{chartData.isIdeal ? 'Ideal' : 'Outside'}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<span className='text-sm font-medium'>{labelStr}</span>
|
||||||
|
</div>
|
||||||
|
<div className='border-t border-white/20 pt-2 mt-2'>
|
||||||
|
<div className='flex items-center justify-between'>
|
||||||
|
<span className='text-white/70 text-sm'>Birds:</span>
|
||||||
|
<span className='font-semibold'>{payload[0].value}</span>
|
||||||
</div>
|
</div>
|
||||||
<span>{labelStr}</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
+2
@@ -8,6 +8,8 @@ export type WeightDistributionRange = {
|
|||||||
max_weight: number;
|
max_weight: number;
|
||||||
bird_count: number;
|
bird_count: number;
|
||||||
is_ideal_range: boolean;
|
is_ideal_range: boolean;
|
||||||
|
ideal_range?: string;
|
||||||
|
outside_range?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type IdealRange = {
|
export type IdealRange = {
|
||||||
|
|||||||
Reference in New Issue
Block a user