From 425ae370321e36652740ab6e4e236ca4a5c4a9ba Mon Sep 17 00:00:00 2001
From: Nell Hardcastle <nell@dev-nell.com>
Date: Mon, 29 Apr 2024 09:25:43 -0700
Subject: [PATCH 1/2] feat(app): Implement search facets for DatasetType field

---
 .../scripts/search/initial-search-params.tsx  |  4 +++
 .../search/inputs/dataset-type-select.tsx     | 33 +++++++++++++++++++
 .../src/scripts/search/inputs/index.ts        |  2 ++
 .../src/scripts/search/search-container.tsx   |  2 ++
 .../src/scripts/search/search-params-ctx.tsx  |  2 ++
 .../src/search-page/FiltersBlock.tsx          | 13 +++++++-
 6 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 packages/openneuro-app/src/scripts/search/inputs/dataset-type-select.tsx

diff --git a/packages/openneuro-app/src/scripts/search/initial-search-params.tsx b/packages/openneuro-app/src/scripts/search/initial-search-params.tsx
index 53bdef0970..171c97e9a9 100644
--- a/packages/openneuro-app/src/scripts/search/initial-search-params.tsx
+++ b/packages/openneuro-app/src/scripts/search/initial-search-params.tsx
@@ -155,6 +155,8 @@ export interface SearchParams {
   tracerRadionuclides: string[]
   sortBy_available
   sortBy_selected
+  bidsDatasetType_available: string[]
+  bidsDatasetType_selected: string | null
 }
 
 // TODO: move to this initial state
@@ -237,6 +239,8 @@ const TEMPORARY_initialSearchParams: SearchParams = {
   tracerRadionuclides: [],
   sortBy_available: sortBy,
   sortBy_selected: sortBy[0],
+  bidsDatasetType_available: ["raw", "derivative"],
+  bidsDatasetType_selected: null,
 }
 
 export default TEMPORARY_initialSearchParams
diff --git a/packages/openneuro-app/src/scripts/search/inputs/dataset-type-select.tsx b/packages/openneuro-app/src/scripts/search/inputs/dataset-type-select.tsx
new file mode 100644
index 0000000000..1194007ff7
--- /dev/null
+++ b/packages/openneuro-app/src/scripts/search/inputs/dataset-type-select.tsx
@@ -0,0 +1,33 @@
+import React, { FC, useContext } from "react"
+import { SearchParamsCtx } from "../search-params-ctx"
+import { FacetSelect } from "@openneuro/components/facets"
+import { AccordionTab, AccordionWrap } from "@openneuro/components/accordion"
+
+const DatasetTypeSelect: FC = () => {
+  const { searchParams, setSearchParams } = useContext(SearchParamsCtx)
+
+  const { bidsDatasetType_selected, bidsDatasetType_available } = searchParams
+  const setDatasetType = (bidsDatasetType_selected) =>
+    setSearchParams((prevState) => ({
+      ...prevState,
+      bidsDatasetType_selected,
+    }))
+
+  return (
+    <AccordionWrap className="facet-accordion">
+      <AccordionTab
+        accordionStyle="plain"
+        label="Dataset Type"
+        startOpen={false}
+      >
+        <FacetSelect
+          selected={bidsDatasetType_selected}
+          setSelected={setDatasetType}
+          items={bidsDatasetType_available}
+        />
+      </AccordionTab>
+    </AccordionWrap>
+  )
+}
+
+export default DatasetTypeSelect
diff --git a/packages/openneuro-app/src/scripts/search/inputs/index.ts b/packages/openneuro-app/src/scripts/search/inputs/index.ts
index 5b9395c77b..539cd4228c 100644
--- a/packages/openneuro-app/src/scripts/search/inputs/index.ts
+++ b/packages/openneuro-app/src/scripts/search/inputs/index.ts
@@ -4,6 +4,7 @@ import ModalitySelect from "./modality-select"
 import ShowDatasetRadios from "./show-datasets-radios"
 import AgeRangeInput from "./age-range-input"
 import SubjectCountRangeInput from "./subject-count-range-input"
+import DatasetTypeSelect from "./dataset-type-select"
 import DiagnosisSelect from "./diagnosis-select"
 import TaskInput from "./task-input"
 import AuthorInput from "./author-input"
