+ );
}
CuratedResults.propTypes = {
- results: PropTypes.array.isRequired,
+ results: PropTypes.arrayOf(PropTypes.object).isRequired,
loadError: PropTypes.bool.isRequired,
};
diff --git a/src/components/UnifiedSearch.jsx b/src/components/UnifiedSearch.jsx
index 295a6322..28735845 100644
--- a/src/components/UnifiedSearch.jsx
+++ b/src/components/UnifiedSearch.jsx
@@ -411,7 +411,7 @@ export default function UnifiedSearch() {
if (curatedResults.length > 0) {
items.unshift({
key: "1",
- label: "Curated Matches of Split-GAL4 Lines to Cell Types",
+ label: `Curated Matches of Split-GAL4 Lines to Cell Types (${curatedResults.length} items)`,
children: curatedMatches,
extra: (
Date: Wed, 8 Jan 2025 11:07:12 -0500
Subject: [PATCH 17/34] testing: fix SearchInput tests after button name change
---
src/components/__tests__/SearchInput.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/__tests__/SearchInput.jsx b/src/components/__tests__/SearchInput.jsx
index 14fc238a..48b65105 100644
--- a/src/components/__tests__/SearchInput.jsx
+++ b/src/components/__tests__/SearchInput.jsx
@@ -12,7 +12,7 @@ describe("SearchInput: unit tests", () => {
);
- expect(getByText('Search'));
+ expect(getByText('Query'));
});
/* had to disable the accessibility test, because it throws an error due to
From b0ee4fc30042a1d8bb170547cd3df78400ac7e91 Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Wed, 15 Jan 2025 11:10:52 -0500
Subject: [PATCH 18/34] feat: Adds EM annotations to curated matches table
---
src/components/CuratedResults.jsx | 2 +-
src/components/UnifiedSearch.jsx | 36 +++++++++++++++++++++++++------
2 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/src/components/CuratedResults.jsx b/src/components/CuratedResults.jsx
index cc090e0a..b069ada3 100644
--- a/src/components/CuratedResults.jsx
+++ b/src/components/CuratedResults.jsx
@@ -27,7 +27,7 @@ const columns = [
key: "source",
},
{
- title: "Cell Type",
+ title: "Cell Type / Neuron ID",
dataIndex: "cellType",
key: "cellType",
render: (cellType) => {cellType},
diff --git a/src/components/UnifiedSearch.jsx b/src/components/UnifiedSearch.jsx
index 28735845..19597c39 100644
--- a/src/components/UnifiedSearch.jsx
+++ b/src/components/UnifiedSearch.jsx
@@ -31,28 +31,50 @@ function filterAndSortCuratedMatches(matches) {
// expand the matches.
const expanded = matches.flatMap((match) => {
if (match.itemType === "line_name") {
+ return match.matches.map((m) => {
+ const cellType = m.cell_type || `${m.dataset}:${m.body_id}`;
+ return {
+ name: match.name,
+ confidence: m.annotation,
+ anatomicalRegion: m.region,
+ cellType,
+ source: m.annotator,
+ };
+ });
+ }
+ if (match.itemType === "cell_type") {
return match.matches.map((m) => ({
- name: match.name,
+ name: m.line,
confidence: m.annotation,
anatomicalRegion: m.region,
- cellType: m.cell_type,
+ cellType: match.name,
+ source: m.annotator,
}));
}
- if (match.itemType === "cell_type") {
+ if (match.itemType === "body_id") {
return match.matches.map((m) => ({
name: m.line,
confidence: m.annotation,
anatomicalRegion: m.region,
- cellType: match.name,
+ cellType:`${m.dataset}:${match.name}`,
+ source: m.annotator,
}));
}
return [];
});
- // strip duplicates if cellType and name are the same
+ // strip duplicates if deep comparison is the same.
const deduped = expanded.filter(
- (v, i, a) =>
- a.findIndex((t) => t.cellType === v.cellType && t.name === v.name) === i,
+ (value, index, self) =>
+ index ===
+ self.findIndex(
+ (t) =>
+ t.name === value.name &&
+ t.confidence === value.confidence &&
+ t.anatomicalRegion === value.anatomicalRegion &&
+ t.cellType === value.cellType &&
+ t.source === value.source,
+ ),
);
// sort by name and then confidence, where confident comes before candidate.
deduped.sort((a, b) => {
From d9d102663b49329e2c75812d427c271fd253ef1b Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Wed, 15 Jan 2025 17:32:10 -0500
Subject: [PATCH 19/34] fix: reduce allowed search term length to 2 from 3
This needed to be done, so that people could search for cell types with
short names, like "EL".
---
src/components/Search.jsx | 6 +++---
src/components/UnifiedSearch.jsx | 28 +++++++++++++++++++++++-----
2 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/src/components/Search.jsx b/src/components/Search.jsx
index e8194dcc..055fb7a9 100644
--- a/src/components/Search.jsx
+++ b/src/components/Search.jsx
@@ -24,14 +24,14 @@ function Search() {
if (!searchTerm) {
return;
}
- if (searchTerm.length < 3) {
+ if (searchTerm.length < 2) {
message.error({
duration: 0,
- content: "Searches must have a minimum of 3 characters.",
+ content: "Searches must have a minimum of 2 characters.",
key: "searchminimum",
onClick: () => message.destroy("searchminimum"),
});
- setResults({ error: "Searches must have a minimum of 3 characters." });
+ setResults({ error: "Searches must have a minimum of 2 characters." });
return;
}
if (searchTerm.match(/\*(\*|\.)\*/)) {
diff --git a/src/components/UnifiedSearch.jsx b/src/components/UnifiedSearch.jsx
index 19597c39..40f28632 100644
--- a/src/components/UnifiedSearch.jsx
+++ b/src/components/UnifiedSearch.jsx
@@ -156,24 +156,25 @@ export default function UnifiedSearch() {
// don't let people search with strings shorter than 3 characters.
// This returns too many results.
- if (searchTerm.length < 3) {
+ if (searchTerm.length < 2) {
message.error({
duration: 0,
- content: "Searches must have a minimum of 3 characters.",
+ content: "Searches must have a minimum of 2 characters.",
key: "searchminimum",
onClick: () => message.destroy("searchminimum"),
});
setByLineResults({
- error: "Searches must have a minimum of 3 characters.",
+ error: "Searches must have a minimum of 2 characters.",
results: [],
});
setByBodyResults({
- error: "Searches must have a minimum of 3 characters.",
+ error: "Searches must have a minimum of 2 characters.",
results: [],
});
return;
}
+
if (searchTerm.match(/\*(\*|\.)\*/)) {
message.error({
duration: 0,
@@ -338,7 +339,17 @@ export default function UnifiedSearch() {
setBodyLoading(false);
});
})
- .catch((e) => setLoadError(e));
+ .catch((e) => {
+ message.error({
+ duration: 0,
+ content: e?.response?.data?.error || "There was a problem contacting the search service.",
+ key: "curated_error",
+ onClick: () => message.destroy("curated_error"),
+ });
+
+
+ setLoadError(true);
+ });
});
}
}, [
@@ -368,6 +379,13 @@ export default function UnifiedSearch() {
})
.catch((error) => {
setCuratedError(error);
+ message.error({
+ duration: 0,
+ content: error?.response?.data?.error || "There was a problem contacting the search service.",
+ key: "curated_error",
+ onClick: () => message.destroy("curated_error"),
+ });
+
});
});
}
From d882022e345e07f63f62a04ff20a15d58decd6eb Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Thu, 27 Feb 2025 09:41:34 -0500
Subject: [PATCH 20/34] fix: Adds a wildcard to the end of all curated
cell_types
In order to address some parent type/subtype uncertainty during the
curation process, we are linking to the wildcard search for a cell_type
so that all results are returned when clicking on it.
---
src/components/CuratedResults.jsx | 13 ++++++++++---
src/components/UnifiedSearch.jsx | 9 ++++++---
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/src/components/CuratedResults.jsx b/src/components/CuratedResults.jsx
index b069ada3..b7d55911 100644
--- a/src/components/CuratedResults.jsx
+++ b/src/components/CuratedResults.jsx
@@ -28,9 +28,16 @@ const columns = [
},
{
title: "Cell Type / Neuron ID",
- dataIndex: "cellType",
- key: "cellType",
- render: (cellType) => {cellType},
+ dataIndex: "matched",
+ key: "matched",
+ render: (matched, row) => {
+ // if the match is a cell type, then we add a wildcard to the search
+ // to get all the sub cell types.
+ if (row.type === 'cell_type') {
+ return {matched};
+ }
+ return {matched};
+ }
},
];
diff --git a/src/components/UnifiedSearch.jsx b/src/components/UnifiedSearch.jsx
index 40f28632..9e2eea04 100644
--- a/src/components/UnifiedSearch.jsx
+++ b/src/components/UnifiedSearch.jsx
@@ -37,7 +37,8 @@ function filterAndSortCuratedMatches(matches) {
name: match.name,
confidence: m.annotation,
anatomicalRegion: m.region,
- cellType,
+ matched: cellType,
+ type: "line_name",
source: m.annotator,
};
});
@@ -47,7 +48,8 @@ function filterAndSortCuratedMatches(matches) {
name: m.line,
confidence: m.annotation,
anatomicalRegion: m.region,
- cellType: match.name,
+ matched: match.name,
+ type: "cell_type",
source: m.annotator,
}));
}
@@ -56,7 +58,8 @@ function filterAndSortCuratedMatches(matches) {
name: m.line,
confidence: m.annotation,
anatomicalRegion: m.region,
- cellType:`${m.dataset}:${match.name}`,
+ matched:`${m.dataset}:${match.name}`,
+ type: "body_id",
source: m.annotator,
}));
}
From d523bf237ea087130b151a44a8c9a8d26f5d33ee Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Thu, 27 Feb 2025 11:03:41 -0500
Subject: [PATCH 21/34] fix: Adds addWildCard attribute to curated matches
This indicates if a wildcard should be added to the result when clicking
on it and adding it to the search bar.
---
src/components/CuratedResults.jsx | 11 +++--------
src/components/UnifiedSearch.jsx | 8 ++++++--
2 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/src/components/CuratedResults.jsx b/src/components/CuratedResults.jsx
index b7d55911..843af9f5 100644
--- a/src/components/CuratedResults.jsx
+++ b/src/components/CuratedResults.jsx
@@ -30,14 +30,9 @@ const columns = [
title: "Cell Type / Neuron ID",
dataIndex: "matched",
key: "matched",
- render: (matched, row) => {
- // if the match is a cell type, then we add a wildcard to the search
- // to get all the sub cell types.
- if (row.type === 'cell_type') {
- return {matched};
- }
- return {matched};
- }
+ // if the match is a cell type, then we add a wildcard to the search
+ // to get all the sub cell types.
+ render: (matched, row) => {matched},
},
];
diff --git a/src/components/UnifiedSearch.jsx b/src/components/UnifiedSearch.jsx
index 9e2eea04..c8e7ba5e 100644
--- a/src/components/UnifiedSearch.jsx
+++ b/src/components/UnifiedSearch.jsx
@@ -32,13 +32,15 @@ function filterAndSortCuratedMatches(matches) {
const expanded = matches.flatMap((match) => {
if (match.itemType === "line_name") {
return match.matches.map((m) => {
- const cellType = m.cell_type || `${m.dataset}:${m.body_id}`;
+ const matched = m.cell_type || `${m.dataset}:${m.body_id}`;
+ const addWildard = m.cell_type ? "*" : "";
return {
name: match.name,
confidence: m.annotation,
anatomicalRegion: m.region,
- matched: cellType,
+ matched,
type: "line_name",
+ addWildard,
source: m.annotator,
};
});
@@ -50,6 +52,7 @@ function filterAndSortCuratedMatches(matches) {
anatomicalRegion: m.region,
matched: match.name,
type: "cell_type",
+ addWildard: "*",
source: m.annotator,
}));
}
@@ -60,6 +63,7 @@ function filterAndSortCuratedMatches(matches) {
anatomicalRegion: m.region,
matched:`${m.dataset}:${match.name}`,
type: "body_id",
+ addWildard: "",
source: m.annotator,
}));
}
From 67f06045a3084194cafc9bfc1dde86dc67b7dc95 Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Mon, 3 Mar 2025 10:15:40 -0500
Subject: [PATCH 22/34] fix: removes incorrect "Additional matches ...."
message
When performing a wildcard search, there are times when the Additional
matches in different datasets" message would appear when it was not
supposed to. This is because the search could return multiple hits for
the wildcard, eg LHPD2c7* would return a hit for LHPD2c7 and LHPD2c7_R,
these contain 4 and 2 bodyIds respectively, with two of the bodyIds
overlapping. The code filtered out the duplicates at a later stage, but
did not do so, before the check that displays the "Additional matches
...." message. This adds a check to remove all bodyIds that have been
seen before and prevents the message from being shown at the wrong time.
---
src/components/UnifiedSearch.jsx | 24 ++++++++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/src/components/UnifiedSearch.jsx b/src/components/UnifiedSearch.jsx
index c8e7ba5e..63b6ef08 100644
--- a/src/components/UnifiedSearch.jsx
+++ b/src/components/UnifiedSearch.jsx
@@ -214,6 +214,8 @@ export default function UnifiedSearch() {
Auth.currentCredentials().then(() => {
setLoadError(false);
+
+
API.get("SearchAPI", "/published_names", {
queryStringParameters: { q: searchBodyIdOrName },
})
@@ -222,6 +224,8 @@ export default function UnifiedSearch() {
const bodyCombined = { results: [] };
const publishedNames = new Set();
+ const seenIds = new Set();
+
const allItems = items.names
.sort((a, b) => {
if (a.searchKey === b.searchKey) {
@@ -267,7 +271,14 @@ export default function UnifiedSearch() {
) {
return match.bodyIDs.map((body) => {
publishedNames.add(body);
- const bodyID = body.split(":").at(-1);
+ const [bodyID] = Object.entries(body)[0];
+ // skip if we have already seen this bodyID in one of the other
+ // matches. This happens when we use wildcard searches that return
+ // results for both the neuron type and the neuron instance. eg: LHPD2c7*
+ if (seenIds.has(bodyID)) {
+ return Promise.resolve();
+ }
+ seenIds.add(bodyID);
const byBodyUrl = `${appState.dataVersion}/metadata/by_body/${bodyID}.json`;
return Storage.get(byBodyUrl, storageOptions)
.then((metaData) =>
@@ -291,6 +302,10 @@ export default function UnifiedSearch() {
// once all the items have loaded, we can clean up.
allPromisses.then(() => {
+ // Set the foundItems count to the total number of items found
+ // in the search results. This is used to determine if we need to
+ // show the 'additional matches' message.
+ setFoundItems(bodyCombined.results.length);
// remove duplicates from the combined results. This can happen if we are
// loading data from a partial neurontype string, eg: WED01
if (bodyCombined.results.length > 0) {
@@ -319,13 +334,14 @@ export default function UnifiedSearch() {
!searchDataset.includes(":")
) {
bodyCombined.results = bodyCombined.results.filter((item) => {
- const [dataset, version, bodyid] =
- item.publishedName.split(":");
+ const [dataset, , bodyid] = item.publishedName.split(":");
const noVersion = `${dataset}:${bodyid}`;
return noVersion.match(searchRegex);
});
// filter out items that don't match the original searchTerm if a
- // dataset and version was used.
+ // dataset and version was used. For example, if the search term
+ // was 'manc:v1.2.1:12191' then we want to filter out any results
+ // that don't match the full search term, such as 'manc:v1.0:12191'
} else if (searchDataset && searchDataset.length > 0) {
bodyCombined.results = bodyCombined.results.filter((item) =>
item.publishedName.match(searchRegex),
From 0d7a077869643f606ebebbf30dbb5dbba03be5fd Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Wed, 12 Mar 2025 10:14:45 -0400
Subject: [PATCH 23/34] fix: Moves curated matches pagination to table bottom.
Moves the pagination controls to the bottom of the results table, to
make it more obvious that there are more than 2 results.
---
src/components/CuratedResults.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/CuratedResults.jsx b/src/components/CuratedResults.jsx
index 843af9f5..52cf43e9 100644
--- a/src/components/CuratedResults.jsx
+++ b/src/components/CuratedResults.jsx
@@ -43,7 +43,7 @@ export default function CuratedResults({ results, loadError }) {
}
let pagination = {
- position: ["topLeft"],
+ position: ["bottomLeft"],
pageSizeOptions: ["2", "5", "10", "15", "20"],
defaultPageSize: 2,
showSizeChanger: true,
From d267c7dd40e80277915cba462ca5f95023ac6a74 Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Wed, 12 Mar 2025 10:23:05 -0400
Subject: [PATCH 24/34] fix: Makes curated match count bold to highlight it.
The idea is to draw more attention to the result count, so people don't
think there are only 2 results.
---
src/components/UnifiedSearch.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/UnifiedSearch.jsx b/src/components/UnifiedSearch.jsx
index 63b6ef08..63d9eda2 100644
--- a/src/components/UnifiedSearch.jsx
+++ b/src/components/UnifiedSearch.jsx
@@ -474,7 +474,7 @@ export default function UnifiedSearch() {
if (curatedResults.length > 0) {
items.unshift({
key: "1",
- label: `Curated Matches of Split-GAL4 Lines to Cell Types (${curatedResults.length} items)`,
+ label:
Curated Matches of Split-GAL4 Lines to Cell Types ({curatedResults.length} items)
,
children: curatedMatches,
extra: (
Date: Thu, 3 Apr 2025 16:10:14 -0400
Subject: [PATCH 25/34] added help text for curated matches from Geoffrey
---
src/components/Help/HelpContents.jsx | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/src/components/Help/HelpContents.jsx b/src/components/Help/HelpContents.jsx
index 78ba1529..8a009b60 100644
--- a/src/components/Help/HelpContents.jsx
+++ b/src/components/Help/HelpContents.jsx
@@ -330,11 +330,22 @@ export default function HelpContents({ scroll }) {
Curated Results
- Curated results show detailed information about...
+ Curated results are based on human evaluations of EM cell types labeled in LM images of split-GAL4 lines. In general they should be more accurate than the average NeuronBridge image search hit. The name of the primary person evaluating the cell type is listed.
+
+ Curated results come from two sources:
+
+
Annotations generated as part of split-GAL4 publications, and included with releases posted to https://splitgal4.janelia.org.
+
Scoring of PatchPerPixMatch EM search results for a subset of the cell type lines published in Meissner et al., 2025. These scores and additional details may be published in a forthcoming standalone paper or addendum to the above paper.
+
-
-
+ Results have one of three confidence levels:
+
+
Confident: >95% confidence, based on detailed examination of all potential associations, similar to criteria for publication.
+
Probable: 70-95% confidence, an association that seems correct but has not been as fully validated.
+
Candidate: 30-70% confidence, where more work is needed for validation and there are often multiple candidates.
From 59614a2291aa2691d8987855741842381ed30f3b Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Fri, 17 Apr 2026 09:23:52 -0400
Subject: [PATCH 31/34] chore: bump version to 3.5.0 and add 3.4.0 release
notes
---
package.json | 2 +-
public/RELEASENOTES.md | 37 +++++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/package.json b/package.json
index a9914bd8..75f9243f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "neuronbridge",
- "version": "3.4.0",
+ "version": "3.5.0",
"private": true,
"dependencies": {
"@ant-design/icons": "^5.1.4",
diff --git a/public/RELEASENOTES.md b/public/RELEASENOTES.md
index 6909f125..493b09b1 100644
--- a/public/RELEASENOTES.md
+++ b/public/RELEASENOTES.md
@@ -1,3 +1,40 @@
+## VERSION 3.4.0 - 2025-04-17
+
+### Major Features
+
+ - **Aligned Volume Download for Custom Searches**: Custom search results now include a download link for the aligned volume, making it easier to retrieve aligned data for further analysis
+ - The "View in 3D" button is now available for custom uploads when an aligned volume exists
+ - The selected channel from mask selection is persisted to the search record
+
+ - **Searched Libraries Display**: The Color Depth Search step now shows which libraries were searched along with result counts, providing better visibility into search coverage
+
+### UI/UX Improvements
+
+ - **External Links Open in New Tabs**: All links to external sources now open in a new tab, preventing users from losing their place on the site
+ - **External Link Icons**: An external link icon has been added to all external links, making it clear when a link will navigate away from NeuronBridge
+ - **Additional Data Source Links**: Two additional links have been added to the landing page data sources list
+
+### Bug Fixes & Improvements
+
+ - **Search & Navigation**:
+ - Improved search result filtering and duplicate removal logic
+ - Fixed the default search library selection in the custom search form
+ - Fixed external EM links to use id instead of library
+ - Fixed the "View" button to be clickable anywhere on the button area
+ - Updated search examples for accuracy
+
+ - **Stability & Error Handling**:
+ - Added null check for error responses in the Results catch handler
+ - Added cacheControl headers to references.json fetch for improved caching
+
+### Content Updates
+
+ - Added CITATION.cff for Zenodo integration
+ - Added reference for Male CNS
+ - Updated site meta description
+
+---
+
## VERSION 3.3.1 - 2024-09-22
### Major Features
From 83f31d8242157d5949f8bfcf39044bac6777b6c3 Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Fri, 17 Apr 2026 09:33:04 -0400
Subject: [PATCH 32/34] docs: add 3.5.0 release notes
---
public/RELEASENOTES.md | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/public/RELEASENOTES.md b/public/RELEASENOTES.md
index 493b09b1..8e0b0c29 100644
--- a/public/RELEASENOTES.md
+++ b/public/RELEASENOTES.md
@@ -1,3 +1,33 @@
+## VERSION 3.5.0 - 2026-04-17
+
+### Major Features
+
+ - **Curated Matches of Split-GAL4 Lines to Cell Types**: Search results now include a curated matches section that displays expert-annotated associations between Split-GAL4 lines and cell types
+ - Results are shown in a collapsible, paginated table with confidence level (Confident/Candidate), anatomical region, and source columns
+ - Includes EM body ID annotations alongside cell type matches
+ - Curated matches appear above computed matches with a bookmark indicator when results are available
+ - Supports searching by line name, cell type, or body ID with wildcard expansion
+
+ - **Line Name Links**: Line names in search result metadata are now clickable links that navigate to a new search for that line
+
+### UI/UX Improvements
+
+ - **Search Input Updates**: The search button has been renamed from "Search" to "Query" and the minimum search term length has been reduced from 3 to 2 characters
+ - **Updated Search Examples**: The example search terms have been refreshed to showcase curated matches functionality
+ - **Constrained Results Width**: Search results are now constrained to a maximum width for improved readability
+ - **Help Documentation**: Added a new help section explaining the curated matches feature
+
+### Curated Results
+
+See the [Curated Results section of the help page](/help#curated_results) for details on confidence levels and data sources.
+
+### Content Updates
+
+ - Updated paper reference
+ - Added help text for curated matches
+
+---
+
## VERSION 3.4.0 - 2025-04-17
### Major Features
From a7b604109664a156e96ed4ab67539913bd94a2bf Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Fri, 17 Apr 2026 09:33:07 -0400
Subject: [PATCH 33/34] fix: scroll to hash anchor on mount instead of page top
---
src/components/ScrollToTopOnMount.jsx | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/components/ScrollToTopOnMount.jsx b/src/components/ScrollToTopOnMount.jsx
index 774b12db..8cce2ba1 100644
--- a/src/components/ScrollToTopOnMount.jsx
+++ b/src/components/ScrollToTopOnMount.jsx
@@ -2,6 +2,14 @@ import { useEffect } from "react";
function ScrollToTopOnMount() {
useEffect(() => {
+ const { hash } = window.location;
+ if (hash) {
+ const element = document.getElementById(hash.slice(1));
+ if (element) {
+ element.scrollIntoView();
+ return;
+ }
+ }
window.scrollTo(0, 0);
}, []);
From 0de5732cd81299562c987cc88d849a716bef0e7f Mon Sep 17 00:00:00 2001
From: Jody Clements
Date: Fri, 17 Apr 2026 09:43:47 -0400
Subject: [PATCH 34/34] chore: Updated release notes to remove unnecessary
details
---
public/RELEASENOTES.md | 30 ++----------------------------
1 file changed, 2 insertions(+), 28 deletions(-)
diff --git a/public/RELEASENOTES.md b/public/RELEASENOTES.md
index 8e0b0c29..32f84f8e 100644
--- a/public/RELEASENOTES.md
+++ b/public/RELEASENOTES.md
@@ -4,65 +4,39 @@
- **Curated Matches of Split-GAL4 Lines to Cell Types**: Search results now include a curated matches section that displays expert-annotated associations between Split-GAL4 lines and cell types
- Results are shown in a collapsible, paginated table with confidence level (Confident/Candidate), anatomical region, and source columns
- - Includes EM body ID annotations alongside cell type matches
- Curated matches appear above computed matches with a bookmark indicator when results are available
- - Supports searching by line name, cell type, or body ID with wildcard expansion
+ - See the [Curated Results section of the help page](/help#curated_results) for details on confidence levels and data sources.
- **Line Name Links**: Line names in search result metadata are now clickable links that navigate to a new search for that line
### UI/UX Improvements
- - **Search Input Updates**: The search button has been renamed from "Search" to "Query" and the minimum search term length has been reduced from 3 to 2 characters
- **Updated Search Examples**: The example search terms have been refreshed to showcase curated matches functionality
- - **Constrained Results Width**: Search results are now constrained to a maximum width for improved readability
- **Help Documentation**: Added a new help section explaining the curated matches feature
-### Curated Results
-
-See the [Curated Results section of the help page](/help#curated_results) for details on confidence levels and data sources.
-
-### Content Updates
-
- - Updated paper reference
- - Added help text for curated matches
-
---
-## VERSION 3.4.0 - 2025-04-17
+## VERSION 3.4.0 - 2026-04-17
### Major Features
- **Aligned Volume Download for Custom Searches**: Custom search results now include a download link for the aligned volume, making it easier to retrieve aligned data for further analysis
- The "View in 3D" button is now available for custom uploads when an aligned volume exists
- - The selected channel from mask selection is persisted to the search record
- **Searched Libraries Display**: The Color Depth Search step now shows which libraries were searched along with result counts, providing better visibility into search coverage
### UI/UX Improvements
- **External Links Open in New Tabs**: All links to external sources now open in a new tab, preventing users from losing their place on the site
- - **External Link Icons**: An external link icon has been added to all external links, making it clear when a link will navigate away from NeuronBridge
- - **Additional Data Source Links**: Two additional links have been added to the landing page data sources list
### Bug Fixes & Improvements
- **Search & Navigation**:
- Improved search result filtering and duplicate removal logic
- - Fixed the default search library selection in the custom search form
- Fixed external EM links to use id instead of library
- Fixed the "View" button to be clickable anywhere on the button area
- Updated search examples for accuracy
- - **Stability & Error Handling**:
- - Added null check for error responses in the Results catch handler
- - Added cacheControl headers to references.json fetch for improved caching
-
-### Content Updates
-
- - Added CITATION.cff for Zenodo integration
- - Added reference for Male CNS
- - Updated site meta description
-
---
## VERSION 3.3.1 - 2024-09-22