@genspectrum/dashboard-components 0.19.2 → 0.19.4

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.
Files changed (61) hide show
  1. package/custom-elements.json +383 -10
  2. package/dist/{LineageFilterChangedEvent-ixHQkq8y.js → LineageFilterChangedEvent-GgkxoF3X.js} +17 -5
  3. package/dist/LineageFilterChangedEvent-GgkxoF3X.js.map +1 -0
  4. package/dist/assets/mutationOverTimeWorker-ChQTFL68.js.map +1 -1
  5. package/dist/components.d.ts +184 -21
  6. package/dist/components.js +9352 -8683
  7. package/dist/components.js.map +1 -1
  8. package/dist/util.d.ts +69 -21
  9. package/dist/util.js +2 -1
  10. package/package.json +1 -1
  11. package/src/componentsEntrypoint.ts +3 -1
  12. package/src/preact/components/error-display.stories.tsx +2 -1
  13. package/src/preact/components/error-display.tsx +2 -3
  14. package/src/preact/components/min-max-range-slider.tsx +19 -4
  15. package/src/preact/components/resize-container.tsx +7 -10
  16. package/src/preact/components/tooltip.tsx +7 -4
  17. package/src/preact/dateRangeFilter/date-range-filter.stories.tsx +9 -5
  18. package/src/preact/dateRangeFilter/date-range-filter.tsx +2 -1
  19. package/src/preact/dateRangeFilter/dateRangeOption.ts +2 -1
  20. package/src/preact/genomeViewer/CDSPlot.tsx +219 -0
  21. package/src/preact/genomeViewer/genome-data-viewer.stories.tsx +113 -0
  22. package/src/preact/genomeViewer/genome-data-viewer.tsx +69 -0
  23. package/src/preact/genomeViewer/loadGff3.spec.ts +61 -0
  24. package/src/preact/genomeViewer/loadGff3.ts +180 -0
  25. package/src/preact/lineageFilter/LineageFilterChangedEvent.ts +3 -1
  26. package/src/preact/lineageFilter/lineage-filter.stories.tsx +3 -2
  27. package/src/preact/locationFilter/LocationChangedEvent.ts +2 -1
  28. package/src/preact/locationFilter/location-filter.stories.tsx +3 -2
  29. package/src/preact/mutationFilter/mutation-filter.stories.tsx +3 -2
  30. package/src/preact/mutationFilter/mutation-filter.tsx +2 -1
  31. package/src/preact/numberRangeFilter/NumberRangeFilterChangedEvent.ts +31 -0
  32. package/src/preact/numberRangeFilter/number-range-filter.stories.tsx +383 -0
  33. package/src/preact/numberRangeFilter/number-range-filter.tsx +159 -0
  34. package/src/preact/numberRangeFilter/useSelectedRangeReducer.ts +137 -0
  35. package/src/preact/shared/charts/colors.ts +1 -1
  36. package/src/preact/textFilter/TextFilterChangedEvent.ts +3 -1
  37. package/src/preact/textFilter/text-filter.stories.tsx +4 -3
  38. package/src/utilEntrypoint.ts +2 -0
  39. package/src/utils/gsEventNames.ts +11 -0
  40. package/src/web-components/input/gs-date-range-filter.stories.ts +4 -3
  41. package/src/web-components/input/gs-date-range-filter.tsx +3 -2
  42. package/src/web-components/input/gs-lineage-filter.stories.ts +3 -2
  43. package/src/web-components/input/gs-lineage-filter.tsx +2 -1
  44. package/src/web-components/input/gs-location-filter.stories.ts +3 -2
  45. package/src/web-components/input/gs-location-filter.tsx +2 -1
  46. package/src/web-components/input/gs-mutation-filter.stories.ts +3 -2
  47. package/src/web-components/input/gs-mutation-filter.tsx +2 -1
  48. package/src/web-components/input/gs-number-range-filter.spec.ts +27 -0
  49. package/src/web-components/input/gs-number-range-filter.stories.ts +96 -0
  50. package/src/web-components/input/gs-number-range-filter.tsx +148 -0
  51. package/src/web-components/input/gs-text-filter.stories.ts +5 -4
  52. package/src/web-components/input/gs-text-filter.tsx +2 -1
  53. package/src/web-components/input/index.ts +1 -0
  54. package/src/web-components/visualization/gs-genome-data-viewer.spec-d.ts +18 -0
  55. package/src/web-components/visualization/gs-genome-data-viewer.stories.ts +108 -0
  56. package/src/web-components/visualization/gs-genome-data-viewer.tsx +59 -0
  57. package/src/web-components/visualization/index.ts +1 -0
  58. package/standalone-bundle/assets/mutationOverTimeWorker-jChgWnwp.js.map +1 -1
  59. package/standalone-bundle/dashboard-components.js +9613 -9059
  60. package/standalone-bundle/dashboard-components.js.map +1 -1
  61. package/dist/LineageFilterChangedEvent-ixHQkq8y.js.map +0 -1
