@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.
- package/custom-elements.json +383 -10
- package/dist/{LineageFilterChangedEvent-ixHQkq8y.js → LineageFilterChangedEvent-GgkxoF3X.js} +17 -5
- package/dist/LineageFilterChangedEvent-GgkxoF3X.js.map +1 -0
- package/dist/assets/mutationOverTimeWorker-ChQTFL68.js.map +1 -1
- package/dist/components.d.ts +184 -21
- package/dist/components.js +9352 -8683
- package/dist/components.js.map +1 -1
- package/dist/util.d.ts +69 -21
- package/dist/util.js +2 -1
- package/package.json +1 -1
- package/src/componentsEntrypoint.ts +3 -1
- package/src/preact/components/error-display.stories.tsx +2 -1
- package/src/preact/components/error-display.tsx +2 -3
- package/src/preact/components/min-max-range-slider.tsx +19 -4
- package/src/preact/components/resize-container.tsx +7 -10
- package/src/preact/components/tooltip.tsx +7 -4
- package/src/preact/dateRangeFilter/date-range-filter.stories.tsx +9 -5
- package/src/preact/dateRangeFilter/date-range-filter.tsx +2 -1
- package/src/preact/dateRangeFilter/dateRangeOption.ts +2 -1
- package/src/preact/genomeViewer/CDSPlot.tsx +219 -0
- package/src/preact/genomeViewer/genome-data-viewer.stories.tsx +113 -0
- package/src/preact/genomeViewer/genome-data-viewer.tsx +69 -0
- package/src/preact/genomeViewer/loadGff3.spec.ts +61 -0
- package/src/preact/genomeViewer/loadGff3.ts +180 -0
- package/src/preact/lineageFilter/LineageFilterChangedEvent.ts +3 -1
- package/src/preact/lineageFilter/lineage-filter.stories.tsx +3 -2
- package/src/preact/locationFilter/LocationChangedEvent.ts +2 -1
- package/src/preact/locationFilter/location-filter.stories.tsx +3 -2
- package/src/preact/mutationFilter/mutation-filter.stories.tsx +3 -2
- package/src/preact/mutationFilter/mutation-filter.tsx +2 -1
- package/src/preact/numberRangeFilter/NumberRangeFilterChangedEvent.ts +31 -0
- package/src/preact/numberRangeFilter/number-range-filter.stories.tsx +383 -0
- package/src/preact/numberRangeFilter/number-range-filter.tsx +159 -0
- package/src/preact/numberRangeFilter/useSelectedRangeReducer.ts +137 -0
- package/src/preact/shared/charts/colors.ts +1 -1
- package/src/preact/textFilter/TextFilterChangedEvent.ts +3 -1
- package/src/preact/textFilter/text-filter.stories.tsx +4 -3
- package/src/utilEntrypoint.ts +2 -0
- package/src/utils/gsEventNames.ts +11 -0
- package/src/web-components/input/gs-date-range-filter.stories.ts +4 -3
- package/src/web-components/input/gs-date-range-filter.tsx +3 -2
- package/src/web-components/input/gs-lineage-filter.stories.ts +3 -2
- package/src/web-components/input/gs-lineage-filter.tsx +2 -1
- package/src/web-components/input/gs-location-filter.stories.ts +3 -2
- package/src/web-components/input/gs-location-filter.tsx +2 -1
- package/src/web-components/input/gs-mutation-filter.stories.ts +3 -2
- package/src/web-components/input/gs-mutation-filter.tsx +2 -1
- package/src/web-components/input/gs-number-range-filter.spec.ts +27 -0
- package/src/web-components/input/gs-number-range-filter.stories.ts +96 -0
- package/src/web-components/input/gs-number-range-filter.tsx +148 -0
- package/src/web-components/input/gs-text-filter.stories.ts +5 -4
- package/src/web-components/input/gs-text-filter.tsx +2 -1
- package/src/web-components/input/index.ts +1 -0
- package/src/web-components/visualization/gs-genome-data-viewer.spec-d.ts +18 -0
- package/src/web-components/visualization/gs-genome-data-viewer.stories.ts +108 -0
- package/src/web-components/visualization/gs-genome-data-viewer.tsx +59 -0
- package/src/web-components/visualization/index.ts +1 -0
- package/standalone-bundle/assets/mutationOverTimeWorker-jChgWnwp.js.map +1 -1
- package/standalone-bundle/dashboard-components.js +9613 -9059
- package/standalone-bundle/dashboard-components.js.map +1 -1
- 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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
1116
|
+
'gs-text-filter': TextFilterComponent;
|
|
1085
1117
|
}
|
|
1086
1118
|
interface HTMLElementEventMap {
|
|
1087
|
-
|
|
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-
|
|
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-
|
|
1135
|
+
'gs-lineage-filter': LineageFilterComponent;
|
|
1105
1136
|
}
|
|
1106
1137
|
interface HTMLElementEventMap {
|
|
1107
|
-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
1173
|
+
'gs-number-range-filter': NumberRangeFilterComponent;
|
|
1143
1174
|
}
|
|
1144
1175
|
interface HTMLElementEventMap {
|
|
1145
|
-
|
|
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-
|
|
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-
|
|
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,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
|
-
|
|
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(
|
|
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(
|
|
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} ${
|
|
63
|
-
${rangeColor} ${
|
|
64
|
-
${rangeColor} ${
|
|
65
|
-
${sliderColor} ${
|
|
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
|
|
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
|
|
9
|
-
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=
|
|
45
|
-
<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
|
|
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: [
|
|
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(
|
|
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
|
|
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(
|
|
337
|
-
canvasElement.addEventListener(
|
|
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(
|
|
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(
|
|
40
|
+
super(gsEventNames.dateRangeOptionChanged, {
|
|
40
41
|
detail,
|
|
41
42
|
bubbles: true,
|
|
42
43
|
composed: true,
|