From 485d4dc2bba450d52815f6fad3af0c87e0f9760c Mon Sep 17 00:00:00 2001 From: george Date: Wed, 5 Mar 2025 12:14:51 -0500 Subject: [PATCH 1/5] fix API key persistence (#98) * make sure sessionStorage initially gets populated with api-key from localStorage by swapping eval order for 'api-key' and 'store-api-key' blocks --- src/store.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/store.ts b/src/store.ts index 397ffb1..e11e98f 100644 --- a/src/store.ts +++ b/src/store.ts @@ -35,6 +35,16 @@ formSelections.subscribe((val) => { sessionStorage.setItem('form', JSON.stringify(val)); }); +export const apiKey = writable(localStorage.getItem('api-key')! || ''); +apiKey.subscribe((val) => { + // always keep key in session storage (resets on window close) + sessionStorage.setItem('api-key', val); + if (localStorage.getItem('store-api-key') === 'true') { + // if flag set, also store key in local persistent storage + localStorage.setItem('api-key', val); + } +}); + export const storeApiKeys = writable(localStorage.getItem('store-api-key') === 'true'); storeApiKeys.subscribe((val) => { localStorage.setItem('store-api-key', val.toString()); @@ -47,16 +57,6 @@ storeApiKeys.subscribe((val) => { } }); -export const apiKey = writable(localStorage.getItem('api-key')! || ''); -apiKey.subscribe((val) => { - // always keep key around in session storage (resets on page refresh) - sessionStorage.setItem('api-key', val); - if (localStorage.getItem('store-api-key') === 'true') { - // store it in local storage (persistent) - localStorage.setItem('api-key', val); - } -}); - export function addDataSet(dataset: DataSet | DataGroup): void { const root = get(datasetTree); root.datasets.push(dataset); From bb1ce090a2975befcbbbeda0d90c96cd214c0e64 Mon Sep 17 00:00:00 2001 From: Rostyslav Zatserkovnyi Date: Wed, 5 Mar 2025 20:05:17 +0200 Subject: [PATCH 2/5] Mark COVIDcast value as active by default (#90) * Mark COVIDcast value as active by default * Fix type * Revert previous changes, add default_enabled * Lint fix * Set `defaultEnabled` explicitly instead of passing thru call chain (#93) * DataGroup: use .defaultEnabled as mutable member instead of constructor-only arg * typo --------- Co-authored-by: george --- src/App.svelte | 4 +--- src/api/EpiData.ts | 18 ++++++++++++++++-- src/data/DataSet.ts | 2 ++ src/store.ts | 6 ++++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/App.svelte b/src/App.svelte index e5b147f..fd3ad5a 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -2,7 +2,7 @@ import Chart from './components/Chart.svelte'; import LeftMenu from './components/LeftMenu.svelte'; import TopMenu from './components/TopMenu.svelte'; - import { activeDatasets, initialViewport, isShowingPoints, navMode } from './store'; + import { initialViewport, isShowingPoints, navMode } from './store'; import type { IChart } from './store'; import { onMount } from 'svelte'; import { tour } from './tour'; @@ -31,8 +31,6 @@ if (ds) { // add the dataset itself addDataSet(ds); - // reset active datasets to fluview -> wili - $activeDatasets = [ds.datasets[0]]; if (chart) { chart.fitData(true); } diff --git a/src/api/EpiData.ts b/src/api/EpiData.ts index 8612320..9969c14 100644 --- a/src/api/EpiData.ts +++ b/src/api/EpiData.ts @@ -273,7 +273,14 @@ export function importCOVIDcast({ { data_source, signal, time_type, geo_type, geo_value }, ['value', 'stderr', 'sample_size'], api_key, - ); + ).then((ds) => { + // get inside the Promise and make sure its not null, + // then enable display of 'value' data + if (ds instanceof DataGroup) { + ds.defaultEnabled = ['value']; + } + return ds; + }); } export function importCOVIDHosp({ @@ -414,7 +421,14 @@ export function importFluView({ wili: '%wILI', ili: '%ILI', }, - ); + ).then((ds) => { + // get inside the Promise and make sure its not null, + // then enable display of 'percent weighted ILI' data + if (ds instanceof DataGroup) { + ds.defaultEnabled = ['%wILI']; + } + return ds; + }); } export function importGFT({ locations }: { locations: string }): Promise { diff --git a/src/data/DataSet.ts b/src/data/DataSet.ts index eab8ebc..4201550 100644 --- a/src/data/DataSet.ts +++ b/src/data/DataSet.ts @@ -102,6 +102,8 @@ export default class DataSet { export class DataGroup { public parent?: DataGroup; + // which fields of this DataGroup should be "enabled" (shown/displayed) on load: + public defaultEnabled: string[] = []; constructor(public readonly title: string, public readonly datasets: (DataSet | DataGroup)[]) {} diff --git a/src/store.ts b/src/store.ts index e11e98f..dbb4be2 100644 --- a/src/store.ts +++ b/src/store.ts @@ -66,6 +66,12 @@ export function addDataSet(dataset: DataSet | DataGroup): void { if (dataset instanceof DataGroup) { // auto expand expandedDataGroups.set([...get(expandedDataGroups), dataset]); + // add defaultEnabled datasets to the list of active datasets + for (const ds of dataset.datasets) { + if (ds instanceof DataSet && dataset.defaultEnabled.includes(ds.title)) { + activeDatasets.set([...get(activeDatasets), ds]); + } + } } else { activeDatasets.set([...get(activeDatasets), dataset]); } From 39bda957afec2d98e1830a1c07d257ed5ada0314 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 13:53:00 -0500 Subject: [PATCH 3/5] build(deps-dev): bump rollup from 2.78.1 to 2.79.2 (#101) Bumps [rollup](https://github.com/rollup/rollup) from 2.78.1 to 2.79.2. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v2.78.1...v2.79.2) --- updated-dependencies: - dependency-name: rollup dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 15 ++++++++------- package.json | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index edf879f..bfb54d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "lint-staged": "^13.0.3", "prettier": "^2.7.1", "prettier-plugin-svelte": "^2.7.0", - "rollup": "^2.78.1", + "rollup": "^2.79.2", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-livereload": "^2.0.5", "rollup-plugin-scss": "^3.0.0", @@ -2827,10 +2827,11 @@ } }, "node_modules/rollup": { - "version": "2.78.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", - "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -5768,9 +5769,9 @@ } }, "rollup": { - "version": "2.78.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", - "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, "requires": { "fsevents": "~2.3.2" diff --git a/package.json b/package.json index f8609bc..db8090a 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "lint-staged": "^13.0.3", "prettier": "^2.7.1", "prettier-plugin-svelte": "^2.7.0", - "rollup": "^2.78.1", + "rollup": "^2.79.2", "rollup-plugin-css-only": "^3.1.0", "rollup-plugin-livereload": "^2.0.5", "rollup-plugin-scss": "^3.0.0", From 9079eaab9db0951892d79128e890cef02ac30419 Mon Sep 17 00:00:00 2001 From: Rostyslav Zatserkovnyi Date: Thu, 6 Mar 2025 06:09:52 +0200 Subject: [PATCH 4/5] Derive custom titles from URL params (#78) --- src/data/DataSet.ts | 1 + src/deriveLinkDefaults.ts | 46 ++++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/data/DataSet.ts b/src/data/DataSet.ts index 4201550..d941327 100644 --- a/src/data/DataSet.ts +++ b/src/data/DataSet.ts @@ -28,6 +28,7 @@ export default class DataSet { public readonly data: readonly EpiPoint[], public title = '', public readonly params: Record | unknown[] | null = null, + public customTitle: string | null = null, public color = getRandomColor(), ) { this.gap = computeGap(data); diff --git a/src/deriveLinkDefaults.ts b/src/deriveLinkDefaults.ts index 2a23da9..aff7e3e 100644 --- a/src/deriveLinkDefaults.ts +++ b/src/deriveLinkDefaults.ts @@ -93,7 +93,7 @@ function endpointParams(endpoint: string, params: unknown[]): Record { if (!dg) { return null; @@ -102,6 +102,7 @@ function patchDataSet(title: string, color: string) { const d = datasets.find((di) => di.title === title); if (d) { d.color = color; + d.customTitle = customTitle; } return d; }; @@ -120,12 +121,34 @@ export function initialLoader(datasets: ILinkConfig['datasets']) { } const key = `${endpoint}:${JSON.stringify(params)}`; const existing = loadingDataSets.get(key); + + /* eslint-disable @typescript-eslint/restrict-template-expressions */ + let customTitle = title; + if (params.custom_title) { + // Custom title present (e.g. from signal documentation) - apply directly + customTitle = `${params.custom_title}`; + } else if (params._endpoint) { + // Derive custom title from params + customTitle = `${params._endpoint}`; + if (params.data_source && params.signal) { + customTitle += ` > ${params.data_source}:${params.signal}`; + } + if (params.geo_type && params.geo_value) { + customTitle += ` > ${params.geo_type}:${params.geo_value}`; + } + if (params.regions) { + customTitle += ` > ${params.regions}`; + } + customTitle += ` > ${title}`; + } + /* eslint-enable @typescript-eslint/restrict-template-expressions */ + if (existing) { - resolvedDataSets.push(existing.then(patchDataSet(title, color))); + resolvedDataSets.push(existing.then(patchDataSet(title, color, customTitle))); } else { const loadingDataSet = func(params); loadingDataSets.set(key, loadingDataSet); - resolvedDataSets.push(loadingDataSet.then(patchDataSet(title, color))); + resolvedDataSets.push(loadingDataSet.then(patchDataSet(title, color, customTitle))); } } @@ -156,21 +179,8 @@ export function initialLoader(datasets: ILinkConfig['datasets']) { return Promise.all(resolvedDataSets).then((data) => { const cleaned = data.filter((d): d is DataSet => d != null); cleaned.forEach((d) => { - if (d.params && !Array.isArray(d.params) && d.params._endpoint) { - /* eslint-disable @typescript-eslint/restrict-template-expressions */ - const col_name = d.title; - d.title = `${d.params._endpoint}`; - if (d.params.data_source && d.params.signal) { - d.title += ` > ${d.params.data_source}:${d.params.signal}`; - } - if (d.params.geo_type && d.params.geo_value) { - d.title += ` > ${d.params.geo_type}:${d.params.geo_value}`; - } - if (d.params.regions) { - d.title += ` > ${d.params.regions}`; - } - d.title += ` > ${col_name}`; - /* eslint-enable @typescript-eslint/restrict-template-expressions */ + if (d.customTitle) { + d.title = d.customTitle; } add(d); }); From de56405ff108083cf36bee23da842524c756f87a Mon Sep 17 00:00:00 2001 From: melange396 Date: Thu, 6 Mar 2025 04:20:58 +0000 Subject: [PATCH 5/5] chore: release v2.1.7 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfb54d3..7f72f79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "www-epivis", - "version": "2.1.6", + "version": "2.1.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "www-epivis", - "version": "2.1.6", + "version": "2.1.7", "license": "MIT", "dependencies": { "uikit": "^3.15.5" diff --git a/package.json b/package.json index db8090a..509eb24 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "www-epivis", - "version": "2.1.6", + "version": "2.1.7", "private": true, "license": "MIT", "description": "",