From ff2228830612256d18fc19f0479ec6771f207425 Mon Sep 17 00:00:00 2001 From: Felipe Date: Mon, 6 Apr 2026 08:11:44 -0400 Subject: [PATCH 1/3] fix: add loading state for tasks in Models and SelectOptionMenu components --- .../components/models/ModelCenterContent.jsx | 2 + .../src/components/models/ModelsContext.jsx | 2 + .../threeSectionLayout/SelectOptionMenu.jsx | 59 ++++++++++++------- DashAI/front/src/hooks/models/useSessions.js | 5 ++ .../front/src/pages/models/ModelsContent.jsx | 27 ++------- 5 files changed, 50 insertions(+), 45 deletions(-) diff --git a/DashAI/front/src/components/models/ModelCenterContent.jsx b/DashAI/front/src/components/models/ModelCenterContent.jsx index 6119a9f99..83e02da3d 100644 --- a/DashAI/front/src/components/models/ModelCenterContent.jsx +++ b/DashAI/front/src/components/models/ModelCenterContent.jsx @@ -15,6 +15,7 @@ export default function ModelsCenterContent() { setSessions, selectedTask, tasks, + loadingTasks, datasets, selectedDatasetId, step, @@ -93,6 +94,7 @@ export default function ModelsCenterContent() { /> ) : step === 0 ? ( - {filteredOptions.map((option, index) => { - const { name, display_name, description, Icon, ...otherProps } = - option; + {loading + ? Array.from({ length: 6 }).map((_, index) => ( + + + + )) + : null} + {!loading && + filteredOptions.map((option, index) => { + const { name, display_name, description, Icon, ...otherProps } = + option; - return ( - - goToNextStep(option.name)} - Icon={Icon} - dataTour={ - dataTour && dataTourTarget && name === dataTourTarget - ? dataTour - : dataTour && !dataTourTarget + return ( + + goToNextStep(option.name)} + Icon={Icon} + dataTour={ + dataTour && dataTourTarget && name === dataTourTarget ? dataTour - : undefined - } - {...otherProps} - /> - - ); - })} + : dataTour && !dataTourTarget + ? dataTour + : undefined + } + {...otherProps} + /> + + ); + })} diff --git a/DashAI/front/src/hooks/models/useSessions.js b/DashAI/front/src/hooks/models/useSessions.js index 911d0c913..59cca91fb 100644 --- a/DashAI/front/src/hooks/models/useSessions.js +++ b/DashAI/front/src/hooks/models/useSessions.js @@ -21,6 +21,7 @@ import { startJobPolling } from "../../utils/jobPoller"; export function useSessions({ t }) { const { enqueueSnackbar } = useSnackbar(); const [tasks, setTasks] = useState([]); + const [loadingTasks, setLoadingTasks] = useState(true); const [selectedTask, setSelectedTask] = useState(null); const [selectedSessionId, setSelectedSessionId] = useState(null); const [selectedSession, setSelectedSession] = useState(null); @@ -45,6 +46,7 @@ export function useSessions({ t }) { }, [enqueueSnackbar, t]); const fetchTasks = useCallback(async () => { + setLoadingTasks(true); try { const data = await getComponents({ selectTypes: ["Task"], @@ -56,6 +58,8 @@ export function useSessions({ t }) { variant: "error", }); console.error("Failed to fetch tasks:", error); + } finally { + setLoadingTasks(false); } }, [enqueueSnackbar, t]); @@ -274,6 +278,7 @@ export function useSessions({ t }) { return { tasks, + loadingTasks, setTasks, selectedTask, setSelectedTask, diff --git a/DashAI/front/src/pages/models/ModelsContent.jsx b/DashAI/front/src/pages/models/ModelsContent.jsx index 136d7ec35..299a82865 100644 --- a/DashAI/front/src/pages/models/ModelsContent.jsx +++ b/DashAI/front/src/pages/models/ModelsContent.jsx @@ -1,5 +1,4 @@ -import { useEffect, useState } from "react"; -import { Box, CircularProgress } from "@mui/material"; +import { useEffect } from "react"; import { useLocation } from "react-router-dom"; import { useTranslation } from "react-i18next"; import { TourProvider } from "../../components/tour/TourProvider"; @@ -20,7 +19,6 @@ import { useModels } from "../../components/models/ModelsContext"; export default function ModelsContent() { const location = useLocation(); const threePanelLayout = useThreePanelLayout(); - const [isInitialLoading, setIsInitialLoading] = useState(true); const { t } = useTranslation(["models"]); const { @@ -38,11 +36,9 @@ export default function ModelsContent() { } = useModels(); useEffect(() => { - const loadInitialData = async () => { - await Promise.all([fetchDatasets(), fetchSessions(), fetchTasks()]); - setIsInitialLoading(false); - }; - loadInitialData(); + fetchDatasets(); + fetchSessions(); + fetchTasks(); }, []); useEffect(() => { @@ -77,21 +73,6 @@ export default function ModelsContent() { } }, [selectedSessionId, sessions]); - if (isInitialLoading) { - return ( - - - - ); - } - return ( From c99ee1065cc25cd2be85c4269bc43d9e2a1ae510 Mon Sep 17 00:00:00 2001 From: Felipe Date: Wed, 8 Apr 2026 08:04:33 -0400 Subject: [PATCH 2/3] fix: remove unused dataset and session fetch calls in ModelsContent component --- DashAI/front/src/pages/models/ModelsContent.jsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/DashAI/front/src/pages/models/ModelsContent.jsx b/DashAI/front/src/pages/models/ModelsContent.jsx index 299a82865..fe43b39ea 100644 --- a/DashAI/front/src/pages/models/ModelsContent.jsx +++ b/DashAI/front/src/pages/models/ModelsContent.jsx @@ -22,10 +22,7 @@ export default function ModelsContent() { const { t } = useTranslation(["models"]); const { - fetchDatasets, sessions, - fetchSessions, - fetchTasks, step, setStep, selectedSessionId, @@ -35,12 +32,6 @@ export default function ModelsContent() { fetchRuns, } = useModels(); - useEffect(() => { - fetchDatasets(); - fetchSessions(); - fetchTasks(); - }, []); - useEffect(() => { if (location.state?.openSessionId && sessions.length > 0) { const sessionToOpen = sessions.find( From ced6c2112a08988cb405fa54fc31d08ca0f2ad50 Mon Sep 17 00:00:00 2001 From: Felipe Date: Wed, 8 Apr 2026 08:15:22 -0400 Subject: [PATCH 3/3] fix: add cache_dir parameter to dataset loading in audio, csv, and json dataloaders, to delete the dir after use --- DashAI/back/dataloaders/classes/audio_dataloader.py | 5 ++++- DashAI/back/dataloaders/classes/csv_dataloader.py | 2 ++ DashAI/back/dataloaders/classes/json_dataloader.py | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/DashAI/back/dataloaders/classes/audio_dataloader.py b/DashAI/back/dataloaders/classes/audio_dataloader.py index 823d9b675..a9a6f5b33 100644 --- a/DashAI/back/dataloaders/classes/audio_dataloader.py +++ b/DashAI/back/dataloaders/classes/audio_dataloader.py @@ -47,7 +47,10 @@ def load_data( prepared_path = self.prepare_files(filepath_or_buffer, temp_path) if prepared_path[1] == "dir": dataset = load_dataset( - "audiofolder", data_dir=prepared_path[0], streaming=bool(n_sample) + "audiofolder", + data_dir=prepared_path[0], + streaming=bool(n_sample), + cache_dir=temp_path, ) if n_sample: if type(dataset) is IterableDatasetDict: diff --git a/DashAI/back/dataloaders/classes/csv_dataloader.py b/DashAI/back/dataloaders/classes/csv_dataloader.py index 53b7d6ff7..29dd78a4e 100644 --- a/DashAI/back/dataloaders/classes/csv_dataloader.py +++ b/DashAI/back/dataloaders/classes/csv_dataloader.py @@ -331,6 +331,7 @@ def load_data( data_files=prepared_path[0], **clean_params, streaming=bool(n_sample), + cache_dir=temp_path, ) else: dataset = load_dataset( @@ -338,6 +339,7 @@ def load_data( data_dir=prepared_path[0], **clean_params, streaming=bool(n_sample), + cache_dir=temp_path, ) shutil.rmtree(prepared_path[0]) if n_sample: diff --git a/DashAI/back/dataloaders/classes/json_dataloader.py b/DashAI/back/dataloaders/classes/json_dataloader.py index eba997446..33b6aec3f 100644 --- a/DashAI/back/dataloaders/classes/json_dataloader.py +++ b/DashAI/back/dataloaders/classes/json_dataloader.py @@ -137,10 +137,15 @@ def load_data( data_files=prepared_path[0], field=field, streaming=bool(n_sample), + cache_dir=temp_path, ) else: dataset = load_dataset( - "json", data_dir=prepared_path[0], field=field, streaming=bool(n_sample) + "json", + data_dir=prepared_path[0], + field=field, + streaming=bool(n_sample), + cache_dir=temp_path, ) shutil.rmtree(prepared_path[0]) if n_sample: