WorkspaceContent.jsx 6.2KB

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