From 45d36348bddec68038607d299230368b6ac5bf49 Mon Sep 17 00:00:00 2001
From: Lauri Himanen <lauri.himanen@physik.hu-berlin.de>
Date: Mon, 24 Mar 2025 14:28:39 +0000
Subject: [PATCH] Fixed issue with using quantities with explicit data types in
 menu histograms.

---
 gui/src/components/search/FilterRegistry.js   | 29 +++++++++----------
 gui/src/components/search/SearchContext.js    |  6 ++--
 .../components/search/input/InputHistogram.js |  5 ++--
 3 files changed, 18 insertions(+), 22 deletions(-)

diff --git a/gui/src/components/search/FilterRegistry.js b/gui/src/components/search/FilterRegistry.js
index cfe9f46e9a..946a412515 100644
--- a/gui/src/components/search/FilterRegistry.js
+++ b/gui/src/components/search/FilterRegistry.js
@@ -740,26 +740,25 @@ export function getStaticSuggestions(quantities, filterData) {
   return suggestions
 }
 
-// add a specific filter
-export function addFilter(filterPath, def, repeats, filtersData, setFiltersData) {
-  if (filterPath in filtersData) {
-    return
-  }
-  const newFilters = {}
-  const pathDtype = filterPath.split(schemaSeparator).slice(-1)[0]
-  const dtype = dtypeMap[getDatatype(def)] || pathDtype
-  // TODO: For some Nexus quantities, the data types cannot be fetched.
-  if (!dtype) {
-    return
-  }
+// Add a new filter to filterData on the fly: NOTE: this is a workaround for
+// enabling the search of unregistered search quantities.
+export function tryAddNewFilter(filterPath, def, repeats, filtersData, setFiltersData) {
+  if (filterPath in filtersData) return
+  const dtype = postFixMap[parseQuantityName(filterPath)?.dtype]
+  if (!dtype) return
+
   const params = {
     name: filterPath,
     quantity: filterPath,
     aggregatable: new Set([DType.String, DType.Enum, DType.Boolean]).has(getDatatype(def)),
-    repeats: repeats
+    repeats: repeats,
+    dtype: dtype
   }
-  newFilters[filterPath] = new Filter(def, params)
-  setFiltersData((old) => ({...old, ...newFilters}))
+  setFiltersData((old) => {
+    const newFilters = {...old}
+    newFilters[filterPath] = new Filter(def, params)
+    return newFilters
+  })
 }
 
 /**
diff --git a/gui/src/components/search/SearchContext.js b/gui/src/components/search/SearchContext.js
index dcffd4fce2..785b63db51 100644
--- a/gui/src/components/search/SearchContext.js
+++ b/gui/src/components/search/SearchContext.js
@@ -72,7 +72,7 @@ import UploadStatusIcon from '../uploads/UploadStatusIcon'
 import { getWidgetsObject } from './widgets/Widget'
 import { inputSectionContext } from './input/InputNestedObject'
 import { SearchSuggestion } from './SearchSuggestion'
-import { withSearchQuantities, addFilter } from './FilterRegistry'
+import { withSearchQuantities, tryAddNewFilter } from './FilterRegistry'
 import { useUnitContext } from '../units/UnitContext'
 
 const useWidthConstrainedStyles = makeStyles(theme => ({
@@ -1096,9 +1096,7 @@ export const SearchContextRaw = React.memo(({
       // trigger any required API calls that also return the aggregation
       // response that is returned by this hook.
       useEffect(() => {
-        if (!(name in filtersData)) {
-          addFilter(name, "", true, filtersData, setFiltersData)
-        }
+        tryAddNewFilter(name, "", true, filtersData, setFiltersData)
         const defaults = filtersData[name]?.aggs?.[config?.type]
         const finalConfig = {
           update: update,
diff --git a/gui/src/components/search/input/InputHistogram.js b/gui/src/components/search/input/InputHistogram.js
index 1a9fd25933..2e81a9f6a8 100644
--- a/gui/src/components/search/input/InputHistogram.js
+++ b/gui/src/components/search/input/InputHistogram.js
@@ -612,14 +612,13 @@ const InputHistogram = React.memo(({
   const {units} = useUnitContext()
   const styles = useInputHistogramStyles()
   const [scaleState, setScaleState] = useState(y?.scale || filterData[x?.search_quantity].scale)
-  const dtype = filterData[x.search_quantity].dtype
-  const isTime = dtype === DType.Timestamp
-  const autorangeFinal = isNil(autorange) ? isTime : autorange
   showStatistics = isStatisticsEnabled && showStatistics
 
   // Create final axis configs for the histogram
   const xAxis = useMemo(() => getAxisConfig(x, filterData, units), [x, filterData, units])
   const yAxis = useMemo(() => ({...y, scale: scaleState}), [scaleState, y])
+  const isTime = xAxis.dtype === DType.Timestamp
+  const autorangeFinal = isNil(autorange) ? isTime : autorange
 
   // Determine the description and title
   const def = filterData[x.search_quantity]
-- 
GitLab