Skip to content
Merged
8 changes: 4 additions & 4 deletions backend/src/controllers/couchdb.controller.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const axios = require("axios");
const COUCHDB_BASE_URL =
process.env.COUCHDB_BASE_URL ||
"https://cors.redoc.ly/https://neurojson.io:7777";

// const COUCHDB_BASE_URL =
// process.env.COUCHDB_BASE_URL ||
// "https://cors.redoc.ly/https://neurojson.io:7777";
const COUCHDB_BASE_URL = "https://neurojson.io:7777";
// get all dbs list (registry)
const getDbList = async (req, res) => {
try {
Expand Down
2 changes: 1 addition & 1 deletion backend/src/routes/dbs.routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ router.get("/", getDbList);
router.get("/stats", getDbStats);

// cross-database search
router.get("/search", searchAllDatabases);
router.post("/search", searchAllDatabases);

// Specific database routes
router.get("/:dbName", getDbInfo);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -858,7 +858,14 @@ export const buildBidsPlan = async (
}

// Preserve raw YAML string for saving
const planYamlStr = raw.startsWith("```") ? planYaml._raw ?? raw : raw;
// const planYamlStr = raw.startsWith("```") ? planYaml._raw ?? raw : raw;
// Preserve raw YAML string for saving — strip markdown fences if present (mirrors planner.py Step 3)
let planYamlStr = raw.trim();
if (planYamlStr.startsWith("```yaml")) planYamlStr = planYamlStr.slice(7);
else if (planYamlStr.startsWith("```"))
planYamlStr = planYamlStr.split("\n").slice(1).join("\n");
if (planYamlStr.endsWith("```")) planYamlStr = planYamlStr.slice(0, -3);
planYamlStr = planYamlStr.trim();

log("✓ BIDSPlan complete");
return {
Expand Down
67 changes: 55 additions & 12 deletions src/pages/UpdatedDatasetDetailPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ import {
fetchDbInfoByDatasetId,
} from "redux/neurojson/neurojson.action";
import { NeurojsonSelector } from "redux/neurojson/neurojson.selector";
import { resetDocument } from "redux/neurojson/neurojson.slice";
// import { NeurojsonService } from "services/neurojson.service";
import RoutesEnum from "types/routes.enum";

Expand Down Expand Up @@ -262,7 +263,7 @@ const UpdatedDatasetDetailPage: React.FC = () => {
const [searchParams, setSearchParams] = useSearchParams();
const focus = searchParams.get("focus") || undefined; // get highlight from url
const rev = searchParams.get("rev") || undefined; // get revision from url

const [chart2DPreviewPath, setChart2DPreviewPath] = useState<string>("");
const [externalLinks, setExternalLinks] = useState<ExternalDataLink[]>([]);
const [internalLinks, setInternalLinks] = useState<InternalDataLink[]>([]);
const [isInternalExpanded, setIsInternalExpanded] = useState(true);
Expand All @@ -284,6 +285,14 @@ const UpdatedDatasetDetailPage: React.FC = () => {
? rawSummary
: Object.values(rawSummary).filter(Boolean).join("\n\n");
const readme = datasetDocument?.["README"] ?? "";

useEffect(() => {
window.__clear2DPath = () => setChart2DPreviewPath("");
return () => {
delete window.__clear2DPath;
};
}, []);

const handleSelectRevision = (newRev?: string | null) => {
setSearchParams((prev) => {
const p = new URLSearchParams(prev); // copy of the query url
Expand Down Expand Up @@ -335,7 +344,7 @@ const UpdatedDatasetDetailPage: React.FC = () => {
: "Unknown Size";

const parts = currentPath.split("/");
const subpath = parts.slice(-3).join("/");
const subpath = parts.slice(-6).join("/");
const label = parentKey || "ExternalData";

links.push({
Expand Down Expand Up @@ -478,6 +487,12 @@ const UpdatedDatasetDetailPage: React.FC = () => {
};
}, []);

// clean old dataset detail and metadata panel(include rev)
useEffect(() => {
dispatch(resetDocument()); // clear redux state
setRevsList([]); // clear local state
}, [dbName, docId, dispatch]);

useEffect(() => {
if (!dbName || !docId) return;

Expand All @@ -493,10 +508,10 @@ const UpdatedDatasetDetailPage: React.FC = () => {
const fromDoc = Array.isArray(datasetDocument?._revs_info)
? (datasetDocument._revs_info as { rev: string }[])
: [];
if (fromDoc.length && revsList.length === 0) {
setRevsList(fromDoc);
if (fromDoc.length > 0) {
setRevsList(fromDoc); // only update when we have revisions
}
}, [datasetDocument, revsList.length]);
}, [datasetDocument]);

useEffect(() => {
if (datasetDocument) {
Expand Down Expand Up @@ -625,7 +640,9 @@ const UpdatedDatasetDetailPage: React.FC = () => {
const handlePreview = (
dataOrUrl: string | any,
idx: number,
isInternal: boolean = false
isInternal: boolean = false,
previewPath: string = "",
displayNumber?: number
) => {
// console.log(
// "🟢 Preview button clicked for:",
Expand All @@ -635,6 +652,9 @@ const UpdatedDatasetDetailPage: React.FC = () => {
// "Is Internal:",
// isInternal
// );
setChart2DPreviewPath(
displayNumber ? `[${displayNumber}] ${previewPath}` : previewPath
);

// Clear any stale preview type from last run
delete (window as any).__previewType;
Expand Down Expand Up @@ -783,14 +803,14 @@ const UpdatedDatasetDetailPage: React.FC = () => {
// Try internal data first
const internal = internalMap.get(previewPath);
if (internal) {
handlePreview(internal.data, internal.index, true);
handlePreview(internal.data, internal.index, true, previewPath);
return;
}

// Then try external data by JSON path
const external = linkMap.get(previewPath);
if (external) {
handlePreview(external.url, external.index, false);
handlePreview(external.url, external.index, false, previewPath);
}
}, [
datasetDocument,
Expand Down Expand Up @@ -1324,7 +1344,12 @@ const UpdatedDatasetDetailPage: React.FC = () => {
},
}}
onClick={() =>
handlePreview(link.data, link.index, true)
handlePreview(
link.data,
link.index,
true,
link.path
)
}
>
Preview
Expand Down Expand Up @@ -1463,7 +1488,7 @@ const UpdatedDatasetDetailPage: React.FC = () => {
}}
title={link.name}
>
{link.name}
{index + 1}. {link.name}
</Typography>
<Box sx={{ display: "flex", flexShrink: 0, gap: 1 }}>
<Button
Expand Down Expand Up @@ -1500,7 +1525,13 @@ const UpdatedDatasetDetailPage: React.FC = () => {
},
}}
onClick={() =>
handlePreview(link.url, link.index, false)
handlePreview(
link.url,
link.index,
false,
link.path,
index + 1
)
}
>
Preview
Expand Down Expand Up @@ -1563,12 +1594,24 @@ const UpdatedDatasetDetailPage: React.FC = () => {
</Box>
</Box>

{chart2DPreviewPath && (
<Typography
sx={{
mt: 2,
mb: 0.5,
fontSize: "0.85rem",
color: Colors.lightBlue,
}}
>
Previewing: {chart2DPreviewPath}
</Typography>
)}
<div
id="chartpanel"
style={{
display: "none",
marginTop: "16px",
background: Colors.darkGray,
background: Colors.lightGray,
color: Colors.black,
padding: "12px",
borderRadius: "8px",
Expand Down
2 changes: 1 addition & 1 deletion src/redux/neurojson/neurojson.action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export const loadPaginatedData = createAsyncThunk(
return rejectWithValue("No more data to load.");
}

response.rows = response.rows.map((row) => ({
response.rows = response.rows.map((row: any) => ({
...row,
dbName,
}));
Expand Down
6 changes: 5 additions & 1 deletion src/redux/neurojson/neurojson.slice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ const neurojsonSlice = createSlice({
setLoading: (state, action: PayloadAction<boolean>) => {
state.loading = action.payload;
},
resetDocument: (state) => {
state.selectedDocument = null;
state.datasetViewInfo = null;
},
},
extraReducers: (builder) => {
builder
Expand Down Expand Up @@ -169,6 +173,6 @@ const neurojsonSlice = createSlice({
},
});

export const { resetData, setLoading } = neurojsonSlice.actions;
export const { resetData, setLoading, resetDocument } = neurojsonSlice.actions;

export default neurojsonSlice.reducer;
21 changes: 11 additions & 10 deletions src/services/instance.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios";

// export const baseURL =
// process.env.REACT_APP_BACK_URL ??
// "https://cors.redoc.ly/https://neurojson.io:7777";
// ==========not mapping neurojson.org and CouchDB requests to backend api yet==============
// const needsCorsProxy =
// process.env.REACT_APP_USE_CORS === "true" ||
// process.env.NODE_ENV === "development";

const needsCorsProxy =
process.env.REACT_APP_USE_CORS === "true" ||
process.env.NODE_ENV === "development";
// const backendURL = "https://neurojson.io:7777";

const backendURL = "https://neurojson.io:7777";
// export const baseURL = needsCorsProxy
// ? `https://cors.redoc.ly/${backendURL}`
// : backendURL;
//==========================================================================================

export const baseURL = needsCorsProxy
? `https://cors.redoc.ly/${backendURL}`
: backendURL;
export const baseURL =
process.env.REACT_APP_API_URL || "http://localhost:5000/api/v1";

export const api: AxiosInstance = axios.create({
baseURL,
Expand Down
Loading
Loading