@genspectrum/dashboard-components 0.16.4 → 0.17.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.
Files changed (47) hide show
  1. package/custom-elements.json +86 -61
  2. package/dist/{LineageFilterChangedEvent-COWV-Y0k.js → LineageFilterChangedEvent-DkvWdq_G.js} +2 -2
  3. package/dist/LineageFilterChangedEvent-DkvWdq_G.js.map +1 -0
  4. package/dist/components.d.ts +46 -34
  5. package/dist/components.js +304 -146
  6. package/dist/components.js.map +1 -1
  7. package/dist/style.css +76 -9
  8. package/dist/util.d.ts +11 -13
  9. package/dist/util.js +1 -1
  10. package/package.json +1 -1
  11. package/src/preact/components/clearable-select.stories.tsx +75 -0
  12. package/src/preact/components/clearable-select.tsx +76 -0
  13. package/src/preact/components/downshift-combobox.tsx +9 -7
  14. package/src/preact/dateRangeFilter/computeInitialValues.spec.ts +31 -33
  15. package/src/preact/dateRangeFilter/computeInitialValues.ts +2 -15
  16. package/src/preact/dateRangeFilter/date-picker.tsx +66 -0
  17. package/src/preact/dateRangeFilter/date-range-filter.stories.tsx +69 -31
  18. package/src/preact/dateRangeFilter/date-range-filter.tsx +136 -139
  19. package/src/preact/dateRangeFilter/dateRangeOption.ts +11 -11
  20. package/src/preact/shared/WithClassName/WithClassName.ts +1 -0
  21. package/src/preact/shared/icons/DeleteIcon.tsx +3 -0
  22. package/src/preact/shared/stories/expectOptionSelected.tsx +7 -0
  23. package/src/utilEntrypoint.ts +1 -1
  24. package/src/web-components/MutationAnnotations.mdx +33 -0
  25. package/src/web-components/ResizeContainer.mdx +1 -1
  26. package/src/web-components/errorHandling.mdx +1 -1
  27. package/src/web-components/gs-app.ts +2 -2
  28. package/src/web-components/input/gs-date-range-filter.stories.ts +38 -32
  29. package/src/web-components/input/gs-date-range-filter.tsx +8 -2
  30. package/src/web-components/input/gs-lineage-filter.tsx +1 -1
  31. package/src/web-components/input/gs-location-filter.tsx +1 -1
  32. package/src/web-components/input/gs-mutation-filter.tsx +1 -1
  33. package/src/web-components/input/gs-text-filter.tsx +1 -1
  34. package/src/web-components/visualization/gs-aggregate.tsx +2 -2
  35. package/src/web-components/visualization/gs-mutation-comparison.tsx +5 -2
  36. package/src/web-components/visualization/gs-mutations-over-time.tsx +5 -2
  37. package/src/web-components/visualization/gs-mutations.tsx +5 -2
  38. package/src/web-components/visualization/gs-number-sequences-over-time.tsx +2 -2
  39. package/src/web-components/visualization/gs-prevalence-over-time.tsx +2 -2
  40. package/src/web-components/visualization/gs-relative-growth-advantage.tsx +2 -2
  41. package/src/web-components/visualization/gs-sequences-by-location.tsx +2 -2
  42. package/src/web-components/visualization/gs-statistics.tsx +2 -2
  43. package/src/web-components/wastewaterVisualization/gs-wastewater-mutations-over-time.tsx +2 -2
  44. package/standalone-bundle/dashboard-components.js +6624 -6538
  45. package/standalone-bundle/dashboard-components.js.map +1 -1
  46. package/standalone-bundle/style.css +1 -1
  47. package/dist/LineageFilterChangedEvent-COWV-Y0k.js.map +0 -1
@@ -7,7 +7,7 @@ import DOMPurify from "dompurify";
7
7
  import { useRef, Grid } from "gridjs";
8
8
  import { Chart, registerables, Scale, BarController } from "chart.js";
9
9
  import { VennDiagramController, ArcSlice, extractSets } from "chartjs-chart-venn";
