@opengeoweb/soundings 19.3.0 → 19.5.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.
@@ -1,11 +1,19 @@
1
- import type { SoundingsInstances } from './types';
1
+ import type { CollectionDetails, SoundingsInstances } from './types';
2
2
  export declare const soundingsQueryOptions: {
3
- readonly getCollectionInstances: (collectionId: string, url: string) => import("@tanstack/query-core").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<SoundingsInstances, Error, SoundingsInstances, readonly ["edr-soundings-instances", string, string]>, "queryFn"> & {
4
- queryFn?: import("@tanstack/query-core").QueryFunction<SoundingsInstances, readonly ["edr-soundings-instances", string, string], never> | undefined;
3
+ readonly getCollectionInstances: (collectionId: string, url: string) => import("@tanstack/query-core").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<SoundingsInstances, Error, SoundingsInstances, string[]>, "queryFn"> & {
4
+ queryFn?: import("@tanstack/query-core").QueryFunction<SoundingsInstances, string[], never> | undefined;
5
5
  } & {
6
- queryKey: readonly ["edr-soundings-instances", string, string] & {
6
+ queryKey: string[] & {
7
7
  [dataTagSymbol]: SoundingsInstances;
8
8
  [dataTagErrorSymbol]: Error;
9
9
  };
10
10
  };
11
+ readonly getCollectionDetails: (collectionId: string, url: string) => import("@tanstack/query-core").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<CollectionDetails, Error, CollectionDetails, string[]>, "queryFn"> & {
12
+ queryFn?: import("@tanstack/query-core").QueryFunction<CollectionDetails, string[], never> | undefined;
13
+ } & {
14
+ queryKey: string[] & {
15
+ [dataTagSymbol]: CollectionDetails;
16
+ [dataTagErrorSymbol]: Error;
17
+ };
18
+ };
11
19
  };
@@ -15,6 +15,21 @@ interface Props {
15
15
  order?: number;
16
16
  isLoading?: boolean;
17
17
  error?: Error | null;
18
+ locationMenuSize?: {
19
+ width: number;
20
+ height: number;
21
+ };
22
+ locationMenuPosition?: {
23
+ x: number;
24
+ y: number;
25
+ };
26
+ onSizeChange?: (size: {
27
+ width: number;
28
+ height: number;
29
+ }, position: {
30
+ x: number;
31
+ y: number;
32
+ }) => void;
18
33
  }
19
- export declare const LocationsMenu: ({ services, selectedSourcesAmount, selectedLocations, isOpen, onClose, updateSelectedLocation, onMouseDown, order, isLoading, error, }: Props) => React.ReactElement;
34
+ export declare const LocationsMenu: ({ services, selectedSourcesAmount, selectedLocations, isOpen, onClose, updateSelectedLocation, onMouseDown, order, isLoading, error, locationMenuSize, onSizeChange, locationMenuPosition, }: Props) => React.ReactElement;
20
35
  export {};
@@ -11,6 +11,8 @@ interface SoundingsMenuBarProps {
11
11
  selectedSourcesAmount?: number;
12
12
  shouldHideMarkers: boolean;
13
13
  toggleMarkers: (shouldHideMarkers: boolean) => void;
14
+ isLegendVisible: boolean;
15
+ toggleLegend: () => void;
14
16
  }
15
- export declare const SoundingsMenuBar: ({ handleClick, isOpen, selectedSourcesAmount, shouldHideMarkers, toggleMarkers, }: SoundingsMenuBarProps) => React.ReactElement;
17
+ export declare const SoundingsMenuBar: ({ handleClick, isOpen, selectedSourcesAmount, shouldHideMarkers, toggleMarkers, isLegendVisible, toggleLegend, }: SoundingsMenuBarProps) => React.ReactElement;
16
18
  export {};
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { SourceSelection } from '@opengeoweb/shared';
3
3
  import type { SoundingsCollectionsWithInstances } from '../Soundings/types';
4
+ export declare const defaultInstanceId = "latest-0";
4
5
  interface SoundingsSourceMenuProps {
5
6
  soundingsCollections: SoundingsCollectionsWithInstances[] | undefined;
6
7
  isOpen?: boolean;
@@ -1,6 +1,14 @@
1
1
  import React from 'react';
2
+ interface SharedVerticalZoom {
3
+ scale: number;
4
+ y: number;
5
+ sourceId: string | null;
6
+ }
2
7
  interface MouseYCtx {
3
8
  clientY: number | null;
9
+ verticalZoom: SharedVerticalZoom;
10
+ publishVerticalZoom: (sourceId: string, scale: number, y: number) => void;
11
+ resetVerticalZoom: (sourceId: string) => void;
4
12
  }
5
13
  export declare const useSharedMouseY: () => MouseYCtx;
6
14
  /**
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { Margin } from './drawUtils';
3
- import type { SoundingFeature, SoundingDiagramType } from '../../api/edr-api/types';
3
+ import type { SoundingDiagramType, SoundingFeature } from '../../api/edr-api/types';
4
4
  export interface SoundingProps {
5
5
  d3GraphId: string;
6
6
  data: SoundingFeature[][];
@@ -18,5 +18,5 @@ export declare const REFERENCE_PRESSURE: number;
18
18
  export declare const EARTH_MEAN_RADIUS = 6371;
19
19
  export declare const MAX_PROXIMITY_RADIUS = 100;
20
20
  export declare const SAME_POINT_DISTANCE_KM = 0.05;
21
- export declare const SOUNDINGS_CONTAINER_BREAKPOINT_PX = "600px";
21
+ export declare const SOUNDINGS_CONTAINER_BREAKPOINT_PX = "720px";
22
22
  export declare const SOUNDINGS_CONTAINER_NAME = "soundings-container";
@@ -29,6 +29,7 @@ interface PlotSounding {
29
29
  pressureValues: number[];
30
30
  color: string;
31
31
  lineStyle: string;
32
+ d3GraphId: string;
32
33
  xScale: ScalesType;
33
34
  yScale: ScalesType;
34
35
  height: number;
@@ -40,6 +41,6 @@ export declare const initializeSvg: ({ svgRef, width, height, margin, diagramTyp
40
41
  export declare const createScales: (diagramType: SoundingDiagramType, width: number, height: number, minPressure: number, maxPressure: number, minTemperature: number, maxTemperature: number) => [ScalesType, ScalesType];
41
42
  export declare const drawAxes: ({ svg, xScale, yScale, height, diagramType, }: DrawAxis) => void;
42
43
  export declare const mapToPlot: (diagramType: SoundingDiagramType, filteredPressureValues: number[], filteredTemperatureValues: number[], xScale: ScalesType, yScale: ScalesType, height: number) => [number, number][];
43
- export declare const plotSounding: ({ temperatureValues, pressureValues, color, lineStyle, xScale, yScale, height, svg, diagramType, }: PlotSounding) => void;
44
+ export declare const plotSounding: ({ temperatureValues, pressureValues, color, lineStyle, d3GraphId, xScale, yScale, height, svg, diagramType, }: PlotSounding) => void;
44
45
  export declare const filterDomainRangeForParameter: (pressureDomain: number[], parameterDomain: number[]) => [number[], number[]];
45
46
  export {};
@@ -1,2 +1,2 @@
1
1
  import React from 'react';
2
- export declare const useSoundingsDiagramSize: (ref: React.RefObject<HTMLDivElement | null>) => number;
2
+ export declare const useSoundingsDiagramSize: (ref: React.RefObject<HTMLDivElement | null>, useWidth?: boolean) => number;
@@ -1,6 +1,7 @@
1
1
  import * as d3 from 'd3';
2
2
  import type { SoundingDiagramType, SoundingFeature } from '../../api/edr-api/types';
3
3
  import type { Margin } from '../Soundings/drawUtils';
4
+ import type { ScalesType } from '../Soundings/types';
4
5
  interface DrawSoundingsTooltipData {
5
6
  pressureData: number[];
6
7
  interpolatePressure: (value: number) => number;
@@ -16,10 +17,10 @@ interface DrawSoundingsTooltipProps {
16
17
  pageY: number;
17
18
  clientY: number;
18
19
  };
19
- yScale: d3.ScaleLinear<number, number>;
20
20
  svgRectangle: DOMRect;
21
21
  margin: Margin;
22
22
  width: number;
23
+ hoveredPressure: number;
23
24
  pressureRefd3?: d3.Selection<HTMLDivElement | null, unknown, null, undefined>;
24
25
  tempRefd3?: d3.Selection<HTMLDivElement | null, unknown, null, undefined>;
25
26
  dewpointRefd3?: d3.Selection<HTMLDivElement | null, unknown, null, undefined>;
@@ -27,5 +28,6 @@ interface DrawSoundingsTooltipProps {
27
28
  tooltipData: DrawSoundingsTooltipData[];
28
29
  diagramType: SoundingDiagramType;
29
30
  }
30
- export declare const drawSoundingsTooltip: ({ event, yScale, svgRectangle, pressureRefd3, tempRefd3, dewpointRefd3, windRefd3, margin, width, tooltipData, diagramType, }: DrawSoundingsTooltipProps) => void;
31
+ export declare const extractPressureFromY: (diagramType: SoundingDiagramType, y: number, yScale: ScalesType) => number;
32
+ export declare const drawSoundingsTooltip: ({ event, svgRectangle, hoveredPressure, pressureRefd3, tempRefd3, dewpointRefd3, windRefd3, margin, width, tooltipData, diagramType, }: DrawSoundingsTooltipProps) => void;
31
33
  export {};
@@ -17,7 +17,8 @@ interface DrawIsothermsBijvoetProps {
17
17
  yScale: ScalesType;
18
18
  height: number;
19
19
  svg: d3.Selection<SVGElement, unknown, HTMLElement, unknown>;
20
+ labelSvg?: d3.Selection<SVGElement, unknown, HTMLElement, unknown>;
20
21
  d3GraphId: string;
21
22
  }
22
- export declare const drawIsothermsBijvoet: ({ staticPressureArray, xScale, yScale, svg, height, d3GraphId, }: DrawIsothermsBijvoetProps) => void;
23
+ export declare const drawIsothermsBijvoet: ({ staticPressureArray, xScale, yScale, svg, labelSvg, height, d3GraphId, }: DrawIsothermsBijvoetProps) => void;
23
24
  export {};
@@ -13,7 +13,8 @@ interface DrawStaticLinesProps {
13
13
  xScale: ScalesType;
14
14
  yScale: ScalesType;
15
15
  svg: d3.Selection<SVGElement, unknown, HTMLElement, unknown>;
16
+ bijvoetLabelSvg?: d3.Selection<SVGElement, unknown, HTMLElement, unknown>;
16
17
  d3GraphId: string;
17
18
  }
18
- export declare const drawStaticLines: ({ diagramType, dp, staticPressureArray, minTemperature, maxTemperature, height, width, xScale, yScale, minPressure, maxPressure, svg, d3GraphId, }: DrawStaticLinesProps) => void;
19
+ export declare const drawStaticLines: ({ diagramType, dp, staticPressureArray, minTemperature, maxTemperature, height, width, xScale, yScale, minPressure, maxPressure, svg, bijvoetLabelSvg, d3GraphId, }: DrawStaticLinesProps) => void;
19
20
  export {};
@@ -16,7 +16,12 @@ export interface DrawWindBarbsProps {
16
16
  margin: Margin;
17
17
  barbColor?: string;
18
18
  columnOffsetX?: number;
19
+ verticalScale?: number;
19
20
  }
20
- export declare const drawWindBarbs: ({ svgRef, plotGroup, yScale, data, width, margin, barbColor, columnOffsetX, }: DrawWindBarbsProps) => void;
21
- export declare const removeItemsExponential: (array: WindDataType[]) => WindDataType[];
21
+ export declare const MIN_VERTICAL_SCALE = 1;
22
+ export declare const MAX_VERTICAL_SCALE = 7;
23
+ export declare const getThinningBaseForVerticalScale: (verticalScale: number) => number;
24
+ export declare const drawWindBarbs: ({ svgRef, plotGroup, yScale, data, width, margin, barbColor, columnOffsetX, verticalScale, }: DrawWindBarbsProps) => void;
25
+ export declare const removeItemsExponential: (array: WindDataType[], base?: number) => WindDataType[];
26
+ export declare const getVisibleWindItemsForVerticalScale: (data: WindDataType[], verticalScale: number) => WindDataType[];
22
27
  export declare const getWindSymbol: (value: number) => Node | null;
@@ -1,6 +1,6 @@
1
1
  import type { Draft, PayloadAction } from '@reduxjs/toolkit';
2
2
  import type { SoundingsCollection } from '@opengeoweb/shared';
3
- import type { SoundingsState, SoundingsViewState, RegisterSoundingsPresetPayload, UpdateLocationPayload, UpdateSourcePayload, UpdateTimePayload, UpdateDiagramTypePayload, ToggleLocationMarkersPayload, ToggleTimeSliderVisibilityPayload, UpdateProfileDataPreferencesPayload, AddSoundingPanelsPayload, ChangeSoundingPanelOrderPayload } from './types';
3
+ import type { SoundingsState, SoundingsViewState, RegisterSoundingsPresetPayload, UpdateLocationPayload, UpdateSourcePayload, UpdateTimePayload, UpdateDiagramTypePayload, ToggleLocationMarkersPayload, ToggleTimeSliderVisibilityPayload, ToggleLegendVisibilityPayload, UpdateProfileDataPreferencesPayload, AddSoundingPanelsPayload, ChangeSoundingPanelOrderPayload, SetLocationMenuSizeAndPositionPayload, SetLocationsMenuOpenPayload } from './types';
4
4
  /**
5
5
  * Default state every new soundings view starts with. Views are created
6
6
  * dynamically when a soundings view mounts, so this serves as the template
@@ -19,6 +19,7 @@ export declare const soundingsActions: import("@reduxjs/toolkit").CaseReducerAct
19
19
  updateDiagramType: (draft: Draft<SoundingsState>, payloadAction: PayloadAction<UpdateDiagramTypePayload>) => void;
20
20
  toggleLocationMarkers: (draft: Draft<SoundingsState>, payloadAction: PayloadAction<ToggleLocationMarkersPayload>) => void;
21
21
  toggleTimeSliderVisibility: (draft: Draft<SoundingsState>, payloadAction: PayloadAction<ToggleTimeSliderVisibilityPayload>) => void;
22
+ toggleLegendVisibility: (draft: Draft<SoundingsState>, payloadAction: PayloadAction<ToggleLegendVisibilityPayload>) => void;
22
23
  updateProfileDataPreferences: (draft: Draft<SoundingsState>, payloadAction: PayloadAction<UpdateProfileDataPreferencesPayload>) => void;
23
24
  addSoundingPanelsFromPreset: (draft: Draft<SoundingsState>, payloadAction: PayloadAction<AddSoundingPanelsPayload>) => void;
24
25
  changeSoundingPanelOrder: (draft: Draft<SoundingsState>, payloadAction: PayloadAction<ChangeSoundingPanelOrderPayload>) => void;
@@ -39,6 +40,8 @@ export declare const soundingsActions: import("@reduxjs/toolkit").CaseReducerAct
39
40
  customWidth: number;
40
41
  origin?: string;
41
42
  }>) => void;
43
+ setLocationMenuSizeAndPosition: (draft: Draft<SoundingsState>, payloadAction: PayloadAction<SetLocationMenuSizeAndPositionPayload>) => void;
44
+ setLocationsMenuOpen: (draft: Draft<SoundingsState>, payloadAction: PayloadAction<SetLocationsMenuOpenPayload>) => void;
42
45
  notifyViewClosed: (draft: Draft<SoundingsState>) => void;
43
46
  }, "soundings">;
44
47
  export declare const soundingsReducer: import("redux").Reducer<SoundingsState>;
@@ -171,6 +171,27 @@ export declare const getIsTimeSliderVisible: ((state: SoundingsModuleState, view
171
171
  memoize: typeof import("reselect").weakMapMemoize;
172
172
  argsMemoize: typeof import("reselect").weakMapMemoize;
173
173
  };
174
+ export declare const getIsLegendVisible: ((state: SoundingsModuleState, viewId?: string | undefined) => boolean) & {
175
+ clearCache: () => void;
176
+ resultsCount: () => number;
177
+ resetResultsCount: () => void;
178
+ } & {
179
+ resultFunc: (resultFuncArgs_0: SoundingsViewState) => boolean;
180
+ memoizedResultFunc: ((resultFuncArgs_0: SoundingsViewState) => boolean) & {
181
+ clearCache: () => void;
182
+ resultsCount: () => number;
183
+ resetResultsCount: () => void;
184
+ };
185
+ lastResult: () => boolean;
186
+ dependencies: [(store: SoundingsModuleState, viewId?: string) => SoundingsViewState];
187
+ recomputations: () => number;
188
+ resetRecomputations: () => void;
189
+ dependencyRecomputations: () => number;
190
+ resetDependencyRecomputations: () => void;
191
+ } & {
192
+ memoize: typeof import("reselect").weakMapMemoize;
193
+ argsMemoize: typeof import("reselect").weakMapMemoize;
194
+ };
174
195
  export declare const getProfileDataPreferences: ((state: SoundingsModuleState, viewId?: string | undefined) => SoundingsProfileDataPreferences) & {
175
196
  clearCache: () => void;
176
197
  resultsCount: () => number;
@@ -295,6 +316,72 @@ export declare const getSelectedSourcesIds: ((state: SoundingsModuleState, viewI
295
316
  memoize: typeof import("reselect").weakMapMemoize;
296
317
  argsMemoize: typeof import("reselect").weakMapMemoize;
297
318
  };
319
+ export declare const getLocationMenuSize: ((state: SoundingsModuleState, viewId?: string | undefined) => {
320
+ width: number;
321
+ height: number;
322
+ } | undefined) & {
323
+ clearCache: () => void;
324
+ resultsCount: () => number;
325
+ resetResultsCount: () => void;
326
+ } & {
327
+ resultFunc: (resultFuncArgs_0: SoundingsViewState) => {
328
+ width: number;
329
+ height: number;
330
+ } | undefined;
331
+ memoizedResultFunc: ((resultFuncArgs_0: SoundingsViewState) => {
332
+ width: number;
333
+ height: number;
334
+ } | undefined) & {
335
+ clearCache: () => void;
336
+ resultsCount: () => number;
337
+ resetResultsCount: () => void;
338
+ };
339
+ lastResult: () => {
340
+ width: number;
341
+ height: number;
342
+ } | undefined;
343
+ dependencies: [(store: SoundingsModuleState, viewId?: string) => SoundingsViewState];
344
+ recomputations: () => number;
345
+ resetRecomputations: () => void;
346
+ dependencyRecomputations: () => number;
347
+ resetDependencyRecomputations: () => void;
348
+ } & {
349
+ memoize: typeof import("reselect").weakMapMemoize;
350
+ argsMemoize: typeof import("reselect").weakMapMemoize;
351
+ };
352
+ export declare const getLocationMenuPosition: ((state: SoundingsModuleState, viewId?: string | undefined) => {
353
+ x: number;
354
+ y: number;
355
+ } | undefined) & {
356
+ clearCache: () => void;
357
+ resultsCount: () => number;
358
+ resetResultsCount: () => void;
359
+ } & {
360
+ resultFunc: (resultFuncArgs_0: SoundingsViewState) => {
361
+ x: number;
362
+ y: number;
363
+ } | undefined;
364
+ memoizedResultFunc: ((resultFuncArgs_0: SoundingsViewState) => {
365
+ x: number;
366
+ y: number;
367
+ } | undefined) & {
368
+ clearCache: () => void;
369
+ resultsCount: () => number;
370
+ resetResultsCount: () => void;
371
+ };
372
+ lastResult: () => {
373
+ x: number;
374
+ y: number;
375
+ } | undefined;
376
+ dependencies: [(store: SoundingsModuleState, viewId?: string) => SoundingsViewState];
377
+ recomputations: () => number;
378
+ resetRecomputations: () => void;
379
+ dependencyRecomputations: () => number;
380
+ resetDependencyRecomputations: () => void;
381
+ } & {
382
+ memoize: typeof import("reselect").weakMapMemoize;
383
+ argsMemoize: typeof import("reselect").weakMapMemoize;
384
+ };
298
385
  export declare const getSoundingsPreset: ((state: SoundingsModuleState, viewId?: string | undefined) => SoundingsViewState) & {
299
386
  clearCache: () => void;
300
387
  resultsCount: () => number;
@@ -41,9 +41,25 @@ export interface ToggleLocationMarkersPayload extends SoundingsPayload {
41
41
  export interface ToggleTimeSliderVisibilityPayload extends SoundingsPayload {
42
42
  isTimeSliderVisible: boolean;
43
43
  }
44
+ export interface ToggleLegendVisibilityPayload extends SoundingsPayload {
45
+ isLegendVisible: boolean;
46
+ }
44
47
  export interface UpdateProfileDataPreferencesPayload extends SoundingsPayload {
45
48
  profileDataPreferences: SoundingsProfileDataPreferences;
46
49
  }
50
+ export interface SetLocationMenuSizeAndPositionPayload extends SoundingsPayload {
51
+ size: {
52
+ width: number;
53
+ height: number;
54
+ };
55
+ position?: {
56
+ x: number;
57
+ y: number;
58
+ };
59
+ }
60
+ export interface SetLocationsMenuOpenPayload extends SoundingsPayload {
61
+ isLocationsDialogOpen: boolean;
62
+ }
47
63
  export interface RegisterSoundingsPresetPayload extends SoundingsPayload {
48
64
  preset: SoundingsViewState;
49
65
  }
@@ -84,9 +100,23 @@ export interface SoundingsViewState {
84
100
  shouldHideLocationMarkers?: boolean;
85
101
  /** Whether the timeslider is shown below the panels (defaults to true) */
86
102
  isTimeSliderVisible?: boolean;
103
+ /** Whether the legend is shown above the panels (defaults to true) */
104
+ isLegendVisible?: boolean;
87
105
  /** Per-view profile data table preferences: visible columns + units */
88
106
  profileDataPreferences?: SoundingsProfileDataPreferences;
89
107
  syncGroupsIds: string[];
108
+ /** Persisted size of the location menu dialog */
109
+ locationMenuSize?: {
110
+ width: number;
111
+ height: number;
112
+ };
113
+ /** Persisted drag position of the location menu dialog */
114
+ locationMenuPosition?: {
115
+ x: number;
116
+ y: number;
117
+ };
118
+ /** Whether the locations dialog was open when the preset was saved */
119
+ isLocationsDialogOpen?: boolean;
90
120
  }
91
121
  /**
92
122
  * Root state for the soundings slice. Views are added dynamically when
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengeoweb/soundings",
3
- "version": "19.3.0",
3
+ "version": "19.5.0",
4
4
  "description": "GeoWeb soundings library for the opengeoweb project",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {