WorkspaceContent.jsx 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import React from 'react'
  2. import { connect } from 'react-redux'
  3. import appFactory from '../appFactory.js'
  4. import Sidebar from './Sidebar.jsx'
  5. import Folder from '../component/Workspace/Folder.jsx'
  6. import FileItem from '../component/Workspace/FileItem.jsx'
  7. import FileItemHeader from '../component/Workspace/FileItemHeader.jsx'
  8. import PageWrapper from '../component/common/layout/PageWrapper.jsx'
  9. import PageTitle from '../component/common/layout/PageTitle.jsx'
  10. import PageContent from '../component/common/layout/PageContent.jsx'
  11. import DropdownCreateButton from '../component/common/Input/DropdownCreateButton.jsx'
  12. import {
  13. getAppList,
  14. getWorkspaceContent,
  15. getFolderContent
  16. } from '../action-creator.async.js'
  17. class WorkspaceContent extends React.Component {
  18. componentDidMount () {
  19. const { workspaceList, app, match, dispatch } = this.props
  20. if (match.params.idws !== undefined) dispatch(getWorkspaceContent(match.params.idws, match.params.filter))
  21. else if (workspaceList.length > 0) dispatch(getWorkspaceContent(workspaceList[0].id, match.params.filter)) // load first ws if none specified
  22. if (Object.keys(app).length === 0) dispatch(getAppList())
  23. }
  24. componentDidUpdate (prevProps) {
  25. const { workspace, workspaceList, match, dispatch } = this.props
  26. // if a workspace is already loaded and the idws in url hasn't changed, do nothing
  27. if (workspace.id !== -1 && prevProps.match.params.idws === match.params.idws) return
  28. // if the idws in url has changed, load the new workspace
  29. if (match.params.idws !== undefined) dispatch(getWorkspaceContent(match.params.idws, match.params.filter))
  30. // else bellow is for loading url PAGE_NAME.HOME (without an idws), when workspaceList is loaded, load the first workspace
  31. else if (workspace.id === -1 && workspaceList.length > 0) dispatch(getWorkspaceContent(workspaceList[0].id))
  32. }
  33. handleClickContentItem = content => {
  34. this.props.renderApp(this.props.app[content.type], this.props.user, {...content, workspace: this.props.workspace})
  35. // Côme - 2018/03/08 - line bellow is useless because we cannot call the reducer again when hiding app since the call comes from the app
  36. // dispatch(setActiveFileContentActive(content))
  37. }
  38. handleClickEditContentItem = (e, content) => {
  39. e.stopPropagation()
  40. console.log('edit nyi', content)
  41. }
  42. handleClickMoveContentItem = (e, content) => {
  43. e.stopPropagation()
  44. console.log('move nyi', content)
  45. }
  46. handleClickDownloadContentItem = (e, content) => {
  47. e.stopPropagation()
  48. console.log('download nyi', content)
  49. }
  50. handleClickArchiveContentItem = (e, content) => {
  51. e.stopPropagation()
  52. console.log('archive nyi', content)
  53. }
  54. handleClickDeleteContentItem = (e, content) => {
  55. e.stopPropagation()
  56. console.log('delete nyi', content)
  57. }
  58. handleClickFolder = folderId => {
  59. this.props.dispatch(getFolderContent(this.props.workspace.id, folderId))
  60. }
  61. filterWorkspaceContent = (contentList, filter) => filter.length === 0
  62. ? contentList
  63. : contentList.filter(c => c.type === 'folder' || filter.includes(c.type)) // keep unfiltered files and folders
  64. .map(c => c.type !== 'folder' ? c : {...c, content: this.filterWorkspaceContent(c.content, filter)}) // recursively filter folder content
  65. .filter(c => c.type !== 'folder' || c.content.length > 0) // remove empty folder
  66. render () {
  67. const { workspace, app } = this.props
  68. const filteredWorkspaceContent = this.filterWorkspaceContent(workspace.content, workspace.filter)
  69. return (
  70. <div className='sidebarpagecontainer'>
  71. <Sidebar />
  72. <PageWrapper customeClass='workspace'>
  73. <PageTitle
  74. parentClass='workspace__header'
  75. customClass='justify-content-between'
  76. title={workspace.title}
  77. >
  78. <DropdownCreateButton parentClass='workspace__header__btnaddworkspace' />
  79. </PageTitle>
  80. <PageContent parentClass='workspace__content'>
  81. <div className='workspace__content__fileandfolder folder__content active'>
  82. <FileItemHeader />
  83. { filteredWorkspaceContent.map((c, i) => c.type === 'folder'
  84. ? (
  85. <Folder
  86. app={app}
  87. folderData={c}
  88. onClickItem={this.handleClickContentItem}
  89. onClickExtendedAction={{
  90. edit: this.handleClickEditContentItem,
  91. move: this.handleClickMoveContentItem,
  92. download: this.handleClickDownloadContentItem,
  93. archive: this.handleClickArchiveContentItem,
  94. delete: this.handleClickDeleteContentItem
  95. }}
  96. onClickFolder={this.handleClickFolder}
  97. isLast={i === filteredWorkspaceContent.length - 1}
  98. key={c.id}
  99. />
  100. )
  101. : (
  102. <FileItem
  103. name={c.title}
  104. type={c.type}
  105. icon={(app[c.type] || {icon: ''}).icon}
  106. status={c.status}
  107. onClickItem={() => this.handleClickContentItem(c)}
  108. onClickExtendedAction={{
  109. edit: e => this.handleClickEditContentItem(e, c),
  110. move: e => this.handleClickMoveContentItem(e, c),
  111. download: e => this.handleClickDownloadContentItem(e, c),
  112. archive: e => this.handleClickArchiveContentItem(e, c),
  113. delete: e => this.handleClickDeleteContentItem(e, c)
  114. }}
  115. isLast={i === filteredWorkspaceContent.length - 1}
  116. key={c.id}
  117. />
  118. )
  119. )}
  120. </div>
  121. <DropdownCreateButton customClass='workspace__content__button mb-5' />
  122. <div id='appContainer' />
  123. </PageContent>
  124. </PageWrapper>
  125. </div>
  126. )
  127. }
  128. }
  129. const mapStateToProps = ({ user, workspace, workspaceList, app }) => ({ user, workspace, workspaceList, app })
  130. export default connect(mapStateToProps)(appFactory(WorkspaceContent))