@sjvair/monitor-map 4.3.0 → 5.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +59 -138
- package/dist/lib/MonitorDetailPanel.svelte +23 -20
- package/dist/lib/MonitorMapLayout.svelte +147 -77
- package/dist/lib/components/DataBox.svelte +4 -1
- package/dist/lib/components/ui/range-calendar/range-calendar.svelte.d.ts +1 -1
- package/dist/lib/config.svelte.d.ts +7 -0
- package/dist/lib/config.svelte.js +10 -0
- package/dist/lib/core.d.ts +2 -2
- package/dist/lib/core.js +2 -1
- package/dist/lib/data-chart/DataChart.svelte +40 -25
- package/dist/lib/data-chart/DateRange.d.ts +13 -4
- package/dist/lib/data-chart/DateRange.js +50 -14
- package/dist/lib/data-chart/chart-utils.js +5 -7
- package/dist/lib/data-chart/level-colors.d.ts +3 -4
- package/dist/lib/data-chart/level-colors.js +7 -4
- package/dist/lib/data-chart/pacific-time.d.ts +9 -0
- package/dist/lib/data-chart/pacific-time.js +25 -0
- package/dist/lib/data-chart/tooltip.js +2 -2
- package/{src/lib/ev-stations/components/EvStationTooltip.svelte → dist/lib/ev-stations/EvPopup.svelte} +6 -5
- package/dist/lib/ev-stations/EvPopup.svelte.d.ts +7 -0
- package/dist/lib/ev-stations/ev-plugin.svelte.d.ts +14 -0
- package/dist/lib/ev-stations/ev-plugin.svelte.js +71 -0
- package/dist/lib/ev-stations/ev-station-icons.d.ts +1 -4
- package/dist/lib/ev-stations/ev-station-icons.js +1 -13
- package/dist/lib/ev-stations/ev-stations.d.ts +7 -0
- package/dist/lib/ev-stations/ev-stations.js +53 -0
- package/dist/lib/ev-stations/ev-store.svelte.d.ts +21 -0
- package/dist/lib/ev-stations/ev-store.svelte.js +83 -0
- package/dist/lib/ev-stations/station-popup.svelte.d.ts +14 -0
- package/dist/lib/ev-stations/station-popup.svelte.js +54 -0
- package/dist/lib/ev-stations/types.d.ts +0 -29
- package/dist/lib/ev-stations/zip-codes.d.ts +11 -0
- package/dist/lib/ev-stations/zip-codes.js +28 -16
- package/dist/lib/index.d.ts +8 -56
- package/dist/lib/index.js +7 -46
- package/dist/lib/legend/Legend.svelte +18 -19
- package/dist/lib/legend/Legend.svelte.d.ts +2 -2
- package/dist/lib/levels.d.ts +7 -0
- package/dist/lib/levels.js +19 -0
- package/dist/lib/map/MapShell.svelte +17 -24
- package/dist/lib/map/MapShell.svelte.d.ts +4 -4
- package/dist/lib/map/basemaps.d.ts +25 -0
- package/dist/lib/map/basemaps.js +66 -0
- package/dist/lib/map/live-map.svelte.d.ts +3 -0
- package/dist/lib/map/live-map.svelte.js +22 -0
- package/dist/lib/map/sync-plugins.svelte.d.ts +19 -0
- package/dist/lib/map/sync-plugins.svelte.js +52 -0
- package/dist/lib/monitors/components/MonitorSubscriptionManager.svelte +66 -61
- package/dist/lib/monitors/filtered-source.svelte.d.ts +9 -0
- package/dist/lib/monitors/filtered-source.svelte.js +28 -0
- package/dist/lib/monitors/monitors.svelte.d.ts +25 -35
- package/dist/lib/monitors/monitors.svelte.js +35 -218
- package/dist/lib/monitors/retry-load.d.ts +8 -0
- package/dist/lib/monitors/retry-load.js +11 -0
- package/dist/lib/monitors/types.d.ts +1 -41
- package/dist/lib/options/map-option-defaults.d.ts +25 -36
- package/dist/lib/options/map-option-defaults.js +12 -30
- package/dist/lib/options/map-options.svelte.d.ts +13 -0
- package/dist/lib/options/map-options.svelte.js +26 -0
- package/dist/lib/options/menus/LayersMenu.svelte +8 -20
- package/dist/lib/options/menus/LayersMenu.svelte.d.ts +17 -2
- package/dist/lib/options/menus/MonitorsMenu.svelte +34 -18
- package/dist/lib/options/menus/OverlaysMenu.svelte +2 -2
- package/dist/lib/options/menus/PollutantMenu.svelte +4 -9
- package/dist/lib/options/menus/SettingsMenu.svelte +32 -25
- package/dist/lib/options/menus/SettingsMenu.svelte.d.ts +5 -16
- package/dist/lib/options/plugin-order.d.ts +8 -0
- package/dist/lib/options/plugin-order.js +36 -0
- package/dist/lib/options/pollutant-param.d.ts +7 -5
- package/dist/lib/options/pollutant-param.js +9 -5
- package/dist/lib/options/row-icons.d.ts +8 -0
- package/dist/lib/options/row-icons.js +15 -0
- package/dist/lib/options/rows/MarkerIcon.svelte +5 -5
- package/dist/lib/options/rows/MarkerIcon.svelte.d.ts +1 -2
- package/dist/lib/search/Search.svelte +20 -33
- package/dist/lib/search/Search.svelte.d.ts +5 -1
- package/dist/lib/search/search-pin.svelte.d.ts +11 -0
- package/dist/lib/search/search-pin.svelte.js +28 -0
- package/dist/lib/search/service.d.ts +7 -2
- package/dist/lib/search/service.js +17 -10
- package/dist/lib/stores.svelte.d.ts +8 -0
- package/dist/lib/stores.svelte.js +9 -0
- package/dist/lib/wind/wind-plugin.d.ts +11 -0
- package/dist/lib/wind/wind-plugin.js +25 -0
- package/package.json +12 -10
- package/src/lib/MonitorDetailPanel.svelte +23 -20
- package/src/lib/MonitorMapLayout.svelte +147 -77
- package/src/lib/components/DataBox.svelte +4 -1
- package/src/lib/config.svelte.ts +16 -0
- package/src/lib/core.ts +2 -2
- package/src/lib/data-chart/DataChart.svelte +40 -25
- package/src/lib/data-chart/DateRange.ts +58 -15
- package/src/lib/data-chart/chart-utils.ts +6 -7
- package/src/lib/data-chart/level-colors.ts +8 -9
- package/src/lib/data-chart/pacific-time.ts +31 -0
- package/src/lib/data-chart/tooltip.ts +2 -2
- package/{dist/lib/ev-stations/components/EvStationTooltip.svelte → src/lib/ev-stations/EvPopup.svelte} +6 -5
- package/src/lib/ev-stations/ev-plugin.svelte.ts +86 -0
- package/src/lib/ev-stations/ev-station-icons.ts +1 -17
- package/src/lib/ev-stations/ev-stations.ts +72 -0
- package/src/lib/ev-stations/ev-store.svelte.ts +117 -0
- package/src/lib/ev-stations/station-popup.svelte.ts +64 -0
- package/src/lib/ev-stations/types.ts +0 -34
- package/src/lib/ev-stations/zip-codes.ts +29 -16
- package/src/lib/index.ts +8 -99
- package/src/lib/legend/Legend.svelte +18 -19
- package/src/lib/levels.ts +24 -0
- package/src/lib/map/MapShell.svelte +17 -24
- package/src/lib/map/basemaps.ts +76 -0
- package/src/lib/map/live-map.svelte.ts +24 -0
- package/src/lib/map/sync-plugins.svelte.ts +69 -0
- package/src/lib/monitors/components/MonitorSubscriptionManager.svelte +66 -61
- package/src/lib/monitors/filtered-source.svelte.ts +38 -0
- package/src/lib/monitors/monitors.svelte.ts +58 -261
- package/src/lib/monitors/retry-load.ts +14 -0
- package/src/lib/monitors/types.ts +1 -47
- package/src/lib/options/map-option-defaults.ts +30 -53
- package/src/lib/options/map-options.svelte.ts +30 -0
- package/src/lib/options/menus/LayersMenu.svelte +8 -20
- package/src/lib/options/menus/MonitorsMenu.svelte +34 -18
- package/src/lib/options/menus/OverlaysMenu.svelte +2 -2
- package/src/lib/options/menus/PollutantMenu.svelte +4 -9
- package/src/lib/options/menus/SettingsMenu.svelte +32 -25
- package/src/lib/options/plugin-order.ts +38 -0
- package/src/lib/options/pollutant-param.ts +14 -9
- package/src/lib/options/row-icons.ts +17 -0
- package/src/lib/options/rows/MarkerIcon.svelte +5 -5
- package/src/lib/search/Search.svelte +20 -33
- package/src/lib/search/search-pin.svelte.ts +35 -0
- package/src/lib/search/service.ts +34 -15
- package/src/lib/stores.svelte.ts +15 -0
- package/src/lib/wind/wind-plugin.ts +33 -0
- package/dist/lib/collocation-sites/CollocationTooltip.svelte +0 -98
- package/dist/lib/collocation-sites/CollocationTooltip.svelte.d.ts +0 -7
- package/dist/lib/collocation-sites/collocations-icon-manager.svelte.d.ts +0 -7
- package/dist/lib/collocation-sites/collocations-icon-manager.svelte.js +0 -18
- package/dist/lib/collocation-sites/collocations-map-integration.svelte.d.ts +0 -21
- package/dist/lib/collocation-sites/collocations-map-integration.svelte.js +0 -113
- package/dist/lib/collocation-sites/collocations.svelte.d.ts +0 -10
- package/dist/lib/collocation-sites/collocations.svelte.js +0 -21
- package/dist/lib/collocation-sites/types.d.ts +0 -8
- package/dist/lib/collocation-sites/types.js +0 -1
- package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte +0 -16
- package/dist/lib/ev-stations/components/EvStationClusterTooltip.svelte.d.ts +0 -7
- package/dist/lib/ev-stations/components/EvStationTooltip.svelte.d.ts +0 -7
- package/dist/lib/ev-stations/ev-stations-cluster-renderer.d.ts +0 -19
- package/dist/lib/ev-stations/ev-stations-cluster-renderer.js +0 -131
- package/dist/lib/ev-stations/ev-stations-map-integration.svelte.d.ts +0 -31
- package/dist/lib/ev-stations/ev-stations-map-integration.svelte.js +0 -226
- package/dist/lib/ev-stations/ev-stations.svelte.d.ts +0 -10
- package/dist/lib/ev-stations/ev-stations.svelte.js +0 -57
- package/dist/lib/hms/hms-fire-icon-manager.d.ts +0 -13
- package/dist/lib/hms/hms-fire-icon-manager.js +0 -39
- package/dist/lib/hms/hms-fire-map-integration.svelte.d.ts +0 -23
- package/dist/lib/hms/hms-fire-map-integration.svelte.js +0 -94
- package/dist/lib/hms/hms-smoke-map-integration.svelte.d.ts +0 -39
- package/dist/lib/hms/hms-smoke-map-integration.svelte.js +0 -87
- package/dist/lib/hms/hms.svelte.d.ts +0 -20
- package/dist/lib/hms/hms.svelte.js +0 -237
- package/dist/lib/legend/LegendBar.svelte +0 -45
- package/dist/lib/legend/LegendBar.svelte.d.ts +0 -7
- package/dist/lib/legend/legend-data.d.ts +0 -40
- package/dist/lib/legend/legend-data.js +0 -65
- package/dist/lib/map/Map.svelte +0 -13
- package/dist/lib/map/Map.svelte.d.ts +0 -8
- package/dist/lib/map/basemap.d.ts +0 -14
- package/dist/lib/map/basemap.js +0 -10
- package/dist/lib/map/icons.d.ts +0 -7
- package/dist/lib/map/icons.js +0 -33
- package/dist/lib/map/integrations/base-layer-seperator.d.ts +0 -9
- package/dist/lib/map/integrations/base-layer-seperator.js +0 -11
- package/dist/lib/map/integrations/click-manager.d.ts +0 -14
- package/dist/lib/map/integrations/click-manager.js +0 -52
- package/dist/lib/map/integrations/integrations-manager.d.ts +0 -8
- package/dist/lib/map/integrations/integrations-manager.js +0 -20
- package/dist/lib/map/integrations/map-display-option.svelte.d.ts +0 -7
- package/dist/lib/map/integrations/map-display-option.svelte.js +0 -10
- package/dist/lib/map/integrations/map-geojson-integration.svelte.d.ts +0 -32
- package/dist/lib/map/integrations/map-geojson-integration.svelte.js +0 -60
- package/dist/lib/map/integrations/map-icon-manager.d.ts +0 -15
- package/dist/lib/map/integrations/map-icon-manager.js +0 -52
- package/dist/lib/map/integrations/map-integration.svelte.d.ts +0 -6
- package/dist/lib/map/integrations/map-integration.svelte.js +0 -2
- package/dist/lib/map/integrations/map-layer-integration.svelte.d.ts +0 -11
- package/dist/lib/map/integrations/map-layer-integration.svelte.js +0 -40
- package/dist/lib/map/integrations/tooltip.svelte.d.ts +0 -36
- package/dist/lib/map/integrations/tooltip.svelte.js +0 -131
- package/dist/lib/map/integrations/types.d.ts +0 -14
- package/dist/lib/map/integrations/types.js +0 -1
- package/dist/lib/map/map-manager.svelte.d.ts +0 -20
- package/dist/lib/map/map-manager.svelte.js +0 -63
- package/dist/lib/map/map-style-state.svelte.d.ts +0 -23
- package/dist/lib/map/map-style-state.svelte.js +0 -86
- package/dist/lib/map/utils.d.ts +0 -7
- package/dist/lib/map/utils.js +0 -36
- package/dist/lib/monitors/components/MonitorClusterTooltip.svelte +0 -112
- package/dist/lib/monitors/components/MonitorClusterTooltip.svelte.d.ts +0 -7
- package/dist/lib/monitors/components/MonitorTooltip.svelte +0 -61
- package/dist/lib/monitors/components/MonitorTooltip.svelte.d.ts +0 -7
- package/dist/lib/monitors/monitor-utils.d.ts +0 -4
- package/dist/lib/monitors/monitor-utils.js +0 -41
- package/dist/lib/monitors/monitors-cluster-renderer.d.ts +0 -33
- package/dist/lib/monitors/monitors-cluster-renderer.js +0 -221
- package/dist/lib/monitors/monitors-icon-manager.svelte.d.ts +0 -15
- package/dist/lib/monitors/monitors-icon-manager.svelte.js +0 -78
- package/dist/lib/monitors/monitors-map-integration.svelte.d.ts +0 -43
- package/dist/lib/monitors/monitors-map-integration.svelte.js +0 -301
- package/dist/lib/options/reset-map-options.d.ts +0 -2
- package/dist/lib/options/reset-map-options.js +0 -24
- package/dist/lib/reactivity.svelte.d.ts +0 -0
- package/dist/lib/reactivity.svelte.js +0 -83
- package/dist/lib/wind/wind.svelte.d.ts +0 -10
- package/dist/lib/wind/wind.svelte.js +0 -13
- package/src/lib/collocation-sites/CollocationTooltip.svelte +0 -98
- package/src/lib/collocation-sites/collocations-icon-manager.svelte.ts +0 -21
- package/src/lib/collocation-sites/collocations-map-integration.svelte.ts +0 -136
- package/src/lib/collocation-sites/collocations.svelte.ts +0 -27
- package/src/lib/collocation-sites/types.ts +0 -10
- package/src/lib/ev-stations/components/EvStationClusterTooltip.svelte +0 -16
- package/src/lib/ev-stations/ev-stations-cluster-renderer.ts +0 -162
- package/src/lib/ev-stations/ev-stations-map-integration.svelte.ts +0 -248
- package/src/lib/ev-stations/ev-stations.svelte.ts +0 -84
- package/src/lib/hms/hms-fire-icon-manager.ts +0 -48
- package/src/lib/hms/hms-fire-map-integration.svelte.ts +0 -109
- package/src/lib/hms/hms-smoke-map-integration.svelte.ts +0 -105
- package/src/lib/hms/hms.svelte.ts +0 -270
- package/src/lib/legend/LegendBar.svelte +0 -45
- package/src/lib/legend/legend-data.ts +0 -101
- package/src/lib/map/Map.svelte +0 -13
- package/src/lib/map/basemap.ts +0 -24
- package/src/lib/map/icons.ts +0 -42
- package/src/lib/map/integrations/base-layer-seperator.ts +0 -17
- package/src/lib/map/integrations/click-manager.ts +0 -64
- package/src/lib/map/integrations/integrations-manager.ts +0 -25
- package/src/lib/map/integrations/map-display-option.svelte.ts +0 -13
- package/src/lib/map/integrations/map-geojson-integration.svelte.ts +0 -77
- package/src/lib/map/integrations/map-icon-manager.ts +0 -67
- package/src/lib/map/integrations/map-integration.svelte.ts +0 -8
- package/src/lib/map/integrations/map-layer-integration.svelte.ts +0 -49
- package/src/lib/map/integrations/tooltip.svelte.ts +0 -153
- package/src/lib/map/integrations/types.ts +0 -24
- package/src/lib/map/map-manager.svelte.ts +0 -83
- package/src/lib/map/map-style-state.svelte.ts +0 -94
- package/src/lib/map/utils.ts +0 -53
- package/src/lib/monitors/components/MonitorClusterTooltip.svelte +0 -112
- package/src/lib/monitors/components/MonitorTooltip.svelte +0 -61
- package/src/lib/monitors/monitor-utils.ts +0 -57
- package/src/lib/monitors/monitors-cluster-renderer.ts +0 -285
- package/src/lib/monitors/monitors-icon-manager.svelte.ts +0 -98
- package/src/lib/monitors/monitors-map-integration.svelte.ts +0 -318
- package/src/lib/options/reset-map-options.ts +0 -28
- package/src/lib/reactivity.svelte.ts +0 -82
- package/src/lib/wind/wind.svelte.ts +0 -20
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { format, formatDistanceToNow } from "date-fns";
|
|
3
|
-
import DataBox from "../components/DataBox.svelte";
|
|
4
|
-
import type { CollocationSiteMapFeature } from "./types";
|
|
5
|
-
import { monitorsManager } from "../monitors/monitors.svelte";
|
|
6
|
-
import { getCurrentLevel } from "../monitors/monitor-utils";
|
|
7
|
-
import type { MonitorLatest, SJVAirEntryLevel } from "@sjvair/sdk";
|
|
8
|
-
|
|
9
|
-
interface CollocationTooltipProps {
|
|
10
|
-
feature: CollocationSiteMapFeature;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const { feature }: CollocationTooltipProps = $props();
|
|
14
|
-
|
|
15
|
-
const data = $derived.by(() => {
|
|
16
|
-
const collocated = monitorsManager.latest?.get(feature.properties.colocated_id);
|
|
17
|
-
const reference = monitorsManager.latest?.get(feature.properties.reference_id);
|
|
18
|
-
|
|
19
|
-
return {
|
|
20
|
-
collocated: getMonitorData(collocated),
|
|
21
|
-
reference: getMonitorData(reference)
|
|
22
|
-
};
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
function getMonitorData(monitor: MonitorLatest | undefined) {
|
|
26
|
-
if (!monitor || !("value" in monitor.latest) || !monitorsManager.meta) return;
|
|
27
|
-
|
|
28
|
-
const entryType = monitorsManager.meta.entryType(monitor.latest.entry_type);
|
|
29
|
-
const level: SJVAirEntryLevel | undefined = getCurrentLevel(
|
|
30
|
-
monitor.latest.value,
|
|
31
|
-
entryType.asIter.levels!
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
const updateDuration = monitorsManager.meta.monitorType(monitor.type).expected_interval;
|
|
35
|
-
|
|
36
|
-
return {
|
|
37
|
-
color: level?.color ?? "",
|
|
38
|
-
header: entryType.label,
|
|
39
|
-
date: {
|
|
40
|
-
formatted: format(monitor.latest.timestamp, "h:mm:aaa EEEE MMM dd, yyyy"),
|
|
41
|
-
diference: formatDistanceToNow(monitor.latest.timestamp, {
|
|
42
|
-
addSuffix: true,
|
|
43
|
-
includeSeconds: true
|
|
44
|
-
})
|
|
45
|
-
},
|
|
46
|
-
monitorName: monitor.name,
|
|
47
|
-
subheading: `(${updateDuration} avg)`,
|
|
48
|
-
value: Math.round(parseInt(monitor.latest.value, 10)).toString()
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
</script>
|
|
52
|
-
|
|
53
|
-
{#if data}
|
|
54
|
-
<div class="flex flex-col gap-4">
|
|
55
|
-
{#if data.reference}
|
|
56
|
-
<div class="flex gap-2">
|
|
57
|
-
<DataBox
|
|
58
|
-
color={data.reference.color}
|
|
59
|
-
header={data.reference.header}
|
|
60
|
-
subheading={data.reference.subheading}
|
|
61
|
-
value={data.reference.value}
|
|
62
|
-
/>
|
|
63
|
-
<div class="flex flex-col">
|
|
64
|
-
<p class="leading-none">{data.reference.date.formatted}</p>
|
|
65
|
-
<h1 class="text-lg font-bold underline">{data.reference.monitorName}</h1>
|
|
66
|
-
<p class="leading-none">Reference monitor</p>
|
|
67
|
-
<div class="mt-auto">
|
|
68
|
-
<p class="text-base leading-none">Last updated</p>
|
|
69
|
-
<p class="text-base leading-none">{data.reference.date.diference}</p>
|
|
70
|
-
</div>
|
|
71
|
-
</div>
|
|
72
|
-
</div>
|
|
73
|
-
{:else}
|
|
74
|
-
<h1>Reference monitor disabled</h1>
|
|
75
|
-
{/if}
|
|
76
|
-
{#if data.collocated}
|
|
77
|
-
<div class="flex flex-row-reverse gap-2">
|
|
78
|
-
<DataBox
|
|
79
|
-
color={data.collocated.color}
|
|
80
|
-
header={data.collocated.header}
|
|
81
|
-
subheading={data.collocated.subheading}
|
|
82
|
-
value={data.collocated.value}
|
|
83
|
-
/>
|
|
84
|
-
<div class="flex flex-col">
|
|
85
|
-
<p class="leading-none">{data.collocated.date.formatted}</p>
|
|
86
|
-
<h1 class="text-lg font-bold underline">{data.collocated.monitorName}</h1>
|
|
87
|
-
<p class="leading-none">Collocated monitor</p>
|
|
88
|
-
<div class="mt-auto">
|
|
89
|
-
<p class="text-base leading-none">Last updated</p>
|
|
90
|
-
<p class="text-base leading-none">{data.collocated.date.diference}</p>
|
|
91
|
-
</div>
|
|
92
|
-
</div>
|
|
93
|
-
</div>
|
|
94
|
-
{:else}
|
|
95
|
-
<h1>Collocated monitor disabled</h1>
|
|
96
|
-
{/if}
|
|
97
|
-
</div>
|
|
98
|
-
{/if}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { CollocationSiteMapFeature } from "./types";
|
|
2
|
-
interface CollocationTooltipProps {
|
|
3
|
-
feature: CollocationSiteMapFeature;
|
|
4
|
-
}
|
|
5
|
-
declare const CollocationTooltip: import("svelte").Component<CollocationTooltipProps, {}, "">;
|
|
6
|
-
type CollocationTooltip = ReturnType<typeof CollocationTooltip>;
|
|
7
|
-
export default CollocationTooltip;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { MonitorShapeIconManager } from "../monitors/monitors-icon-manager.svelte";
|
|
2
|
-
export declare function getCollocationIconId(baseIconId: string): string;
|
|
3
|
-
export declare class CollocationIconManager extends MonitorShapeIconManager {
|
|
4
|
-
protected get idPrefix(): string;
|
|
5
|
-
protected get iconSize(): number;
|
|
6
|
-
protected transformSvg(svg: string): string;
|
|
7
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { CROSSHAIR_ICON_SIZE, withCrosshair } from "../map/icons";
|
|
2
|
-
import { MonitorShapeIconManager } from "../monitors/monitors-icon-manager.svelte";
|
|
3
|
-
const COLLOCATION_ICON_PREFIX = "collocation";
|
|
4
|
-
const CROSSHAIR_COLOR = "#4A5FC6";
|
|
5
|
-
export function getCollocationIconId(baseIconId) {
|
|
6
|
-
return `${COLLOCATION_ICON_PREFIX}-${baseIconId}`;
|
|
7
|
-
}
|
|
8
|
-
export class CollocationIconManager extends MonitorShapeIconManager {
|
|
9
|
-
get idPrefix() {
|
|
10
|
-
return COLLOCATION_ICON_PREFIX;
|
|
11
|
-
}
|
|
12
|
-
get iconSize() {
|
|
13
|
-
return CROSSHAIR_ICON_SIZE;
|
|
14
|
-
}
|
|
15
|
-
transformSvg(svg) {
|
|
16
|
-
return withCrosshair(svg, CROSSHAIR_COLOR);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type Map as MaptilerMap } from "@maptiler/sdk";
|
|
2
|
-
import { MapIconLayerIntegration } from "../map/integrations/map-geojson-integration.svelte";
|
|
3
|
-
import { CollocationIconManager } from "./collocations-icon-manager.svelte";
|
|
4
|
-
import { TooltipManager } from "../map/integrations/tooltip.svelte";
|
|
5
|
-
import type { CollocationSiteMapFeature, CollocationSiteMarkerProperties } from "./types";
|
|
6
|
-
declare class CollocationSitesMapIntegration extends MapIconLayerIntegration<CollocationSiteMarkerProperties> {
|
|
7
|
-
referenceId: string;
|
|
8
|
-
enabled: boolean;
|
|
9
|
-
icons: CollocationIconManager;
|
|
10
|
-
tooltipManager: TooltipManager;
|
|
11
|
-
/** The option only applies while monitors are shown with PM2.5. */
|
|
12
|
-
get available(): boolean;
|
|
13
|
-
features: Array<CollocationSiteMapFeature>;
|
|
14
|
-
mapLayer: Parameters<MaptilerMap["addLayer"]>[0];
|
|
15
|
-
get mapSource(): Parameters<MaptilerMap["addSource"]>[1];
|
|
16
|
-
constructor();
|
|
17
|
-
apply(): void;
|
|
18
|
-
remove(): void;
|
|
19
|
-
}
|
|
20
|
-
export declare const collocationSitesMapIntegration: CollocationSitesMapIntegration;
|
|
21
|
-
export type { CollocationSitesMapIntegration as MonitorsMapIntegration };
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { mapManager } from "../map/map-manager.svelte.js";
|
|
2
|
-
import { MapIconLayerIntegration } from "../map/integrations/map-geojson-integration.svelte";
|
|
3
|
-
import { CollocationIconManager, getCollocationIconId } from "./collocations-icon-manager.svelte";
|
|
4
|
-
import { TooltipManager } from "../map/integrations/tooltip.svelte";
|
|
5
|
-
import { collocationSitesManager } from "./collocations.svelte";
|
|
6
|
-
import { monitorsManager } from "../monitors/monitors.svelte";
|
|
7
|
-
import { monitorsMapIntegration } from "../monitors/monitors-map-integration.svelte";
|
|
8
|
-
import { untrack } from "svelte";
|
|
9
|
-
import CollocationTooltip from "./CollocationTooltip.svelte";
|
|
10
|
-
import { mountPopup } from "../map/utils";
|
|
11
|
-
function collocationTooltip(evt) {
|
|
12
|
-
const feature = evt.features?.[0];
|
|
13
|
-
if (!feature)
|
|
14
|
-
return;
|
|
15
|
-
return mountPopup(CollocationTooltip, { feature }, evt.lngLat);
|
|
16
|
-
}
|
|
17
|
-
class CollocationSitesMapIntegration extends MapIconLayerIntegration {
|
|
18
|
-
referenceId = "collocation-sites";
|
|
19
|
-
enabled = $state(false);
|
|
20
|
-
icons = new CollocationIconManager(monitorsManager);
|
|
21
|
-
tooltipManager = new TooltipManager();
|
|
22
|
-
/** The option only applies while monitors are shown with PM2.5. */
|
|
23
|
-
get available() {
|
|
24
|
-
return monitorsMapIntegration.enabled && monitorsManager.pollutant === "pm25";
|
|
25
|
-
}
|
|
26
|
-
features = $derived.by(() => {
|
|
27
|
-
if (!monitorsManager.meta ||
|
|
28
|
-
!monitorsManager.pollutant ||
|
|
29
|
-
!collocationSitesManager.collocationSites ||
|
|
30
|
-
monitorsMapIntegration.features.length === 0) {
|
|
31
|
-
return [];
|
|
32
|
-
}
|
|
33
|
-
return collocationSitesManager.collocationSites
|
|
34
|
-
.map((c) => {
|
|
35
|
-
const referenceMonitorFeature = monitorsMapIntegration.features.find((m) => m.properties.id === c.reference_id);
|
|
36
|
-
if (!referenceMonitorFeature)
|
|
37
|
-
return;
|
|
38
|
-
const feature = {
|
|
39
|
-
type: "Feature",
|
|
40
|
-
properties: {
|
|
41
|
-
icon: getCollocationIconId(referenceMonitorFeature.properties.icon),
|
|
42
|
-
colocated_id: c.colocated_id,
|
|
43
|
-
reference_id: c.reference_id,
|
|
44
|
-
name: c.name
|
|
45
|
-
},
|
|
46
|
-
geometry: c.position
|
|
47
|
-
};
|
|
48
|
-
return feature;
|
|
49
|
-
})
|
|
50
|
-
.filter((f) => f !== undefined);
|
|
51
|
-
});
|
|
52
|
-
mapLayer = {
|
|
53
|
-
id: this.referenceId,
|
|
54
|
-
type: "symbol",
|
|
55
|
-
source: this.referenceId,
|
|
56
|
-
layout: {
|
|
57
|
-
"icon-allow-overlap": true,
|
|
58
|
-
"icon-ignore-placement": true,
|
|
59
|
-
"icon-image": ["get", "icon"],
|
|
60
|
-
"icon-size": 1
|
|
61
|
-
},
|
|
62
|
-
paint: {}
|
|
63
|
-
};
|
|
64
|
-
get mapSource() {
|
|
65
|
-
return {
|
|
66
|
-
type: "geojson",
|
|
67
|
-
promoteId: "id",
|
|
68
|
-
data: {
|
|
69
|
-
type: "FeatureCollection",
|
|
70
|
-
features: this.features
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
constructor() {
|
|
75
|
-
super();
|
|
76
|
-
$effect.root(() => {
|
|
77
|
-
$effect(() => {
|
|
78
|
-
const features = this.features;
|
|
79
|
-
if (!mapManager.map || !this.enabled)
|
|
80
|
-
return;
|
|
81
|
-
mapManager.setDataSource(this.referenceId, features);
|
|
82
|
-
});
|
|
83
|
-
// Remove the layer while the option is unavailable (Ozone or Pollutant = None); restore
|
|
84
|
-
// it when it becomes available again if the user still has it checked.
|
|
85
|
-
$effect(() => {
|
|
86
|
-
if (!this.available) {
|
|
87
|
-
untrack(() => this.remove());
|
|
88
|
-
}
|
|
89
|
-
else if (untrack(() => this.enabled)) {
|
|
90
|
-
untrack(() => this.apply());
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
apply() {
|
|
96
|
-
if (!this.available) {
|
|
97
|
-
this.remove();
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
if (!mapManager.map)
|
|
101
|
-
return;
|
|
102
|
-
if (!this.tooltipManager.has(this.referenceId)) {
|
|
103
|
-
this.tooltipManager.register(this.referenceId, collocationTooltip, Number.MAX_SAFE_INTEGER);
|
|
104
|
-
}
|
|
105
|
-
this.tooltipManager.enable();
|
|
106
|
-
super.apply();
|
|
107
|
-
}
|
|
108
|
-
remove() {
|
|
109
|
-
this.tooltipManager.disable();
|
|
110
|
-
super.remove();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
export const collocationSitesMapIntegration = new CollocationSitesMapIntegration();
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { type CollocationSite } from "@sjvair/sdk";
|
|
2
|
-
import type { SignalOptions } from "../abort";
|
|
3
|
-
declare class CollocationSitesManager {
|
|
4
|
-
initialized: boolean;
|
|
5
|
-
collocationSites: Array<CollocationSite> | null;
|
|
6
|
-
init({ signal }?: SignalOptions): Promise<void>;
|
|
7
|
-
update({ signal }?: SignalOptions): Promise<void>;
|
|
8
|
-
}
|
|
9
|
-
export declare const collocationSitesManager: CollocationSitesManager;
|
|
10
|
-
export type { CollocationSitesManager };
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { getCollocationSites } from "@sjvair/sdk";
|
|
2
|
-
class CollocationSitesManager {
|
|
3
|
-
initialized = $state(false);
|
|
4
|
-
collocationSites = $state(null);
|
|
5
|
-
async init({ signal } = {}) {
|
|
6
|
-
if (this.initialized)
|
|
7
|
-
return;
|
|
8
|
-
if (signal?.aborted)
|
|
9
|
-
throw signal.reason;
|
|
10
|
-
this.collocationSites = await getCollocationSites({ signal });
|
|
11
|
-
this.initialized = true;
|
|
12
|
-
}
|
|
13
|
-
async update({ signal } = {}) {
|
|
14
|
-
if (!this.initialized)
|
|
15
|
-
return;
|
|
16
|
-
if (signal?.aborted)
|
|
17
|
-
throw signal.reason;
|
|
18
|
-
this.collocationSites = await getCollocationSites({ signal });
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export const collocationSitesManager = new CollocationSitesManager();
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Feature, Geometry } from "geojson";
|
|
2
|
-
export type CollocationSiteMapFeature = Feature<Geometry, CollocationSiteMarkerProperties>;
|
|
3
|
-
export interface CollocationSiteMarkerProperties {
|
|
4
|
-
icon: string;
|
|
5
|
-
colocated_id: string;
|
|
6
|
-
reference_id: string;
|
|
7
|
-
name: string;
|
|
8
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { EvStationClusterMapFeature } from "../types";
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
feature: EvStationClusterMapFeature;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const { feature }: Props = $props();
|
|
9
|
-
|
|
10
|
-
const levelLabel = $derived(feature.source.includes("lvl2") ? "Level 2" : "Level 3");
|
|
11
|
-
</script>
|
|
12
|
-
|
|
13
|
-
<div class="flex flex-col gap-1 p-1">
|
|
14
|
-
<p class="font-semibold">{levelLabel} Chargers</p>
|
|
15
|
-
<p class="text-sm">{feature.properties.point_count} stations</p>
|
|
16
|
-
</div>
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { EvStationClusterMapFeature } from "../types";
|
|
2
|
-
interface Props {
|
|
3
|
-
feature: EvStationClusterMapFeature;
|
|
4
|
-
}
|
|
5
|
-
declare const EvStationClusterTooltip: import("svelte").Component<Props, {}, "">;
|
|
6
|
-
type EvStationClusterTooltip = ReturnType<typeof EvStationClusterTooltip>;
|
|
7
|
-
export default EvStationClusterTooltip;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { EvStationMapFeature } from "../types";
|
|
2
|
-
interface Props {
|
|
3
|
-
feature: EvStationMapFeature;
|
|
4
|
-
}
|
|
5
|
-
declare const EvStationTooltip: import("svelte").Component<Props, {}, "">;
|
|
6
|
-
type EvStationTooltip = ReturnType<typeof EvStationTooltip>;
|
|
7
|
-
export default EvStationTooltip;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { type ClickHandler } from "../map/integrations/click-manager";
|
|
2
|
-
import { TooltipManager } from "../map/integrations/tooltip.svelte";
|
|
3
|
-
import type { EvStationMapFeature } from "./types";
|
|
4
|
-
export interface EvStationsClusterContext {
|
|
5
|
-
referenceId: string;
|
|
6
|
-
featuresByLevel: Record<string, EvStationMapFeature[]>;
|
|
7
|
-
beforeLayer?: string;
|
|
8
|
-
tooltipManager: TooltipManager;
|
|
9
|
-
}
|
|
10
|
-
export declare class EvStationsClusterRenderer {
|
|
11
|
-
private ctx;
|
|
12
|
-
private _levels;
|
|
13
|
-
constructor(ctx: EvStationsClusterContext);
|
|
14
|
-
apply(stationClickHandler: ClickHandler): void;
|
|
15
|
-
remove(): void;
|
|
16
|
-
get unclusteredLayerIds(): string[];
|
|
17
|
-
syncFeatures(): void;
|
|
18
|
-
private makeClusterClickHandler;
|
|
19
|
-
}
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { mapManager } from "../map/map-manager.svelte.js";
|
|
2
|
-
import { mountPopup } from "../map/utils";
|
|
3
|
-
import { clickManager } from "../map/integrations/click-manager";
|
|
4
|
-
import { EV_STATION_LEVELS } from "./ev-station-icons";
|
|
5
|
-
import EvStationClusterTooltip from "./components/EvStationClusterTooltip.svelte";
|
|
6
|
-
function clusterTooltip(evt) {
|
|
7
|
-
const feature = evt.features?.[0];
|
|
8
|
-
if (!feature)
|
|
9
|
-
return;
|
|
10
|
-
return mountPopup(EvStationClusterTooltip, { feature }, evt.lngLat);
|
|
11
|
-
}
|
|
12
|
-
export class EvStationsClusterRenderer {
|
|
13
|
-
ctx;
|
|
14
|
-
_levels = [];
|
|
15
|
-
constructor(ctx) {
|
|
16
|
-
this.ctx = ctx;
|
|
17
|
-
}
|
|
18
|
-
apply(stationClickHandler) {
|
|
19
|
-
if (!mapManager.map)
|
|
20
|
-
return;
|
|
21
|
-
for (const level of Object.keys(EV_STATION_LEVELS)) {
|
|
22
|
-
const sourceId = `${this.ctx.referenceId}-${level}`;
|
|
23
|
-
const features = this.ctx.featuresByLevel[level] ?? [];
|
|
24
|
-
const { bg } = EV_STATION_LEVELS[level];
|
|
25
|
-
const clusterBg = bg.replace("rgb(", "rgba(").replace(")", ", 0.6)");
|
|
26
|
-
mapManager.map.addSource(sourceId, {
|
|
27
|
-
type: "geojson",
|
|
28
|
-
promoteId: "id",
|
|
29
|
-
data: { type: "FeatureCollection", features },
|
|
30
|
-
cluster: true,
|
|
31
|
-
clusterRadius: 40,
|
|
32
|
-
clusterMaxZoom: 9
|
|
33
|
-
});
|
|
34
|
-
mapManager.map.addLayer({
|
|
35
|
-
id: `${sourceId}-cluster-circle`,
|
|
36
|
-
type: "circle",
|
|
37
|
-
source: sourceId,
|
|
38
|
-
filter: ["has", "point_count"],
|
|
39
|
-
paint: {
|
|
40
|
-
"circle-color": clusterBg,
|
|
41
|
-
"circle-radius": ["step", ["get", "point_count"], 15, 10, 20, 25, 25]
|
|
42
|
-
}
|
|
43
|
-
}, this.ctx.beforeLayer);
|
|
44
|
-
mapManager.map.addLayer({
|
|
45
|
-
id: `${sourceId}-cluster-label`,
|
|
46
|
-
type: "symbol",
|
|
47
|
-
source: sourceId,
|
|
48
|
-
filter: ["has", "point_count"],
|
|
49
|
-
layout: {
|
|
50
|
-
"text-field": ["get", "point_count_abbreviated"],
|
|
51
|
-
"text-size": 12,
|
|
52
|
-
"text-allow-overlap": true,
|
|
53
|
-
"text-ignore-placement": true
|
|
54
|
-
},
|
|
55
|
-
paint: { "text-color": "#ffffff" }
|
|
56
|
-
}, this.ctx.beforeLayer);
|
|
57
|
-
mapManager.map.addLayer({
|
|
58
|
-
id: `${sourceId}-unclustered`,
|
|
59
|
-
type: "symbol",
|
|
60
|
-
source: sourceId,
|
|
61
|
-
filter: ["!", ["has", "point_count"]],
|
|
62
|
-
layout: {
|
|
63
|
-
"icon-image": `ev-station-${level}`,
|
|
64
|
-
"icon-allow-overlap": true,
|
|
65
|
-
"icon-ignore-placement": true,
|
|
66
|
-
"icon-size": 1
|
|
67
|
-
},
|
|
68
|
-
paint: {}
|
|
69
|
-
}, this.ctx.beforeLayer);
|
|
70
|
-
const circleLayerId = `${sourceId}-cluster-circle`;
|
|
71
|
-
const unclusteredLayerId = `${sourceId}-unclustered`;
|
|
72
|
-
if (!this.ctx.tooltipManager.has(circleLayerId)) {
|
|
73
|
-
this.ctx.tooltipManager.register(circleLayerId, clusterTooltip);
|
|
74
|
-
}
|
|
75
|
-
clickManager.register([circleLayerId], this.makeClusterClickHandler(sourceId));
|
|
76
|
-
clickManager.register([unclusteredLayerId], stationClickHandler);
|
|
77
|
-
this._levels.push(level);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
remove() {
|
|
81
|
-
if (!mapManager.map)
|
|
82
|
-
return;
|
|
83
|
-
for (const level of this._levels) {
|
|
84
|
-
const sourceId = `${this.ctx.referenceId}-${level}`;
|
|
85
|
-
const layerIds = [
|
|
86
|
-
`${sourceId}-cluster-circle`,
|
|
87
|
-
`${sourceId}-cluster-label`,
|
|
88
|
-
`${sourceId}-unclustered`
|
|
89
|
-
];
|
|
90
|
-
for (const layerId of layerIds) {
|
|
91
|
-
clickManager.unregister([layerId]);
|
|
92
|
-
if (mapManager.map.getLayer(layerId)) {
|
|
93
|
-
mapManager.map.removeLayer(layerId);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (mapManager.map.getSource(sourceId)) {
|
|
97
|
-
mapManager.map.removeSource(sourceId);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
this._levels = [];
|
|
101
|
-
}
|
|
102
|
-
get unclusteredLayerIds() {
|
|
103
|
-
return this._levels.map((level) => `${this.ctx.referenceId}-${level}-unclustered`);
|
|
104
|
-
}
|
|
105
|
-
syncFeatures() {
|
|
106
|
-
if (!mapManager.map)
|
|
107
|
-
return;
|
|
108
|
-
for (const level of this._levels) {
|
|
109
|
-
const sourceId = `${this.ctx.referenceId}-${level}`;
|
|
110
|
-
mapManager.setDataSource(sourceId, this.ctx.featuresByLevel[level] ?? []);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
makeClusterClickHandler(sourceId) {
|
|
114
|
-
return async (features) => {
|
|
115
|
-
try {
|
|
116
|
-
const feature = features[0];
|
|
117
|
-
if (!feature?.properties?.cluster_id)
|
|
118
|
-
return;
|
|
119
|
-
const source = mapManager.map?.getSource(sourceId);
|
|
120
|
-
if (!source)
|
|
121
|
-
return;
|
|
122
|
-
const zoom = await source.getClusterExpansionZoom(feature.properties.cluster_id);
|
|
123
|
-
const coords = feature.geometry.coordinates;
|
|
124
|
-
mapManager.map?.easeTo({ center: coords, zoom });
|
|
125
|
-
}
|
|
126
|
-
catch (err) {
|
|
127
|
-
console.error("EvStations: cluster expansion zoom failed", err);
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { FilterSpecification, Map as MaptilerMap } from "@maptiler/sdk";
|
|
2
|
-
import { MapIconLayerIntegration } from "../map/integrations/map-geojson-integration.svelte";
|
|
3
|
-
import { MapDisplayOption } from "../map/integrations/map-display-option.svelte";
|
|
4
|
-
import { TooltipManager } from "../map/integrations/tooltip.svelte";
|
|
5
|
-
import { EvStationIconManager } from "./ev-station-icons";
|
|
6
|
-
import { type EvStationsClusterContext } from "./ev-stations-cluster-renderer";
|
|
7
|
-
import type { EvStationMapFeature, EvStationMarkerProperties } from "./types";
|
|
8
|
-
declare class EvStationsMapIntegration extends MapIconLayerIntegration<EvStationMarkerProperties> implements EvStationsClusterContext {
|
|
9
|
-
referenceId: string;
|
|
10
|
-
enabled: boolean;
|
|
11
|
-
clustered: boolean;
|
|
12
|
-
icons: EvStationIconManager;
|
|
13
|
-
tooltipManager: TooltipManager;
|
|
14
|
-
private renderer;
|
|
15
|
-
private currentPopup;
|
|
16
|
-
displayOptions: {
|
|
17
|
-
lvl2: MapDisplayOption;
|
|
18
|
-
lvl3: MapDisplayOption;
|
|
19
|
-
};
|
|
20
|
-
features: Array<EvStationMapFeature>;
|
|
21
|
-
featuresByLevel: Record<string, EvStationMapFeature[]>;
|
|
22
|
-
filters: FilterSpecification;
|
|
23
|
-
private handleStationClick;
|
|
24
|
-
get mapLayer(): Parameters<MaptilerMap["addLayer"]>[0];
|
|
25
|
-
get mapSource(): Parameters<MaptilerMap["addSource"]>[1];
|
|
26
|
-
constructor();
|
|
27
|
-
apply(): void;
|
|
28
|
-
remove(): void;
|
|
29
|
-
}
|
|
30
|
-
export declare const evStationsMapIntegration: EvStationsMapIntegration;
|
|
31
|
-
export type { EvStationsMapIntegration };
|