Folder.jsx 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. handleClickNewFile = e => {
  20. e.stopPropagation() // because we have a link inside a link (togler and newFile)
  21. console.log('new file') // @TODO
  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.title }
  44. </div>
  45. <div className='folder__header__button'>
  46. <div
  47. className='folder__header__button__addbtn'
  48. onClick={this.handleClickNewFile}
  49. >
  50. <button className='addbtn__text btn btn-outline-primary dropdown-toggle' type='button' id='dropdownMenuButton' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'>
  51. {t('Folder.create')} ...
  52. </button>
  53. <div className='addbtn__subdropdown dropdown-menu' aria-labelledby='dropdownMenuButton'>
  54. <div className='subdropdown__link dropdown-item'>
  55. <div className='subdropdown__link__folder d-flex align-items-center'>
  56. <div className='subdropdown__link__folder__icon mr-3'>
  57. <i className='fa fa-fw fa-folder-o' />
  58. </div>
  59. <div className='subdropdown__link__folder__text'>
  60. Créer un dossier
  61. </div>
  62. </div>
  63. </div>
  64. <div className='subdropdown__link dropdown-item'>
  65. <div className='subdropdown__link__apphtml d-flex align-items-center'>
  66. <div className='subdropdown__link__apphtml__icon mr-3'>
  67. <i className='fa fa-fw fa-file-text-o' />
  68. </div>
  69. <div className='subdropdown__link__apphtml__text'>
  70. Rédiger un document
  71. </div>
  72. </div>
  73. </div>
  74. <div className='subdropdown__link dropdown-item'>
  75. <div className='subdropdown__link__appfile d-flex align-items-center'>
  76. <div className='subdropdown__link__appfile__icon mr-3'>
  77. <i className='fa fa-fw fa-file-image-o' />
  78. </div>
  79. <div className='subdropdown__link__appfile__text'>
  80. Importer un fichier
  81. </div>
  82. </div>
  83. </div>
  84. <div className='subdropdown__link dropdown-item'>
  85. <div className='subdropdown__link__appmarkdown d-flex align-items-center'>
  86. <div className='subdropdown__link__appmarkdown__icon mr-3'>
  87. <i className='fa fa-fw fa-file-code-o' />
  88. </div>
  89. <div className='subdropdown__link__appmarkdown__text'>
  90. Rédiger un document markdown
  91. </div>
  92. </div>
  93. </div>
  94. <div className='subdropdown__link dropdown-item'>
  95. <div className='subdropdown__link__appthread d-flex align-items-center'>
  96. <div className='subdropdown__link__appthread__icon mr-3'>
  97. <i className='fa fa-fw fa-comments-o' />
  98. </div>
  99. <div className='subdropdown__link__appthread__text'>
  100. Lancer une discussion
  101. </div>
  102. </div>
  103. </div>
  104. <div className='subdropdown__link dropdown-item'>
  105. <div className='subdropdown__link__apptask d-flex align-items-center'>
  106. <div className='subdropdown__link__apptask__icon mr-3'>
  107. <i className='fa fa-fw fa-list-ul' />
  108. </div>
  109. <div className='subdropdown__link__apptask__text'>
  110. Créer une tâche
  111. </div>
  112. </div>
  113. </div>
  114. <div className='subdropdown__link dropdown-item'>
  115. <div className='subdropdown__link__appissue d-flex align-items-center'>
  116. <div className='subdropdown__link__appissue__icon mr-3'>
  117. <i className='fa fa-fw fa-ticket' />
  118. </div>
  119. <div className='subdropdown__link__appissue__text'>
  120. Ouvrir un ticket
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. <div className='d-none d-md-flex'>
  126. <BtnExtandedAction onClickExtendedAction={{
  127. edit: e => onClickExtendedAction.edit(e, folderData),
  128. move: e => onClickExtendedAction.move(e, folderData),
  129. download: e => onClickExtendedAction.download(e, folderData),
  130. archive: e => onClickExtendedAction.archive(e, folderData),
  131. delete: e => onClickExtendedAction.delete(e, folderData)
  132. }} />
  133. </div>
  134. </div>
  135. </div>
  136. <div className='folder__header__status' />
  137. </div>
  138. <div className='folder__content'>
  139. { folderData.content.map((c, i) => c.type === 'folder'
  140. ? <Folder
  141. app={app}
  142. folderData={c}
  143. onClickItem={onClickItem}
  144. onClickExtendedAction={onClickExtendedAction}
  145. onClickFolder={onClickFolder}
  146. isLast={isLast}
  147. t={t}
  148. key={c.id}
  149. />
  150. : <FileItem
  151. icon={(app[c.type] || {icon: ''}).icon}
  152. name={c.title}
  153. type={c.type}
  154. status={c.status}
  155. onClickItem={() => onClickItem(c)}
  156. onClickExtendedAction={{
  157. // we have to use the event here because it is the only place where we also have the content (c)
  158. edit: e => onClickExtendedAction.edit(e, c),
  159. move: e => onClickExtendedAction.move(e, c),
  160. download: e => onClickExtendedAction.download(e, c),
  161. archive: e => onClickExtendedAction.archive(e, c),
  162. delete: e => onClickExtendedAction.delete(e, c)
  163. }}
  164. isLast={isLast && i === folderData.content.length - 1}
  165. key={c.id}
  166. />
  167. )}
  168. </div>
  169. </div>
  170. )
  171. }
  172. }
  173. export default translate()(Folder)
  174. Folder.propTypes = {
  175. folderData: PropTypes.shape({
  176. title: PropTypes.string.isRequired,
  177. content: PropTypes.array
  178. }),
  179. app: PropTypes.object,
  180. onClickItem: PropTypes.func.isRequired,
  181. onClickFolder: PropTypes.func.isRequired,
  182. isLast: PropTypes.bool.isRequired
  183. }