Guest User

Untitled

a guest
Nov 20th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.64 KB | None | 0 0
  1. import React, { Component } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { connect } from 'react-redux';
  4.  
  5. import documentAction from 'actions/files';
  6. import modalAction from 'actions/modals';
  7.  
  8. import CPInputFile from 'components/InputFile/inputMassa';
  9.  
  10. import documentService from 'services/DocumentService';
  11.  
  12.  
  13. class InputFile extends Component {
  14. setServerId = (fileId, serverId) => {
  15. const { dispatch } = this.props;
  16. dispatch(documentAction.setServerId(fileId, serverId));
  17. };
  18.  
  19. sendToS3 = (companyId, token, file, cb) => {
  20. const { dispatch } = this.props;
  21. documentService.create(companyId, token, file, dispatch)
  22. .then((response) => {
  23. this.setServerId(file._id, response[0].id);
  24. }).catch(() => cb());
  25. };
  26.  
  27.  
  28. toogleFileModal = state => this.props.dispatch(modalAction.toggle('inputFile', state))
  29.  
  30.  
  31. handleDeleteFile = (id) => {
  32. const { dispatch } = this.props;
  33. dispatch(documentAction.removeFile(id));
  34. return id;
  35. }
  36.  
  37. // TODO: Upload no arquivo após clicar em salvar. Retornar key do amazon e link. Transação recebe os dados da amazon e cria documento no banco com eles.
  38.  
  39. addFilesToState = (files) => {
  40. const { dispatch } = this.props;
  41. dispatch(documentAction.addFiles(files));
  42. };
  43.  
  44. render() {
  45. const { modals, files } = this.props;
  46. const inputFileProps = {
  47. files,
  48. addFilesToState: this.addFilesToState,
  49. sendToS3: this.sendToS3,
  50. setServerId: this.setServerId,
  51. toogleFileModal: this.toogleFileModal,
  52. fileModalProps: {
  53. files,
  54. isOpen: modals.inputFile.isOpen,
  55. toogleFileModal: this.toogleFileModal,
  56. handleUpdateLoading: this.handleUpdateLoading,
  57. handleDeleteFile: this.handleDeleteFile,
  58. handleChangeCheckbox: this.handleChangeCheckbox,
  59. },
  60. };
  61.  
  62. return (
  63. <CPInputFile {...inputFileProps} />
  64. );
  65. }
  66. }
  67.  
  68. InputFile.propTypes = {
  69. dispatch: PropTypes.func.isRequired,
  70. modals: PropTypes.shape().isRequired,
  71. files: PropTypes.shape().isRequired,
  72. };
  73.  
  74. const inputFile = connect(state => ({
  75. modals: state.modals,
  76. company: state.main.userCompanyId,
  77. token: state.auth.userToken,
  78. files: state.files.files,
  79. }))(InputFile);
  80.  
  81. export default inputFile;
  82.  
  83. import React, { Component } from 'react';
  84. import PropTypes from 'prop-types';
  85. import CSSModules from 'react-css-modules';
  86. import async from 'async';
  87. import _ from 'lodash';
  88.  
  89. import CSSModulesConfig from 'config/cssModules';
  90. import Icon from 'components/Icon';
  91. import FileModal from './FileModal';
  92.  
  93. import style from './style.styl';
  94.  
  95. @CSSModules(style, CSSModulesConfig)
  96. class InputFile extends Component {
  97. uploadFiles = (companyId, token, filesToUpload) => {
  98. const { sendToS3 } = this.props;
  99. async.each(filesToUpload, (file, cb) => {
  100. sendToS3(companyId, token, file, cb);
  101. }, (err) => {
  102. console.log(err);
  103. });
  104. };
  105.  
  106. checkedFileType = (files) => {
  107. const types = ['.pdf', '.jpeg'];
  108. let validated = false;
  109.  
  110. return _.map(files, (file) => {
  111. _.map(types, (type) => {
  112. const valid = file.name.indexOf(type);
  113. if (valid >= 0) {
  114. validated = ({
  115. _id: Math.random() * Date.now(),
  116. filename: file.name,
  117. filesize: file.size,
  118. isPayment: false,
  119. isExpense: false,
  120. loading: 0,
  121. file,
  122. });
  123. }
  124. });
  125.  
  126. return validated;
  127. });
  128. }
  129.  
  130. openFileWindow = () => this.inputFile.click();
  131.  
  132. shouldOpenFileWindow = () => {
  133. const { toogleFileModal, files } = this.props;
  134. if (files.length === 0) this.openFileWindow();
  135. else toogleFileModal(false);
  136. };
  137.  
  138. handleChangeInputFile = (event) => {
  139. const {
  140. addFilesToState,
  141. toogleFileModal,
  142. } = this.props;
  143.  
  144. const files = this.checkedFileType(event.target.files);
  145. _.remove(files, file => file === false);
  146. if (files !== []) {
  147. addFilesToState(files);
  148. this.uploadFiles(this.props.company, this.props.token, files);
  149. }
  150.  
  151.  
  152. // TODO: Apagar os dados do input DEPOIS que o upload for finalizado
  153. this.inputFile.value = '';
  154. toogleFileModal(false);
  155. }
  156.  
  157. handleChangeCheckbox = (id, checked, checkbox) =>
  158.  
  159. // files[index][checkbox] = checked;
  160.  
  161. id
  162.  
  163. // dispatch para mudar tipo de documento
  164.  
  165. ;
  166.  
  167.  
  168. render() {
  169. const {
  170. fileModalProps,
  171. shouldOpenFileWindow,
  172. } = this.props;
  173.  
  174. return (
  175. <label styleName="inputFile">
  176. <Icon name="attachment" />
  177. <button
  178. type="button"
  179. styleName="button"
  180. onClick={this.shouldOpenFileWindow}
  181. >
  182. Anexar documentos comprobatórios
  183. </button>
  184.  
  185. <input
  186. ref={(input) => {
  187. this.inputFile = input;
  188. return this.inputFile;
  189. }}
  190. type="file"
  191. multiple
  192. onChange={this.handleChangeInputFile}
  193. />
  194.  
  195. <FileModal
  196. openFileWindow={this.openFileWindow}
  197. {...fileModalProps}
  198. />
  199. </label>
  200. );
  201. }
  202. }
  203.  
  204. InputFile.propTypes = {
  205. handleChangeInputFile: PropTypes.func.isRequired,
  206. shouldOpenFileWindow: PropTypes.func.isRequired,
  207. addFilesToState: PropTypes.func.isRequired,
  208. toogleFileModal: PropTypes.func.isRequired,
  209. sendToS3: PropTypes.func.isRequired,
  210. fileModalProps: PropTypes.shape().isRequired,
  211. files: PropTypes.arrayOf(Object).isRequired,
  212. };
  213.  
  214. export default InputFile;
  215.  
  216. import React from 'react';
  217. import PropTypes from 'prop-types';
  218. import _ from 'lodash';
  219.  
  220.  
  221. import Modal from 'components/Modal';
  222. import Button from 'components/Button';
  223. import ButtonGroup from 'components/ButtonGroup';
  224. import File from '../File';
  225. import Empty from '../Empty';
  226.  
  227. const FileModal = (props) => {
  228. const {
  229. isOpen,
  230. files,
  231. handleChangeCheckbox,
  232. handleDeleteFile,
  233. openFileWindow,
  234. toogleFileModal,
  235. } = props;
  236.  
  237.  
  238. return (<Modal
  239. contentLabel="inputFileModal"
  240. isOpen={isOpen}
  241. onRequestClose={() => toogleFileModal(true)}
  242. file
  243. >
  244. <div>
  245. <section>
  246. <h3 >Anexar documentos</h3>
  247.  
  248. {
  249. files.length > 0
  250. ? (
  251. _.map(files, file => (
  252. <File
  253. key={file._id}
  254. id={file._id}
  255. handleChangePayment={event => handleChangeCheckbox(file._id, event.target.checked, 'isPayment')}
  256. handleChangeExpense={event => handleChangeCheckbox(file._id, event.target.checked, 'isExpense')}
  257. handleDeleteFile={() => handleDeleteFile(file._id)}
  258. />
  259. ))
  260. ) : <Empty openFileWindow={openFileWindow} />
  261. }
  262. </section>
  263. <footer>
  264. <ButtonGroup right>
  265. <Button
  266. basic
  267. label="Anexar mais documentos"
  268. onClick={openFileWindow}
  269. />
  270. <Button
  271. label="Salvar"
  272. onClick={() => toogleFileModal(true)}
  273. />
  274. </ButtonGroup>
  275. </footer>
  276. </div>
  277. </Modal>);
  278. };
  279.  
  280. FileModal.defaultProps = {
  281. isOpen: false,
  282. };
  283.  
  284. FileModal.propTypes = {
  285. isOpen: PropTypes.bool,
  286. };
  287.  
  288. export default FileModal;
  289.  
  290. import React, { Component } from 'react';
  291. import PropTypes from 'prop-types';
  292. import CSSModules from 'react-css-modules';
  293.  
  294. import CSSModulesConfig from 'config/cssModules';
  295. import Icon from 'components/Icon';
  296. import Loading from 'components/Loading';
  297.  
  298. import style from './style';
  299.  
  300. @CSSModules(style, CSSModulesConfig)
  301. class File extends Component {
  302. render() {
  303. const {
  304. handleChangeExpense,
  305. handleChangePayment,
  306. handleDeleteFile,
  307. } = this.props;
  308.  
  309. const {
  310. filename,
  311. filesize,
  312. isExpense,
  313. isPayment,
  314. loading,
  315. } = this.props.fileData;
  316.  
  317. let size = filesize / 1000;
  318. size = `${size.toFixed(2)} KB`;
  319. return (
  320. <section styleName="container">
  321. <Icon className={style.icon} name="lion" />
  322.  
  323. <div>
  324. {
  325. loading === 100
  326. ? (
  327. <div styleName="info">
  328. <div styleName="name is-primary">{filename}</div>
  329. <div styleName="size is-primary">{size}</div>
  330. </div>
  331. ) : (
  332. <div styleName="info">
  333. <div styleName="name">{filename}</div>
  334. <div styleName="bar">
  335. <div style={{ width: `${loading}%` }} data-percent={`${loading}%`} />
  336. </div>
  337. <Loading />
  338. </div>
  339. )
  340. }
  341.  
  342. <div>
  343. <span styleName="label">Tipo de documento:</span>
  344. <div styleName="check">
  345. <div className="u-mr20">
  346. <input
  347. className="u-mr5"
  348. type="checkbox"
  349. onChange={handleChangePayment}
  350. checked={isPayment}
  351. />
  352. Comprovante de pagamento
  353. </div>
  354. <div>
  355. <input
  356. className="u-mr5"
  357. type="checkbox"
  358. onChange={handleChangeExpense}
  359. checked={isExpense}
  360. />
  361. Comprovante de despesa
  362. </div>
  363. </div>
  364. </div>
  365.  
  366. </div>
  367.  
  368. <div styleName="icons" onClick={handleDeleteFile}>
  369. <Icon name="trash" />
  370. </div>
  371. </section>
  372. );
  373. }
  374. }
  375.  
  376. File.propTypes = {
  377. handleChangeExpense: PropTypes.func.isRequired,
  378. handleChangePayment: PropTypes.func.isRequired,
  379. handleDeleteFile: PropTypes.func.isRequired,
  380. fileData: PropTypes.shape({
  381. filename: PropTypes.string.isRequired,
  382. filesize: PropTypes.number.isRequired,
  383. isExpense: PropTypes.bool.isRequired,
  384. isPayment: PropTypes.bool.isRequired,
  385. loading: PropTypes.number.isRequired,
  386. }).isRequired,
  387. };
  388.  
  389. export default File;
Add Comment
Please, Sign In to add comment