10
- import { v as views, s as sequenceTypeSchema, n as namedLapisFilterSchema, l as lapisFilterSchema, t as temporalGranularitySchema, b as dateRangeValueSchema, c as dateRangeOptionSchema, e as toYYYYMMDD, D as DateRangeOptionChangedEvent, f as lapisLocationFilterSchema, L as LocationChangedEvent, T as TextFilterChangedEvent, m as mutationsFilterSchema, a as LineageFilterChangedEvent } from "./LineageFilterChangedEvent-COWV-Y0k.js";
10
+ import { v as views, s as sequenceTypeSchema, n as namedLapisFilterSchema, l as lapisFilterSchema, t as temporalGranularitySchema, b as dateRangeValueSchema, c as dateRangeOptionSchema, e as toYYYYMMDD, D as DateRangeOptionChangedEvent, f as lapisLocationFilterSchema, L as LocationChangedEvent, T as TextFilterChangedEvent, m as mutationsFilterSchema, a as LineageFilterChangedEvent } from "./LineageFilterChangedEvent-DkvWdq_G.js";
11
11
  import { autoUpdate, computePosition, offset, shift, flip } from "@floating-ui/dom";
12
12
  import { ReactiveElement } from "@lit/reactive-element";
13
13
  import { BarWithErrorBarsController, BarWithErrorBar } from "chartjs-chart-error-bars";
@@ -3105,12 +3105,6 @@ html {
3105
3105
  --tw-bg-opacity: 1;
3106
3106
  background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));
3107
3107
  }
3108
-
3109
- .table-zebra tr.hover:hover,
3110
- .table-zebra tr.hover:nth-child(even):hover {
3111
- --tw-bg-opacity: 1;
3112
- background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));
3113
- }
3114
3108
  }
3115
3109
  .btn {
3116
3110
  display: inline-flex;
@@ -5130,6 +5124,9 @@ input.tab:checked + .tab-content,
5130
5124
  .right-0 {
5131
5125
  right: 0px;
5132
5126
  }
5127
+ .right-10 {
5128
+ right: 2.5rem;
5129
+ }
5133
5130
  .right-2 {
5134
5131
  right: 0.5rem;
5135
5132
  }
@@ -5279,9 +5276,6 @@ input.tab:checked + .tab-content,
5279
5276
  .w-\\[6rem\\] {
5280
5277
  width: 6rem;
5281
5278
  }
5282
- .w-\\[7\\.5rem\\] {
5283
- width: 7.5rem;
5284
- }
5285
5279
  .w-full {
5286
5280
  width: 100%;
5287
5281
  }
@@ -5289,6 +5283,9 @@ input.tab:checked + .tab-content,
5289
5283
  width: -moz-max-content;
5290
5284
  width: max-content;
5291
5285
  }
5286
+ .min-w-24 {
5287
+ min-width: 6rem;
5288
+ }
5292
5289
  .min-w-32 {
5293
5290
  min-width: 8rem;
5294
5291
  }
@@ -5310,6 +5307,10 @@ input.tab:checked + .tab-content,
5310
5307
  .grow {
5311
5308
  flex-grow: 1;
5312
5309
  }
5310
+ .-translate-y-1\\/2 {
5311
+ --tw-translate-y: -50%;
5312
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
5313
+ }
5313
5314
  .translate-x-\\[-50\\%\\] {
5314
5315
  --tw-translate-x: -50%;
5315
5316
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
@@ -5408,12 +5409,27 @@ input.tab:checked + .tab-content,
5408
5409
  border-bottom-right-radius: 0.375rem;
5409
5410
  border-bottom-left-radius: 0.375rem;
5410
5411
  }
5412
+ .rounded-b-none {
5413
+ border-bottom-right-radius: 0px;
5414
+ border-bottom-left-radius: 0px;
5415
+ }
5416
+ .rounded-t-md {
5417
+ border-top-left-radius: 0.375rem;
5418
+ border-top-right-radius: 0.375rem;
5419
+ }
5420
+ .rounded-t-none {
5421
+ border-top-left-radius: 0px;
5422
+ border-top-right-radius: 0px;
5423
+ }
5411
5424
  .rounded-tr-md {
5412
5425
  border-top-right-radius: 0.375rem;
5413
5426
  }
5414
5427
  .border {
5415
5428
  border-width: 1px;
5416
5429
  }
5430
+ .border-0 {
5431
+ border-width: 0px;
5432
+ }
5417
5433
  .border-2 {
5418
5434
  border-width: 2px;
5419
5435
  }
@@ -5455,6 +5471,9 @@ input.tab:checked + .tab-content,
5455
5471
  --tw-bg-opacity: 1;
5456
5472
  background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1));
5457
5473
  }
