project-list-root.tsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import {
  2. ProjectListProvider,
  3. useProjectListContext,
  4. } from '../context/project-list-context'
  5. import * as eventTracking from '../../../infrastructure/event-tracking'
  6. import { Col, Row } from 'react-bootstrap'
  7. import { useTranslation } from 'react-i18next'
  8. import useWaitForI18n from '../../../shared/hooks/use-wait-for-i18n'
  9. import CurrentPlanWidget from './current-plan-widget/current-plan-widget'
  10. import NewProjectButton from './new-project-button'
  11. import ProjectListTable from './table/project-list-table'
  12. import SurveyWidget from './survey-widget'
  13. import WelcomeMessage from './welcome-message'
  14. import LoadingBranded from '../../../shared/components/loading-branded'
  15. import SystemMessages from './notifications/system-messages'
  16. import UserNotifications from './notifications/user-notifications'
  17. import SearchForm from './search-form'
  18. import ProjectsDropdown from './dropdown/projects-dropdown'
  19. import SortByDropdown from './dropdown/sort-by-dropdown'
  20. import ProjectTools from './table/project-tools/project-tools'
  21. import Sidebar from './sidebar/sidebar'
  22. import LoadMore from './load-more'
  23. import { useEffect } from 'react'
  24. function ProjectListRoot() {
  25. const { isReady } = useWaitForI18n()
  26. return isReady ? (
  27. <ProjectListProvider>
  28. <ProjectListPageContent />
  29. </ProjectListProvider>
  30. ) : null
  31. }
  32. function ProjectListPageContent() {
  33. const {
  34. totalProjectsCount,
  35. error,
  36. isLoading,
  37. loadProgress,
  38. searchText,
  39. setSearchText,
  40. selectedProjects,
  41. } = useProjectListContext()
  42. useEffect(() => {
  43. eventTracking.sendMB('loads_v2_dash', {})
  44. }, [])
  45. return isLoading ? (
  46. <div className="loading-container">
  47. <LoadingBranded loadProgress={loadProgress} />
  48. </div>
  49. ) : (
  50. <>
  51. <SystemMessages />
  52. <div className="project-list-wrapper clearfix">
  53. {totalProjectsCount > 0 ? (
  54. <>
  55. <Sidebar />
  56. <div className="project-list-main-react">
  57. {error ? <DashApiError /> : ''}
  58. <Row>
  59. <Col xs={12}>
  60. <UserNotifications />
  61. </Col>
  62. </Row>
  63. <Row>
  64. <Col md={7} className="hidden-xs">
  65. <SearchForm
  66. inputValue={searchText}
  67. setInputValue={setSearchText}
  68. />
  69. </Col>
  70. <Col md={5}>
  71. <div className="project-tools">
  72. <div className="hidden-xs">
  73. {selectedProjects.length === 0 ? (
  74. <CurrentPlanWidget />
  75. ) : (
  76. <ProjectTools />
  77. )}
  78. </div>
  79. <div className="visible-xs">
  80. <CurrentPlanWidget />
  81. </div>
  82. </div>
  83. </Col>
  84. </Row>
  85. <div className="project-list-sidebar-survey-wrapper visible-xs">
  86. <SurveyWidget />
  87. </div>
  88. <div className="visible-xs mt-1">
  89. <div role="toolbar" className="projects-toolbar">
  90. <ProjectsDropdown />
  91. <SortByDropdown />
  92. </div>
  93. </div>
  94. <Row className="row-spaced">
  95. <Col xs={12}>
  96. <div className="card project-list-card">
  97. <div className="visible-xs pt-2 pb-3">
  98. <div className="clearfix">
  99. <NewProjectButton
  100. id="new-project-button-projects-table"
  101. className="pull-left me-2"
  102. showAddAffiliationWidget
  103. />
  104. <SearchForm
  105. inputValue={searchText}
  106. setInputValue={setSearchText}
  107. className="overflow-hidden"
  108. formGroupProps={{ className: 'mb-0' }}
  109. />
  110. </div>
  111. </div>
  112. <ProjectListTable />
  113. </div>
  114. </Col>
  115. </Row>
  116. <Row className="row-spaced">
  117. <Col xs={12}>
  118. <LoadMore />
  119. </Col>
  120. </Row>
  121. </div>
  122. </>
  123. ) : (
  124. <div className="project-list-welcome-wrapper">
  125. {error ? <DashApiError /> : ''}
  126. <Row className="row-spaced">
  127. <Col
  128. sm={10}
  129. smOffset={1}
  130. md={8}
  131. mdOffset={2}
  132. className="project-list-empty-col"
  133. >
  134. <Row>
  135. <Col xs={12}>
  136. <UserNotifications />
  137. </Col>
  138. </Row>
  139. <WelcomeMessage />
  140. </Col>
  141. </Row>
  142. </div>
  143. )}
  144. </div>
  145. </>
  146. )
  147. }
  148. function DashApiError() {
  149. const { t } = useTranslation()
  150. return (
  151. <Row className="row-spaced">
  152. <Col xs={8} xsOffset={2} aria-live="polite" className="text-center">
  153. <div className="alert alert-danger">
  154. {t('generic_something_went_wrong')}
  155. </div>
  156. </Col>
  157. </Row>
  158. )
  159. }
  160. export default ProjectListRoot