project-list-ds-nav.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import { useProjectListContext } from '../context/project-list-context'
  2. import { useTranslation } from 'react-i18next'
  3. import CurrentPlanWidget from './current-plan-widget/current-plan-widget'
  4. import NewProjectButton from './new-project-button'
  5. import ProjectListTable from './table/project-list-table'
  6. import UserNotifications from './notifications/user-notifications'
  7. import SearchForm from './search-form'
  8. import ProjectsDropdown from './dropdown/projects-dropdown'
  9. import SortByDropdown from './dropdown/sort-by-dropdown'
  10. import ProjectTools from './table/project-tools/project-tools'
  11. import ProjectListTitle from './title/project-list-title'
  12. import LoadMore from './load-more'
  13. import OLCol from '@/features/ui/components/ol/ol-col'
  14. import OLRow from '@/features/ui/components/ol/ol-row'
  15. import { TableContainer } from '@/features/ui/components/bootstrap-5/table'
  16. import DashApiError from '@/features/project-list/components/dash-api-error'
  17. import getMeta from '@/utils/meta'
  18. import DefaultNavbar from '@/features/ui/components/bootstrap-5/navbar/default-navbar'
  19. import Footer from '@/features/ui/components/bootstrap-5/footer/footer'
  20. import SidebarDsNav from '@/features/project-list/components/sidebar/sidebar-ds-nav'
  21. import SystemMessages from '@/shared/components/system-messages'
  22. import overleafLogo from '@/shared/svgs/overleaf-a-ds-solution-mallard.svg'
  23. import CookieBanner from '@/shared/components/cookie-banner'
  24. export function ProjectListDsNav() {
  25. const navbarProps = getMeta('ol-navbar')
  26. const footerProps = getMeta('ol-footer')
  27. const { t } = useTranslation()
  28. const {
  29. error,
  30. searchText,
  31. setSearchText,
  32. selectedProjects,
  33. filter,
  34. tags,
  35. selectedTagId,
  36. } = useProjectListContext()
  37. const selectedTag = tags.find(tag => tag._id === selectedTagId)
  38. const tableTopArea = (
  39. <div className="pt-2 pb-3 d-md-none d-flex gap-2">
  40. <NewProjectButton
  41. id="new-project-button-projects-table"
  42. showAddAffiliationWidget
  43. />
  44. <SearchForm
  45. inputValue={searchText}
  46. setInputValue={setSearchText}
  47. filter={filter}
  48. selectedTag={selectedTag}
  49. className="overflow-hidden flex-grow-1"
  50. />
  51. </div>
  52. )
  53. return (
  54. <div className="project-ds-nav-page website-redesign">
  55. <SystemMessages />
  56. <DefaultNavbar
  57. {...navbarProps}
  58. overleafLogo={overleafLogo}
  59. showCloseIcon
  60. />
  61. <main className="project-list-wrapper">
  62. <SidebarDsNav />
  63. <div className="project-ds-nav-content-and-messages">
  64. <div className="project-ds-nav-content">
  65. <div className="project-ds-nav-main">
  66. {error ? <DashApiError /> : ''}
  67. <UserNotifications />
  68. <div className="project-list-header-row">
  69. <ProjectListTitle
  70. filter={filter}
  71. selectedTag={selectedTag}
  72. selectedTagId={selectedTagId}
  73. className="text-truncate d-none d-md-block"
  74. />
  75. <div className="project-tools">
  76. <div className="d-none d-md-block">
  77. {selectedProjects.length === 0 ? (
  78. <CurrentPlanWidget />
  79. ) : (
  80. <ProjectTools />
  81. )}
  82. </div>
  83. <div className="d-md-none">
  84. <CurrentPlanWidget />
  85. </div>
  86. </div>
  87. </div>
  88. <div className="project-ds-nav-project-list">
  89. <OLRow className="d-none d-md-block">
  90. <OLCol lg={7}>
  91. <SearchForm
  92. inputValue={searchText}
  93. setInputValue={setSearchText}
  94. filter={filter}
  95. selectedTag={selectedTag}
  96. />
  97. </OLCol>
  98. </OLRow>
  99. <div className="project-list-sidebar-survey-wrapper d-md-none">
  100. {/* Omit the survey card in mobile view for now */}
  101. </div>
  102. <div className="mt-1 d-md-none">
  103. <div
  104. role="toolbar"
  105. className="projects-toolbar"
  106. aria-label={t('projects')}
  107. >
  108. <ProjectsDropdown />
  109. <SortByDropdown />
  110. </div>
  111. </div>
  112. <div className="mt-3">
  113. <TableContainer bordered>
  114. {tableTopArea}
  115. <ProjectListTable />
  116. </TableContainer>
  117. </div>
  118. <div className="mt-3">
  119. <LoadMore />
  120. </div>
  121. </div>
  122. </div>
  123. <Footer {...footerProps} />
  124. </div>
  125. <CookieBanner />
  126. </div>
  127. </main>
  128. </div>
  129. )
  130. }