5474
+ .bg-transparent {
5475
+ background-color: transparent;
5476
+ }
5458
5477
  .bg-white {
5459
5478
  --tw-bg-opacity: 1;
5460
5479
  background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
@@ -5502,6 +5521,9 @@ input.tab:checked + .tab-content,
5502
5521
  .pl-2 {
5503
5522
  padding-left: 0.5rem;
5504
5523
  }
5524
+ .pr-14 {
5525
+ padding-right: 3.5rem;
5526
+ }
5505
5527
  .text-center {
5506
5528
  text-align: center;
5507
5529
  }
@@ -5700,6 +5722,51 @@ input.tab:checked + .tab-content,
5700
5722
  visibility: visible;
5701
5723
  }
5702
5724
  }
5725
+ @container (min-width: 14rem) {
5726
+
5727
+ .\\@4xs\\:flex-row {
5728
+ flex-direction: row;
5729
+ }
5730
+
5731
+ .\\@4xs\\:rounded-l-none {
5732
+ border-top-left-radius: 0px;
5733
+ border-bottom-left-radius: 0px;
5734
+ }
5735
+
5736
+ .\\@4xs\\:rounded-bl-md {
5737
+ border-bottom-left-radius: 0.375rem;
5738
+ }
5739
+
5740
+ .\\@4xs\\:rounded-tr-none {
5741
+ border-top-right-radius: 0px;
5742
+ }
5743
+ }
5744
+ @container (min-width: 28rem) {
5745
+
5746
+ .\\@md\\:flex-row {
5747
+ flex-direction: row;
5748
+ }
5749
+
5750
+ .\\@md\\:rounded-l-md {
5751
+ border-top-left-radius: 0.375rem;
5752
+ border-bottom-left-radius: 0.375rem;
5753
+ }
5754
+
5755
+ .\\@md\\:rounded-l-none {
5756
+ border-top-left-radius: 0px;
5757
+ border-bottom-left-radius: 0px;
5758
+ }
5759
+
5760
+ .\\@md\\:rounded-r-md {
5761
+ border-top-right-radius: 0.375rem;
5762
+ border-bottom-right-radius: 0.375rem;
5763
+ }
5764
+
5765
+ .\\@md\\:rounded-r-none {
5766
+ border-top-right-radius: 0px;
5767
+ border-bottom-right-radius: 0px;
5768
+ }
5769
+ }
5703
5770
  @media (min-width: 640px) {
5704
5771
 
5705
5772
  .sm\\:max-w-5xl {
@@ -11774,12 +11841,7 @@ const getDatesForSelectorValue = (initialSelectedDateRange, dateRangeOptions, ea
11774
11841
  function computeInitialValues(value, earliestDate, dateRangeOptions) {
11775
11842
  var _a;
11776
11843
  if (value === void 0) {
11777
- const { dateFrom: dateFrom2, dateTo: dateTo2 } = getDatesForSelectorValue(void 0, dateRangeOptions, earliestDate);
11778
- return {
11779
- initialSelectedDateRange: void 0,
11780
- initialSelectedDateFrom: dateFrom2,
11781
- initialSelectedDateTo: dateTo2
11782
- };
11844
+ return void 0;
11783
11845
  }
11784
11846
  if (typeof value === "string") {
11785
11847
  const selectableOptions = getSelectableOptions(dateRangeOptions);
@@ -11827,12 +11889,115 @@ function computeInitialValues(value, earliestDate, dateRangeOptions) {
11827
11889
  function isUndefinedOrEmpty(value) {
11828
11890
  return value === void 0 || value === "";
11829
11891
  }
11892
+ function DatePicker({
11893
+ onChange,
11894
+ value,
11895
+ minDate,
11896
+ maxDate,
11897
+ placeholderText,
11898
+ className
11899
+ }) {
11900
+ const inputRef = A$1(null);
11901
+ const [datePicker, setDatePicker] = d(null);
11902
+ y(() => {
11903
+ if (!inputRef.current) {
11904
+ return;
11905
+ }
11906
+ const instance = flatpickr(inputRef.current, {
11907
+ allowInput: true,
11908
+ dateFormat: "Y-m-d",
11909
+ defaultDate: value,
11910
+ minDate,
11911
+ maxDate
11912
+ });
11913
+ setDatePicker(instance);
11914
+ return () => {
11915
+ instance.destroy();
11916
+ };
11917
+ }, [maxDate, minDate, onChange, value]);
11918
+ if (value === void 0 && inputRef.current) {
11919
+ inputRef.current.value = "";
11920
+ }
11921
+ const handleChange = () => {
11922
+ const newValue = datePicker == null ? void 0 : datePicker.selectedDates[0];
11923
+ if (onChange) {
11924
+ onChange(newValue);
11925
+ }
11926
+ };
11927
+ return /* @__PURE__ */ u$1(
11928
+ "input",
11929
+ {
11930
+ className: `input input-bordered w-full ${className}`,
11931
+ type: "text",
11932
+ placeholder: placeholderText,
11933
+ ref: inputRef,
11934
+ onChange: handleChange,
11935
+ onBlur: handleChange
11936
+ }
11937
+ );
11938
+ }
11939
+ function DeleteIcon() {
11940
+ return /* @__PURE__ */ u$1(Fragment, { children: "×" });
11941
+ }
11942
+ const undefinedValue = "__undefined__";
11943
+ function ClearableSelect({
11944
+ items,
11945
+ initiallySelectedItem,
11946
+ onChange,
11947
+ placeholderText,
11948
+ className,
11949
+ value,
11950
+ selectClassName
11951
+ }) {
11952
+ const [selectedOption, setSelectedOption] = d(initiallySelectedItem ?? null);
11953
+ y(() => {
11954
+ if (value !== void 0) {
11955
+ setSelectedOption(value);
11956
+ }
11957
+ }, [value]);
11958
+ const handleClear = () => {
11959
+ setSelectedOption(null);
11960
+ if (onChange) {
11961
+ onChange(null);
11962
+ }
11963
+ };
11964
+ const handleChange = (event) => {
11965
+ const newValue = event.currentTarget.value;
11966
+ setSelectedOption(newValue);
11967
+ if (onChange) {
11968
+ onChange(newValue);
11969
+ }
11970
+ };
11971
+ return /* @__PURE__ */ u$1("div", { className: `relative inline min-w-24 ${className}`, children: [
11972
+ /* @__PURE__ */ u$1(
11973
+ "select",
11974
+ {
11975
+ className: `w-full select select-bordered pr-14 ${selectClassName}`,
11976
+ value: selectedOption ?? undefinedValue,
11977
+ onChange: handleChange,
11978
+ children: [
11979
+ /* @__PURE__ */ u$1("option", { value: undefinedValue, disabled: true, children: placeholderText ?? "Select an option" }),
11980
+ items.map((item) => /* @__PURE__ */ u$1("option", { value: item, children: item }, item))
11981
+ ]
11982
+ }
11983
+ ),
11984
+ selectedOption && /* @__PURE__ */ u$1(
11985
+ "button",
11986
+ {
11987
+ onClick: handleClear,
11988
+ className: "absolute right-10 top-1/2 -translate-y-1/2 bg-transparent border-0 cursor-pointer",
11989
+ children: /* @__PURE__ */ u$1(DeleteIcon, {})
11990
+ }
11991
+ )
11992
+ ] });
11993
+ }
11830
11994
  const customOption = "Custom";
11831
11995
  const dateRangeFilterInnerPropsSchema = z$2.object({
11832
11996
  dateRangeOptions: z$2.array(dateRangeOptionSchema),
11833
11997
  earliestDate: z$2.string().date(),
11834
- value: dateRangeValueSchema.optional(),
11835
- lapisDateField: z$2.string().min(1)
11998
+ value: dateRangeValueSchema,
11999
+ lapisDateField: z$2.string().min(1),
12000
+ placeholder: z$2.string().optional()
11836
12001
  });
11837
12002
  const dateRangeFilterPropsSchema = dateRangeFilterInnerPropsSchema.extend({
11838
12003
  width: z$2.string()
@@ -11846,118 +12011,104 @@ const DateRangeFilterInner = ({
11846
12011
  dateRangeOptions,
11847
12012
  earliestDate = "1900-01-01",
11848
12013
  value,
11849
- lapisDateField
12014
+ lapisDateField,
12015
+ placeholder
11850
12016
  }) => {
12017
+ var _a;
11851
12018
  const initialValues = T$1(
11852
12019
  () => computeInitialValues(value, earliestDate, dateRangeOptions),
11853
12020
  [value, earliestDate, dateRangeOptions]
11854
12021
  );
11855
- const fromDatePickerRef = A$1(null);
11856
- const toDatePickerRef = A$1(null);
11857
12022
  const divRef = A$1(null);
11858
- const [dateFromPicker, setDateFromPicker] = d(null);
11859
- const [dateToPicker, setDateToPicker] = d(null);
11860
- const [selectedDateRange, setSelectedDateRange] = d(
11861
- initialValues.initialSelectedDateRange
11862
- );
11863
- const [selectedDates, setSelectedDates] = d({
11864
- dateFrom: initialValues.initialSelectedDateFrom,
11865
- dateTo: initialValues.initialSelectedDateTo
11866
- });
11867
- y(() => {
11868
- setSelectedDateRange(initialValues.initialSelectedDateRange);
11869
- setSelectedDates({
12023
+ const getInitialState2 = q$1(() => {
12024
+ if (!initialValues) {
12025
+ return null;
12026
+ }
12027
+ return initialValues.initialSelectedDateRange ? {
12028
+ label: initialValues.initialSelectedDateRange,
12029
+ dateFrom: initialValues.initialSelectedDateFrom,
12030
+ dateTo: initialValues.initialSelectedDateTo
12031
+ } : {
12032
+ label: customOption,
11870
12033
  dateFrom: initialValues.initialSelectedDateFrom,
11871
12034
  dateTo: initialValues.initialSelectedDateTo
11872
- });
11873
- const commonConfig = {
11874
- allowInput: true,
11875
- dateFormat: "Y-m-d"
11876
12035
  };
11877
- if (fromDatePickerRef.current) {
11878
- setDateFromPicker(
11879
- flatpickr(fromDatePickerRef.current, {
11880
- ...commonConfig,
11881
- defaultDate: initialValues.initialSelectedDateFrom
11882
- })
11883
- );
11884
- }
11885
- if (toDatePickerRef.current) {
11886
- setDateToPicker(
11887
- flatpickr(toDatePickerRef.current, {
11888
- ...commonConfig,
11889
- defaultDate: initialValues.initialSelectedDateTo
11890
- })
11891
- );
12036
+ }, [initialValues]);
12037
+ const customComboboxValue = { label: customOption };
12038
+ const [options2, setOptions] = d(
12039
+ ((_a = getInitialState2()) == null ? void 0 : _a.label) === customOption ? [...dateRangeOptions, customComboboxValue] : [...dateRangeOptions]
12040
+ );
12041
+ const [state, setState] = d(getInitialState2());
12042
+ function updateState(newState) {
12043
+ setState(newState);
12044
+ fireFilterChangedEvent({ dateFrom: newState == null ? void 0 : newState.dateFrom, dateTo: newState == null ? void 0 : newState.dateTo, lapisDateField });
12045
+ fireOptionChangedEvent(newState);
12046
+ }
12047
+ y(() => {
12048
+ setState(getInitialState2());
12049
+ }, [getInitialState2]);
12050
+ const onSelectChange = (option) => {
12051
+ updateState(
12052
+ option !== null ? {
12053
+ label: option == null ? void 0 : option.label,
12054
+ dateFrom: getFromDate(option, earliestDate),
12055
+ dateTo: getToDate(option)
12056
+ } : null
12057
+ );
12058
+ if ((option == null ? void 0 : option.label) !== customOption) {
12059
+ setOptions([...dateRangeOptions]);
11892
12060
  }
11893
- return () => {
11894
- setDateFromPicker((prev) => {
11895
- prev == null ? void 0 : prev.destroy();
11896
- return null;
11897
- });
11898
- setDateToPicker((prev) => {
11899
- prev == null ? void 0 : prev.destroy();
11900
- return null;
11901
- });
11902
- };
11903
- }, [fromDatePickerRef, toDatePickerRef, initialValues]);
11904
- const onSelectChange = (value2) => {
11905
- setSelectedDateRange(value2);
11906
- const dateRange = getDatesForSelectorValue(value2, dateRangeOptions, earliestDate);
11907
- dateToPicker == null ? void 0 : dateToPicker.set("minDate", dateRange.dateFrom);
11908
- dateFromPicker == null ? void 0 : dateFromPicker.set("maxDate", dateRange.dateTo);
11909
- dateFromPicker == null ? void 0 : dateFromPicker.setDate(dateRange.dateFrom);
11910
- dateToPicker == null ? void 0 : dateToPicker.setDate(dateRange.dateTo);
11911
- setSelectedDates({
11912
- dateFrom: dateRange.dateFrom,
11913
- dateTo: dateRange.dateTo
11914
- });
11915
- fireFilterChangedEvent();
11916
- fireOptionChangedEvent(value2);
11917
12061
  };
11918
- const onChangeDateFrom = () => {
11919
- if (selectedDates.dateFrom.toDateString() === (dateFromPicker == null ? void 0 : dateFromPicker.selectedDates[0].toDateString())) {
12062
+ function getFromDate(option, earliestDate2) {
12063
+ if (!option || option.label === customOption) {
12064
+ return void 0;
12065
+ }
12066
+ return new Date((option == null ? void 0 : option.dateFrom) ?? earliestDate2);
12067
+ }
12068
+ function getToDate(option) {
12069
+ if (!option || option.label === customOption) {
12070
+ return void 0;
12071
+ }
12072
+ if (!option.dateTo) {
12073
+ return /* @__PURE__ */ new Date();
12074
+ }
12075
+ return new Date(option.dateTo);
12076
+ }
12077
+ const onChangeDateFrom = (date) => {
12078
+ var _a2;
12079
+ if ((date == null ? void 0 : date.toDateString()) === ((_a2 = state == null ? void 0 : state.dateFrom) == null ? void 0 : _a2.toDateString())) {
11920
12080
  return;
11921
12081
  }
11922
- const dateTo = dateToPicker == null ? void 0 : dateToPicker.selectedDates[0];
11923
- const dateFrom = dateFromPicker == null ? void 0 : dateFromPicker.selectedDates[0];
11924
- selectedDates.dateFrom = dateFrom || /* @__PURE__ */ new Date();
11925
- dateToPicker == null ? void 0 : dateToPicker.set("minDate", dateFrom);
11926
- setSelectedDateRange(customOption);
11927
- fireFilterChangedEvent();
11928
- fireOptionChangedEvent({
11929
- dateFrom: dateFrom !== void 0 ? toYYYYMMDD(dateFrom) : earliestDate,
11930
- dateTo: toYYYYMMDD(dateTo || /* @__PURE__ */ new Date())
12082
+ updateState({
12083
+ label: customOption,
12084
+ dateFrom: date,
12085
+ dateTo: state == null ? void 0 : state.dateTo
11931
12086
  });
12087
+ setOptions([...dateRangeOptions, customComboboxValue]);
11932
12088
  };
11933
- const onChangeDateTo = () => {
11934
- if (selectedDates.dateTo.toDateString() === (dateToPicker == null ? void 0 : dateToPicker.selectedDates[0].toDateString())) {
12089
+ const onChangeDateTo = (date) => {
12090
+ var _a2;
12091
+ if ((date == null ? void 0 : date.toDateString()) === ((_a2 = state == null ? void 0 : state.dateTo) == null ? void 0 : _a2.toDateString())) {
11935
12092
  return;
11936
12093
  }
11937
- const dateTo = dateToPicker == null ? void 0 : dateToPicker.selectedDates[0];
11938
- const dateFrom = dateFromPicker == null ? void 0 : dateFromPicker.selectedDates[0];
11939
- selectedDates.dateTo = dateTo || /* @__PURE__ */ new Date();
11940
- dateFromPicker == null ? void 0 : dateFromPicker.set("maxDate", dateTo);
11941
- setSelectedDateRange(customOption);
11942
- fireFilterChangedEvent();
11943
- fireOptionChangedEvent({
11944
- dateFrom: dateFrom !== void 0 ? toYYYYMMDD(dateFrom) : earliestDate,
11945
- dateTo: toYYYYMMDD(dateTo || /* @__PURE__ */ new Date())
12094
+ updateState({
12095
+ label: customOption,
12096
+ dateFrom: state == null ? void 0 : state.dateFrom,
12097
+ dateTo: date
11946
12098
  });
12099
+ setOptions([...dateRangeOptions, customComboboxValue]);
11947
12100
  };
11948
- const fireOptionChangedEvent = (option) => {
11949
- var _a;
11950
- (_a = divRef.current) == null ? void 0 : _a.dispatchEvent(new DateRangeOptionChangedEvent(option));
11951
- };
11952
- const fireFilterChangedEvent = () => {
11953
- var _a;
11954
- const dateFrom = dateFromPicker == null ? void 0 : dateFromPicker.selectedDates[0];
11955
- const dateTo = dateToPicker == null ? void 0 : dateToPicker.selectedDates[0];
12101
+ const fireFilterChangedEvent = ({
12102
+ dateFrom,
12103
+ dateTo,
12104
+ lapisDateField: lapisDateField2
12105
+ }) => {
12106
+ var _a2;
11956
12107
  const detail = {
11957
- ...dateFrom !== void 0 && { [`${lapisDateField}From`]: toYYYYMMDD(dateFrom) },
11958
- ...dateTo !== void 0 && { [`${lapisDateField}To`]: toYYYYMMDD(dateTo) }
12108
+ ...dateFrom !== void 0 && { [`${lapisDateField2}From`]: toYYYYMMDD(dateFrom) },
12109
+ ...dateTo !== void 0 && { [`${lapisDateField2}To`]: toYYYYMMDD(dateTo) }
11959
12110
  };
11960
- (_a = divRef.current) == null ? void 0 : _a.dispatchEvent(
12111
+ (_a2 = divRef.current) == null ? void 0 : _a2.dispatchEvent(
11961
12112
  new CustomEvent("gs-date-range-filter-changed", {
11962
12113
  detail,
11963
12114
  bubbles: true,
@@ -11965,49 +12116,51 @@ const DateRangeFilterInner = ({
11965
12116
  })
11966
12117
  );
11967
12118
  };
11968
- return /* @__PURE__ */ u$1("div", { class: "flex flex-wrap", ref: divRef, children: [
11969
- /* @__PURE__ */ u$1(
11970
- Select,
12119
+ const fireOptionChangedEvent = (state2) => {
12120
+ var _a2;
12121
+ const eventDetail = (state2 == null ? void 0 : state2.label) === customOption ? {
12122
+ dateFrom: state2.dateFrom !== void 0 ? toYYYYMMDD(state2.dateFrom) : void 0,
12123
+ dateTo: state2.dateTo !== void 0 ? toYYYYMMDD(state2.dateTo) : void 0
12124
+ } : state2 == null ? void 0 : state2.label;
12125
+ (_a2 = divRef.current) == null ? void 0 : _a2.dispatchEvent(new DateRangeOptionChangedEvent(eventDetail));
12126
+ };
12127
+ return /* @__PURE__ */ u$1("div", { className: "@container", ref: divRef, children: /* @__PURE__ */ u$1("div", { className: "flex min-w-[7.5rem] flex-col @md:flex-row", children: [
12128
+ /* @__PURE__ */ u$1("div", { className: "flex-grow", children: /* @__PURE__ */ u$1(
12129
+ ClearableSelect,
11971
12130
  {
11972
- items: [
11973
- ...getSelectableOptions(dateRangeOptions),
11974
- { label: customOption, value: customOption, disabled: true }
11975
- ],
11976
- selected: selectedDateRange ?? customOption,
11977
- selectStyle: "select-bordered rounded-none flex-grow min-w-[7.5rem]",
11978
- onChange: (event) => {
11979
- event.preventDefault();
11980
- const select = event.target;
11981
- const value2 = select.value;
11982
- onSelectChange(value2);
11983
- }
12131
+ items: options2.map((item) => item.label),
12132
+ placeholderText: placeholder,
12133
+ onChange: (value2) => {
12134
+ const dateRangeOption = options2.find((item) => item.label === value2);
12135
+ onSelectChange(dateRangeOption ?? null);
12136
+ },
12137
+ value: (state == null ? void 0 : state.label) ?? null,
12138
+ selectClassName: "rounded-t-md rounded-b-none @md:rounded-l-md @md:rounded-r-none"
11984
12139
  }
11985
- ),
11986
- /* @__PURE__ */ u$1("div", { className: "flex flex-wrap flex-grow", children: [
12140
+ ) }),
12141
+ /* @__PURE__ */ u$1("div", { className: "flex flex-grow flex-col @4xs:flex-row", children: [
11987
12142
  /* @__PURE__ */ u$1(
11988
- "input",
12143
+ DatePicker,
11989
12144
  {
11990
- class: "input input-bordered rounded-none flex-grow w-[7.5rem]",
11991
- type: "text",
11992
- placeholder: "Date from",
11993
- ref: fromDatePickerRef,
12145
+ className: "flex-grow min-w-[7.5rem] @4xs:rounded-bl-md @md:rounded-l-none rounded-none",
12146
+ value: state == null ? void 0 : state.dateFrom,
11994
12147
  onChange: onChangeDateFrom,
11995
- onBlur: onChangeDateFrom
12148
+ maxDate: state == null ? void 0 : state.dateTo,
12149
+ placeholderText: "Date from"
11996
12150
  }
11997
12151
  ),
11998
12152
  /* @__PURE__ */ u$1(
11999
- "input",
12153
+ DatePicker,
12000
12154
  {
12001
- class: "input input-bordered rounded-none flex-grow w-[7.5rem]",
12002
- type: "text",
12003
- placeholder: "Date to",
12004
- ref: toDatePickerRef,
12155
+ className: "flex-grow min-w-[7.5rem] rounded-b-md rounded-t-none @4xs:rounded-tr-none @4xs:rounded-l-none @md:rounded-r-md ",
12156
+ value: state == null ? void 0 : state.dateTo,
12005
12157
  onChange: onChangeDateTo,
12006
- onBlur: onChangeDateTo
12158
+ minDate: state == null ? void 0 : state.dateFrom,
12159
+ placeholderText: "Date to"
12007
12160
  }
12008
12161
  )
12009
12162
  ] })
12010
- ] });
12163
+ ] }) });
12011
12164
  };
12012
12165
  var __defProp$4 = Object.defineProperty;
12013
12166
  var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
@@ -12026,6 +12179,7 @@ let DateRangeFilterComponent = class extends PreactLitAdapter {
12026
12179
  this.earliestDate = "1900-01-01";
12027
12180
  this.value = void 0;
12028
12181
  this.width = "100%";
12182
+ this.placeholder = void 0;
12029
12183
  this.lapisDateField = "";
12030
12184
  }
12031
12185
  render() {
@@ -12036,7 +12190,8 @@ let DateRangeFilterComponent = class extends PreactLitAdapter {
12036
12190
  earliestDate: this.earliestDate,
12037
12191
  value: this.value,
12038
12192
  lapisDateField: this.lapisDateField,
12039
- width: this.width
12193
+ width: this.width,
12194
+ placeholder: this.placeholder
12040
12195
  }
12041
12196
  );
12042
12197
  }
@@ -12068,6 +12223,9 @@ __decorateClass$4([
12068
12223
  __decorateClass$4([
12069
12224
  n$1({ type: String })
12070
12225
  ], DateRangeFilterComponent.prototype, "width", 2);
12226
+ __decorateClass$4([
12227
+ n$1({ type: String })
12228
+ ], DateRangeFilterComponent.prototype, "placeholder", 2);
12071
12229
  __decorateClass$4([
12072
12230
  n$1({ type: String })
12073
12231
  ], DateRangeFilterComponent.prototype, "lapisDateField", 2);
@@ -15059,11 +15217,11 @@ function DownshiftCombobox({
15059
15217
  createEvent,
15060
15218
  itemToString: itemToString2,
15061
15219
  placeholderText,
15062
- formatItemInList
15220
+ formatItemInList,
15221
+ inputClassName = ""
15063
15222
  }) {
15064
15223
  var _a;
15065
- const initialSelectedItem = value ?? null;
15066
- const [itemsFilter, setItemsFilter] = d(itemToString2(initialSelectedItem));
15224
+ const [itemsFilter, setItemsFilter] = d(itemToString2(value));
15067
15225
  const items = T$1(
15068
15226
  () => allItems.filter((item) => filterItemsByInputValue(item, itemsFilter)),
15069
15227
  [allItems, filterItemsByInputValue, itemsFilter]
@@ -15102,7 +15260,7 @@ function DownshiftCombobox({
15102
15260
  itemToString(item) {
15103
15261
  return itemToString2(item);
15104
15262
  },
15105
- initialSelectedItem,
15263
+ selectedItem: value,
15106
15264
  environment
15107
15265
  });
15108
15266
  const onInputBlur = () => {
@@ -15124,7 +15282,7 @@ function DownshiftCombobox({
15124
15282
  /* @__PURE__ */ u$1("div", { className: "w-full flex flex-col gap-1", children: /* @__PURE__ */ u$1(
15125
15283
  "div",
15126
15284
  {
15127
- className: "flex gap-0.5 input input-bordered min-w-32",
15285
+ className: `flex gap-0.5 input input-bordered min-w-32 ${inputClassName}`,
15128
15286
  onBlur: (event) => {
15129
15287
  if (event.relatedTarget != buttonRef.current) {
15130
15288
  closeMenu();
@@ -15148,7 +15306,7 @@ function DownshiftCombobox({
15148
15306
  type: "button",
15149
15307
  onClick: clearInput,
15150
15308
  tabIndex: -1,
15151
- children: "×"
15309
+ children: /* @__PURE__ */ u$1(DeleteIcon, {})
15152
15310
  }
15153
15311
  ),
15154
15312
  /* @__PURE__ */ u$1(