project-list-ds-nav.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. <SystemMessages />
  55. <DefaultNavbar
  56. {...navbarProps}
  57. overleafLogo={overleafLogo}
  58. showCloseIcon
  59. />
  60. <main className="project-list-wrapper">
  61. <SidebarDsNav />
  62. <div className="project-ds-nav-content-and-messages">
  63. <div className="project-ds-nav-content">
  64. <div className="project-ds-nav-main">
  65. {error ? <DashApiError /> : ''}
  66. <UserNotifications />
  67. <div className="project-list-header-row">
  68. <ProjectListTitle
  69. filter={filter}
  70. selectedTag={selectedTag}
  71. selectedTagId={selectedTagId}
  72. className="text-truncate d-none d-md-block"
  73. />
  74. <div className="project-tools">
  75. <div className="d-none d-md-block">
  76. {selectedProjects.length === 0 ? (
  77. <CurrentPlanWidget />
  78. ) : (
  79. <ProjectTools />
  80. )}
  81. </div>
  82. <div className="d-md-none">
  83. <CurrentPlanWidget />
  84. </div>
  85. </div>
  86. </div>
  87. <div className="project-ds-nav-project-list">
  88. <OLRow className="d-none d-md-block">
  89. <OLCol lg={7}>
  90. <SearchForm
  91. inputValue={searchText}
  92. setInputValue={setSearchText}
  93. filter={filter}
  94. selectedTag={selectedTag}
  95. />
  96. </OLCol>
  97. </OLRow>
  98. <div className="project-list-sidebar-survey-wrapper d-md-none">
  99. {/* Omit the survey card in mobile view for now */}
  100. </div>
  101. <div className="mt-1 d-md-none">
  102. <div
  103. role="toolbar"
  104. className="projects-toolbar"
  105. aria-label={t('projects')}
  106. >
  107. <ProjectsDropdown />
  108. <SortByDropdown />
  109. </div>
  110. </div>
  111. <div className="mt-3">
  112. <TableContainer bordered>
  113. {tableTopArea}
  114. <ProjectListTable />
  115. </TableContainer>
  116. </div>
  117. <div className="mt-3">
  118. <LoadMore />
  119. </div>
  120. </div>
  121. </div>
  122. <Footer {...footerProps} />
  123. </div>
  124. </div>
  125. </main>
  126. </div>
  127. )
  128. }