WorkspaceContent.jsx 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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 ContentItem from '../component/Workspace/ContentItem.jsx'
  7. import ContentItemHeader from '../component/Workspace/ContentItemHeader.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. import {newFlashMessage, setWorkspaceData} from '../action-creator.sync.js'
  18. import { PAGE } from '../helper.js'
  19. const qs = require('query-string')
  20. class WorkspaceContent extends React.Component {
  21. async componentDidMount () {
  22. const { workspaceList, app, match, location, dispatch } = this.props
  23. if (Object.keys(app).length === 0) dispatch(getAppList()) // async but no need await
  24. const wsToLoad = (() => {
  25. if (match.params.idws !== undefined) return match.params.idws
  26. if (workspaceList.length > 0) return workspaceList[0].id // load first ws if none specified
  27. return null
  28. })()
  29. if (wsToLoad === null) return
  30. const wsContent = await dispatch(getWorkspaceContent(wsToLoad))
  31. if (wsContent.status === 200) {
  32. dispatch(setWorkspaceData(wsContent.json, qs.parse(location.search).type))
  33. if (match.params.idcts) { // if a content id is in url, open it
  34. const contentToOpen = wsContent.json.content.find(wsc => wsc.id === parseInt(match.params.idcts))
  35. if (contentToOpen === undefined) return
  36. this.handleClickContentItem(contentToOpen)
  37. }
  38. } else dispatch(newFlashMessage('Error while loading workspace', 'danger'))
  39. }
  40. handleClickContentItem = content => {
  41. this.props.history.push(`${PAGE.WORKSPACE.CONTENT(content.workspace_id, content.id)}${this.props.location.search}`)
  42. this.props.renderApp(this.props.app[content.type], this.props.user, {...content, workspace: this.props.workspace})
  43. }
  44. handleClickEditContentItem = (e, content) => {
  45. e.stopPropagation()
  46. console.log('edit nyi', content)
  47. }
  48. handleClickMoveContentItem = (e, content) => {
  49. e.stopPropagation()
  50. console.log('move nyi', content)
  51. }
  52. handleClickDownloadContentItem = (e, content) => {
  53. e.stopPropagation()
  54. console.log('download nyi', content)
  55. }
  56. handleClickArchiveContentItem = (e, content) => {
  57. e.stopPropagation()
  58. console.log('archive nyi', content)
  59. }
  60. handleClickDeleteContentItem = (e, content) => {
  61. e.stopPropagation()
  62. console.log('delete nyi', content)
  63. }
  64. handleClickFolder = folderId => {
  65. this.props.dispatch(getFolderContent(this.props.workspace.id, folderId))
  66. }
  67. filterWorkspaceContent = (contentList, filter) => filter.length === 0
  68. ? contentList
  69. : contentList.filter(c => c.type === 'folder' || filter.includes(c.type)) // keep unfiltered files and folders
  70. .map(c => c.type !== 'folder' ? c : {...c, content: this.filterWorkspaceContent(c.content, filter)}) // recursively filter folder content
  71. // .filter(c => c.type !== 'folder' || c.content.length > 0) // remove empty folder => 2018/05/21 - since we load only one lvl of content, don't remove empty folders
  72. render () {
  73. const { workspace, app } = this.props
  74. const filteredWorkspaceContent = this.filterWorkspaceContent(workspace.content, workspace.filter)
  75. return (
  76. <div className='sidebarpagecontainer'>
  77. <Sidebar />
  78. <PageWrapper customeClass='workspace'>
  79. <PageTitle
  80. parentClass='workspace__header'
  81. customClass='justify-content-between'
  82. title={workspace.title}
  83. >
  84. <DropdownCreateButton parentClass='workspace__header__btnaddworkspace' />
  85. </PageTitle>
  86. <PageContent parentClass='workspace__content'>
  87. <div className='workspace__content__fileandfolder folder__content active'>
  88. <ContentItemHeader />
  89. { filteredWorkspaceContent.map((c, i) => c.type === 'folder'
  90. ? (
  91. <Folder
  92. app={app}
  93. folderData={c}
  94. onClickItem={this.handleClickContentItem}
  95. onClickExtendedAction={{
  96. edit: this.handleClickEditContentItem,
  97. move: this.handleClickMoveContentItem,
  98. download: this.handleClickDownloadContentItem,
  99. archive: this.handleClickArchiveContentItem,
  100. delete: this.handleClickDeleteContentItem
  101. }}
  102. onClickFolder={this.handleClickFolder}
  103. isLast={i === filteredWorkspaceContent.length - 1}
  104. key={c.id}
  105. />
  106. )
  107. : (
  108. <ContentItem
  109. name={c.title}
  110. type={c.type}
  111. icon={(app[c.type] || {icon: ''}).icon}
  112. status={c.status}
  113. onClickItem={() => this.handleClickContentItem(c)}
  114. onClickExtendedAction={{
  115. edit: e => this.handleClickEditContentItem(e, c),
  116. move: e => this.handleClickMoveContentItem(e, c),
  117. download: e => this.handleClickDownloadContentItem(e, c),
  118. archive: e => this.handleClickArchiveContentItem(e, c),
  119. delete: e => this.handleClickDeleteContentItem(e, c)
  120. }}
  121. isLast={i === filteredWorkspaceContent.length - 1}
  122. key={c.id}
  123. />
  124. )
  125. )}
  126. </div>
  127. <DropdownCreateButton customClass='workspace__content__button mb-5' />
  128. <div id='appContainer' />
  129. </PageContent>
  130. </PageWrapper>
  131. </div>
  132. )
  133. }
  134. }
  135. const mapStateToProps = ({ user, workspace, workspaceList, app }) => ({ user, workspace, workspaceList, app })
  136. export default connect(mapStateToProps)(appFactory(WorkspaceContent))