index.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import React, { Component } from 'react';
  2. import PropTypes from 'prop-types';
  3. import Field from 'components/Field';
  4. import './style.scss';
  5. function getEmptyValue(type) {
  6. if (type === 'text' || type === 'textarea') {
  7. return '';
  8. }
  9. if (type === 'number') {
  10. return 0;
  11. }
  12. return null;
  13. }
  14. function makeEmptyFields(docFields) {
  15. return Object.keys(docFields).reduce((items, key) => ({
  16. ...items,
  17. [key]: getEmptyValue(docFields[key].type)
  18. }), {});
  19. }
  20. export default class AddCrudItem extends Component {
  21. static propTypes = {
  22. docFields: PropTypes.object.isRequired,
  23. onCreate: PropTypes.func.isRequired
  24. };
  25. constructor(props) {
  26. super(props);
  27. this.state = makeEmptyFields(props.docFields);
  28. this.onFieldChange = Object.keys(props.docFields).reduce((items, key) => ({
  29. ...items,
  30. [key]: event => {
  31. this.setState({
  32. [key]: event.target.value
  33. });
  34. }
  35. }), {});
  36. }
  37. onCreate = () => {
  38. this.props.onCreate(this.state);
  39. this.setState(makeEmptyFields(this.props.docFields));
  40. };
  41. render() {
  42. const {
  43. docFields
  44. } = this.props;
  45. const fields = Object.keys(docFields).map(key => (
  46. <div key={key} className="field-wrapper">
  47. <span className="title">{key}</span>
  48. <Field
  49. type={docFields[key].type}
  50. value={this.state[key]}
  51. onChange={this.onFieldChange[key]}
  52. />
  53. </div>
  54. ));
  55. return (
  56. <div className="add-field-wrapper">
  57. <div className="fields">
  58. {fields}
  59. </div>
  60. <div className="meta">
  61. <button className="button-add" onClick={this.onCreate}>{'Add'}</button>
  62. </div>
  63. </div>
  64. );
  65. }
  66. }