feat(ui): add single-select mode for metrics in comparison view
- Restrict metric selection to single choice in user comparison view - Auto-keep first selected metric when switching to comparison mode - Update UI label to show "单选" or "多选" based on view mode - Improve chart readability by preventing metric overload in comparison mode Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -437,16 +437,31 @@ export const ReportAnalysisDialog: React.FC<ReportAnalysisDialogProps> = ({
|
|||||||
}, [comparisonData, selectedMetrics, selectedUsers])
|
}, [comparisonData, selectedMetrics, selectedUsers])
|
||||||
|
|
||||||
const handleMetricToggle = (metric: MetricKey) => {
|
const handleMetricToggle = (metric: MetricKey) => {
|
||||||
const next = new Set(selectedMetrics)
|
// In comparison view, only allow single metric selection
|
||||||
if (next.has(metric)) {
|
if (viewMode === 'comparison') {
|
||||||
if (next.size > 1) {
|
setSelectedMetrics(new Set([metric]))
|
||||||
// Ensure at least one metric is selected
|
|
||||||
next.delete(metric)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
next.add(metric)
|
// In aggregated view, allow multiple metric selection
|
||||||
|
const next = new Set(selectedMetrics)
|
||||||
|
if (next.has(metric)) {
|
||||||
|
if (next.size > 1) {
|
||||||
|
// Ensure at least one metric is selected
|
||||||
|
next.delete(metric)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
next.add(metric)
|
||||||
|
}
|
||||||
|
setSelectedMetrics(next)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleViewModeChange = (newMode: 'aggregated' | 'comparison') => {
|
||||||
|
setViewMode(newMode)
|
||||||
|
// When switching to comparison view, keep only the first selected metric
|
||||||
|
if (newMode === 'comparison' && selectedMetrics.size > 1) {
|
||||||
|
const firstMetric = Array.from(selectedMetrics)[0]
|
||||||
|
setSelectedMetrics(new Set([firstMetric]))
|
||||||
}
|
}
|
||||||
setSelectedMetrics(next)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Custom Tooltip formatter
|
// Custom Tooltip formatter
|
||||||
@@ -573,7 +588,9 @@ export const ReportAnalysisDialog: React.FC<ReportAnalysisDialogProps> = ({
|
|||||||
<div className="flex-1 flex flex-col p-6 overflow-y-auto">
|
<div className="flex-1 flex flex-col p-6 overflow-y-auto">
|
||||||
{/* Controls */}
|
{/* Controls */}
|
||||||
<div className="mb-8">
|
<div className="mb-8">
|
||||||
<h3 className="text-sm font-medium text-slate-700 mb-3">选择呈现内容 (多选)</h3>
|
<h3 className="text-sm font-medium text-slate-700 mb-3">
|
||||||
|
选择呈现内容 ({viewMode === 'comparison' ? '单选' : '多选'})
|
||||||
|
</h3>
|
||||||
<div className="flex flex-wrap gap-2">
|
<div className="flex flex-wrap gap-2">
|
||||||
{(Object.keys(METRIC_LABELS) as MetricKey[]).map((key) => {
|
{(Object.keys(METRIC_LABELS) as MetricKey[]).map((key) => {
|
||||||
const isSelected = selectedMetrics.has(key)
|
const isSelected = selectedMetrics.has(key)
|
||||||
@@ -606,7 +623,7 @@ export const ReportAnalysisDialog: React.FC<ReportAnalysisDialogProps> = ({
|
|||||||
<h3 className="text-sm font-medium text-slate-700 mb-3">视图模式</h3>
|
<h3 className="text-sm font-medium text-slate-700 mb-3">视图模式</h3>
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<button
|
<button
|
||||||
onClick={() => setViewMode('aggregated')}
|
onClick={() => handleViewModeChange('aggregated')}
|
||||||
className={`px-4 py-2 rounded-lg text-sm font-medium border transition-colors ${
|
className={`px-4 py-2 rounded-lg text-sm font-medium border transition-colors ${
|
||||||
viewMode === 'aggregated'
|
viewMode === 'aggregated'
|
||||||
? 'bg-blue-50 border-blue-200 text-blue-700'
|
? 'bg-blue-50 border-blue-200 text-blue-700'
|
||||||
@@ -616,7 +633,7 @@ export const ReportAnalysisDialog: React.FC<ReportAnalysisDialogProps> = ({
|
|||||||
按日期聚合
|
按日期聚合
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => setViewMode('comparison')}
|
onClick={() => handleViewModeChange('comparison')}
|
||||||
className={`px-4 py-2 rounded-lg text-sm font-medium border transition-colors ${
|
className={`px-4 py-2 rounded-lg text-sm font-medium border transition-colors ${
|
||||||
viewMode === 'comparison'
|
viewMode === 'comparison'
|
||||||
? 'bg-blue-50 border-blue-200 text-blue-700'
|
? 'bg-blue-50 border-blue-200 text-blue-700'
|
||||||
|
|||||||
Reference in New Issue
Block a user