@genspectrum/dashboard-components 1.10.0 → 1.10.1

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/dist/util.d.ts CHANGED
@@ -942,7 +942,7 @@ declare global {
942
942
 
943
943
  declare global {
944
944
  interface HTMLElementTagNameMap {
945
- 'gs-genome-data-viewer': GenomeDataViewerComponent;
945
+ 'gs-mutation-comparison-component': MutationComparisonComponent;
946
946
  }
947
947
  }
948
948
 
@@ -950,7 +950,7 @@ declare global {
950
950
  declare global {
951
951
  namespace JSX {
952
952
  interface IntrinsicElements {
953
- 'gs-genome-data-viewer': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
953
+ 'gs-mutation-comparison-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
954
954
  }
955
955
  }
956
956
  }
@@ -958,7 +958,7 @@ declare global {
958
958
 
959
959
  declare global {
960
960
  interface HTMLElementTagNameMap {
961
- 'gs-mutation-comparison-component': MutationComparisonComponent;
961
+ 'gs-mutations': MutationsComponent;
962
962
  }
963
963
  }
964
964
 
@@ -966,7 +966,7 @@ declare global {
966
966
  declare global {
967
967
  namespace JSX {
968
968
  interface IntrinsicElements {
969
- 'gs-mutation-comparison-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
969
+ 'gs-mutations': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
970
970
  }
971
971
  }
972
972
  }
@@ -990,7 +990,7 @@ declare global {
990
990
 
991
991
  declare global {
992
992
  interface HTMLElementTagNameMap {
993
- 'gs-mutations': MutationsComponent;
993
+ 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;
994
994
  }
995
995
  }
996
996
 
@@ -998,7 +998,7 @@ declare global {
998
998
  declare global {
999
999
  namespace JSX {
1000
1000
  interface IntrinsicElements {
1001
- 'gs-mutations': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1001
+ 'gs-relative-growth-advantage': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1002
1002
  }
1003
1003
  }
1004
1004
  }
@@ -1006,7 +1006,7 @@ declare global {
1006
1006
 
1007
1007
  declare global {
1008
1008
  interface HTMLElementTagNameMap {
1009
- 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;
1009
+ 'gs-aggregate': AggregateComponent;
1010
1010
  }
1011
1011
  }
1012
1012
 
@@ -1014,7 +1014,7 @@ declare global {
1014
1014
  declare global {
1015
1015
  namespace JSX {
1016
1016
  interface IntrinsicElements {
1017
- 'gs-relative-growth-advantage': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1017
+ 'gs-aggregate': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1018
1018
  }
1019
1019
  }
1020
1020
  }
@@ -1022,7 +1022,7 @@ declare global {
1022
1022
 
1023
1023
  declare global {
1024
1024
  interface HTMLElementTagNameMap {
1025
- 'gs-aggregate': AggregateComponent;
1025
+ 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;
1026
1026
  }
1027
1027
  }
1028
1028
 
@@ -1030,7 +1030,7 @@ declare global {
1030
1030
  declare global {
1031
1031
  namespace JSX {
1032
1032
  interface IntrinsicElements {
1033
- 'gs-aggregate': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1033
+ 'gs-number-sequences-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1034
1034
  }
1035
1035
  }
1036
1036
  }
@@ -1038,7 +1038,7 @@ declare global {
1038
1038
 
1039
1039
  declare global {
1040
1040
  interface HTMLElementTagNameMap {
1041
- 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;
1041
+ 'gs-sequences-by-location': SequencesByLocationComponent;
1042
1042
  }
1043
1043
  }
1044
1044
 
@@ -1046,7 +1046,7 @@ declare global {
1046
1046
  declare global {
1047
1047
  namespace JSX {
1048
1048
  interface IntrinsicElements {
1049
- 'gs-number-sequences-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1049
+ 'gs-sequences-by-location': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1050
1050
  }
1051
1051
  }
1052
1052
  }
@@ -1070,7 +1070,7 @@ declare global {
1070
1070
 
1071
1071
  declare global {
1072
1072
  interface HTMLElementTagNameMap {
1073
- 'gs-sequences-by-location': SequencesByLocationComponent;
1073
+ 'gs-genome-data-viewer': GenomeDataViewerComponent;
1074
1074
  }
1075
1075
  }
1076
1076
 
@@ -1078,7 +1078,7 @@ declare global {
1078
1078
  declare global {
1079
1079
  namespace JSX {
1080
1080
  interface IntrinsicElements {
1081
- 'gs-sequences-by-location': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1081
+ 'gs-genome-data-viewer': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1082
1082
  }
1083
1083
  }
1084
1084
  }
@@ -1179,11 +1179,11 @@ declare global {
1179
1179
 
1180
1180
  declare global {
1181
1181
  interface HTMLElementTagNameMap {
1182
- 'gs-lineage-filter': LineageFilterComponent;
1182
+ 'gs-number-range-filter': NumberRangeFilterComponent;
1183
1183
  }
1184
1184
  interface HTMLElementEventMap {
1185
- [gsEventNames.lineageFilterChanged]: LineageFilterChangedEvent;
1186
- [gsEventNames.lineageFilterMultiChanged]: LineageMultiFilterChangedEvent;
1185
+ [gsEventNames.numberRangeFilterChanged]: NumberRangeFilterChangedEvent;
1186
+ [gsEventNames.numberRangeValueChanged]: NumberRangeValueChangedEvent;
1187
1187
  }
1188
1188
  }
1189
1189
 
@@ -1191,7 +1191,7 @@ declare global {
1191
1191
  declare global {
1192
1192
  namespace JSX {
1193
1193
  interface IntrinsicElements {
1194
- 'gs-lineage-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1194
+ 'gs-number-range-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1195
1195
  }
1196
1196
  }
1197
1197
  }
@@ -1199,11 +1199,11 @@ declare global {
1199
1199
 
1200
1200
  declare global {
1201
1201
  interface HTMLElementTagNameMap {
1202
- 'gs-number-range-filter': NumberRangeFilterComponent;
1202
+ 'gs-lineage-filter': LineageFilterComponent;
1203
1203
  }
1204
1204
  interface HTMLElementEventMap {
1205
- [gsEventNames.numberRangeFilterChanged]: NumberRangeFilterChangedEvent;
1206
- [gsEventNames.numberRangeValueChanged]: NumberRangeValueChangedEvent;
1205
+ [gsEventNames.lineageFilterChanged]: LineageFilterChangedEvent;
1206
+ [gsEventNames.lineageFilterMultiChanged]: LineageMultiFilterChangedEvent;
1207
1207
  }
1208
1208
  }
1209
1209
 
@@ -1211,7 +1211,7 @@ declare global {
1211
1211
  declare global {
1212
1212
  namespace JSX {
1213
1213
  interface IntrinsicElements {
1214
- 'gs-number-range-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1214
+ 'gs-lineage-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1215
1215
  }
1216
1216
  }
1217
1217
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genspectrum/dashboard-components",
3
- "version": "1.10.0",
3
+ "version": "1.10.1",
4
4
  "description": "GenSpectrum web components for building dashboards",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
@@ -171,7 +171,9 @@ export const SetsValueOnBlur: StoryObj<DateRangeFilterProps> = {
171
171
  },
172
172
  }),
173
173
  );
174
+ });
174
175
 
176
+ await waitFor(async () => {
175
177
  await expect(optionChangedListenerMock).toHaveBeenCalledWith(
176
178
  expect.objectContaining({
177
179
  detail: {
@@ -155,6 +155,54 @@ export const LineageFilter: StoryObj<Required<LineageFilterProps>> = {
155
155
  },
156
156
  };
157
157
 
158
+ export const LineageFilterStringValue: StoryObj<Required<LineageFilterProps>> = {
159
+ render: (args) => {
160
+ return html` <gs-app lapis="${LAPIS_URL}">
161
+ <div class="max-w-(--breakpoint-lg)">
162
+ <gs-lineage-filter
163
+ lapisField="pangoLineage"
164
+ placeholderText="Enter a lineage"
165
+ value="B.1.1.7"
166
+ .multiSelect=${args.multiSelect}
167
+ ></gs-lineage-filter>
168
+ </div>
169
+ </gs-app>`;
170
+ },
171
+ args: {
172
+ multiSelect: false,
173
+ },
174
+ play: async ({ canvasElement }) => {
175
+ const canvas = await withinShadowRoot(canvasElement, 'gs-lineage-filter');
176
+ await waitFor(() => {
177
+ return expect(canvas.getByPlaceholderText('Enter a lineage')).toBeVisible();
178
+ });
179
+ },
180
+ };
181
+
182
+ export const LineageFilterArrayValue: StoryObj<Required<LineageFilterProps>> = {
183
+ render: (args) => {
184
+ return html` <gs-app lapis="${LAPIS_URL}">
185
+ <div class="max-w-(--breakpoint-lg)">
186
+ <gs-lineage-filter
187
+ lapisField="pangoLineage"
188
+ placeholderText="Enter a lineage"
189
+ value='["B.1.1.7", "B.1.1.10"]'
190
+ .multiSelect=${args.multiSelect}
191
+ ></gs-lineage-filter>
192
+ </div>
193
+ </gs-app>`;
194
+ },
195
+ args: {
196
+ multiSelect: true,
197
+ },
198
+ play: async ({ canvasElement }) => {
199
+ const canvas = await withinShadowRoot(canvasElement, 'gs-lineage-filter');
200
+ await waitFor(() => {
201
+ return expect(canvas.getByPlaceholderText('Enter a lineage')).toBeVisible();
202
+ });
203
+ },
204
+ };
205
+
158
206
  export const DelayToShowLoadingState: StoryObj<Required<LineageFilterProps>> = {
159
207
  ...Template,
160
208
  parameters: {
@@ -49,7 +49,7 @@ export class LineageFilterComponent extends PreactLitAdapter {
49
49
  * Can be a string for single select mode or an array of strings (or comma-separated string) for multi-select mode.
50
50
  * Examples: "B.1.1.7" or ["B.1.1.7", "BA.5"] or "B.1.1.7,BA.5"
51
51
  */
52
- @property({ type: Array })
52
+ @property()
53
53
  value: string | string[] = '';
54
54
 
55
55
  /**
@@ -103,6 +103,33 @@ export class LineageFilterComponent extends PreactLitAdapter {
103
103
  @property({ type: Boolean })
104
104
  hideCounts: boolean | undefined = false;
105
105
 
106
+ override updated(changedProps: Map<string, unknown>) {
107
+ if (changedProps.has('value') || changedProps.has('multiSelect')) {
108
+ if (this.multiSelect) {
109
+ if (typeof this.value === 'string') {
110
+ let parsed: unknown;
111
+ try {
112
+ parsed = JSON.parse(this.value);
113
+ } catch {
114
+ parsed = this.value.split(',').map((s) => s.trim());
115
+ }
116
+
117
+ // type guard
118
+ if (Array.isArray(parsed) && parsed.every((v) => typeof v === 'string')) {
119
+ this.value = parsed;
120
+ } else {
121
+ this.value = [];
122
+ }
123
+ }
124
+ } else {
125
+ // single select: ensure value is a string
126
+ if (Array.isArray(this.value)) {
127
+ this.value = this.value[0] ?? '';
128
+ }
129
+ }
130
+ }
131
+ }
132
+
106
133
  override render() {
107
134
  return (
108
135
  <LineageFilter
@@ -162,13 +162,15 @@ export const FiresEvents: StoryObj<Required<TextFilterProps>> = {
162
162
  await step('Remove initial value', async () => {
163
163
  await userEvent.click(canvas.getByRole('button', { name: 'clear selection' }));
164
164
 
165
- await expect(listenerMock).toHaveBeenCalledWith(
166
- expect.objectContaining({
167
- detail: {
168
- host: undefined,
169
- },
170
- }),
171
- );
165
+ await waitFor(async () => {
166
+ await expect(listenerMock).toHaveBeenCalledWith(
167
+ expect.objectContaining({
168
+ detail: {
169
+ host: undefined,
170
+ },
171
+ }),
172
+ );
173
+ });
172
174
  });
173
175
  },
174
176
  args: {
@@ -40199,6 +40199,21 @@ let so = class extends zn {
40199
40199
  constructor() {
40200
40200
  super(...arguments), this.value = "", this.lapisField = "", this.multiSelect = !1, this.lapisFilter = {}, this.placeholderText = void 0, this.width = "100%", this.hideCounts = !1;
40201
40201
  }
40202
+ updated(n) {
40203
+ if (n.has("value") || n.has("multiSelect"))
40204
+ if (this.multiSelect) {
40205
+ if (typeof this.value == "string") {
40206
+ let e;
40207
+ try {
40208
+ e = JSON.parse(this.value);
40209
+ } catch {
40210
+ e = this.value.split(",").map((t) => t.trim());
40211
+ }
40212
+ Array.isArray(e) && e.every((t) => typeof t == "string") ? this.value = e : this.value = [];
40213
+ }
40214
+ } else
40215
+ Array.isArray(this.value) && (this.value = this.value[0] ?? "");
40216
+ }
40202
40217
  render() {
40203
40218
  return /* @__PURE__ */ v(
40204
40219
  vB,
@@ -40215,7 +40230,7 @@ let so = class extends zn {
40215
40230
  }
40216
40231
  };
40217
40232
  is([
40218
- U({ type: Array })
40233
+ U()
40219
40234
  ], so.prototype, "value", 2);
40220
40235
  is([
40221
40236
  U()