MetaPhase-Consulting/State-TalentMAP

View on GitHub
src/Components/AdministratorPage/bidAudit/BidAuditCard.jsx

Summary

Maintainability
A
35 mins
Test Coverage
F
6%
import { useEffect, useRef, useState } from 'react';
import { useDispatch } from 'react-redux';
import DatePicker from 'react-datepicker';
import TextareaAutosize from 'react-textarea-autosize';
import { Tooltip } from 'react-tippy';
import FA from 'react-fontawesome';
import PropTypes from 'prop-types';
import swal from '@sweetalert/with-react';
import { formatDate } from 'utilities';
import { bidAuditRunAudit, bidAuditUpdateAudit } from 'actions/bidAudit';
import { EMPTY_FUNCTION } from 'Constants/PropTypes';
import TabbedCard from 'Components/TabbedCard';
import { NO_VALUE } from 'Constants/SystemMessages';
import PositionExpandableContent from 'Components/PositionExpandableContent';
import { history } from '../../../store';

const BidAuditCard = ({ data, onEditModeSearch }) => {
  const {
    audit_id,
    audit_desc,
    cycle_id,
    cycle_category,
    cycle_name,
    cycle_status,
    posted_by_date,
    audit_date,
  } = data;

  const dispatch = useDispatch();

  const [description, setDescription] = useState(audit_desc || '');
  const [pbDate, setPbDate] = useState(posted_by_date ? new Date(posted_by_date) : '');

  const [editMode, setEditMode] = useState(false);

  useEffect(() => {
    setPbDate(posted_by_date ? new Date(posted_by_date) : '');
    setDescription(audit_desc || '');
    onEditModeSearch(editMode, audit_id);
  }, [editMode]);

  const onOptionClick = (type) => {
    history.push(`/profile/administrator/bidaudit/${type}/${cycle_id}/${audit_id}/`);
  };

  const onCancelForm = () => {
    setPbDate(posted_by_date ? new Date(posted_by_date) : '');
    setDescription(audit_desc || '');
    swal.close();
  };

  const onSubmitForm = () => {
    const formData = {
      id: cycle_id,
      auditNumber: audit_id,
      postByDate: formatDate(pbDate),
      auditDescription: description,
    };
    dispatch(bidAuditUpdateAudit(formData, setEditMode(false)));
  };

  const datePickerRef = useRef(null);
  const openDatePicker = () => {
    datePickerRef.current.setOpen(true);
  };

  const submitRunAudit = () => {
    dispatch(bidAuditRunAudit({
      cycleId: cycle_id,
      auditNbr: audit_id,
    }));
    swal.close();
  };

  const onRunBidAudit = () => {
    swal({
      title: 'Run Bid Audit?',
      button: false,
      content: (
        <div className="simple-action-modal">
          <div className="help-text">
            <span>{'Are you sure you want to run this Bid Audit?'}</span>
          </div>
          <div className="modal-controls">
            <button onClick={submitRunAudit} type="submit">Yes</button>
            <button className="usa-button-secondary" onClick={() => swal.close()}>Cancel</button>
          </div>
        </div>
      ),
    });
  };

  const onShowAuditData = () => {
    history.push(`/profile/administrator/bidaudit/data/${cycle_id}/${audit_id}/`);
  };

  const showRunBidAudit = () => (
    <div className="ba-run-audit">
      <Tooltip title="Run Bid Audit">
        <a role="button" tabIndex={0} onClick={onRunBidAudit}>
          Run Audit
        </a>
      </Tooltip>
    </div>
  );

  const showAuditData = () => (
    <div className="ba-run-audit">
      <Tooltip title="View Audit Data">
        <a role="button" tabIndex={0} onClick={onShowAuditData}>
          {audit_date}
        </a>
      </Tooltip>
    </div>
  );

  const bidAuditSections = {
    /* eslint-disable no-dupe-keys */
    /* eslint-disable quote-props */
    subheading: [
      { 'Cycle Name': cycle_name || NO_VALUE },
      { 'Status': cycle_status || NO_VALUE },
      { 'Category': cycle_category || NO_VALUE },
    ],
    bodyPrimary: [
      { 'Audit Number': audit_id || NO_VALUE },
      { 'Description': audit_desc || NO_VALUE },
      { 'Positions Posted By': posted_by_date || NO_VALUE },
      { 'Audit Date': audit_date ? showAuditData() : showRunBidAudit() },
    ],
    /* eslint-enable quote-props */
    /* eslint-enable no-dupe-keys */
  };
  const bidAuditForm = {
    /* eslint-disable quote-props */
    staticBody: [
      { 'Audit Number': audit_id || NO_VALUE },
      { 'Audit Date': audit_date || NO_VALUE },
    ],
    inputBody: (
      <div className="position-form">
        <div className="position-form--label-input-container">
          <label htmlFor="description">Audit Description</label>
          <TextareaAutosize
            maxRows={2}
            minRows={1}
            maxLength="100"
            name="description"
            placeholder="Please provide a description of the bid season."
            defaultValue={description || ''}
            onChange={(e) => setDescription(e.target.value)}
          />
        </div>
        <div className="word-count">
          {description?.length} / 100
        </div>
        <div className="position-form--inputs">
          <div className="position-form--label-input-container">
            <label htmlFor="status">Positions Posted By</label>
            <div className="date-wrapper-react larger-date-picker">
              <FA name="fa fa-calendar" onClick={() => openDatePicker()} />
              <FA name="times" className={`${pbDate ? '' : 'hide'}`} onClick={() => setPbDate(null)} />
              <DatePicker
                id={`mc-date-${audit_id}`}
                selected={pbDate}
                onChange={setPbDate}
                dateFormat="MM/dd/yyyy"
                placeholderText="MM/DD/YYYY"
                ref={datePickerRef}
              />
            </div>
          </div>
        </div>
        <div>
          <div className="ba-flex-end">
            <button onClick={() => onOptionClick('grade')}>View At Grades</button>
            <button onClick={() => onOptionClick('category')}>View In Skill Categories</button>
          </div>
        </div>
      </div>
    ),
    cancelText: 'Are you sure you want to discard all changes made to this position?',
    disableSubmit: (!pbDate || !description),
    handleSubmit: onSubmitForm,
    handleCancel: onCancelForm,
    handleEdit: {
      editMode,
      setEditMode,
    },
    /* eslint-enable quote-props */
  };

  return (
    <TabbedCard
      tabs={[{
        text: 'Bid Audit',
        value: 'Bid Audit',
        content: (
          <div className="position-content--container">
            <PositionExpandableContent
              sections={bidAuditSections}
              form={bidAuditForm}
              saveText="Save Audit Cycle"
            />
          </div>
        ),
      },
      ]}
    />
  );
};

BidAuditCard.propTypes = {
  data: PropTypes.shape({
    audit_id: PropTypes.number,
    audit_desc: PropTypes.string,
    cycle_id: PropTypes.number,
    cycle_category: PropTypes.string,
    cycle_category_code: PropTypes.string,
    cycle_name: PropTypes.string,
    cycle_status: PropTypes.string,
    cycle_status_code: PropTypes.string,
    posted_by_date: PropTypes.string,
    audit_date: PropTypes.string,
  }).isRequired,
  onEditModeSearch: PropTypes.func,
};

BidAuditCard.defaultProps = {
  onEditModeSearch: EMPTY_FUNCTION,
};

export default BidAuditCard;