diff --git a/electron/decoder/decoder.js b/electron/decoder/decoder.js index 209645e..21c873b 100644 --- a/electron/decoder/decoder.js +++ b/electron/decoder/decoder.js @@ -29,9 +29,12 @@ async function DecodeEstimate(filePath) { returnValue = { ERROR: "Vehicle mileage is less than 20,000kms." }; } else if (!accepted_ins_co.includes(job.INS_CO_NM)) { returnValue = { - ERROR: `Insurance Company Name is not valid for RPS. (${job.INS_CO_NM})`, + ERROR: `Insurance Company Name is not valid for RPS. (${ + job.INS_CO_NM || "No name set" + })`, }; - } else if (!job.clm_no) { + } else if (!job.CLM_NO) { + log.info("Job ignored. No claim #. " + job.clm_no); returnValue = { ERROR: `An unique claim number must be set for all jobs sent to RPS.`, }; diff --git a/electron/main.js b/electron/main.js index 832b244..06e3178 100644 --- a/electron/main.js +++ b/electron/main.js @@ -44,6 +44,7 @@ var menu = Menu.buildFromTemplate([ label: "Clear Settings", click() { store.reset("filePaths"); + mainWindow.webContents.session.clearStorageData(); }, }, { diff --git a/firebase/functions/index.js b/firebase/functions/index.js index 367f916..aacd3d5 100644 --- a/firebase/functions/index.js +++ b/firebase/functions/index.js @@ -7,7 +7,7 @@ exports.processSignUp = functions.auth.user().onCreate((user) => { // Check if user meets role criteria: // Your custom logic here: to decide what roles and other `x-hasura-*` should the user get let customClaims; - if (user.email && user.email.indexOf("@thinkimex.com") !== -1) { + if (user.email && user.email.indexOf("@admin.imex.online") !== -1) { customClaims = { "https://hasura.io/jwt/claims": { "x-hasura-default-role": "admin", diff --git a/src/components/atoms/delete-job/delete-job.atom.jsx b/src/components/atoms/delete-job/delete-job.atom.jsx new file mode 100644 index 0000000..c1407a9 --- /dev/null +++ b/src/components/atoms/delete-job/delete-job.atom.jsx @@ -0,0 +1,46 @@ +import { DeleteFilled } from "@ant-design/icons"; +import { useMutation } from "@apollo/client"; +import { Button, message, Popconfirm } from "antd"; +import React, { useState } from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; +import { DELETE_JOB } from "../../../graphql/jobs.queries"; +import { setSelectedJobId } from "../../../redux/application/application.actions"; +const mapStateToProps = createStructuredSelector({ + //currentUser: selectCurrentUser +}); +const mapDispatchToProps = (dispatch) => ({ + setSelectedJobId: (id) => dispatch(setSelectedJobId(id)), +}); +export function DeleteJobAtom({ setSelectedJobId, jobId }) { + const [deleteJob] = useMutation(DELETE_JOB); + const [loading, setLoading] = useState(false); + const handleDelete = async () => { + setLoading(true); + const result = await deleteJob({ + variables: { jobId: jobId }, + }); + + if (result.errors) { + message.error(result.errors.toString()); + } else { + message.success("Job deleted."); + setSelectedJobId(null); + } + setLoading(false); + }; + + return ( +
+ + + +
+ ); +} +export default connect(mapStateToProps, mapDispatchToProps)(DeleteJobAtom); diff --git a/src/components/organisms/jobs-detail/jobs-detail.organism.jsx b/src/components/organisms/jobs-detail/jobs-detail.organism.jsx index e05f725..ea971ed 100644 --- a/src/components/organisms/jobs-detail/jobs-detail.organism.jsx +++ b/src/components/organisms/jobs-detail/jobs-detail.organism.jsx @@ -6,6 +6,7 @@ import { createStructuredSelector } from "reselect"; import { QUERY_JOB_BY_PK } from "../../../graphql/jobs.queries"; import { setSelectedJobTargetPc } from "../../../redux/application/application.actions"; import { selectSelectedJobId } from "../../../redux/application/application.selectors"; +import { DeleteJobAtom } from "../../atoms/delete-job/delete-job.atom"; import ErrorResultAtom from "../../atoms/error-result/error-result.atom"; import JobsPartsGraphAtom from "../../atoms/jobs-parts-graph/jobs-parts-graph.atom"; import JobsDetailDescriptionMolecule from "../../molecules/jobs-detail-description/jobs-detail-description.molecule"; @@ -77,6 +78,7 @@ export function JobsDetailOrganism({ selectedJobId, setSelectedJobTargetPc }) { loading={loading} /> + ); } diff --git a/src/components/pages/jobs/jobs.page.jsx b/src/components/pages/jobs/jobs.page.jsx index f2ef40c..160ae86 100644 --- a/src/components/pages/jobs/jobs.page.jsx +++ b/src/components/pages/jobs/jobs.page.jsx @@ -1,4 +1,4 @@ -import { Col, Row, Tabs } from "antd"; +import { Col, Row, Tabs, Grid } from "antd"; import React from "react"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; @@ -10,10 +10,27 @@ const mapStateToProps = createStructuredSelector({}); const mapDispatchToProps = (dispatch) => ({}); export function JobsPage() { + const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) + .filter((screen) => !!screen[1]) + .slice(-1)[0]; + + const bpoints = { + xs: { l: 12, r: 12 }, + sm: { l: 10, r: 14 }, + md: { l: 10, r: 14 }, + lg: { l: 8, r: 16 }, + xl: { l: 6, r: 18 }, + xxl: { l: 5, r: 19 }, + }; + + const selectedSpans = selectedBreakpoint + ? bpoints[selectedBreakpoint[0]] + : { l: 18, r: 6 }; + return (
- + @@ -23,7 +40,7 @@ export function JobsPage() { - + diff --git a/src/components/pages/routes/routes.page.jsx b/src/components/pages/routes/routes.page.jsx index 30e2638..cf05db8 100644 --- a/src/components/pages/routes/routes.page.jsx +++ b/src/components/pages/routes/routes.page.jsx @@ -6,14 +6,26 @@ import { createStructuredSelector } from "reselect"; import SiderMenuOrganism from "../../organisms/sider-menu/sider-menu.organism"; import Jobs from "../jobs/jobs.page"; import SettingsPage from "../settings/settings.page"; - -const mapStateToProps = createStructuredSelector({}); +import { selectBodyshop } from "../../../redux/user/user.selectors"; +import ErrorResultAtom from "../../atoms/error-result/error-result.atom"; +const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); const mapDispatchToProps = (dispatch) => ({}); -export function RoutesPage() { +export function RoutesPage({ bodyshop }) { + if (bodyshop === false) + return ( + + ); return ( - + diff --git a/src/components/pages/sign-in/sign-in.page.jsx b/src/components/pages/sign-in/sign-in.page.jsx index 40952f2..26087bc 100644 --- a/src/components/pages/sign-in/sign-in.page.jsx +++ b/src/components/pages/sign-in/sign-in.page.jsx @@ -2,7 +2,6 @@ import { LockOutlined, UserOutlined } from "@ant-design/icons"; import { Alert, Button, Form, Input, Typography } from "antd"; import React from "react"; import { connect } from "react-redux"; -import { Link } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import ImEXOnlineLogo from "../../../assets/logo192.png"; import { emailSignInStart } from "../../../redux/user/user.actions"; @@ -58,9 +57,6 @@ export function SignInPage({ emailSignInStart, signInError, loginLoading }) { Login - - -
); } diff --git a/src/graphql/jobs.queries.js b/src/graphql/jobs.queries.js index c378d31..0528fbf 100644 --- a/src/graphql/jobs.queries.js +++ b/src/graphql/jobs.queries.js @@ -172,3 +172,11 @@ export const UPDATE_JOB = gql` } } `; + +export const DELETE_JOB = gql` + mutation DELETE_JOB($jobId: uuid!) { + delete_jobs_by_pk(id: $jobId) { + id + } + } +`; diff --git a/src/redux/user/user.sagas.js b/src/redux/user/user.sagas.js index 77b4075..9880553 100644 --- a/src/redux/user/user.sagas.js +++ b/src/redux/user/user.sagas.js @@ -36,17 +36,19 @@ export function* signInWithEmail({ payload: { email, password } }) { mutation: UPSERT_USER, variables: { authEmail: user.email, authToken: user.uid }, }); - console.log("function*signInWithEmail -> result", result); - - yield put( - signInSuccess({ - uid: user.uid, - email: user.email, - displayName: user.displayName, - photoURL: user.photoURL, - authorized: true, - }) - ); + if (!result.errors) { + yield put( + signInSuccess({ + uid: user.uid, + email: user.email, + displayName: user.displayName, + photoURL: user.photoURL, + authorized: true, + }) + ); + } else { + yield put(signInFailure(JSON.stringify(result.errors))); + } } catch (error) { yield put(signInFailure(error)); } @@ -100,6 +102,7 @@ export function* updateUserDetails(userDetails) { } catch (error) { //yield put(signOutFailure(error.message)); //TODO error handling + console.log(error); } } @@ -111,13 +114,17 @@ export function* signInSuccessSaga({ payload }) { //Query for the Correct Bodyshop const shop = yield client.query({ query: QUERY_BODYSHOP }); - - yield put(setBodyshop(shop.data.bodyshops[0])); - ipcRenderer.send( - ipcTypes.default.app.toMain.setAcceptableInsCoNm, - shop.data.bodyshops[0].accepted_ins_co - ); - ipcRenderer.send(ipcTypes.default.fileWatcher.toMain.start); + if (shop.data.bodyshops.length > 0) { + yield put(setBodyshop(shop.data.bodyshops[0])); + ipcRenderer.send( + ipcTypes.default.app.toMain.setAcceptableInsCoNm, + shop.data.bodyshops[0].accepted_ins_co + ); + ipcRenderer.send(ipcTypes.default.fileWatcher.toMain.start); + } else { + console.log("No bodyshop has been associated."); + yield put(setBodyshop(false)); + } // LogRocket.identify(payload.email); // if (!payload.email.includes("@imex.")) yield put(setInstanceId(payload.uid)); // yield logImEXEvent("redux_sign_in_success");