Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
c83d518
Refactor DatasetsContent to utilize useDatasets hook for improved dat…
Creylay Jan 23, 2026
251de24
Refactor DatasetsContent to integrate useNotebooks hook and enhance d…
Creylay Jan 26, 2026
102f51c
Refactor DatasetsContent to utilize useDatasetUIState for improved UI…
Creylay Jan 26, 2026
37f1ce2
Refactor DatasetsContent to implement useDatasetFlow for enhanced dat…
Creylay Jan 26, 2026
45d3049
Refactor DatasetsContent to implement useDatasetActions for improved …
Creylay Jan 26, 2026
38936c3
Add useThreePanelLayout hook for managing three-panel layout with res…
Creylay Jan 27, 2026
0f0df8e
Refactor DatasetsContent to integrate useNotebookActions for improved…
Creylay Jan 27, 2026
e9865d7
Refactor DatasetsContent to utilize useLayoutActions for improved flo…
Creylay Jan 27, 2026
88e5f47
Refactor DatasetsContent to reorganize hooks into a dedicated dataset…
Creylay Jan 27, 2026
48a0f89
Refactor DatasetsContent to remove unused imports for cleaner code
Creylay Jan 27, 2026
683185a
Refactor DatasetsContent to implement three-panel layout with dedicat…
Creylay Jan 28, 2026
9432eb5
Refactor DatasetsContent and related components to reorganize panel s…
Creylay Jan 28, 2026
5e4cfde
Refactor DatasetsContent to import DatasetsCenterContent from the cor…
Creylay Jan 28, 2026
cb9707e
Refactor RightPanel to accept toggleButtonTop prop for dynamic positi…
Creylay Jan 28, 2026
d7264a3
Merge remote-tracking branch 'origin/develop' into refactor/datasets-…
Creylay Jan 28, 2026
c6d32ea
Refactor DatasetVisualization component to streamline imports and imp…
Creylay Jan 30, 2026
f0d261a
Add tourContextType prop to DatasetVisualization for enhanced tour fu…
Creylay Jan 30, 2026
36e307d
Refactor dataset handling in DatasetsContent and related components f…
Creylay Feb 3, 2026
3ca1216
Rename DatasetsNotebooksLeftBar component for better clarity
Creylay Feb 3, 2026
9845a56
Adds new DatasetAndNotebooks context and provider to manage all the s…
Creylay Feb 3, 2026
c0acd22
Refactor Datasets and Notebooks context to enhance state management a…
Creylay Feb 3, 2026
1005919
Refactor Datasets and Notebooks context to include rightBarContent st…
Creylay Feb 3, 2026
46544d5
Refactor dataset deletion logic by moving it to DatasetsNotebooksLeft…
Creylay Feb 3, 2026
64d9db8
Refactor DatasetsNotebooksLeftBar and DatasetsContent to streamline n…
Creylay Feb 3, 2026
b58856b
Refactor DatasetsNotebooksLeftBar and DatasetsContent to replace onNo…
Creylay Feb 3, 2026
2cb3c33
Refactor DatasetsNotebooksLeftBar and DatasetsContent to implement on…
Creylay Feb 3, 2026
27a43da
Refactor DatasetsNotebooksLeftBar and DatasetsCenterContent to implem…
Creylay Feb 3, 2026
ba477a3
Refactor DatasetsCenterContent and DatasetsContent to move handleNewN…
Creylay Feb 3, 2026
d82907d
Refactor DatasetsContent and DatasetsCenterContent to remove handleAd…
Creylay Feb 3, 2026
5e9b80c
Refactor DatasetsContent and remove unused hooks to improve code clar…
Creylay Feb 3, 2026
ac07e27
Refactor dataset deletion methods to unify under deleteDatasetById, i…
Creylay Feb 4, 2026
fc13a46
Refactor Header and HeaderBox components to improve layout alignment …
Creylay Feb 4, 2026
0fcfaf1
Refactor DatasetsCenterContent to remove t prop and utilize useTransl…
Creylay Feb 4, 2026
fe9729d
Refactor DatasetsCenterContent to streamline navigation logic by cons…
Creylay Feb 4, 2026
1769046
Refactor dataset deletion logic to improve error handling and user fe…
Creylay Feb 4, 2026
993e348
Refactor deleteDatasetById to remove unnecessary response logging, im…
Creylay Feb 4, 2026
b0cb8ae
Refactor notebook deletion logic to improve error handling and user f…
Creylay Feb 4, 2026
37c03e4
Refactor dataset handling to unify deleteDataset references across co…
Creylay Feb 4, 2026
07ee979
Refactor DatasetVisualization component to remove redundant state dec…
Creylay Feb 4, 2026
cd42c4b
Refactor DatasetVisualization component to improve dataset loading ha…
Creylay Feb 4, 2026
9501ada
Refactor DatasetVisualization props to improve clarity and consistenc…
Creylay Feb 5, 2026
3911abd
Refactor DatasetVisualization component to remove unused onItemCreate…
Creylay Feb 5, 2026
67f3e49
Refactor DatasetVisualization component to improve dataset fetching l…
Creylay Feb 5, 2026
c042ea4
Merge remote-tracking branch 'origin/develop' into refactor/datasets-…
Creylay Feb 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion DashAI/front/src/api/datasets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export const updateDataset = async (

export const deleteDataset = async (id: string): Promise<object> => {
const response = await api.delete(`${datasetEndpoint}/${id}`);
return response.data;
return response;
};

export const getDatasetFile = async (path: string, page = 0, pageSize = 5) => {
Expand Down
6 changes: 3 additions & 3 deletions DashAI/front/src/api/notebook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import api from "./api";
import { INotebook } from "../types/notebook";
import { IExplorer } from "../types/explorer";
import { IConverter } from "../types/converter";
import { IDataset } from "../types/dataset";

const notebookEndpoint = "/v1/notebook";

Expand Down Expand Up @@ -39,8 +38,9 @@ export const getConvertersByNotebookId = async (
return response.data;
};

export const deleteNotebook = async (id: number): Promise<void> => {
await api.delete(`${notebookEndpoint}/${id}`);
export const deleteNotebook = async (id: number): Promise<object> => {
const response = await api.delete(`${notebookEndpoint}/${id}`);
return response;
};

export const updateNotebook = async (
Expand Down
67 changes: 33 additions & 34 deletions DashAI/front/src/components/DatasetVisualization.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,23 @@ import { useCallback, useState, useEffect } from "react";
import {
Button,
Grid,
Paper,
Typography,
CircularProgress,
Box,
Chip,
Alert,
Divider,
Tabs,
Tab,
} from "@mui/material";
import { useTheme } from "@mui/material/styles";
import {
AddCircleOutline as AddIcon,
CheckCircle as CheckIcon,
} from "@mui/icons-material";
import { AddCircleOutline as AddIcon } from "@mui/icons-material";
import {
getDatasetFile,
getDatasetInfo,
getDatasetFileFiltered,
} from "../api/datasets";
import DatasetTable from "./notebooks/dataset/DatasetTable";
import { getComponents } from "../api/component";
import { useTourContext } from "./tour/TourProvider";
import { useSnackbar } from "notistack";
import JobQueueWidget from "./jobs/JobQueueWidget";
import { getDatasetStatus } from "../utils/datasetStatus";
import { formatDate } from "../pages/results/constants/formatDate";
import Header from "./notebooks/dataset/header/Header";
import Tooltip from "@mui/material/Tooltip";
Expand All @@ -39,63 +30,59 @@ import CorrelationsTab from "./notebooks/dataset/tabs/CorrelationsTab";
import { QualityAlerts } from "./notebooks/dataset/QualityAlerts";
import { TextTab } from "./notebooks/dataset/tabs/TextTab";
import { useTranslation } from "react-i18next";

import { useDatasetsAndNotebooks } from "./custom/contexts/DatasetsAndNotebooksContext";
/**
* Component to visualize dataset information including quality metrics, statistics, and data preview.
* Can be used across different modules (Notebooks, Models) with customizable action buttons.
* @param {Object} props
* @param {Object} props.dataset - Dataset object containing id, name, file_path, status, and created date
* @param {Function} props.onItemCreated - Callback function when a new item (notebook/session) is created
* @param {Function} props.onNewItem - Callback function when "New Item" button is clicked
* @param {string} [props.newItemButtonText="New Item"] - Custom text for the action button (e.g., "New Notebook", "New Session")
* @param {Array} [props.existingItems=[]] - Array of existing items (notebooks/sessions) for validation
*/
export default function DatasetVisualization({
dataset,
onItemCreated,
onNewItem,
newItemButtonText = "New Item",
existingItems = [],
tourContextType = null,
}) {
const { t } = useTranslation(["datasets", "common"]);
const theme = useTheme();

if (!dataset) {
return (
<Box
sx={{ display: "flex", justifyContent: "center", alignItems: "center" }}
>
<CircularProgress sx={{ color: theme.palette.primary.main }} />
<Typography>{t("common:loading")}</Typography>
</Box>
);
}

const [datasetInfo, setDatasetInfo] = useState(null);
const [tab, setTab] = useState(0);
const tourContext = useTourContext();

const status = dataset.status;
const isProcessing = !(status === 3 || status === 4); // Finished or Error

const { fetchDatasets } = useDatasetsAndNotebooks();

useEffect(() => {
if (!dataset) return;

setTab(0);
const fetchDatasetInfo = async () => {
if (isProcessing) return;

if (isProcessing) {
setTimeout(() => {
fetchDatasets();
}, 1000);
return;
}
try {
const info = await getDatasetInfo(dataset.id);
const info = await getDatasetInfo(Number(dataset.id));
setDatasetInfo(info);
} catch (error) {
setDatasetInfo(null);
}
};

fetchDatasetInfo();
}, [dataset.id, dataset.status]);
}, [dataset]);

// fetchPage compatible with server-side filtering
const fetchDatasetPage = useCallback(
async (page, pageSize, filterModel) => {
if (isProcessing) return { rows: [], total: 0 };
if (!dataset || isProcessing) return { rows: [], total: 0 };
try {
// Use getDatasetFile if no filters, else use getDatasetFileFiltered
const hasFilters =
Expand All @@ -118,11 +105,23 @@ export default function DatasetVisualization({
return { rows: [], total: 0 };
}
},
[dataset.file_path, dataset.status, dataset.id],
[
dataset && dataset.file_path,
dataset && dataset.status,
dataset && dataset.id,
],
);

const status = dataset.status;
const isProcessing = !(status === 3 || status === 4); // Finished or Error
if (!dataset) {
return (
<Box
sx={{ display: "flex", justifyContent: "center", alignItems: "center" }}
>
<CircularProgress sx={{ color: theme.palette.primary.main }} />
<Typography>{t("common:loading")}</Typography>
</Box>
);
}

return (
<>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import { createContext, useContext, useEffect, useState } from "react";

import { useTranslation } from "react-i18next";
import { useDatasets } from "../../../hooks/datasets/useDatasets";
import { useNotebooks } from "../../../hooks/datasets/useNotebooks";

const DatasetsAndNotebooksContext = createContext();

export const useDatasetsAndNotebooks = () =>
useContext(DatasetsAndNotebooksContext);

export const OptionsEnum = Object.freeze({
DATASET: "dataset",
NOTEBOOK: "notebook",
NEW: "new",
});

export const DatasetsAndNotebooksProvider = ({ children }) => {
const { t } = useTranslation(["datasets", "common"]);
const {
datasets,
createDataset,
selectedDatasetId,
fetchDatasets,
selectDataset,
clearSelectedDataset,
deleteDataset,
deleteDatasetById,
editDataset,
addDatasetOptimistically,
enrichDatasetsWithInfo,
replaceDatasets,
startDatasetPolling,
} = useDatasets({ t });

const {
notebooks,
selectedNotebookId,
fetchNotebooks,
selectNotebook,
clearSelectedNotebook,
deleteNotebookById,
editNotebook,
removeNotebooksByDatasetId,
} = useNotebooks({ t });

const [step, setStep] = useState(0);
const [selectedOption, setSelectedOption] = useState(OptionsEnum.NEW); // "datasets" or "notebooks"

const [rightBarContent, setRightBarContent] = useState(null);

useEffect(() => {
fetchDatasets();
fetchNotebooks();
}, []);

const value = {
datasets,
createDataset,
selectedDatasetId,
fetchDatasets,
selectDataset,
clearSelectedDataset,
deleteDataset,
deleteDatasetById,
editDataset,
addDatasetOptimistically,
enrichDatasetsWithInfo,
replaceDatasets,
startDatasetPolling,
notebooks,
selectedNotebookId,
fetchNotebooks,
selectNotebook,
clearSelectedNotebook,
deleteNotebookById,
editNotebook,
removeNotebooksByDatasetId,
selectedOption,
setSelectedOption,
step,
setStep,
rightBarContent,
setRightBarContent,
};

return (
<DatasetsAndNotebooksContext.Provider value={value}>
{children}
</DatasetsAndNotebooksContext.Provider>
);
};
2 changes: 1 addition & 1 deletion DashAI/front/src/components/generative/ParamsBar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
updateGenerativeSessionParams,
} from "../../api/generativeTask";
import { preprocessSchema, buildYupSchema } from "./utils";
import SideBar from "../threeSectionLayout/SideBar";
import SideBar from "../threeSectionLayout/panelContainers/SideBar";
import { useTranslation } from "react-i18next";

export default function ParamsBar({
Expand Down
2 changes: 1 addition & 1 deletion DashAI/front/src/components/generative/SessionBar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import InfoSessionModal from "./InfoSessionModal";
import Footer from "./Footer";
import SessionList from "./SessionList";
import NewItemButton from "../threeSectionLayout/NewItemButton";
import SideBar from "../threeSectionLayout/SideBar";
import SideBar from "../threeSectionLayout/panelContainers/SideBar";
import BarHeader from "../threeSectionLayout/BarHeader";
import { useTranslation } from "react-i18next";

Expand Down
15 changes: 15 additions & 0 deletions DashAI/front/src/components/layout/ModuleContainer.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Box } from "@mui/material";

export default function ModuleContainer({ children, ...props }) {
return (
<Box
height="calc(100vh - 74px)"
width="100%"
display="flex"
data-container="datasets"
{...props}
>
{children}
</Box>
);
}
2 changes: 1 addition & 1 deletion DashAI/front/src/components/models/LeftBar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import StorageIcon from "@mui/icons-material/Storage";
import Biotech from "@mui/icons-material/Biotech";
import Footer from "../threeSectionLayout/Footer";
import BarHeader from "../threeSectionLayout/BarHeader";
import SideBar from "../threeSectionLayout/SideBar";
import SideBar from "../threeSectionLayout/panelContainers/SideBar";
import CollapsibleList from "../threeSectionLayout/CollapsibleList";
import GroupedCollapsibleList from "../threeSectionLayout/GroupedCollapsibleList";
import SearchBar from "../threeSectionLayout/SearchBar";
Expand Down
2 changes: 1 addition & 1 deletion DashAI/front/src/components/models/RightBar.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
import { useTheme } from "@mui/material/styles";
import { ChevronRight, Search as SearchIcon } from "@mui/icons-material";
import { useSnackbar } from "notistack";
import SideBar from "../threeSectionLayout/SideBar";
import SideBar from "../threeSectionLayout/panelContainers/SideBar";
import { getComponents } from "../../api/component";
import ModelListItem from "./model/ModelListItem";
import { useTranslation } from "react-i18next";
Expand Down
Loading