From f81a7b2ff2e62c673f9b1a0997f751c38dfe8c51 Mon Sep 17 00:00:00 2001 From: Chris Dryden <117657238+chrisdrydenaltmetric@users.noreply.github.com> Date: Mon, 27 Jul 2026 09:44:32 +0100 Subject: [PATCH] Merge pull request #35534 from overleaf/cd-share-sidenav-bar-with-library [web] Share the dashboard sidebar with the library page GitOrigin-RevId: 5595746fef6698bee6a35ee7fc8be15743e2c620 --- services/web/config/settings.defaults.js | 1 + .../dropdown/mobile-page-switcher-items.tsx | 3 +- .../components/dropdown/projects-dropdown.tsx | 2 +- .../components/project-list-ds-nav.tsx | 2 +- .../components/projects-filter-menu.ts | 13 +- .../components/sidebar/sidebar-ds-nav.tsx | 52 ++++---- .../components/sidebar/sidebar-filters.tsx | 60 +++++++-- .../context/project-list-context.tsx | 59 ++++++--- .../project-list/util/navigation-state.ts | 2 + .../sidebar/ds-nav-overleaf-logo.tsx | 22 ++++ .../sidebar/ds-nav-page-switcher.tsx | 87 ------------- .../pages/project-list-ds-nav.scss | 34 +++--- .../sidebar/ds-nav-page-switcher.spec.tsx | 114 ------------------ 13 files changed, 177 insertions(+), 274 deletions(-) create mode 100644 services/web/frontend/js/shared/components/sidebar/ds-nav-overleaf-logo.tsx delete mode 100644 services/web/frontend/js/shared/components/sidebar/ds-nav-page-switcher.tsx delete mode 100644 services/web/test/frontend/shared/components/sidebar/ds-nav-page-switcher.spec.tsx diff --git a/services/web/config/settings.defaults.js b/services/web/config/settings.defaults.js index e14289ff88..eb5efe4fa6 100644 --- a/services/web/config/settings.defaults.js +++ b/services/web/config/settings.defaults.js @@ -1027,6 +1027,7 @@ module.exports = { // createFileModes: [], devToolbar: [], + dsNavLibraryLink: [], gitBridge: [], publishModalDropdownButton: [], publishModalToolbarButton: [], diff --git a/services/web/frontend/js/features/project-list/components/dropdown/mobile-page-switcher-items.tsx b/services/web/frontend/js/features/project-list/components/dropdown/mobile-page-switcher-items.tsx index 0c42b4fc7d..3c03ce43db 100644 --- a/services/web/frontend/js/features/project-list/components/dropdown/mobile-page-switcher-items.tsx +++ b/services/web/frontend/js/features/project-list/components/dropdown/mobile-page-switcher-items.tsx @@ -1,8 +1,9 @@ import { useTranslation } from 'react-i18next' import { OLDropdownItem } from '@/shared/components/ol/ol-dropdown-menu' +import { ActivePage } from '../../util/navigation-state' type Props = { - activePage: 'library' | 'projects' + activePage: ActivePage onProjectsClick?: () => void } diff --git a/services/web/frontend/js/features/project-list/components/dropdown/projects-dropdown.tsx b/services/web/frontend/js/features/project-list/components/dropdown/projects-dropdown.tsx index 176676aad7..82eb424433 100644 --- a/services/web/frontend/js/features/project-list/components/dropdown/projects-dropdown.tsx +++ b/services/web/frontend/js/features/project-list/components/dropdown/projects-dropdown.tsx @@ -34,7 +34,7 @@ export function Item({ filter, text, leadingIcon, onClick }: ItemProps) { } return ( - + {isActive => (
- +
diff --git a/services/web/frontend/js/features/project-list/components/projects-filter-menu.ts b/services/web/frontend/js/features/project-list/components/projects-filter-menu.ts index 7c45debd95..964223d5e2 100644 --- a/services/web/frontend/js/features/project-list/components/projects-filter-menu.ts +++ b/services/web/frontend/js/features/project-list/components/projects-filter-menu.ts @@ -1,13 +1,22 @@ import { Filter, useProjectListContext } from '../context/project-list-context' +import { ActivePage } from '../util/navigation-state' type ProjectsMenuFilterType = { children: (isActive: boolean) => React.ReactElement filter: Filter + activePage: ActivePage } -function ProjectsFilterMenu({ children, filter }: ProjectsMenuFilterType) { +function ProjectsFilterMenu({ + children, + filter, + activePage, +}: ProjectsMenuFilterType) { const { filter: activeFilter, selectedTagId } = useProjectListContext() - const isActive = selectedTagId === undefined && filter === activeFilter + const isActive = + selectedTagId === undefined && + filter === activeFilter && + activePage === 'projects' return children(isActive) } diff --git a/services/web/frontend/js/features/project-list/components/sidebar/sidebar-ds-nav.tsx b/services/web/frontend/js/features/project-list/components/sidebar/sidebar-ds-nav.tsx index e1a70eefe8..57bf3a7c5d 100644 --- a/services/web/frontend/js/features/project-list/components/sidebar/sidebar-ds-nav.tsx +++ b/services/web/frontend/js/features/project-list/components/sidebar/sidebar-ds-nav.tsx @@ -1,3 +1,4 @@ +import { JSXElementConstructor } from 'react' import { useTranslation } from 'react-i18next' import classnames from 'classnames' import { Trash } from '@phosphor-icons/react' @@ -9,15 +10,20 @@ import { useScrolled } from '@/features/project-list/components/sidebar/use-scro import { SurveyWidgetDsNav } from '@/features/project-list/components/survey-widget-ds-nav' import { SidebarLowerSection } from '@/shared/components/sidebar/sidebar-lower-section' import { isSplitTestEnabled } from '@/utils/splitTestUtils' -import { DsNavPageSwitcher } from '@/shared/components/sidebar/ds-nav-page-switcher' +import { DsNavOverleafLogo } from '@/shared/components/sidebar/ds-nav-overleaf-logo' import { useProjectListContext } from '@/features/project-list/context/project-list-context' +import importOverleafModules from '../../../../../macros/import-overleaf-module.macro' +import { ActivePage } from '../../util/navigation-state' -function SidebarDsNav() { +function SidebarDsNav({ activePage }: { activePage: ActivePage }) { const { t } = useTranslation() const { show: showAddAffiliationWidget } = useAddAffiliation() const isLibraryEnabled = isSplitTestEnabled('overleaf-library') const { filter, selectedTagId, selectFilter } = useProjectListContext() const isTrashActive = selectedTagId === undefined && filter === 'trashed' + const [dsNavLibraryLinkModule] = importOverleafModules('dsNavLibraryLink') + const DsNavLibraryLink: JSXElementConstructor<{ active?: boolean }> = + dsNavLibraryLinkModule?.import.default const { mousePos, getHandleProps, getTargetProps } = usePersistedResize({ name: 'project-sidebar', }) @@ -32,16 +38,7 @@ function SidebarDsNav() { }, })} > - {isLibraryEnabled && ( - <> - selectFilter('all')} - /> -
- - )} + {isLibraryEnabled && activePage === 'library' && }
@@ -70,17 +67,24 @@ function SidebarDsNav() { > {isLibraryEnabled && ( - + <> + {DsNavLibraryLink && ( + + )} + + )}
diff --git a/services/web/frontend/js/features/project-list/components/sidebar/sidebar-filters.tsx b/services/web/frontend/js/features/project-list/components/sidebar/sidebar-filters.tsx index 2540b05b38..ac380c8391 100644 --- a/services/web/frontend/js/features/project-list/components/sidebar/sidebar-filters.tsx +++ b/services/web/frontend/js/features/project-list/components/sidebar/sidebar-filters.tsx @@ -1,4 +1,5 @@ import { useTranslation } from 'react-i18next' +import classNames from 'classnames' import { Filter, useProjectListContext, @@ -6,20 +7,36 @@ import { import TagsList from './tags-list' import ProjectsFilterMenu from '../projects-filter-menu' import { isSplitTestEnabled } from '@/utils/splitTestUtils' +import { Folder } from '@phosphor-icons/react' +import { ActivePage } from '../../util/navigation-state' type SidebarFilterProps = { filter: Filter text: React.ReactNode + activePage: ActivePage + icon?: React.ReactNode } -export function SidebarFilter({ filter, text }: SidebarFilterProps) { +export function SidebarFilter({ + filter, + text, + icon, + activePage, +}: SidebarFilterProps) { const { selectFilter } = useProjectListContext() return ( - + {isActive => (
  • -
  • @@ -28,17 +45,42 @@ export function SidebarFilter({ filter, text }: SidebarFilterProps) { ) } -export default function SidebarFilters() { +export default function SidebarFilters({ + activePage, +}: { + activePage: ActivePage +}) { const { t } = useTranslation() const isLibraryEnabled = isSplitTestEnabled('overleaf-library') return (
      - - - - + } + /> + + + {!isLibraryEnabled && ( - + )}