From 0bfaf2f69282a5e2f48c127428edbbded5cfc0b6 Mon Sep 17 00:00:00 2001 From: Amit_Noyberg1 <219515702+amit-noy@users.noreply.github.com> Date: Tue, 19 May 2026 13:11:57 +0300 Subject: [PATCH 1/4] add tab page name to breadcrumbs when navigating to inner page --- src/common/Breadcrumbs/Breadcrumbs.jsx | 83 ++++--- .../BreadcrumbsStep/BreadcrumbsStep.jsx | 206 ++++++++++-------- .../BreadcrumbsStep/breadcrumbsStep.scss | 7 +- src/common/Breadcrumbs/breadcrumbs.scss | 1 - src/common/Breadcrumbs/breadcrumbs.util.js | 131 +++-------- src/components/Alerts/Alerts.jsx | 2 +- .../ApplicationMetrics/ApplicationMetrics.jsx | 2 +- src/components/Artifacts/Artifacts.jsx | 1 + src/components/Artifacts/ArtifactsView.jsx | 4 +- .../ConsumerGroupsWrapper.jsx | 2 +- src/components/FeatureStore/FeatureStore.jsx | 6 +- src/components/FunctionsPage/Functions.jsx | 1 + .../FunctionsPage/FunctionsView.jsx | 7 +- .../FunctionsPageOld/FunctionsViewOld.jsx | 2 +- src/components/Jobs/Jobs.jsx | 2 +- src/components/ModelsPage/ModelsPage.jsx | 7 +- .../MonitoringApplicationsPage.jsx | 2 +- src/components/Project/ProjectMonitorView.jsx | 2 +- src/constants.js | 6 + .../BreadcrumbsDropdown.jsx | 99 +++++---- .../breadcrumbsDropdown.scss | 30 ++- 21 files changed, 310 insertions(+), 293 deletions(-) diff --git a/src/common/Breadcrumbs/Breadcrumbs.jsx b/src/common/Breadcrumbs/Breadcrumbs.jsx index 44e48643a8..95f1974193 100644 --- a/src/common/Breadcrumbs/Breadcrumbs.jsx +++ b/src/common/Breadcrumbs/Breadcrumbs.jsx @@ -24,68 +24,86 @@ import { useSelector } from 'react-redux' import BreadcrumbsStep from './BreadcrumbsStep/BreadcrumbsStep' -import { generateMlrunScreens, generateTabsList } from './breadcrumbs.util' -import { MONITORING_APP_PAGE, PROJECTS_PAGE_PATH } from '../../constants' +import { generateMlrunScreens } from './breadcrumbs.util' +import { PROJECTS_PAGE_PATH } from '../../constants' import { generateProjectsList } from '../../utils/projects' +import { useMode } from '../../hooks/mode.hook' + +import { + BREADCRUMBS_STEP_ITEM_TYPE, + BREADCRUMBS_STEP_PROJECT_TYPE, + BREADCRUMBS_STEP_SCREEN_TYPE +} from '../../constants' import './breadcrumbs.scss' -const Breadcrumbs = ({ onClick = () => {} }) => { +const Breadcrumbs = ({ itemName = '', onClick = () => {} }) => { const [searchValue, setSearchValue] = useState('') const [showScreensList, setShowScreensList] = useState(false) const [showProjectsList, setShowProjectsList] = useState(false) const breadcrumbsRef = useRef() const params = useParams() const location = useLocation() + const { isDemoMode } = useMode() const projectStore = useSelector(state => state.projectStore) const projectsList = useMemo(() => { - return generateProjectsList(projectStore.projectsNames.data) - }, [projectStore.projectsNames.data]) + const projectsList = generateProjectsList(projectStore.projectsNames.data, params.projectName) + return projectsList.map(project => ({ + ...project, + link: location.pathname.replace(params.projectName, project.id) + })) + }, [projectStore.projectsNames.data, location.pathname, params.projectName]) const mlrunScreens = useMemo(() => { - return generateMlrunScreens(params) - }, [params]) - const projectTabs = useMemo(() => { - return generateTabsList() - }, []) + return generateMlrunScreens(params?.projectName ?? '', isDemoMode).filter( + screen => !screen.hidden + ) + }, [isDemoMode, params?.projectName]) const urlParts = useMemo(() => { - if (params.projectName) { - const [projects, projectName, screenName] = location.pathname.split('/').slice(1, 4) - const screen = mlrunScreens.find(screen => screen.id === screenName) - let tab = projectTabs.find(tab => - location.pathname - .split('/') - .slice(3) - .find(pathItem => pathItem === tab.id) - ) - - if (screen.id === MONITORING_APP_PAGE) { - tab = {} + const innerScreenName = params?.['*']?.split('/')[0] + const [projects, projectName, page] = location.pathname.split('/').slice(1, 4) + const screen = + mlrunScreens.find(screen => screen.id === innerScreenName) || + mlrunScreens.find(screen => screen.id === page) + + const pathItems = [ + { id: projects, label: 'Projects', link: `/${PROJECTS_PAGE_PATH}` }, + { + id: projectName, + label: projectName, + link: `/projects/${projectName}`, + type: BREADCRUMBS_STEP_PROJECT_TYPE + }, + { + id: screen?.id, + label: screen?.label, + link: screen?.link, + type: BREADCRUMBS_STEP_SCREEN_TYPE } + ] + + itemName && pathItems.push({ id: itemName, label: itemName, type: BREADCRUMBS_STEP_ITEM_TYPE }) + if (params.projectName) { return { - pathItems: [projects, projectName, screen?.label || screenName], - screen, - tab + pathItems, + screen } } else { - const [page] = location.pathname.split('/').slice(3, 4) - const screen = mlrunScreens.find(screen => screen.id === page) - return { - pathItems: [PROJECTS_PAGE_PATH, screen?.label || page], + pathItems: pathItems.filter(item => item.type !== BREADCRUMBS_STEP_PROJECT_TYPE), screen } } - }, [location.pathname, params.projectName, mlrunScreens, projectTabs]) + }, [itemName, location.pathname, params, mlrunScreens]) return (