Folder.jsx 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. import React from 'react'
  2. import { translate } from 'react-i18next'
  3. import PropTypes from 'prop-types'
  4. import classnames from 'classnames'
  5. import FileItem from './ContentItem.jsx'
  6. // import PopupExtandedAction from '../../container/PopupExtandedAction.jsx'
  7. import BtnExtandedAction from './BtnExtandedAction.jsx'
  8. class Folder extends React.Component {
  9. constructor (props) {
  10. super(props)
  11. this.state = {
  12. open: false
  13. }
  14. }
  15. handleClickToggleFolder = () => {
  16. !this.state.open && this.props.folderData.content.length === 0 && this.props.onClickFolder(this.props.folderData.id)
  17. this.setState({open: !this.state.open})
  18. }
  19. handleClickCreateContent = (e, folder, type) => {
  20. e.stopPropagation() // because we have a link inside a link (togler and newFile)
  21. this.props.onClickCreateContent(folder, type)
  22. }
  23. render () {
  24. const {
  25. app,
  26. folderData,
  27. onClickItem,
  28. onClickExtendedAction,
  29. onClickFolder,
  30. isLast,
  31. t
  32. } = this.props
  33. return (
  34. <div className={classnames('folder', {'active': this.state.open && folderData.content.length > 0, 'item-last': isLast})}>
  35. <div className='folder__header align-items-center' onClick={this.handleClickToggleFolder}>
  36. <div className='folder__header__triangleborder'>
  37. <div className='folder__header__triangleborder__triangle' />
  38. </div>
  39. <div className='folder__header__icon'>
  40. <i className={classnames('fa fa-fw', {'fa-folder-open-o': this.state.open, 'fa-folder-o': !this.state.open})} />
  41. </div>
  42. <div className='folder__header__name'>
  43. { folderData.label }
  44. </div>
  45. <div className='folder__header__button'>
  46. <div className='folder__header__button__addbtn'>
  47. <button
  48. className='addbtn__text btn btn-outline-primary dropdown-toggle'
  49. type='button'
  50. id='dropdownMenuButton'
  51. data-toggle='dropdown'
  52. aria-haspopup='true'
  53. aria-expanded='false'
  54. onClick={e => e.stopPropagation()}
  55. >
  56. {t('Folder.create')} ...
  57. </button>
  58. {/* @TODO generate the subdropdown with available app from redux */}
  59. <div className='addbtn__subdropdown dropdown-menu' aria-labelledby='dropdownMenuButton'>
  60. <div className='subdropdown__link dropdown-item' onClick={e => this.handleClickCreateContent(e, folderData, 'folder')}>
  61. <div className='subdropdown__link__folder d-flex align-items-center'>
  62. <div className='subdropdown__link__folder__icon mr-3'>
  63. <i className='fa fa-fw fa-folder-o' />
  64. </div>
  65. <div className='subdropdown__link__folder__text'>
  66. Créer un dossier
  67. </div>
  68. </div>
  69. </div>
  70. <div className='subdropdown__link dropdown-item' onClick={e => this.handleClickCreateContent(e, folderData, 'PageHtml')}>
  71. <div className='subdropdown__link__apphtml d-flex align-items-center'>
  72. <div className='subdropdown__link__apphtml__icon mr-3'>
  73. <i className='fa fa-fw fa-file-text-o' />
  74. </div>
  75. <div className='subdropdown__link__apphtml__text'>
  76. Rédiger un document
  77. </div>
  78. </div>
  79. </div>
  80. <div className='subdropdown__link dropdown-item' onClick={e => this.handleClickCreateContent(e, folderData, 'File')}>
  81. <div className='subdropdown__link__appfile d-flex align-items-center'>
  82. <div className='subdropdown__link__appfile__icon mr-3'>
  83. <i className='fa fa-fw fa-file-image-o' />
  84. </div>
  85. <div className='subdropdown__link__appfile__text'>
  86. Importer un fichier
  87. </div>
  88. </div>
  89. </div>
  90. <div className='subdropdown__link dropdown-item' onClick={e => this.handleClickCreateContent(e, folderData, 'PageMarkdown')}>
  91. <div className='subdropdown__link__appmarkdown d-flex align-items-center'>
  92. <div className='subdropdown__link__appmarkdown__icon mr-3'>
  93. <i className='fa fa-fw fa-file-code-o' />
  94. </div>
  95. <div className='subdropdown__link__appmarkdown__text'>
  96. Rédiger un document markdown
  97. </div>
  98. </div>
  99. </div>
  100. <div className='subdropdown__link dropdown-item' onClick={e => this.handleClickCreateContent(e, folderData, 'Thread')}>
  101. <div className='subdropdown__link__appthread d-flex align-items-center'>
  102. <div className='subdropdown__link__appthread__icon mr-3'>
  103. <i className='fa fa-fw fa-comments-o' />
  104. </div>
  105. <div className='subdropdown__link__appthread__text'>
  106. Lancer une discussion
  107. </div>
  108. </div>
  109. </div>
  110. <div className='subdropdown__link dropdown-item' onClick={e => this.handleClickCreateContent(e, folderData, 'Task')}>
  111. <div className='subdropdown__link__apptask d-flex align-items-center'>
  112. <div className='subdropdown__link__apptask__icon mr-3'>
  113. <i className='fa fa-fw fa-list-ul' />
  114. </div>
  115. <div className='subdropdown__link__apptask__text'>
  116. Créer une tâche
  117. </div>
  118. </div>
  119. </div>
  120. <div className='subdropdown__link dropdown-item' onClick={e => this.handleClickCreateContent(e, folderData, 'Issue')}>
  121. <div className='subdropdown__link__appissue d-flex align-items-center'>
  122. <div className='subdropdown__link__appissue__icon mr-3'>
  123. <i className='fa fa-fw fa-ticket' />
  124. </div>
  125. <div className='subdropdown__link__appissue__text'>
  126. Ouvrir un ticket
  127. </div>
  128. </div>
  129. </div>
  130. </div>
  131. <div className='d-none d-md-flex'>
  132. <BtnExtandedAction onClickExtendedAction={{
  133. edit: e => onClickExtendedAction.edit(e, folderData),
  134. move: e => onClickExtendedAction.move(e, folderData),
  135. download: e => onClickExtendedAction.download(e, folderData),
  136. archive: e => onClickExtendedAction.archive(e, folderData),
  137. delete: e => onClickExtendedAction.delete(e, folderData)
  138. }} />
  139. </div>
  140. </div>
  141. </div>
  142. <div className='folder__header__status' />
  143. </div>
  144. <div className='folder__content'>
  145. {
  146. // folderData.map((c, i) => c.type === 'folder'
  147. // ? <Folder
  148. // app={app}
  149. // folderData={c}
  150. // onClickItem={onClickItem}
  151. // onClickExtendedAction={onClickExtendedAction}
  152. // onClickFolder={onClickFolder}
  153. // isLast={isLast}
  154. // t={t}
  155. // key={c.id}
  156. // />
  157. // : <FileItem
  158. // icon={(app[c.type] || {icon: ''}).icon}
  159. // name={c.title}
  160. // type={c.type}
  161. // status={c.status}
  162. // onClickItem={() => onClickItem(c)}
  163. // onClickExtendedAction={{
  164. // // we have to use the event here because it is the only place where we also have the content (c)
  165. // edit: e => onClickExtendedAction.edit(e, c),
  166. // move: e => onClickExtendedAction.move(e, c),
  167. // download: e => onClickExtendedAction.download(e, c),
  168. // archive: e => onClickExtendedAction.archive(e, c),
  169. // delete: e => onClickExtendedAction.delete(e, c)
  170. // }}
  171. // isLast={isLast && i === folderData.content.length - 1}
  172. // key={c.id}
  173. // />
  174. // )
  175. }
  176. </div>
  177. </div>
  178. )
  179. }
  180. }
  181. export default translate()(Folder)
  182. Folder.propTypes = {
  183. folderData: PropTypes.object,
  184. app: PropTypes.array,
  185. onClickItem: PropTypes.func.isRequired,
  186. onClickFolder: PropTypes.func.isRequired,
  187. isLast: PropTypes.bool.isRequired
  188. }