@genspectrum/dashboard-components 0.19.3 → 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/dist/util.d.ts CHANGED
@@ -157,6 +157,8 @@ export declare const gsEventNames: {
157
157
  readonly lineageFilterChanged: "gs-lineage-filter-changed";
158
158
  readonly locationChanged: "gs-location-changed";
159
159
  readonly textFilterChanged: "gs-text-filter-changed";
160
+ readonly numberRangeFilterChanged: "gs-number-range-filter-changed";
161
+ readonly numberRangeValueChanged: "gs-number-range-value-changed";
160
162
  };
161
163
 
162
164
  export declare type LapisFilter = default_2.infer<typeof lapisFilterSchema>;
@@ -960,7 +962,7 @@ declare global {
960
962
 
961
963
  declare global {
962
964
  interface HTMLElementTagNameMap {
963
- 'gs-wastewater-mutations-over-time': WastewaterMutationsOverTimeComponent;
965
+ 'gs-prevalence-over-time': PrevalenceOverTimeComponent;
964
966
  }
965
967
  }
966
968
 
@@ -968,7 +970,7 @@ declare global {
968
970
  declare global {
969
971
  namespace JSX {
970
972
  interface IntrinsicElements {
971
- 'gs-wastewater-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
973
+ 'gs-prevalence-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
972
974
  }
973
975
  }
974
976
  }
@@ -976,7 +978,7 @@ declare global {
976
978
 
977
979
  declare global {
978
980
  interface HTMLElementTagNameMap {
979
- 'gs-prevalence-over-time': PrevalenceOverTimeComponent;
981
+ 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;
980
982
  }
981
983
  }
982
984
 
@@ -984,7 +986,7 @@ declare global {
984
986
  declare global {
985
987
  namespace JSX {
986
988
  interface IntrinsicElements {
987
- 'gs-prevalence-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
989
+ 'gs-relative-growth-advantage': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
988
990
  }
989
991
  }
990
992
  }
@@ -992,7 +994,7 @@ declare global {
992
994
 
993
995
  declare global {
994
996
  interface HTMLElementTagNameMap {
995
- 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;
997
+ 'gs-aggregate': AggregateComponent;
996
998
  }
997
999
  }
998
1000
 
@@ -1000,7 +1002,7 @@ declare global {
1000
1002
  declare global {
1001
1003
  namespace JSX {
1002
1004
  interface IntrinsicElements {
1003
- 'gs-relative-growth-advantage': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1005
+ 'gs-aggregate': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1004
1006
  }
1005
1007
  }
1006
1008
  }
@@ -1008,7 +1010,7 @@ declare global {
1008
1010
 
1009
1011
  declare global {
1010
1012
  interface HTMLElementTagNameMap {
1011
- 'gs-aggregate': AggregateComponent;
1013
+ 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;
1012
1014
  }
1013
1015
  }
1014
1016
 
@@ -1016,7 +1018,7 @@ declare global {
1016
1018
  declare global {
1017
1019
  namespace JSX {
1018
1020
  interface IntrinsicElements {
1019
- 'gs-aggregate': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1021
+ 'gs-number-sequences-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1020
1022
  }
1021
1023
  }
1022
1024
  }
@@ -1040,7 +1042,7 @@ declare global {
1040
1042
 
1041
1043
  declare global {
1042
1044
  interface HTMLElementTagNameMap {
1043
- 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;
1045
+ 'gs-sequences-by-location': SequencesByLocationComponent;
1044
1046
  }
1045
1047
  }
1046
1048
 
@@ -1048,7 +1050,7 @@ declare global {
1048
1050
  declare global {
1049
1051
  namespace JSX {
1050
1052
  interface IntrinsicElements {
1051
- 'gs-number-sequences-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1053
+ 'gs-sequences-by-location': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1052
1054
  }
1053
1055
  }
1054
1056
  }
@@ -1056,7 +1058,11 @@ declare global {
1056
1058
 
1057
1059
  declare global {
1058
1060
  interface HTMLElementTagNameMap {
1059
- 'gs-sequences-by-location': SequencesByLocationComponent;
1061
+ 'gs-date-range-filter': DateRangeFilterComponent;
1062
+ }
1063
+ interface HTMLElementEventMap {
1064
+ [gsEventNames.dateRangeFilterChanged]: CustomEvent<Record<string, string>>;
1065
+ [gsEventNames.dateRangeOptionChanged]: DateRangeOptionChangedEvent;
1060
1066
  }
1061
1067
  }
1062
1068
 
@@ -1064,7 +1070,7 @@ declare global {
1064
1070
  declare global {
1065
1071
  namespace JSX {
1066
1072
  interface IntrinsicElements {
1067
- 'gs-sequences-by-location': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1073
+ 'gs-date-range-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1068
1074
  }
1069
1075
  }
1070
1076
  }
@@ -1072,7 +1078,10 @@ declare global {
1072
1078
 
1073
1079
  declare global {
1074
1080
  interface HTMLElementTagNameMap {
1075
- 'gs-statistics': StatisticsComponent;
1081
+ 'gs-location-filter': LocationFilterComponent;
1082
+ }
1083
+ interface HTMLElementEventMap {
1084
+ [gsEventNames.locationChanged]: LocationChangedEvent;
1076
1085
  }
1077
1086
  }
1078
1087
 
@@ -1080,7 +1089,7 @@ declare global {
1080
1089
  declare global {
1081
1090
  namespace JSX {
1082
1091
  interface IntrinsicElements {
1083
- 'gs-statistics': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1092
+ 'gs-location-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1084
1093
  }
1085
1094
  }
1086
1095
  }
@@ -1088,11 +1097,7 @@ declare global {
1088
1097
 
1089
1098
  declare global {
1090
1099
  interface HTMLElementTagNameMap {
1091
- 'gs-date-range-filter': DateRangeFilterComponent;
1092
- }
1093
- interface HTMLElementEventMap {
1094
- [gsEventNames.dateRangeFilterChanged]: CustomEvent<Record<string, string>>;
1095
- [gsEventNames.dateRangeOptionChanged]: DateRangeOptionChangedEvent;
1100
+ 'gs-statistics': StatisticsComponent;
1096
1101
  }
1097
1102
  }
1098
1103
 
@@ -1100,7 +1105,7 @@ declare global {
1100
1105
  declare global {
1101
1106
  namespace JSX {
1102
1107
  interface IntrinsicElements {
1103
- 'gs-date-range-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1108
+ 'gs-statistics': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1104
1109
  }
1105
1110
  }
1106
1111
  }
@@ -1108,10 +1113,10 @@ declare global {
1108
1113
 
1109
1114
  declare global {
1110
1115
  interface HTMLElementTagNameMap {
1111
- 'gs-location-filter': LocationFilterComponent;
1116
+ 'gs-text-filter': TextFilterComponent;
1112
1117
  }
1113
1118
  interface HTMLElementEventMap {
1114
- [gsEventNames.locationChanged]: LocationChangedEvent;
1119
+ [gsEventNames.textFilterChanged]: TextFilterChangedEvent;
1115
1120
  }
1116
1121
  }
1117
1122
 
@@ -1119,7 +1124,7 @@ declare global {
1119
1124
  declare global {
1120
1125
  namespace JSX {
1121
1126
  interface IntrinsicElements {
1122
- 'gs-location-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1127
+ 'gs-text-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1123
1128
  }
1124
1129
  }
1125
1130
  }
@@ -1127,10 +1132,10 @@ declare global {
1127
1132
 
1128
1133
  declare global {
1129
1134
  interface HTMLElementTagNameMap {
1130
- 'gs-text-filter': TextFilterComponent;
1135
+ 'gs-lineage-filter': LineageFilterComponent;
1131
1136
  }
1132
1137
  interface HTMLElementEventMap {
1133
- [gsEventNames.textFilterChanged]: TextFilterChangedEvent;
1138
+ [gsEventNames.lineageFilterChanged]: LineageFilterChangedEvent;
1134
1139
  }
1135
1140
  }
1136
1141
 
@@ -1138,7 +1143,7 @@ declare global {
1138
1143
  declare global {
1139
1144
  namespace JSX {
1140
1145
  interface IntrinsicElements {
1141
- 'gs-text-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1146
+ 'gs-lineage-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;
1142
1147
  }
1143
1148
  }
1144
1149
  }
@@ -1165,10 +1170,11 @@ declare global {
1165
1170
 
1166
1171
  declare global {
1167
1172
  interface HTMLElementTagNameMap {
1168
- 'gs-lineage-filter': LineageFilterComponent;
1173
+ 'gs-number-range-filter': NumberRangeFilterComponent;
1169
1174
  }
1170
1175
  interface HTMLElementEventMap {
1171
- [gsEventNames.lineageFilterChanged]: LineageFilterChangedEvent;
1176
+ [gsEventNames.numberRangeFilterChanged]: NumberRangeFilterChangedEvent;
1177
+ [gsEventNames.numberRangeValueChanged]: NumberRangeValueChangedEvent;
1172
1178
  }
1173
1179
  }
1174
1180
 
@@ -1176,7 +1182,23 @@ declare global {
1176
1182
  declare global {
1177
1183
  namespace JSX {
1178
1184
  interface IntrinsicElements {
1179
- '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>;
1180
1202
  }
1181
1203
  }
1182
1204
  }
package/dist/util.js CHANGED
@@ -1,4 +1,4 @@
1
- import { D, a, L, T, d, g, v } from "./LineageFilterChangedEvent-b0iuroUL.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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genspectrum/dashboard-components",
3
- "version": "0.19.3",
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",
@@ -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
+ }
@@ -256,7 +256,10 @@ export const ChangingTheValueProgrammatically: StoryObj<DateRangeFilterProps> =
256
256
 
257
257
  await step('Clearing the value from within the component is still possible', async () => {
258
258
  await waitFor(async () => {
259
- 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 () => {
260
263
  await expectOptionSelected(canvasElement, placeholder);
261
264
  });
262
265
  await waitFor(async () => {
@@ -10,7 +10,7 @@ const SplicedGeneData = `
10
10
  ##species https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=641809
11
11
  NC_026431.1 RefSeq region 1 982 . + . ID=NC_026431.1:1..982;Dbxref=taxon:641809;Name=7;collection-date=09-Apr-2009;country=USA: California state;gbkey=Src;genome=genomic;mol_type=viral cRNA;nat-host=Homo sapiens%3B gender M%3B age 54;segment=7;serotype=H1N1;strain=A/California/07/2009
12
12
  NC_026431.1 RefSeq CDS 1 26 . + 0 Name=M2;gene=M2;gbkey=CDS;locus_tag=UJ99_s7gp1;protein_id=YP_009118622.1;product=matrix protein 2;ID=cds-YP_009118622.1;Dbxref=GenBank:YP_009118622.1,GeneID:23308108
13
- NC_026431.1 RefSeq CDS 715 982 . + 1 Name=M2;gene=M2;gbkey=CDS;locus_tag=UJ99_s7gp1;protein_id=YP_009118622.1;product=matrix protein 2;ID=cds-YP_009118622.1;Dbxref=GenBank:YP_009118622.1,GeneID:23308108
13
+ NC_026431.1 RefSeq CDS 715 982 . + 1 Name="M2";gene=M2;gbkey=CDS;locus_tag=UJ99_s7gp1;protein_id=YP_009118622.1;product=matrix protein 2;ID=cds-YP_009118622.1;Dbxref=GenBank:YP_009118622.1,GeneID:23308108
14
14
  NC_026431.1 RefSeq CDS 1 759 . + 0 Name=M1;gene=M1;gbkey=CDS;locus_tag=UJ99_s7gp2;protein_id=YP_009118623.1;product=matrix protein 1;ID=cds-YP_009118623.1;Dbxref=GenBank:YP_009118623.1,GeneID:23308107
15
15
  NC_026431.1 RefSeq CDS 760 790 . + 0 Name=fakeGene;gene=fakeGene;gbkey=CDS;locus_tag=UJ99_s7fake;protein_id=YP_009118624.1;product=None;ID=cds-YP_009118624.1;Dbxref=GenBank:YP_009118624.1,GeneID:23308109
16
16
  `;
@@ -60,6 +60,10 @@ function getAttributes(attributes: string): Map<string, string> {
60
60
  return attrMap;
61
61
  }
62
62
 
63
+ function removeQuotes(input: string) {
64
+ return input.replace(/^['"](.*)['"]$/, '$1');
65
+ }
66
+
63
67
  function getCDSMap(lines: string[], genome_type: string, geneMap: CDSMap): CDSMap {
64
68
  for (const line of lines) {
65
69
  if (line.startsWith('#') || line.trim() === '') {
@@ -73,7 +77,7 @@ function getCDSMap(lines: string[], genome_type: string, geneMap: CDSMap): CDSMa
73
77
 
74
78
  const [, , type, startStr, endStr, , , , attributes] = fields;
75
79
 
76
- if (type.toLowerCase() !== genome_type.toLowerCase()) {
80
+ if (removeQuotes(type.toLowerCase()) !== genome_type.toLowerCase()) {
77
81
  continue;
78
82
  }
79
83
 
@@ -85,16 +89,18 @@ function getCDSMap(lines: string[], genome_type: string, geneMap: CDSMap): CDSMa
85
89
  }
86
90
 
87
91
  const attrPairs = getAttributes(attributes);
88
- const label = attrPairs.get('Name') || attrPairs.get('gene') || attrPairs.get('gene_name');
89
- if (!label) {
92
+ const labelAttribute = attrPairs.get('Name') || attrPairs.get('gene') || attrPairs.get('gene_name');
93
+ if (!labelAttribute) {
90
94
  throw new UserFacingError(
91
95
  'Invalid gff3 source',
92
96
  `No label found for feature: "${line}", must contain label in Name, gene, or gene_name attribute`,
93
97
  );
94
98
  }
95
- const id = attrPairs.get('ID') || label;
96
- if (attrPairs.get('Parent')) {
97
- const parent = attrPairs.get('Parent');
99
+ const label = removeQuotes(labelAttribute);
100
+ const id = removeQuotes(attrPairs.get('ID') || labelAttribute);
101
+ const parentAttribute = attrPairs.get('Parent');
102
+ if (parentAttribute) {
103
+ const parent = removeQuotes(parentAttribute);
98
104
  if (parent && parent in geneMap) {
99
105
  delete geneMap[parent];
100
106
  }
@@ -0,0 +1,31 @@
1
+ import z from 'zod';
2
+
3
+ import { gsEventNames } from '../../utils/gsEventNames';
4
+
5
+ type LapisNumberFilter = Record<string, number | undefined>;
6
+
7
+ export const numberRangeSchema = z.object({
8
+ min: z.number().optional(),
9
+ max: z.number().optional(),
10
+ });
11
+ export type NumberRange = z.infer<typeof numberRangeSchema>;
12
+
13
+ export class NumberRangeValueChangedEvent extends CustomEvent<NumberRange> {
14
+ constructor(detail: NumberRange) {
15
+ super(gsEventNames.numberRangeValueChanged, {
16
+ detail,
17
+ bubbles: true,
18
+ composed: true,
19
+ });
20
+ }
21
+ }
22
+
23
+ export class NumberRangeFilterChangedEvent extends CustomEvent<LapisNumberFilter> {
24
+ constructor(detail: LapisNumberFilter) {
25
+ super(gsEventNames.numberRangeFilterChanged, {
26
+ detail,
27
+ bubbles: true,
28
+ composed: true,
29
+ });
30
+ }
31
+ }