index.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import React, { Component } from 'react';
  2. import PropTypes from 'prop-types';
  3. import classNames from 'classnames';
  4. import CrudField from 'components/CrudField';
  5. import './style.scss';
  6. export default class CrudDocument extends Component {
  7. static propTypes = {
  8. id: PropTypes.string.isRequired,
  9. pending: PropTypes.bool,
  10. fields: PropTypes.object.isRequired,
  11. docFields: PropTypes.object.isRequired,
  12. onUpdate: PropTypes.func.isRequired,
  13. onDelete: PropTypes.func.isRequired
  14. };
  15. constructor(props) {
  16. super(props);
  17. this.state = {
  18. editing: false
  19. };
  20. }
  21. onEditStart = () => {
  22. this.setState({ editing: true });
  23. };
  24. onEditEnd = (key, value) => {
  25. this.setState({ editing: false });
  26. this.props.onUpdate(this.props.id, { [key]: value });
  27. };
  28. onDelete = () => {
  29. this.props.onDelete(this.props.id);
  30. };
  31. render() {
  32. const {
  33. pending,
  34. fields,
  35. docFields
  36. } = this.props;
  37. const fieldsList = Object.keys(fields).map(key => (
  38. <CrudField key={key}
  39. field={key}
  40. pending={pending}
  41. type={docFields[key].type}
  42. value={fields[key]}
  43. onEditStart={this.onEditStart}
  44. onEditEnd={this.onEditEnd}
  45. />
  46. ));
  47. const className = classNames('crud-document-wrapper', {
  48. pending
  49. });
  50. return (
  51. <div className={className}>
  52. <div className="fields-list">
  53. {fieldsList}
  54. </div>
  55. <div className="meta">
  56. <button className="button-delete"
  57. onClick={this.onDelete}
  58. disabled={pending}>
  59. {'Delete'}
  60. </button>
  61. </div>
  62. </div>
  63. );
  64. }
  65. }