add and implement action to send "delete fees" request

This commit is contained in:
Bilal Catic
2019-11-21 07:13:30 +01:00
parent 8a3db0d481
commit 37abb86961
4 changed files with 188 additions and 148 deletions

View File

@@ -1,5 +1,6 @@
import React from 'react'; import React, { Component } from 'react';
import { Loader } from 'semantic-ui-react'; import { connect } from 'react-redux';
import { Loader, Button } from 'semantic-ui-react';
import ReactTable from 'react-table'; import ReactTable from 'react-table';
import 'react-table/react-table.css'; import 'react-table/react-table.css';
import { NavLink } from 'react-router-dom'; import { NavLink } from 'react-router-dom';
@@ -13,155 +14,180 @@ import {
UNSCHEDULED_INCIDENT_BEFORE_RESERVATION, UNSCHEDULED_INCIDENT_STANDALONE UNSCHEDULED_INCIDENT_BEFORE_RESERVATION, UNSCHEDULED_INCIDENT_STANDALONE
} from '../../../constants/enums'; } from '../../../constants/enums';
import { doorLockRelatedWithReservationIncidentHeaders, standaloneDoorLockIncidentHeaders, bookingChangeIncidentHeaders } from '../../../constants/constants'; import { doorLockRelatedWithReservationIncidentHeaders, standaloneDoorLockIncidentHeaders, bookingChangeIncidentHeaders } from '../../../constants/constants';
import { deleteIncidents } from "../../../store/actions";
class SingleIncidentsTable extends Component {
deleteSelectedFees = () => {
const { dateRange, deleteIncidentsById } = this.props;
const SingleIncidentsTable = props => { const unlockedIncidentIds = [];
const { const unscheduledIncidentIds = [];
loading, const bookingChangeIncidentIds = [];
title,
openMemberSummaryOnMemberClick,
hideMemberName,
tableType
} = props;
const incidents = props.incidents ? props.incidents : [];
const columns = [];
if (incidents && incidents.length > 0){ const incidentsToDelete = {
let tableHeaders; unlockedIncidentIds,
switch (tableType) { unscheduledIncidentIds,
case incidentTableTypes.INCIDENTS_RELATED_TO_RESERVATIONS: bookingChangeIncidentIds
tableHeaders = doorLockRelatedWithReservationIncidentHeaders; };
break;
case incidentTableTypes.STANDALONE_INCIDENTS: deleteIncidentsById(dateRange, incidentsToDelete);
tableHeaders = standaloneDoorLockIncidentHeaders; };
break;
case incidentTableTypes.BOOKING_CHANGE_INCIDENTS: render(){
tableHeaders = bookingChangeIncidentHeaders; const {
break; loading,
default: title,
break; openMemberSummaryOnMemberClick,
hideMemberName,
tableType
} = this.props;
const incidents = this.props.incidents ? this.props.incidents : [];
const columns = [];
if (incidents && incidents.length > 0){
let tableHeaders;
switch (tableType) {
case incidentTableTypes.INCIDENTS_RELATED_TO_RESERVATIONS:
tableHeaders = doorLockRelatedWithReservationIncidentHeaders;
break;
case incidentTableTypes.STANDALONE_INCIDENTS:
tableHeaders = standaloneDoorLockIncidentHeaders;
break;
case incidentTableTypes.BOOKING_CHANGE_INCIDENTS:
tableHeaders = bookingChangeIncidentHeaders;
break;
default:
break;
}
tableHeaders.forEach((header) => {
const columnTitle = incidentsReportHeaderTitles[header];
let showColumn = true;
if (header === 'memberName' && hideMemberName){
showColumn = false;
}
if (columnTitle && showColumn){
const columnAlignments = {
left: 'left',
right: 'right',
};
let columnContentsAlignment = columnAlignments.left;
columns.push({
Header: incidentsReportHeaderTitles[header],
accessor: header,
Cell: props => {
let cellValue = '';
let urlValue = undefined;
switch (props.column.id) {
case 'memberName':
const memberId = props.row['_original'].memberId;
urlValue = `/specific-member-incidents-report/${memberId}`;
cellValue = props.value;
break;
case 'resourceName':
if (props.row['_original'].resourceName){
cellValue = props.row['_original'].resourceName || '---';
}else{
const oldResourceName = props.row['_original'].oldResourceName || '---';
const newResourceName = props.row['_original'].newResourceName || '---';
if (oldResourceName !== newResourceName){
cellValue = `${oldResourceName}\n${newResourceName}`;
}else{
cellValue = oldResourceName;
}
}
break;
case 'reservation':
const bookingStart = props.row['_original'].bookingStart;
const bookingEnd = props.row['_original'].bookingEnd;
cellValue = `${bookingStart}\n${bookingEnd}`;
break;
case 'doorLockTimestamps':
const unlockTimestamp = props.row['_original'].unlockTimestamp;
const lockTimestamp = props.row['_original'].lockTimestamp;
cellValue = `${unlockTimestamp ? unlockTimestamp : '---'}\n${lockTimestamp ? lockTimestamp : '---'}`;
break;
case 'incidentType':
cellValue = incidentDescriptions[props.value];
break;
case 'incidentLevel':
cellValue = incidentLevelDescriptions[props.value];
break;
case 'feeDescription':
const { incidentType, incidentLevel, timeIntervalsToCharge } = props.row['_original'];
switch (incidentType) {
case UNLOCKED_INCIDENT_RELATED_WITH_RESERVATION:
case UNLOCKED_INCIDENT_STANDALONE:
cellValue = `${incidentLevelDescriptions[incidentLevel]}`;
break;
case UNSCHEDULED_INCIDENT_BEFORE_RESERVATION:
case UNSCHEDULED_INCIDENT_AFTER_RESERVATION:
case UNSCHEDULED_INCIDENT_STANDALONE:
cellValue = `${timeIntervalsToCharge} x 5 min`;
break;
default:
cellValue = '';
break;
}
break;
case 'totalChargeFee':
const totalFee = (props.row['_original'].incidentPrice || props.value) || 0;
const totalFeeFormatted = parseFloat(totalFee).toFixed(2);
cellValue = `$ ${totalFeeFormatted}`;
columnContentsAlignment = columnAlignments.right;
break;
case 'oldReservation':
const oldBookingStart = props.row['_original'].oldBookingStart;
const oldBookingEnd = props.row['_original'].oldBookingEnd;
cellValue = `${oldBookingStart}\n${oldBookingEnd}`;
break;
case 'newReservation':
const newBookingStart = props.row['_original'].newBookingStart || '---';
const newBookingEnd = props.row['_original'].newBookingEnd || '---';
cellValue = `${newBookingStart}\n${newBookingEnd}`;
break;
default:
cellValue = props.value;
}
if (openMemberSummaryOnMemberClick && urlValue){
return <NavLink to={urlValue}>{cellValue}</NavLink>
}else{
return <div style={{ textAlign: columnContentsAlignment, whiteSpace: 'pre' }}>{cellValue}</div>
}
}
});
}
});
} }
tableHeaders.forEach((header) => { return (
const columnTitle = incidentsReportHeaderTitles[header]; <div>
<h4>{title}</h4>
let showColumn = true; <Loader active={loading} />
if (header === 'memberName' && hideMemberName){ {
showColumn = false; <Button disabled={loading} onClick={this.deleteSelectedFees}>Delete</Button>
} }
{
if (columnTitle && showColumn){ !loading && incidents &&
const columnAlignments = { <ReactTable
left: 'left', data={incidents}
right: 'right', multiSort={false}
}; columns={columns}
let columnContentsAlignment = columnAlignments.left; />
}
columns.push({ </div>
Header: incidentsReportHeaderTitles[header], );
accessor: header,
Cell: props => {
let cellValue = '';
let urlValue = undefined;
switch (props.column.id) {
case 'memberName':
const memberId = props.row['_original'].memberId;
urlValue = `/specific-member-incidents-report/${memberId}`;
cellValue = props.value;
break;
case 'resourceName':
if (props.row['_original'].resourceName){
cellValue = props.row['_original'].resourceName || '---';
}else{
const oldResourceName = props.row['_original'].oldResourceName || '---';
const newResourceName = props.row['_original'].newResourceName || '---';
if (oldResourceName !== newResourceName){
cellValue = `${oldResourceName}\n${newResourceName}`;
}else{
cellValue = oldResourceName;
}
}
break;
case 'reservation':
const bookingStart = props.row['_original'].bookingStart;
const bookingEnd = props.row['_original'].bookingEnd;
cellValue = `${bookingStart}\n${bookingEnd}`;
break;
case 'doorLockTimestamps':
const unlockTimestamp = props.row['_original'].unlockTimestamp;
const lockTimestamp = props.row['_original'].lockTimestamp;
cellValue = `${unlockTimestamp ? unlockTimestamp : '---'}\n${lockTimestamp ? lockTimestamp : '---'}`;
break;
case 'incidentType':
cellValue = incidentDescriptions[props.value];
break;
case 'incidentLevel':
cellValue = incidentLevelDescriptions[props.value];
break;
case 'feeDescription':
const { incidentType, incidentLevel, timeIntervalsToCharge } = props.row['_original'];
switch (incidentType) {
case UNLOCKED_INCIDENT_RELATED_WITH_RESERVATION:
case UNLOCKED_INCIDENT_STANDALONE:
cellValue = `${incidentLevelDescriptions[incidentLevel]}`;
break;
case UNSCHEDULED_INCIDENT_BEFORE_RESERVATION:
case UNSCHEDULED_INCIDENT_AFTER_RESERVATION:
case UNSCHEDULED_INCIDENT_STANDALONE:
cellValue = `${timeIntervalsToCharge} x 5 min`;
break;
default:
cellValue = '';
break;
}
break;
case 'totalChargeFee':
const totalFee = (props.row['_original'].incidentPrice || props.value) || 0;
const totalFeeFormatted = parseFloat(totalFee).toFixed(2);
cellValue = `$ ${totalFeeFormatted}`;
columnContentsAlignment = columnAlignments.right;
break;
case 'oldReservation':
const oldBookingStart = props.row['_original'].oldBookingStart;
const oldBookingEnd = props.row['_original'].oldBookingEnd;
cellValue = `${oldBookingStart}\n${oldBookingEnd}`;
break;
case 'newReservation':
const newBookingStart = props.row['_original'].newBookingStart || '---';
const newBookingEnd = props.row['_original'].newBookingEnd || '---';
cellValue = `${newBookingStart}\n${newBookingEnd}`;
break;
default:
cellValue = props.value;
}
if (openMemberSummaryOnMemberClick && urlValue){
return <NavLink to={urlValue}>{cellValue}</NavLink>
}else{
return <div style={{ textAlign: columnContentsAlignment, whiteSpace: 'pre' }}>{cellValue}</div>
}
}
});
}
});
} }
}
return ( const mapDispatchToProps = (dispatch) => ({
<div> deleteIncidentsById: (dateRange, incidentsToDelete) => deleteIncidents(dispatch, {dateRange, incidentsToDelete})
<h4>{title}</h4> });
<Loader active={loading} />
{
!loading && incidents &&
<ReactTable
data={incidents}
multiSort={false}
columns={columns}
/>
}
</div>
);
};
export default SingleIncidentsTable; export default connect(null, mapDispatchToProps)(SingleIncidentsTable);

