project-list-default.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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 SurveyWidget from './survey-widget'
  7. import UserNotifications from './notifications/user-notifications'
  8. import SearchForm from './search-form'
  9. import ProjectsDropdown from './dropdown/projects-dropdown'
  10. import SortByDropdown from './dropdown/sort-by-dropdown'
  11. import ProjectTools from './table/project-tools/project-tools'
  12. import ProjectListTitle from './title/project-list-title'
  13. import Sidebar from './sidebar/sidebar'
  14. import LoadMore from './load-more'
  15. import OLCol from '@/features/ui/components/ol/ol-col'
  16. import OLRow from '@/features/ui/components/ol/ol-row'
  17. import { TableContainer } from '@/features/ui/components/bootstrap-5/table'
  18. import DashApiError from '@/features/project-list/components/dash-api-error'
  19. export default function ProjectListDefault() {
  20. const { t } = useTranslation()
  21. const {
  22. error,
  23. searchText,
  24. setSearchText,
  25. selectedProjects,
  26. filter,
  27. tags,
  28. selectedTagId,
  29. } = useProjectListContext()
  30. const selectedTag = tags.find(tag => tag._id === selectedTagId)
  31. const tableTopArea = (
  32. <div className="pt-2 pb-3 d-md-none d-flex gap-2">
  33. <NewProjectButton
  34. id="new-project-button-projects-table"
  35. showAddAffiliationWidget
  36. />
  37. <SearchForm
  38. inputValue={searchText}
  39. setInputValue={setSearchText}
  40. filter={filter}
  41. selectedTag={selectedTag}
  42. className="overflow-hidden flex-grow-1"
  43. />
  44. </div>
  45. )
  46. return (
  47. <>
  48. <Sidebar />
  49. <div className="project-list-main-react">
  50. {error ? <DashApiError /> : ''}
  51. <OLRow>
  52. <OLCol>
  53. <UserNotifications />
  54. </OLCol>
  55. </OLRow>
  56. <div className="project-list-header-row">
  57. <ProjectListTitle
  58. filter={filter}
  59. selectedTag={selectedTag}
  60. selectedTagId={selectedTagId}
  61. className="text-truncate d-none d-md-block"
  62. />
  63. <div className="project-tools">
  64. <div className="d-none d-md-block">
  65. {selectedProjects.length === 0 ? (
  66. <CurrentPlanWidget />
  67. ) : (
  68. <ProjectTools />
  69. )}
  70. </div>
  71. <div className="d-md-none">
  72. <CurrentPlanWidget />
  73. </div>
  74. </div>
  75. </div>
  76. <OLRow className="d-none d-md-block">
  77. <OLCol lg={7}>
  78. <SearchForm
  79. inputValue={searchText}
  80. setInputValue={setSearchText}
  81. filter={filter}
  82. selectedTag={selectedTag}
  83. />
  84. </OLCol>
  85. </OLRow>
  86. <div className="project-list-sidebar-survey-wrapper d-md-none">
  87. <SurveyWidget />
  88. </div>
  89. <div className="mt-1 d-md-none">
  90. <div
  91. role="toolbar"
  92. className="projects-toolbar"
  93. aria-label={t('projects')}
  94. >
  95. <ProjectsDropdown />
  96. <SortByDropdown />
  97. </div>
  98. </div>
  99. <OLRow className="row-spaced">
  100. <OLCol>
  101. <TableContainer bordered>
  102. {tableTopArea}
  103. <ProjectListTable />
  104. </TableContainer>
  105. </OLCol>
  106. </OLRow>
  107. <OLRow className="row-spaced">
  108. <OLCol>
  109. <LoadMore />
  110. </OLCol>
  111. </OLRow>
  112. </div>
  113. </>
  114. )
  115. }