langbung01 icon

Untitled

langbung01 | PRO | 12/19/18 10:53:26 AM UTC | 0 ⭐ | 617 👁️ | Never ⏰ | []
JavaScript |

12.04 KB

|

None

|

0 👍

/

0 👎

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Modal } from 'react-bootstrap';
import { change, Field, reduxForm, SubmissionError } from 'redux-form'
import swal from 'sweetalert2';
import axios from 'axios/index'
 
const formName = 'addOwner';
 
class BusinessNewOwnerModal extends Component {
  constructor(props) {
    super(props);
    this.state = {
      bizRoleOption:[],
      listNewOwner: [],
      errorConfirmOwner: '',
      first_name_owner: '',
      last_name_owner: '',
      position_name_owner: '',
      department_name_owner: '',
    };
  }
 
  componentDidMount(){
      this.getRoleBizOption();
  }
 
  handleSubmit = async (values) => {
    const url = `${process.env.MIX_BACKEND_IP}/api/check_owner`;
    try {
      const res = await axios.post(url, values);
      const { id } = res.data.data;
      this.setState({
        listNewOwner: [
          ...this.state.listNewOwner, {
            name: `${values.first_name_owner} ${values.last_name_owner}`,
            id,
          }],
        first_name_owner: values.first_name_owner,
        last_name_owner: values.last_name_owner,
        position_name_owner: values.position_name_owner,
        department_name_owner: values.department_name_owner,
      });
    } catch (e) {
      throw new SubmissionError({
        _error: e.response.data.errorMessage,
      });
    }
  };
 
  deleteNewOwner = (i) => {
    const listNewOwner = this.state.listNewOwner.filter((item, index) => index !== i);
    this.setState({
      listNewOwner,
    });
  };
 
  renderField = (field, disabled) => {
    const { meta: { touched, error } } = field;
    const className = `form-group has-feedback ${touched && error
      ? 'has-error'
      : ''}`;
    return (
      <div className={className}>
        <label htmlFor={field.input.name}>{field.label}</label>
        <input
          type={field.type}
          disabled={disabled}
          placeholder={field.label}
          className="form-control"
          {...field.input}
        />
        <span className="help-block">
          {touched ? error : ''}
        </span>
      </div>
    );
  };
 
  getRoleBizOption=()=>{
      console.log(this.props.bizRole.length);
      this.setState({
          bizRoleOption:this.props.bizRole.map((bizRole)=>(
              <option key={bizRole} value="{bizRole}">{bizRole}</option>
          )),
      })
  }
 
  renderSelectPosition= async (field)=>{
      const { meta: { touched, error } } = field;
      const className = `form-group has-feedback ${touched && error
          ? 'has-error'
          : ''}`;
 
    return (
          <div className={className}>
              <label htmlFor={field.input.name}>{field.label}</label>
              <div className="form-group">
                  <div className="input-group col-md-12">
                      <select
                          type={field.type}
                          placeholder={field.label}
                          className="form-control">
                          {this.state.bizRole}
                      </select>
                  </div>
                  <span className="help-block">
                    {/*{touched ? error : ''}*/}
                  </span>
            </div>
          </div>
      );
  }
 
  renderInputField = (field) => {
    const { meta: { touched, error } } = field;
    const className = `form-group has-feedback ${touched && error
      ? 'has-error'
      : ''}`;
    return (
      <div className={className}>
        <label htmlFor={field.input.name}>{field.label}</label>
        <div className="form-group">
          <div className="input-group col-md-12">
            <input
              type={field.type}
              placeholder={field.label}
              className="form-control"
              {...field.input}
            />
            <span className="input-group-btn"> <button type="button" className="btn btn-primary"><i className="fa fa-search"/></button> </span>
          </div>
          <span className="help-block">
            {touched ? error : ''}
          </span>
        </div>
      </div>
    );
  };
 
  renderInputFieldDetail = (field) => {
    const { meta: { touched, error } } = field;
    const className = `form-group has-feedback ${touched && error
      ? 'has-error'
      : ''}`;
    return (
      <div className={className}>
        <label htmlFor={field.input.name}>{field.label}</label>
          <input
            type={field.type}
            placeholder={field.label}
            className="form-control"
            {...field.input}
          />
          <span className="help-block">
            {touched ? error : ''}
          </span>
      </div>
    );
  };
 
  handleConfirmOwner = async () => {
    if (!this.state.listNewOwner.length) {
      this.setState({
        errorConfirmOwner: 'Please add owner before confirm',
      });
      return;
    }
    const ownerId = this.state.listNewOwner.map(account => account.id);
    const url = '/service/request_business';
    const businessId = document.querySelector('meta[name="account-id"]').getAttribute('content');
    try {
      await axios.post(url, {
        businessId,
        type: 'ADD_NEW_OWNER',
        ownerId,
        firstName: this.state.first_name_owner,
        lastName: this.state.last_name_owner,
        position: this.state.position_name_owner,
        department: this.state.department_name_owner,
      });
      swal({
        title: 'request success',
        type: 'success',
        showConfirmButton: false,
        timer: 3000,
      });
      this.props.handleModal(false);
    } catch (e) {
      console.log(e);
    }
  };
 
