project-list-ds-nav.tsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. export function ProjectListDsNav() {
  24. const navbarProps = getMeta('ol-navbar')
  25. const footerProps = getMeta('ol-footer')
  26. const { t } = useTranslation()
  27. const {
  28. error,
  29. searchText,
  30. setSearchText,
  31. selectedProjects,
  32. filter,
  33. tags,
  34. selectedTagId,
  35. } = useProjectListContext()
  36. const selectedTag = tags.find(tag => tag._id === selectedTagId)
  37. const tableTopArea = (
  38. <div className="pt-2 pb-3 d-md-none d-flex gap-2">
  39. <NewProjectButton
  40. id="new-project-button-projects-table"
  41. showAddAffiliationWidget
  42. />
  43. <SearchForm
  44. inputValue={searchText}
  45. setInputValue={setSearchText}
  46. filter={filter}
  47. selectedTag={selectedTag}
  48. className="overflow-hidden flex-grow-1"
  49. />
  50. </div>
  51. )
  52. return (
  53. <div className="project-ds-nav-page website-redesign">
  54. <DefaultNavbar {...navbarProps} customLogo={overleafLogo} showCloseIcon />
  55. <main className="project-list-wrapper">
  56. <SidebarDsNav />
  57. <div className="project-ds-nav-content-and-messages">
  58. <div className="project-ds-nav-content">
  59. <div className="project-ds-nav-main">
  60. {error ? <DashApiError /> : ''}
  61. <UserNotifications />
  62. <div className="project-list-header-row">
  63. <ProjectListTitle
  64. filter={filter}
  65. selectedTag={selectedTag}
  66. selectedTagId={selectedTagId}
  67. className="text-truncate d-none d-md-block"
  68. />
  69. <div className="project-tools">
  70. <div className="d-none d-md-block">
  71. {selectedProjects.length === 0 ? (
  72. <CurrentPlanWidget />
  73. ) : (
  74. <ProjectTools />
  75. )}
  76. </div>
  77. <div className="d-md-none">
  78. <CurrentPlanWidget />
  79. </div>
  80. </div>
  81. </div>
  82. <div className="project-ds-nav-project-list">
  83. <OLRow className="d-none d-md-block">
  84. <OLCol lg={7}>
  85. <SearchForm
  86. inputValue={searchText}
  87. setInputValue={setSearchText}
  88. filter={filter}
  89. selectedTag={selectedTag}
  90. />
  91. </OLCol>
  92. </OLRow>
  93. <div className="project-list-sidebar-survey-wrapper d-md-none">
  94. {/* Omit the survey card in mobile view for now */}
  95. </div>
  96. <div className="mt-1 d-md-none">
  97. <div
  98. role="toolbar"
  99. className="projects-toolbar"
  100. aria-label={t('projects')}
  101. >
  102. <ProjectsDropdown />
  103. <SortByDropdown />
  104. </div>
  105. </div>
  106. <div className="mt-3">
  107. <TableContainer bordered>
  108. {tableTopArea}
  109. <ProjectListTable />
  110. </TableContainer>
  111. </div>
  112. <div className="mt-3">
  113. <LoadMore />
  114. </div>
  115. </div>
  116. </div>
  117. <Footer {...footerProps} />
  118. </div>
  119. <div>
  120. <SystemMessages />
  121. </div>
  122. </div>
  123. </main>
  124. </div>
  125. )
  126. }