View File

@@ -8,7 +8,7 @@ import {
} from '../../constants/enums'; } from '../../constants/enums';
export default function MemberIncidentsTables (props) { export default function MemberIncidentsTables (props) {
const { pendingIncidents, incidents, hideMemberName } = props; const { pendingIncidents, incidents, hideMemberName, dateRange } = props;
const incidentsRelatedToReservations = []; const incidentsRelatedToReservations = [];
const standaloneIncidents = []; const standaloneIncidents = [];
@@ -46,6 +46,7 @@ export default function MemberIncidentsTables (props) {
openMemberSummaryOnMemberClick openMemberSummaryOnMemberClick
hideMemberName={hideMemberName} hideMemberName={hideMemberName}
tableType={incidentTableTypes.INCIDENTS_RELATED_TO_RESERVATIONS} tableType={incidentTableTypes.INCIDENTS_RELATED_TO_RESERVATIONS}
dateRange={dateRange}
/> />
); );
@@ -56,6 +57,7 @@ export default function MemberIncidentsTables (props) {
openMemberSummaryOnMemberClick openMemberSummaryOnMemberClick
hideMemberName={hideMemberName} hideMemberName={hideMemberName}
tableType={incidentTableTypes.STANDALONE_INCIDENTS} tableType={incidentTableTypes.STANDALONE_INCIDENTS}
dateRange={dateRange}
/> />
); );
@@ -66,6 +68,7 @@ export default function MemberIncidentsTables (props) {
openMemberSummaryOnMemberClick openMemberSummaryOnMemberClick
hideMemberName={hideMemberName} hideMemberName={hideMemberName}
tableType={incidentTableTypes.BOOKING_CHANGE_INCIDENTS} tableType={incidentTableTypes.BOOKING_CHANGE_INCIDENTS}
dateRange={dateRange}
/> />
); );

View File

@@ -47,7 +47,7 @@ class IncidentsReport extends Component {
<br/><br/> <br/><br/>
<hr/> <hr/>
<br/> <br/>
<MemberIncidentsTables pendingIncidents={loading} incidents={incidents} /> <MemberIncidentsTables pendingIncidents={loading} incidents={incidents} dateRange={dateRange} />
</Container> </Container>
); );
} }

View File

@@ -88,6 +88,17 @@ export const fetchIncidents = (dispatch, dateRange) => {
}); });
}; };
export const deleteIncidents = (dispatch, deleteData) => {
dispatch({type: FETCH_INCIDENTS_PENDING});
API.delete(`/integration/fees`, { data: deleteData })
.then(response => {
dispatch({type: FETCH_INCIDENTS_SUCCESS, payload: response.data});
})
.catch(error => {
dispatch({type: FETCH_INCIDENTS_FAILED, payload: error.response});
});
};
export const fetchMembersList = (dispatch) => { export const fetchMembersList = (dispatch) => {
dispatch({type: FETCH_MEMBERS_PENDING}); dispatch({type: FETCH_MEMBERS_PENDING});
API.get('officeRnD/membersList') API.get('officeRnD/membersList')