@@ -24,6 +25,7 @@ export {
   AllDatasetsToggle,
   AuthorInput,
   BodyPartsInput,
+  DatasetTypeSelect,
   DateRadios,
   DiagnosisSelect,
   KeywordInput,
diff --git a/packages/openneuro-app/src/scripts/search/search-container.tsx b/packages/openneuro-app/src/scripts/search/search-container.tsx
index e733aebe2f..31739e2f19 100644
--- a/packages/openneuro-app/src/scripts/search/search-container.tsx
+++ b/packages/openneuro-app/src/scripts/search/search-container.tsx
@@ -16,6 +16,7 @@ import {
   AllDatasetsToggle,
   AuthorInput,
   BodyPartsInput,
+  DatasetTypeSelect,
   DateRadios,
   DiagnosisSelect,
   KeywordInput,
@@ -166,6 +167,7 @@ const SearchContainer: FC<SearchContainerProps> = ({ portalContent }) => {
             {!portalContent
               ? <ModalitySelect portalStyles={true} label="Modalities" />
               : <ModalitySelect portalStyles={false} label="Choose Modality" />}
+            <DatasetTypeSelect />
             <AgeRangeInput />
             <SubjectCountRangeInput />
             <DiagnosisSelect />
diff --git a/packages/openneuro-app/src/scripts/search/search-params-ctx.tsx b/packages/openneuro-app/src/scripts/search/search-params-ctx.tsx
index 2d164f2ba7..89237bb3cc 100644
--- a/packages/openneuro-app/src/scripts/search/search-params-ctx.tsx
+++ b/packages/openneuro-app/src/scripts/search/search-params-ctx.tsx
@@ -123,6 +123,7 @@ export const getSelectParams = ({
   scannerManufacturersModelNames,
   tracerNames,
   tracerRadionuclides,
+  bidsDatasetType_selected,
 }) => ({
   keywords,
   modality_selected,
@@ -144,6 +145,7 @@ export const getSelectParams = ({
   scannerManufacturersModelNames,
   tracerNames,
   tracerRadionuclides,
+  bidsDatasetType_selected,
 })
 
 /**
diff --git a/packages/openneuro-components/src/search-page/FiltersBlock.tsx b/packages/openneuro-components/src/search-page/FiltersBlock.tsx
index 84ef38645f..e65a16f22d 100644
--- a/packages/openneuro-components/src/search-page/FiltersBlock.tsx
+++ b/packages/openneuro-components/src/search-page/FiltersBlock.tsx
@@ -6,7 +6,6 @@ import { TermListItem } from "./TermListItem"
 import { FacetSelectValueType } from "../facets/FacetSelect"
 import { NeurobagelSearch } from "./NeurobagelSearch"
 
-
 export interface FiltersBlockProps {
   keywords: string[]
   modality_selected?: FacetSelectValueType
@@ -33,6 +32,7 @@ export interface FiltersBlockProps {
   removeAllFilters?(): void
   numTotalResults: number
   loading: boolean
+  bidsDatasetType_selected?: FacetSelectValueType
 }
 
 export const FiltersBlock = ({
@@ -61,6 +61,7 @@ export const FiltersBlock = ({
   removeFilterItem,
   removeAllFilters,
   numTotalResults,
+  bidsDatasetType_selected,
 }: FiltersBlockProps) => {
   const ageRangeIsNull =
     JSON.stringify(ageRange) === JSON.stringify([null, null])
@@ -114,6 +115,16 @@ export const FiltersBlock = ({
             removeFilterItem={removeFilterItem(true)}
           />
         )}
+        {bidsDatasetType_selected && (
+          <FilterListItem
+            type="Dataset Type"
+            item={{
+              param: "bidsDatasetType_selected",
+              value: bidsDatasetType_selected,
+            }}
+            removeFilterItem={removeFilterItem()}
+          />
+        )}
         {!searchAllDatasets && (
           <>
             {datasetType_selected && (

From 5523972f4188830afe1b864d7e36659a58881fe8 Mon Sep 17 00:00:00 2001
From: Nell Hardcastle <nell@dev-nell.com>
Date: Thu, 2 May 2024 09:28:35 -0700
Subject: [PATCH 2/2] fix(app): Allow removal of DatasetType filters

---
 packages/openneuro-components/src/search-page/FiltersBlock.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/openneuro-components/src/search-page/FiltersBlock.tsx b/packages/openneuro-components/src/search-page/FiltersBlock.tsx
index e65a16f22d..5e71b95f2a 100644
--- a/packages/openneuro-components/src/search-page/FiltersBlock.tsx
+++ b/packages/openneuro-components/src/search-page/FiltersBlock.tsx
@@ -122,7 +122,7 @@ export const FiltersBlock = ({
               param: "bidsDatasetType_selected",
               value: bidsDatasetType_selected,
             }}
-            removeFilterItem={removeFilterItem()}
+            removeFilterItem={removeFilterItem(true)}
           />
         )}
         {!searchAllDatasets && (