diff --git a/src/components/molecules/job-group/job-group.molecule.jsx b/src/components/molecules/job-group/job-group.molecule.jsx index db1d277..dcdecd8 100644 --- a/src/components/molecules/job-group/job-group.molecule.jsx +++ b/src/components/molecules/job-group/job-group.molecule.jsx @@ -7,6 +7,7 @@ import { createStructuredSelector } from "reselect"; import { UPDATE_JOB } from "../../../graphql/jobs.queries"; import ipcTypes from "../../../ipc.types"; import { selectBodyshop } from "../../../redux/user/user.selectors"; +import { AlertFilled } from "@ant-design/icons"; const { ipcRenderer } = window; const mapStateToProps = createStructuredSelector({ @@ -51,12 +52,20 @@ export function JobGroupMolecule({ bodyshop, jobId, group, job }) { ); return ( - - e.preventDefault()}> - {group} - - {loading && } - - + <> + + e.preventDefault()}> + {group} + + {loading && } + + + {!group && ( +
+ + No group set. +
+ )} + ); } diff --git a/src/components/pages/reporting/reporting.page.jsx b/src/components/pages/reporting/reporting.page.jsx index 69d290e..807ec27 100644 --- a/src/components/pages/reporting/reporting.page.jsx +++ b/src/components/pages/reporting/reporting.page.jsx @@ -1,8 +1,13 @@ -import { Card } from "antd"; +import { Card, Typography } from "antd"; import React from "react"; import { connect } from "react-redux"; +import { Link } from "react-router-dom"; import { createStructuredSelector } from "reselect"; -import { selectDates } from "../../../redux/reporting/reporting.selectors"; +import { setSelectedJobId } from "../../../redux/application/application.actions"; +import { + selectDates, + selectReportingError, +} from "../../../redux/reporting/reporting.selectors"; import ReportingTitleAtom from "../../atoms/reporting-title/reporting-title.atom"; import ReportingDatesMolecule from "../../molecules/reporting-dates/reporting-dates.molecule"; import ReportingJobsListMolecule from "../../molecules/reporting-jobs-list/reporting-jobs-list.molecule"; @@ -12,19 +17,34 @@ import "./reporting.page.styles.scss"; const mapStateToProps = createStructuredSelector({ dates: selectDates, + error: selectReportingError, }); const mapDispatchToProps = (dispatch) => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) + setSelectedJobId: (id) => dispatch(setSelectedJobId(id)), }); -export default connect(mapStateToProps, mapDispatchToProps)(ReportingPage); -export function ReportingPage({ dates }) { +export function ReportingPage({ dates, error, setSelectedJobId }) { return (
- {dates && dates.startDate && dates.endDate && ( + {error && ( +
+ {error.message} + +
+ )} + {!error && dates && dates.startDate && dates.endDate && (
@@ -41,3 +61,5 @@ export function ReportingPage({ dates }) {
); } + +export default connect(mapStateToProps, mapDispatchToProps)(ReportingPage); diff --git a/src/redux/reporting/reporting.reducer.js b/src/redux/reporting/reporting.reducer.js index 64076cb..3d36428 100644 --- a/src/redux/reporting/reporting.reducer.js +++ b/src/redux/reporting/reporting.reducer.js @@ -13,11 +13,17 @@ const applicationReducer = (state = INITIAL_STATE, action) => { return { ...state, loading: true, + error: null, dates: { startDate: action.payload.startDate.toISOString(), endDate: action.payload.endDate.toISOString(), }, }; + case ReportingActionTypes.SET_REPORTING_ERROR: + return { + ...state, + error: action.payload, + }; case ReportingActionTypes.SET_REPORTING_DATA: return { ...state, data: action.payload }; case ReportingActionTypes.SET_SCORE_CARD: diff --git a/src/redux/reporting/reporting.sagas.js b/src/redux/reporting/reporting.sagas.js index f22c7f9..0f4cfa4 100644 --- a/src/redux/reporting/reporting.sagas.js +++ b/src/redux/reporting/reporting.sagas.js @@ -13,6 +13,7 @@ import { calculateScorecard, setReportingData, setScoreCard, + setReportingError, } from "./reporting.actions"; import ReportingApplicationTypes from "./reporting.types"; @@ -62,6 +63,23 @@ export function* handleCalculateScoreCard({ payload: jobs }) { const targets = yield select((state) => state.user.bodyshop.targets); const groups = yield select((state) => state.user.bodyshop.groups); + //Check to ensure every job has a group. + const jobsWithNoGroup = jobs + .filter((j) => !j.group) + .map((j) => { + return { ...j, error: "No group set." }; + }); + + if (jobsWithNoGroup.length > 0) { + yield put( + setReportingError({ + message: "There is an issue with the following jobs.", + jobs: [...jobsWithNoGroup], + }) + ); + return; + } + const scoreCard = { shopRpsTotalDollars: Dinero(), shopRpsExpectedDollars: Dinero(), @@ -152,6 +170,7 @@ export function* handleCalculateScoreCard({ payload: jobs }) { event: "CALCULATE_SCORE_CARD_ERROR", error: error, }); + yield put(setReportingError({ message: error, jobs: [] })); } }