|
3 | 3 | ...DEFAULT_WIDGET_STATE, |
4 | 4 | width: 3, |
5 | 5 | height: 2, |
| 6 | + zero: true, |
6 | 7 | }; |
7 | 8 | </script> |
8 | 9 |
|
|
11 | 12 | import WidgetCard, { DEFAULT_WIDGET_STATE } from './WidgetCard.svelte'; |
12 | 13 | import { getContext } from 'svelte'; |
13 | 14 | import DownloadMenu from '../../../components/DownloadMenu.svelte'; |
14 | | - import { generateCompareLineSpec, resolveHighlightedDate, patchHighlightTuple } from '../../../specs/lineSpec'; |
| 15 | + import { |
| 16 | + generateCompareLineSpec, |
| 17 | + resolveHighlightedDate, |
| 18 | + patchHighlightTuple, |
| 19 | + generateDualAxisSpec, |
| 20 | + } from '../../../specs/lineSpec'; |
15 | 21 | import { formatDateISO, formatWeek } from '../../../formats'; |
16 | 22 | import { WidgetHighlight } from '../highlight'; |
17 | 23 | import isEqual from 'lodash-es/isEqual'; |
18 | 24 | import { createEventDispatcher } from 'svelte'; |
19 | 25 | import { EpiWeek } from '../../../data/EpiWeek'; |
20 | 26 | import { isComparableAcrossRegions } from '../../../data/sensor'; |
21 | 27 | import HistoryLineTooltip from '../../../blocks/HistoryLineTooltip.svelte'; |
| 28 | + import Toggle from '../../../components/Toggle.svelte'; |
22 | 29 |
|
23 | 30 | const dispatch = createEventDispatcher(); |
24 | 31 |
|
|
43 | 50 | export let highlight = null; |
44 | 51 |
|
45 | 52 | export let initialState = DEFAULT_STATE; |
| 53 | + let zoom = !initialState.zero; |
46 | 54 |
|
47 | 55 | $: canCompare = isComparableAcrossRegions(sensor.value); |
48 | 56 | $: visibleRegions = canCompare ? regions : regions.slice(0, Math.min(2, regions.length)); |
|
51 | 59 | $: state = { |
52 | 60 | ...initialState, |
53 | 61 | ...superState, |
| 62 | + zero: !zoom, |
54 | 63 | }; |
55 | 64 | $: { |
56 | 65 | dispatch('state', { id, state }); |
|
75 | 84 | * @param {import('../../../stores/params').SensorParam} sensor |
76 | 85 | * @param {import('../../../stores/params').RegionParam[]} regions |
77 | 86 | * @param {import('../../../stores/params').TimeFrame} timeFrame |
78 | | - * @param {{zero: boolean, raw: boolean}} options |
| 87 | + * @param {{zero: boolean, canCompare: boolean}} options |
79 | 88 | */ |
80 | | - function genSpec(sensor, regions, timeFrame) { |
| 89 | + function genSpec(sensor, regions, timeFrame, { canCompare, zero }) { |
81 | 90 | const isWeekly = sensor.value.isWeeklySignal; |
82 | 91 | /** |
83 | 92 | * @type {import('../../../specs/lineSpec').LineSpecOptions} |
84 | 93 | */ |
85 | 94 | const options = { |
86 | 95 | initialDate: highlightToDate(highlight) || timeFrame.max, |
87 | 96 | domain: timeFrame.domain, |
88 | | - zero: false, |
| 97 | + zero, |
89 | 98 | valueFormat: sensor.value.formatSpecifier, |
90 | 99 | xTitle: sensor.xAxis, |
91 | 100 | title: [`${sensor.name}`, timeFrame.toNiceString(isWeekly)], |
|
95 | 104 | autoAlignOffset: 60, |
96 | 105 | paddingTop: 80, |
97 | 106 | isWeeklySignal: isWeekly, |
98 | | - legend: true, |
99 | 107 | compareField: 'displayName', |
100 | 108 | tooltip: true, |
101 | 109 | }; |
102 | | - return generateCompareLineSpec( |
103 | | - regions.map((region) => region.displayName), |
104 | | - options, |
105 | | - ); |
| 110 | + const names = regions.map((region) => region.displayName); |
| 111 | + if (canCompare) { |
| 112 | + return generateCompareLineSpec(names, options); |
| 113 | + } |
| 114 | + return generateDualAxisSpec(names.slice(0, 1), names.slice(1), options); |
106 | 115 | } |
107 | 116 |
|
108 | 117 | /** |
|
127 | 136 | }-${sensor.isWeeklySignal ? formatWeek(timeFrame.max_week) : formatDateISO(timeFrame.max)}${suffix}`; |
128 | 137 | } |
129 | 138 |
|
130 | | - $: spec = genSpec(sensor, visibleRegions, timeFrame); |
| 139 | + $: spec = genSpec(sensor, visibleRegions, timeFrame, { canCompare, zero: !zoom }); |
131 | 140 | $: data = loadData(sensor, visibleRegions, timeFrame); |
132 | 141 | $: fileName = generateFileName(sensor, visibleRegions, timeFrame); |
133 | 142 |
|
|
215 | 224 | tooltipProps={{ sensor }} |
216 | 225 | /> |
217 | 226 | <svelte:fragment slot="toolbar"> |
| 227 | + <Toggle bind:checked={zoom} noPadding>Rescale Y-axis</Toggle> |
218 | 228 | <DownloadMenu {fileName} {vegaRef} {data} {sensor} advanced={false} /> |
219 | 229 | </svelte:fragment> |
220 | 230 | </WidgetCard> |
0 commit comments