package/dist/util.d.ts CHANGED
@@ -149,6 +149,18 @@ declare const dateRangeValueSchema: default_2.ZodNullable<default_2.ZodUnion<[de
149
149
  dateTo?: string | undefined;
150
150
  }>]>>;
151
151
 
152
+ export declare const gsEventNames: {
153
+ readonly error: "gs-error";
154
+ readonly dateRangeFilterChanged: "gs-date-range-filter-changed";
155
+ readonly dateRangeOptionChanged: "gs-date-range-option-changed";
156
+ readonly mutationFilterChanged: "gs-mutation-filter-changed";
157
+ readonly lineageFilterChanged: "gs-lineage-filter-changed";
158
+ readonly locationChanged: "gs-location-changed";
159
+ readonly textFilterChanged: "gs-text-filter-changed";
160
+ readonly numberRangeFilterChanged: "gs-number-range-filter-changed";
161
+ readonly numberRangeValueChanged: "gs-number-range-value-changed";
162
+ };
163
+
152
164
  export declare type LapisFilter = default_2.infer<typeof lapisFilterSchema>;
153
165
 
154
166
  declare const lapisFilterSchema: default_2.ZodIntersection<default_2.ZodRecord<default_2.ZodString, default_2.ZodUnion<[default_2.ZodString, default_2.ZodArray<default_2.ZodString, "many">, default_2.ZodNumber, default_2.ZodNull, default_2.ZodBoolean, default_2.ZodUndefined]>>, default_2.ZodObject<{
@@ -879,7 +891,7 @@ export { }
879
891
 
880
892
  declare global {
881
893
  interface HTMLElementEventMap {
882
- 'gs-error': ErrorEvent;
894
+ [gsEventNames.error]: ErrorEvent;
883
895
  }
884
896
  }
885
897
 
@@ -900,6 +912,22 @@ declare global {
900
912
  }
901
913
 
902
914
 
915
+ declare global {
916
+ interface HTMLElementTagNameMap {
917
+ 'gs-genome-data-viewer': GenomeDataViewerComponent;
918
+ }
919
+ }
920
+
921
+
922
+ declare global {
923
+ namespace JSX {
924
+ interface IntrinsicElements {
925
+ 'gs-genome-data-viewer': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
926
+ }
927
+ }
928
+ }
929
+
930
+
903
931
  declare global {
904
932
  interface HTMLElementTagNameMap {
905
933
  'gs-mutation-comparison-component': MutationComparisonComponent;
@@ -1030,7 +1058,11 @@ declare global {
1030
1058
 
1031
1059
  declare global {
1032
1060
  interface HTMLElementTagNameMap {
1033
- 'gs-statistics': StatisticsComponent;
1061
+ 'gs-date-range-filter': DateRangeFilterComponent;
1062
+ }
1063
+ interface HTMLElementEventMap {
1064
+ [gsEventNames.dateRangeFilterChanged]: CustomEvent<Record<string, string>>;
1065
+ [gsEventNames.dateRangeOptionChanged]: DateRangeOptionChangedEvent;
1034
1066
  }
1035
1067
  }
1036
1068
 
@@ -1038,7 +1070,7 @@ declare global {
1038
1070
  declare global {
1039
1071
  namespace JSX {
1040
1072
  interface IntrinsicElements {
1041
- 'gs-statistics': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1073
+ 'gs-date-range-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1042
1074
  }
1043
1075
  }
1044
1076
  }
@@ -1046,7 +1078,10 @@ declare global {
1046
1078
 
1047
1079
  declare global {
1048
1080
  interface HTMLElementTagNameMap {
1049
- 'gs-wastewater-mutations-over-time': WastewaterMutationsOverTimeComponent;
1081
+ 'gs-location-filter': LocationFilterComponent;
1082
+ }
1083
+ interface HTMLElementEventMap {
1084
+ [gsEventNames.locationChanged]: LocationChangedEvent;
1050
1085
  }
1051
1086
  }
1052
1087
 
@@ -1054,7 +1089,7 @@ declare global {
1054
1089
  declare global {
1055
1090
  namespace JSX {
1056
1091
  interface IntrinsicElements {
1057
- 'gs-wastewater-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1092
+ 'gs-location-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1058
1093
  }
1059
1094
  }
1060
1095
  }
@@ -1062,10 +1097,7 @@ declare global {
1062
1097
 
1063
1098
  declare global {
1064
1099
  interface HTMLElementTagNameMap {
1065
- 'gs-location-filter': LocationFilterComponent;
1066
- }
1067
- interface HTMLElementEventMap {
1068
- 'gs-location-changed': LocationChangedEvent;
1100
+ 'gs-statistics': StatisticsComponent;
1069
1101
  }
1070
1102
  }
1071
1103
 
@@ -1073,7 +1105,7 @@ declare global {
1073
1105
  declare global {
1074
1106
  namespace JSX {
1075
1107
  interface IntrinsicElements {
1076
- 'gs-location-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1108
+ 'gs-statistics': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1077
1109
  }
1078
1110
  }
1079
1111
  }
@@ -1081,11 +1113,10 @@ declare global {
1081
1113
 
1082
1114
  declare global {
1083
1115
  interface HTMLElementTagNameMap {
1084
- 'gs-date-range-filter': DateRangeFilterComponent;
1116
+ 'gs-text-filter': TextFilterComponent;
1085
1117
  }
1086
1118
  interface HTMLElementEventMap {
1087
- 'gs-date-range-filter-changed': CustomEvent<Record<string, string>>;
1088
- 'gs-date-range-option-changed': DateRangeOptionChangedEvent;
1119
+ [gsEventNames.textFilterChanged]: TextFilterChangedEvent;
1089
1120
  }
1090
1121
  }
1091
1122
 
@@ -1093,7 +1124,7 @@ declare global {
1093
1124
  declare global {
1094
1125
  namespace JSX {
1095
1126
  interface IntrinsicElements {
1096
- 'gs-date-range-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1127
+ 'gs-text-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1097
1128
  }
1098
1129
  }
1099
1130
  }
@@ -1101,10 +1132,10 @@ declare global {
1101
1132
 
1102
1133
  declare global {
1103
1134
  interface HTMLElementTagNameMap {
1104
- 'gs-text-filter': TextFilterComponent;
1135
+ 'gs-lineage-filter': LineageFilterComponent;
1105
1136
  }
1106
1137
  interface HTMLElementEventMap {
1107
- 'gs-text-filter-changed': TextFilterChangedEvent;
1138
+ [gsEventNames.lineageFilterChanged]: LineageFilterChangedEvent;
1108
1139
  }
1109
1140
  }
1110
1141
 
@@ -1112,7 +1143,7 @@ declare global {
1112
1143
  declare global {
1113
1144
  namespace JSX {
1114
1145
  interface IntrinsicElements {
1115
- 'gs-text-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1146
+ 'gs-lineage-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1116
1147
  }
1117
1148
  }
1118
1149
  }
@@ -1123,7 +1154,7 @@ declare global {
1123
1154
  'gs-mutation-filter': MutationFilterComponent;
1124
1155
  }
1125
1156
  interface HTMLElementEventMap {
1126
- 'gs-mutation-filter-changed': CustomEvent<MutationsFilter>;
1157
+ [gsEventNames.mutationFilterChanged]: CustomEvent<MutationsFilter>;
1127
1158
  }
1128
1159
  }
1129
1160
 
@@ -1139,10 +1170,11 @@ declare global {
1139
1170
 
1140
1171
  declare global {
1141
1172
  interface HTMLElementTagNameMap {
1142
- 'gs-lineage-filter': LineageFilterComponent;
1173
+ 'gs-number-range-filter': NumberRangeFilterComponent;
1143
1174
  }
1144
1175
  interface HTMLElementEventMap {
1145
- 'gs-lineage-filter-changed': LineageFilterChangedEvent;
1176
+ [gsEventNames.numberRangeFilterChanged]: NumberRangeFilterChangedEvent;
1177
+ [gsEventNames.numberRangeValueChanged]: NumberRangeValueChangedEvent;
1146
1178
  }
1147
1179
  }
1148
1180
 
@@ -1150,7 +1182,23 @@ declare global {
1150
1182
  declare global {
1151
1183
  namespace JSX {
1152
1184
  interface IntrinsicElements {
1153
- 'gs-lineage-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1185
+ 'gs-number-range-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1186
+ }
1187
+ }
1188
+ }
1189
+
1190
+
1191
+ declare global {
1192
+ interface HTMLElementTagNameMap {
1193
+ 'gs-wastewater-mutations-over-time': WastewaterMutationsOverTimeComponent;
1194
+ }
1195
+ }
1196
+
1197
+
1198
+ declare global {
1199
+ namespace JSX {
1200
+ interface IntrinsicElements {
1201
+ 'gs-wastewater-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1154
1202
  }
1155
1203
  }
1156
1204
  }
package/dist/util.js CHANGED
@@ -1,10 +1,11 @@
1
- import { D, a, L, T, d, v } from "./LineageFilterChangedEvent-ixHQkq8y.js";
1
+ import { D, a, L, T, d, g, v } from "./LineageFilterChangedEvent-GgkxoF3X.js";
2
2
  export {
3
3
  D as DateRangeOptionChangedEvent,
4
4
  a as LineageFilterChangedEvent,
5
5
  L as LocationChangedEvent,
6
6
  T as TextFilterChangedEvent,
7
7
  d as dateRangeOptionPresets,
8
+ g as gsEventNames,
8
9
  v as views
9
10
  };
10
11
  //# sourceMappingURL=util.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genspectrum/dashboard-components",
3
- "version": "0.19.2",
3
+ "version": "0.19.4",
4
4
  "description": "GenSpectrum web components for building dashboards",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
@@ -1,9 +1,11 @@
1
+ import { type gsEventNames } from './utils/gsEventNames';
2
+
1
3
  export * from './web-components';
2
4
 
3
5
  export { type ErrorEvent, UserFacingError } from './preact/components/error-display';
4
6
 
5
7
  declare global {
6
8
  interface HTMLElementEventMap {
7
- 'gs-error': ErrorEvent;
9
+ [gsEventNames.error]: ErrorEvent;
8
10
  }
9
11
  }
@@ -3,6 +3,7 @@ import { expect, fn, userEvent, waitFor, within } from '@storybook/test';
3
3
 
4
4
  import { ErrorDisplay, UserFacingError } from './error-display';
5
5
  import { ResizeContainer } from './resize-container';
6
+ import { gsEventNames } from '../../utils/gsEventNames';
6
7
 
7
8
  const meta: Meta = {
8
9
  title: 'Component/Error',
@@ -58,7 +59,7 @@ export const FiresEvent: StoryObj = {
58
59
 
59
60
  play: async ({ canvasElement }) => {
60
61
  const listenerMock = fn();
61
- canvasElement.addEventListener('gs-error', listenerMock);
62
+ canvasElement.addEventListener(gsEventNames.error, listenerMock);
62
63
 
63
64
  await waitFor(async () => {
64
65
  await expect(listenerMock.mock.calls.at(-1)![0].error.name).toStrictEqual('UserFacingError');
@@ -5,12 +5,11 @@ import { type ZodError } from 'zod';
5
5
  import { InfoHeadline1, InfoParagraph } from './info';
6
6
  import { Modal } from './modal';
7
7
  import { LapisError, UnknownLapisError } from '../../lapisApi/lapisApi';
8
-
9
- export const GS_ERROR_EVENT_TYPE = 'gs-error';
8
+ import { gsEventNames } from '../../utils/gsEventNames';
10
9
 
11
10
  export class ErrorEvent extends Event {
12
11
  constructor(public readonly error: Error) {
13
- super(GS_ERROR_EVENT_TYPE, {
12
+ super(gsEventNames.error, {
14
13
  bubbles: true,
15
14
  composed: true,
16
15
  });
@@ -6,6 +6,7 @@ export interface MinMaxPercentSliderProps {
6
6
  max: number;
7
7
  setMin: (min: number) => void;
8
8
  setMax: (max: number) => void;
9
+ onDrop?: () => void;
9
10
  rangeMin?: number;
10
11
  rangeMax?: number;
11
12
  step?: number;
@@ -16,6 +17,7 @@ export const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({
16
17
  max,
17
18
  setMin,
18
19
  setMax,
20
+ onDrop,
19
21
  rangeMin = 0,
20
22
  rangeMax = 100,
21
23
  step = 0.1,
@@ -55,14 +57,16 @@ export const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({
55
57
  }
56
58
  };
57
59
 
60
+ const lowerBoundary = getGradientBoundary(min, rangeMin, rangeMax);
61
+ const upperBoundary = getGradientBoundary(max, rangeMin, rangeMax);
58
62
  const background = `
59
63
  linear-gradient(
60
64
  to right,
61
65
  ${sliderColor} 0%,
62
- ${sliderColor} ${min}%,
63
- ${rangeColor} ${min}%,
64
- ${rangeColor} ${max}%,
65
- ${sliderColor} ${max}%,
66
+ ${sliderColor} ${lowerBoundary}%,
67
+ ${rangeColor} ${lowerBoundary}%,
68
+ ${rangeColor} ${upperBoundary}%,
69
+ ${sliderColor} ${upperBoundary}%,
66
70
  ${sliderColor} 100%)
67
71
  `;
68
72
 
@@ -73,6 +77,8 @@ export const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({
73
77
  type='range'
74
78
  value={min}
75
79
  onInput={onMinChange}
80
+ onMouseUp={() => onDrop?.()}
81
+ onTouchEnd={() => onDrop?.()}
76
82
  min={`${rangeMin}`}
77
83
  max={`${rangeMax}`}
78
84
  step={step}
@@ -86,8 +92,17 @@ export const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({
86
92
  max={`${rangeMax}`}
87
93
  step={step}
88
94
  onInput={onMaxChange}
95
+ onMouseUp={() => onDrop?.()}
96
+ onTouchEnd={() => onDrop?.()}
89
97
  style={{ background, zIndex: zIndexTo }}
90
98
  />
91
99
  </div>
92
100
  );
93
101
  };
102
+
103
+ /**
104
+ * This is a linear function that returns 0 for x = lowerBound and 100 for x = upperBound.
105
+ */
106
+ function getGradientBoundary(x: number, lowerBound: number, upperBound: number) {
107
+ return ((x - lowerBound) / (upperBound - lowerBound)) * 100;
108
+ }
@@ -1,18 +1,15 @@
1
- import { type FunctionComponent } from 'preact';
1
+ import { type ComponentChildren } from 'preact';
2
+ import { forwardRef } from 'preact/compat';
2
3
 
3
4
  export type Size = {
4
5
  width: string;
5
6
  height?: string;
6
7
  };
7
8
 
8
- export interface ResizeContainerProps {
9
- size: Size;
10
- }
11
-
12
- export const ResizeContainer: FunctionComponent<ResizeContainerProps> = ({ children, size }) => {
13
- return (
14
- <div style={size} className='bg-white'>
9
+ export const ResizeContainer = forwardRef<HTMLDivElement, { size: Size; children: ComponentChildren }>(
10
+ ({ size, children }, ref) => (
11
+ <div ref={ref} style={{ width: size.width, height: size.height, position: 'relative' }}>
15
12
  {children}
16
13
  </div>
17
- );
18
- };
14
+ ),
15
+ );
@@ -1,4 +1,5 @@
1
1
  import { type FunctionComponent } from 'preact';
2
+ import { type CSSProperties } from 'preact/compat';
2
3
  import { type JSXInternal } from 'preact/src/jsx';
3
4
 
4
5
  export type TooltipPosition =
@@ -14,6 +15,7 @@ export type TooltipPosition =
14
15
  export type TooltipProps = {
15
16
  content: string | JSXInternal.Element;
16
17
  position?: TooltipPosition;
18
+ tooltipStyle?: CSSProperties;
17
19
  };
18
20
 
19
21
  function getPositionCss(position?: TooltipPosition) {
@@ -39,12 +41,13 @@ function getPositionCss(position?: TooltipPosition) {
39
41
  }
40
42
  }
41
43
 
42
- const Tooltip: FunctionComponent<TooltipProps> = ({ children, content, position = 'bottom' }) => {
44
+ const Tooltip: FunctionComponent<TooltipProps> = ({ children, content, position = 'bottom', tooltipStyle }) => {
43
45
  return (
44
- <div className='relative w-full h-full'>
45
- <div className='peer w-full h-full'>{children}</div>
46
+ <div className={`relative group`}>
47
+ <div>{children}</div>
46
48
  <div
47
- className={`absolute z-10 w-max bg-white p-4 border border-gray-200 rounded-md invisible peer-hover:visible ${getPositionCss(position)}`}
49
+ className={`absolute z-10 w-max bg-white p-4 border border-gray-200 rounded-md invisible group-hover:visible ${getPositionCss(position)}`}
50
+ style={{ ...tooltipStyle }}
48
51
  >
49
52
  {content}
50
53
  </div>
@@ -7,6 +7,7 @@ import { useEffect, useRef, useState } from 'preact/hooks';
7
7
  import { DateRangeFilter, type DateRangeFilterProps } from './date-range-filter';
8
8
  import { previewHandles } from '../../../.storybook/preview';
9
9
  import { LAPIS_URL } from '../../constants';
10
+ import { gsEventNames } from '../../utils/gsEventNames';
10
11
  import { LapisUrlContextProvider } from '../LapisUrlContext';
11
12
  import { dateRangeOptionPresets, type DateRangeValue } from './dateRangeOption';
12
13
  import { expectInvalidAttributesErrorMessage } from '../shared/stories/expectErrorMessage';
@@ -27,7 +28,7 @@ const meta: Meta<DateRangeFilterProps> = {
27
28
  component: DateRangeFilter,
28
29
  parameters: {
29
30
  actions: {
30
- handles: ['gs-date-range-filter-changed', 'gs-date-range-option-changed', ...previewHandles],
31
+ handles: [gsEventNames.dateRangeFilterChanged, gsEventNames.dateRangeOptionChanged, ...previewHandles],
31
32
  },
32
33
  fetchMock: {},
33
34
  },
@@ -198,7 +199,7 @@ export const ChangingTheValueProgrammatically: StoryObj<DateRangeFilterProps> =
198
199
  const ref = useRef<HTMLDivElement>(null);
199
200
 
200
201
  useEffect(() => {
201
- ref.current?.addEventListener('gs-date-range-option-changed', (event) => {
202
+ ref.current?.addEventListener(gsEventNames.dateRangeOptionChanged, (event) => {
202
203
  setValue(event.detail);
203
204
  });
204
205
  }, []);
@@ -255,7 +256,10 @@ export const ChangingTheValueProgrammatically: StoryObj<DateRangeFilterProps> =
255
256
 
256
257
  await step('Clearing the value from within the component is still possible', async () => {
257
258
  await waitFor(async () => {
258
- await userEvent.click(canvas.getByRole('button', { name: '×' }));
259
+ await expect(canvas.getByRole('button', { name: '×' })).toBeVisible();
260
+ });
261
+ await userEvent.click(canvas.getByRole('button', { name: '×' }));
262
+ await waitFor(async () => {
259
263
  await expectOptionSelected(canvasElement, placeholder);
260
264
  });
261
265
  await waitFor(async () => {
@@ -333,8 +337,8 @@ async function prepare(canvasElement: HTMLElement, step: StepFunction<PreactRend
333
337
  const filterChangedListenerMock = fn();
334
338
  const optionChangedListenerMock = fn();
335
339
  await step('Setup event listener mock', () => {
336
- canvasElement.addEventListener('gs-date-range-filter-changed', filterChangedListenerMock);
337
- canvasElement.addEventListener('gs-date-range-option-changed', optionChangedListenerMock);
340
+ canvasElement.addEventListener(gsEventNames.dateRangeFilterChanged, filterChangedListenerMock);
341
+ canvasElement.addEventListener(gsEventNames.dateRangeOptionChanged, optionChangedListenerMock);
338
342
  });
339
343
 
340
344
  return { canvas, filterChangedListenerMock, optionChangedListenerMock };
@@ -10,6 +10,7 @@ import {
10
10
  dateRangeOptionSchema,
11
11
  dateRangeValueSchema,
12
12
  } from './dateRangeOption';
13
+ import { gsEventNames } from '../../utils/gsEventNames';
13
14
  import { ClearableSelect } from '../components/clearable-select';
14
15
  import { ErrorBoundary } from '../components/error-boundary';
15
16
 
@@ -170,7 +171,7 @@ export const DateRangeFilterInner = ({
170
171
  };
171
172
 
172
173
  divRef.current?.dispatchEvent(
173
- new CustomEvent('gs-date-range-filter-changed', {
174
+ new CustomEvent(gsEventNames.dateRangeFilterChanged, {
174
175
  detail,
175
176
  bubbles: true,
176
177
  composed: true,
@@ -1,6 +1,7 @@
1
1
  import z from 'zod';
2
2
 
3
3
  import { toYYYYMMDD } from './dateConversion';
4
+ import { gsEventNames } from '../../utils/gsEventNames';
4
5
 
5
6
  /**
6
7
  * A date range option that can be used in the `gs-date-range-filter` component.
@@ -36,7 +37,7 @@ export type DateRangeValue = z.infer<typeof dateRangeValueSchema>;
36
37
 
37
38
  export class DateRangeOptionChangedEvent extends CustomEvent<DateRangeValue> {
38
39
  constructor(detail: DateRangeValue) {
39
- super('gs-date-range-option-changed', {
40
+ super(gsEventNames.dateRangeOptionChanged, {
40
41
  detail,
41
42
  bubbles: true,
42
43
  composed: true,