  render() {
    console.log(this.props.bizRole.length);
    if(this.props.bizRole.length>0)
      return (
          <Modal
              show={this.props.openModal}
              onHide={() => this.props.handleModal(false)}
          >
              <Modal.Header closeButton>
                  <Modal.Title>เพิ่มพนักงาน</Modal.Title>
              </Modal.Header>
              <Modal.Body>
                  <form onSubmit={this.props.handleSubmit(this.handleSubmit)}>
                      <Field
                          name="first_name_owner"
                          type="text"
                          component={this.renderField}
                          label="ชื่อ (ภาษาอังกฤษ)"
                      />
                      <Field
                          name="last_name_owner"
                          type="text"
                          component={this.renderField}
                          label="นามสกุล (ภาษาอังกฤษ)"
                      />
 
                      <Field
                          name="id_no_owner"
                          type="text"
                          component={this.renderInputField}
                          label="เลขบัตรประจำตัว"
                      />
 
                      <Field
                          name="position_name_owner"
                          type="text"
                          component={this.renderSelectPosition}
                          label="ตำแหน่ง*"
                      />
 
 
                      <Field
                          name="department_name_owner"
                          type="text"
                          component={this.renderInputFieldDetail}
                          label="แผนก*"
                      />
 
                      <p className="text-danger">
                          {this.props.error && <strong>{this.props.error}</strong>}
                      </p>
                      <button type="submit" className="btn btn-primary">เพิ่ม</button>
                  </form>
                  <hr />
                  <table className="table table-hover">
                      <thead>
                      <tr>
                          <th>#</th>
                          <th>ชื่อ</th>
                      </tr>
                      </thead>
                      <tbody>
                      {this.state.listNewOwner.map((account, index) => (
                          <tr key={index}>
                              <td>
                                  {index + 1}
                              </td>
                              <td>
                                  {account.name}
                              </td>
                              <td>
                                  <button
                                      className="btn btn-danger"
                                      onClick={() => this.deleteNewOwner(index)}
                                  >
                                      <i className="fa fa-times" />
                                  </button>
                              </td>
                          </tr>
                      ))}
                      </tbody>
                  </table>
                  <p className="text-danger">
                      {!this.state.listNewOwner.length && <strong>{this.state.errorConfirmOwner}</strong>}
                  </p>
              </Modal.Body>
              <Modal.Footer>
                  <button className="btn btn-primary" onClick={this.handleConfirmOwner}>
                      ยืนยัน
                  </button>
              </Modal.Footer>
          </Modal>
      );
    return "";
 
  }
}
 
BusinessNewOwnerModal.propTypes = {
  openModal: PropTypes.bool.isRequired,
  handleModal: PropTypes.func.isRequired,
  handleSubmit: PropTypes.func.isRequired,
};
BusinessNewOwnerModal.defaultProps = {};
 
function validate(values) {
  const errors = {};
  const regex = /(?=.*[A-Za-z])(?=.*\d)[\S\d]{8,}$/;
  const regexNumber = /^[0-9\b]+$/;
  const regexEng = /^[A-Za-z][A-Za-z0-9]*$/;
 
  if (!values.first_name_owner) {
    errors.first_name_owner = 'โปรดกรอกชื่อ';
  } else if (!regexEng.test(values.first_name_owner)) {
    errors.first_name_owner = 'โปรดกรอกภาษาอังกฤษเท่านั้น';
  }
  if (!values.last_name_owner) {
    errors.last_name_owner = 'โปรดกรอกชื่อ(ภาษาอังกฤษ)';
  } else if (!regexEng.test(values.last_name_owner)) {
    errors.last_name_owner = 'โปรดกรอกภาษาอังกฤษเท่านั้น';
  }
  if (!values.id_no_owner) {
    errors.id_no_owner = 'โปรดกรอกเลขประจำตัวประชาชน';
  } else if (!regexNumber.test(values.id_no_owner)) {
    errors.id_no_owner = 'โปรดกรอกตัวเลขเท่านั้น';
  } else if (values.id_no_owner.length !== 13) {
    errors.id_no_owner = 'เลขประจำตัวประชาชนต้องเท่ากับ 13 หลัก';
  }
  if (!values.position_name_owner) {
    errors.position_name_owner = 'โปรดกรอกตำแหน่ง';
  }
  if (!values.department_name_owner) {
    errors.department_name_owner = 'โปรดกรอกแผนก';
  }
  return errors;
}
 
const handleSearch = async (values, dispatch, props) => {
  const url = `${process.env.MIX_BACKEND_IP}/api/check_owner`;
  try {
    const res = await axios.post(url, {
      id_no_owner: values.id_no_owner,
    });
    props.dispatch(change(formName, 'first_name_owner', res.data.data.first_name_eng));
    props.dispatch(change(formName, 'last_name_owner', res.data.data.last_name_eng));
  } catch (exception) {
    props.dispatch(change(formName, 'first_name_owner', ''));
    props.dispatch(change(formName, 'last_name_owner', ''));
    throw {
      id_no_owner: "ไม่พบผู้ใช้ในระบบ"
    }
  }
}
 
export default reduxForm({
  form: formName,
  validate,
  asyncValidate: handleSearch,
  asyncBlurFields: ['id_no_owner'],
})(BusinessNewOwnerModal);

Comments