Added in-session recent items with cross tab support. BOD-178
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
<babeledit_project version="1.2" be_version="2.6.1">
|
<babeledit_project be_version="2.6.1" version="1.2">
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
BabelEdit project file
|
BabelEdit project file
|
||||||
@@ -5508,6 +5508,116 @@
|
|||||||
</concept_node>
|
</concept_node>
|
||||||
</children>
|
</children>
|
||||||
</folder_node>
|
</folder_node>
|
||||||
|
<folder_node>
|
||||||
|
<name>itemtypes</name>
|
||||||
|
<children>
|
||||||
|
<concept_node>
|
||||||
|
<name>contract</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>courtesycar</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>job</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>owner</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>vehicle</name>
|
||||||
|
<definition_loaded>false</definition_loaded>
|
||||||
|
<description></description>
|
||||||
|
<comment></comment>
|
||||||
|
<default_text></default_text>
|
||||||
|
<translations>
|
||||||
|
<translation>
|
||||||
|
<language>en-US</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>es-MX</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
<translation>
|
||||||
|
<language>fr-CA</language>
|
||||||
|
<approved>false</approved>
|
||||||
|
</translation>
|
||||||
|
</translations>
|
||||||
|
</concept_node>
|
||||||
|
</children>
|
||||||
|
</folder_node>
|
||||||
<folder_node>
|
<folder_node>
|
||||||
<name>labels</name>
|
<name>labels</name>
|
||||||
<children>
|
<children>
|
||||||
|
|||||||
@@ -55,6 +55,7 @@
|
|||||||
"redux": "^4.0.5",
|
"redux": "^4.0.5",
|
||||||
"redux-persist": "^6.0.0",
|
"redux-persist": "^6.0.0",
|
||||||
"redux-saga": "^1.1.3",
|
"redux-saga": "^1.1.3",
|
||||||
|
"redux-state-sync": "^3.1.1",
|
||||||
"reselect": "^4.0.0",
|
"reselect": "^4.0.0",
|
||||||
"styled-components": "^5.1.1",
|
"styled-components": "^5.1.1",
|
||||||
"subscriptions-transport-ws": "^0.9.16"
|
"subscriptions-transport-ws": "^0.9.16"
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
&__grow {
|
&__grow {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|||||||
@@ -19,18 +19,24 @@ export function BreadCrumbs({ breadcrumbs, recentItems }) {
|
|||||||
const menu = (
|
const menu = (
|
||||||
<Menu>
|
<Menu>
|
||||||
{recentItems.map((i, idx) => (
|
{recentItems.map((i, idx) => (
|
||||||
<Menu.Item key={idx}>{i.label}</Menu.Item>
|
<Menu.Item key={idx}>
|
||||||
|
<Link to={i.url}>{i.label}</Link>
|
||||||
|
</Menu.Item>
|
||||||
))}
|
))}
|
||||||
</Menu>
|
</Menu>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='breadcrumb-container'>
|
<div className="breadcrumb-container imex-flex-row">
|
||||||
<Dropdown overlay={menu} trigger={["click"]}>
|
<Dropdown
|
||||||
|
className="imex-flex-row__margin-large"
|
||||||
|
overlay={menu}
|
||||||
|
trigger={["click"]}
|
||||||
|
>
|
||||||
<ClockCircleFilled onClick={(e) => e.preventDefault()} />
|
<ClockCircleFilled onClick={(e) => e.preventDefault()} />
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
|
|
||||||
<Breadcrumb separator='>'>
|
<Breadcrumb separator=">">
|
||||||
<Breadcrumb.Item>
|
<Breadcrumb.Item>
|
||||||
<Link to={`/manage`}>
|
<Link to={`/manage`}>
|
||||||
<HomeFilled />
|
<HomeFilled />
|
||||||
|
|||||||
@@ -33,11 +33,6 @@ export function TechClockInContainer({ technician, bodyshop }) {
|
|||||||
ciecacode: Object.keys(
|
ciecacode: Object.keys(
|
||||||
bodyshop.md_responsibility_centers.defaults.costs
|
bodyshop.md_responsibility_centers.defaults.costs
|
||||||
).find((key) => {
|
).find((key) => {
|
||||||
console.log(
|
|
||||||
"key",
|
|
||||||
key,
|
|
||||||
bodyshop.md_responsibility_centers.defaults.costs[key]
|
|
||||||
);
|
|
||||||
return (
|
return (
|
||||||
bodyshop.md_responsibility_centers.defaults.costs[key] ===
|
bodyshop.md_responsibility_centers.defaults.costs[key] ===
|
||||||
values.cost_center
|
values.cost_center
|
||||||
|
|||||||
@@ -11,14 +11,19 @@ import {
|
|||||||
QUERY_CONTRACT_BY_PK,
|
QUERY_CONTRACT_BY_PK,
|
||||||
UPDATE_CONTRACT,
|
UPDATE_CONTRACT,
|
||||||
} from "../../graphql/cccontracts.queries";
|
} from "../../graphql/cccontracts.queries";
|
||||||
import { setBreadcrumbs } from "../../redux/application/application.actions";
|
import {
|
||||||
|
setBreadcrumbs,
|
||||||
|
addRecentItem,
|
||||||
|
} from "../../redux/application/application.actions";
|
||||||
import ContractDetailPageComponent from "./contract-detail.page.component";
|
import ContractDetailPageComponent from "./contract-detail.page.component";
|
||||||
|
import { CreateRecentItem } from "../../utils/create-recent-item";
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
||||||
|
addRecentItem: (item) => dispatch(addRecentItem(item)),
|
||||||
});
|
});
|
||||||
|
|
||||||
export function ContractDetailPageContainer({ setBreadcrumbs }) {
|
export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [updateContract] = useMutation(UPDATE_CONTRACT);
|
const [updateContract] = useMutation(UPDATE_CONTRACT);
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
@@ -50,7 +55,17 @@ export function ContractDetailPageContainer({ setBreadcrumbs }) {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}, [t, data, error, loading, setBreadcrumbs]);
|
|
||||||
|
if (data)
|
||||||
|
addRecentItem(
|
||||||
|
CreateRecentItem(
|
||||||
|
contractId,
|
||||||
|
"contract",
|
||||||
|
data.cccontracts_by_pk.agreementnumber,
|
||||||
|
`/manage/courtesycars/contracts/${contractId}`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}, [t, data, error, loading, setBreadcrumbs, addRecentItem]);
|
||||||
|
|
||||||
const handleFinish = (values) => {
|
const handleFinish = (values) => {
|
||||||
updateContract({
|
updateContract({
|
||||||
|
|||||||
@@ -7,13 +7,21 @@ import { connect } from "react-redux";
|
|||||||
import { useParams } from "react-router-dom";
|
import { useParams } from "react-router-dom";
|
||||||
import AlertComponent from "../../components/alert/alert.component";
|
import AlertComponent from "../../components/alert/alert.component";
|
||||||
import { QUERY_CC_BY_PK, UPDATE_CC } from "../../graphql/courtesy-car.queries";
|
import { QUERY_CC_BY_PK, UPDATE_CC } from "../../graphql/courtesy-car.queries";
|
||||||
import { setBreadcrumbs } from "../../redux/application/application.actions";
|
import {
|
||||||
|
addRecentItem,
|
||||||
|
setBreadcrumbs,
|
||||||
|
} from "../../redux/application/application.actions";
|
||||||
|
import { CreateRecentItem } from "../../utils/create-recent-item";
|
||||||
import CourtesyCarDetailPageComponent from "./courtesy-car-detail.page.component";
|
import CourtesyCarDetailPageComponent from "./courtesy-car-detail.page.component";
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
||||||
|
addRecentItem: (item) => dispatch(addRecentItem(item)),
|
||||||
});
|
});
|
||||||
export function CourtesyCarDetailPageContainer({ setBreadcrumbs }) {
|
export function CourtesyCarDetailPageContainer({
|
||||||
|
setBreadcrumbs,
|
||||||
|
addRecentItem,
|
||||||
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [insertCourtesyCar] = useMutation(UPDATE_CC);
|
const [insertCourtesyCar] = useMutation(UPDATE_CC);
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
@@ -42,7 +50,17 @@ export function CourtesyCarDetailPageContainer({ setBreadcrumbs }) {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}, [t, data, error, loading, setBreadcrumbs]);
|
|
||||||
|
if (data)
|
||||||
|
addRecentItem(
|
||||||
|
CreateRecentItem(
|
||||||
|
ccId,
|
||||||
|
"courtesycar",
|
||||||
|
data.courtesycars_by_pk.fleet_number || data.courtesycars_by_pk.vin,
|
||||||
|
`/manage/courtesycars/${ccId}`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}, [t, data, error, loading, setBreadcrumbs, addRecentItem]);
|
||||||
|
|
||||||
const handleFinish = (values) => {
|
const handleFinish = (values) => {
|
||||||
insertCourtesyCar({
|
insertCourtesyCar({
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { useMutation, useQuery } from "@apollo/react-hooks";
|
|||||||
import { notification } from "antd";
|
import { notification } from "antd";
|
||||||
import React, { useEffect } from "react";
|
import React, { useEffect } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { connect } from "react-redux";
|
||||||
import AlertComponent from "../../components/alert/alert.component";
|
import AlertComponent from "../../components/alert/alert.component";
|
||||||
import SpinComponent from "../../components/loading-spinner/loading-spinner.component";
|
import SpinComponent from "../../components/loading-spinner/loading-spinner.component";
|
||||||
import {
|
import {
|
||||||
@@ -10,12 +11,12 @@ import {
|
|||||||
UPDATE_JOB,
|
UPDATE_JOB,
|
||||||
UPDATE_JOB_STATUS,
|
UPDATE_JOB_STATUS,
|
||||||
} from "../../graphql/jobs.queries";
|
} from "../../graphql/jobs.queries";
|
||||||
import JobsDetailPage from "./jobs-detail.page.component";
|
|
||||||
import {
|
import {
|
||||||
setBreadcrumbs,
|
|
||||||
addRecentItem,
|
addRecentItem,
|
||||||
|
setBreadcrumbs,
|
||||||
} from "../../redux/application/application.actions";
|
} from "../../redux/application/application.actions";
|
||||||
import { connect } from "react-redux";
|
import { CreateRecentItem } from "../../utils/create-recent-item";
|
||||||
|
import JobsDetailPage from "./jobs-detail.page.component";
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
||||||
@@ -71,13 +72,23 @@ function JobsDetailPageContainer({ match, setBreadcrumbs, addRecentItem }) {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}, [loading, data, t, error, setBreadcrumbs, jobId]);
|
|
||||||
|
if (data)
|
||||||
|
addRecentItem(
|
||||||
|
CreateRecentItem(
|
||||||
|
jobId,
|
||||||
|
"job",
|
||||||
|
`${data.jobs_by_pk.est_number || ""} | ${
|
||||||
|
data.jobs_by_pk.ro_number || ""
|
||||||
|
}`,
|
||||||
|
`/manage/jobs/${jobId}`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}, [loading, data, t, error, setBreadcrumbs, jobId, addRecentItem]);
|
||||||
|
|
||||||
if (loading) return <SpinComponent />;
|
if (loading) return <SpinComponent />;
|
||||||
if (error) return <AlertComponent message={error.message} type="error" />;
|
if (error) return <AlertComponent message={error.message} type="error" />;
|
||||||
|
|
||||||
if (data) addRecentItem({ id: 1234, label: " abcd" });
|
|
||||||
|
|
||||||
return data.jobs_by_pk ? (
|
return data.jobs_by_pk ? (
|
||||||
<JobsDetailPage
|
<JobsDetailPage
|
||||||
job={data.jobs_by_pk}
|
job={data.jobs_by_pk}
|
||||||
|
|||||||
@@ -1,17 +1,27 @@
|
|||||||
import React, { useEffect } from "react";
|
|
||||||
import OwnersDetailComponent from "./owners-detail.page.component";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
import { useQuery } from "@apollo/react-hooks";
|
import { useQuery } from "@apollo/react-hooks";
|
||||||
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
|
import React, { useEffect } from "react";
|
||||||
import AlertComponent from "../../components/alert/alert.component";
|
import { useTranslation } from "react-i18next";
|
||||||
import { QUERY_OWNER_BY_ID } from "../../graphql/owners.queries";
|
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { setBreadcrumbs } from "../../redux/application/application.actions";
|
import AlertComponent from "../../components/alert/alert.component";
|
||||||
|
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
|
||||||
|
import { QUERY_OWNER_BY_ID } from "../../graphql/owners.queries";
|
||||||
|
import {
|
||||||
|
addRecentItem,
|
||||||
|
setBreadcrumbs,
|
||||||
|
} from "../../redux/application/application.actions";
|
||||||
|
import { CreateRecentItem } from "../../utils/create-recent-item";
|
||||||
|
import OwnersDetailComponent from "./owners-detail.page.component";
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
||||||
|
addRecentItem: (item) => dispatch(addRecentItem(item)),
|
||||||
});
|
});
|
||||||
|
|
||||||
export function OwnersDetailContainer({ match, setBreadcrumbs }) {
|
export function OwnersDetailContainer({
|
||||||
|
match,
|
||||||
|
setBreadcrumbs,
|
||||||
|
addRecentItem,
|
||||||
|
}) {
|
||||||
const { ownerId } = match.params;
|
const { ownerId } = match.params;
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -42,7 +52,19 @@ export function OwnersDetailContainer({ match, setBreadcrumbs }) {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}, [setBreadcrumbs, t, data, ownerId]);
|
|
||||||
|
if (data)
|
||||||
|
addRecentItem(
|
||||||
|
CreateRecentItem(
|
||||||
|
ownerId,
|
||||||
|
"owner",
|
||||||
|
`${data.owners_by_pk.ownr_fn || ""} ${
|
||||||
|
data.owners_by_pk.ownr_ln || ""
|
||||||
|
} ${data.owners_by_pk.ownr_co_nm || ""}`,
|
||||||
|
`/manage/owners/${ownerId}`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}, [setBreadcrumbs, t, data, ownerId, addRecentItem]);
|
||||||
|
|
||||||
if (loading) return <LoadingSpinner />;
|
if (loading) return <LoadingSpinner />;
|
||||||
if (error) return <AlertComponent message={error.message} type="error" />;
|
if (error) return <AlertComponent message={error.message} type="error" />;
|
||||||
|
|||||||
@@ -5,17 +5,26 @@ import { QUERY_VEHICLE_BY_ID } from "../../graphql/vehicles.queries";
|
|||||||
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
|
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
|
||||||
import AlertComponent from "../../components/alert/alert.component";
|
import AlertComponent from "../../components/alert/alert.component";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { setBreadcrumbs } from "../../redux/application/application.actions";
|
import {
|
||||||
|
setBreadcrumbs,
|
||||||
|
addRecentItem,
|
||||||
|
} from "../../redux/application/application.actions";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
|
import { CreateRecentItem } from "../../utils/create-recent-item";
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
||||||
|
addRecentItem: (item) => dispatch(addRecentItem(item)),
|
||||||
});
|
});
|
||||||
|
|
||||||
export function VehicleDetailContainer({ match, setBreadcrumbs }) {
|
export function VehicleDetailContainer({
|
||||||
|
match,
|
||||||
|
setBreadcrumbs,
|
||||||
|
addRecentItem,
|
||||||
|
}) {
|
||||||
const { vehId } = match.params;
|
const { vehId } = match.params;
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const { loading, data, error, refetch } = useQuery(QUERY_VEHICLE_BY_ID, {
|
const { loading, data, error, refetch } = useQuery(QUERY_VEHICLE_BY_ID, {
|
||||||
variables: { id: vehId },
|
variables: { id: vehId },
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
@@ -40,7 +49,17 @@ export function VehicleDetailContainer({ match, setBreadcrumbs }) {
|
|||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
}, [t, data, setBreadcrumbs, vehId]);
|
|
||||||
|
if (data)
|
||||||
|
addRecentItem(
|
||||||
|
CreateRecentItem(
|
||||||
|
vehId,
|
||||||
|
"vehicle",
|
||||||
|
`${data.vehicles_by_pk.v_vin} | ${data.vehicles_by_pk.v_model_yr} ${data.vehicles_by_pk.v_make_desc} ${data.vehicles_by_pk.v_model_desc}`,
|
||||||
|
`/manage/vehicles/${vehId}`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}, [t, data, setBreadcrumbs, vehId, addRecentItem]);
|
||||||
|
|
||||||
if (loading) return <LoadingSpinner />;
|
if (loading) return <LoadingSpinner />;
|
||||||
if (error) return <AlertComponent message={error.message} type="error" />;
|
if (error) return <AlertComponent message={error.message} type="error" />;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ const applicationReducer = (state = INITIAL_STATE, action) => {
|
|||||||
case ApplicationActionTypes.ADD_RECENT_ITEM:
|
case ApplicationActionTypes.ADD_RECENT_ITEM:
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
recentItems: [action.payload, ...state.recentItems.slice(0, 9)],
|
recentItems: updateRecentItemsArray(state, action.payload),
|
||||||
};
|
};
|
||||||
case ApplicationActionTypes.SET_BREAD_CRUMBS:
|
case ApplicationActionTypes.SET_BREAD_CRUMBS:
|
||||||
return {
|
return {
|
||||||
@@ -63,3 +63,18 @@ const applicationReducer = (state = INITIAL_STATE, action) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default applicationReducer;
|
export default applicationReducer;
|
||||||
|
|
||||||
|
const updateRecentItemsArray = (state, newItem) => {
|
||||||
|
//Check to see if the new item is in the list.
|
||||||
|
const matchingIndex = state.recentItems.findIndex((i) => i.id === newItem.id);
|
||||||
|
|
||||||
|
if (matchingIndex >= 0) {
|
||||||
|
return [
|
||||||
|
newItem,
|
||||||
|
...state.recentItems.slice(0, matchingIndex),
|
||||||
|
...state.recentItems.slice(matchingIndex + 1, 9),
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
return [newItem, ...state.recentItems.slice(0, 9)];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { combineReducers } from "redux";
|
import { combineReducers } from "redux";
|
||||||
import { persistReducer } from "redux-persist";
|
import { persistReducer } from "redux-persist";
|
||||||
import storage from "redux-persist/lib/storage";
|
import storage from "redux-persist/lib/storage";
|
||||||
|
import { withReduxStateSync } from "redux-state-sync";
|
||||||
|
|
||||||
import userReducer from "./user/user.reducer";
|
import userReducer from "./user/user.reducer";
|
||||||
import messagingReducer from "./messaging/messaging.reducer";
|
import messagingReducer from "./messaging/messaging.reducer";
|
||||||
@@ -8,10 +9,11 @@ import emailReducer from "./email/email.reducer";
|
|||||||
import modalsReducer from "./modals/modals.reducer";
|
import modalsReducer from "./modals/modals.reducer";
|
||||||
import applicationReducer from "./application/application.reducer";
|
import applicationReducer from "./application/application.reducer";
|
||||||
import techReducer from "./tech/tech.reducer";
|
import techReducer from "./tech/tech.reducer";
|
||||||
|
|
||||||
const persistConfig = {
|
const persistConfig = {
|
||||||
key: "root",
|
key: "root",
|
||||||
storage,
|
storage,
|
||||||
whitelist: ["messaging", "tech"],
|
whitelist: ["messaging", "tech", "application"],
|
||||||
blacklist: ["user", "email", "modals"],
|
blacklist: ["user", "email", "modals"],
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -24,4 +26,4 @@ const rootReducer = combineReducers({
|
|||||||
tech: techReducer,
|
tech: techReducer,
|
||||||
});
|
});
|
||||||
|
|
||||||
export default persistReducer(persistConfig, rootReducer);
|
export default withReduxStateSync(persistReducer(persistConfig, rootReducer));
|
||||||
|
|||||||
@@ -2,11 +2,24 @@ import { createStore, applyMiddleware, compose } from "redux";
|
|||||||
import { persistStore } from "redux-persist";
|
import { persistStore } from "redux-persist";
|
||||||
import { createLogger } from "redux-logger";
|
import { createLogger } from "redux-logger";
|
||||||
import createSagaMiddleware from "redux-saga";
|
import createSagaMiddleware from "redux-saga";
|
||||||
|
import {
|
||||||
|
createStateSyncMiddleware,
|
||||||
|
initMessageListener,
|
||||||
|
} from "redux-state-sync";
|
||||||
|
|
||||||
import rootReducer from "./root.reducer";
|
import rootReducer from "./root.reducer";
|
||||||
import rootSaga from "./root.saga";
|
import rootSaga from "./root.saga";
|
||||||
|
|
||||||
const sagaMiddleWare = createSagaMiddleware();
|
const sagaMiddleWare = createSagaMiddleware();
|
||||||
const middlewares = [sagaMiddleWare];
|
|
||||||
|
const reduxSyncConfig = {
|
||||||
|
whitelist: ["ADD_RECENT_ITEM"],
|
||||||
|
};
|
||||||
|
|
||||||
|
const middlewares = [
|
||||||
|
sagaMiddleWare,
|
||||||
|
createStateSyncMiddleware(reduxSyncConfig),
|
||||||
|
];
|
||||||
if (process.env.NODE_ENV === "development") {
|
if (process.env.NODE_ENV === "development") {
|
||||||
middlewares.push(createLogger({ collapsed: true, diff: true }));
|
middlewares.push(createLogger({ collapsed: true, diff: true }));
|
||||||
}
|
}
|
||||||
@@ -25,6 +38,7 @@ const enhancer = composeEnhancers(
|
|||||||
|
|
||||||
export const store = createStore(rootReducer, enhancer);
|
export const store = createStore(rootReducer, enhancer);
|
||||||
sagaMiddleWare.run(rootSaga);
|
sagaMiddleWare.run(rootSaga);
|
||||||
|
initMessageListener(store);
|
||||||
|
|
||||||
export const persistor = persistStore(store);
|
export const persistor = persistStore(store);
|
||||||
|
|
||||||
|
|||||||
@@ -368,6 +368,13 @@
|
|||||||
"submit": "Submit",
|
"submit": "Submit",
|
||||||
"submitticket": "Submit a Support Ticket"
|
"submitticket": "Submit a Support Ticket"
|
||||||
},
|
},
|
||||||
|
"itemtypes": {
|
||||||
|
"contract": "CC Contract",
|
||||||
|
"courtesycar": "Courtesy Car",
|
||||||
|
"job": "Job",
|
||||||
|
"owner": "Owner",
|
||||||
|
"vehicle": "Vehicle"
|
||||||
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"actions": "Actions",
|
"actions": "Actions",
|
||||||
"areyousure": "Are you sure?",
|
"areyousure": "Are you sure?",
|
||||||
|
|||||||
@@ -368,6 +368,13 @@
|
|||||||
"submit": "",
|
"submit": "",
|
||||||
"submitticket": ""
|
"submitticket": ""
|
||||||
},
|
},
|
||||||
|
"itemtypes": {
|
||||||
|
"contract": "",
|
||||||
|
"courtesycar": "",
|
||||||
|
"job": "",
|
||||||
|
"owner": "",
|
||||||
|
"vehicle": ""
|
||||||
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"actions": "Comportamiento",
|
"actions": "Comportamiento",
|
||||||
"areyousure": "",
|
"areyousure": "",
|
||||||
|
|||||||
@@ -368,6 +368,13 @@
|
|||||||
"submit": "",
|
"submit": "",
|
||||||
"submitticket": ""
|
"submitticket": ""
|
||||||
},
|
},
|
||||||
|
"itemtypes": {
|
||||||
|
"contract": "",
|
||||||
|
"courtesycar": "",
|
||||||
|
"job": "",
|
||||||
|
"owner": "",
|
||||||
|
"vehicle": ""
|
||||||
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"actions": "actes",
|
"actions": "actes",
|
||||||
"areyousure": "",
|
"areyousure": "",
|
||||||
|
|||||||
9
client/src/utils/create-recent-item.js
Normal file
9
client/src/utils/create-recent-item.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import i18n from "i18next";
|
||||||
|
|
||||||
|
export function CreateRecentItem(id, type, labelid, url) {
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
label: `${i18n.t(`general.itemtypes.${type}`)}: ${labelid}`,
|
||||||
|
url,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1300,6 +1300,13 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.13.4"
|
regenerator-runtime "^0.13.4"
|
||||||
|
|
||||||
|
"@babel/runtime@^7.6.2":
|
||||||
|
version "7.10.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99"
|
||||||
|
integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw==
|
||||||
|
dependencies:
|
||||||
|
regenerator-runtime "^0.13.4"
|
||||||
|
|
||||||
"@babel/runtime@^7.8.4":
|
"@babel/runtime@^7.8.4":
|
||||||
version "7.9.2"
|
version "7.9.2"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06"
|
||||||
@@ -3409,6 +3416,11 @@ bcrypt-pbkdf@^1.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
tweetnacl "^0.14.3"
|
tweetnacl "^0.14.3"
|
||||||
|
|
||||||
|
big-integer@^1.6.16:
|
||||||
|
version "1.6.48"
|
||||||
|
resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e"
|
||||||
|
integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==
|
||||||
|
|
||||||
big.js@^5.2.2:
|
big.js@^5.2.2:
|
||||||
version "5.2.2"
|
version "5.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
||||||
@@ -3517,6 +3529,19 @@ braces@~3.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fill-range "^7.0.1"
|
fill-range "^7.0.1"
|
||||||
|
|
||||||
|
broadcast-channel@^3.1.0:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.1.0.tgz#b4a6970fc72c4d68fc859321a6af850e66cb2dfa"
|
||||||
|
integrity sha512-zrjTunJRva1aFW9UlLtoMnB05tu8hbb7qbv3PxXXGnxp3t9VA/KcTIwcC0+u7oLBdlXSnv0yy7pB+UemLjANyQ==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.7.2"
|
||||||
|
detect-node "^2.0.4"
|
||||||
|
js-sha3 "0.8.0"
|
||||||
|
microseconds "0.2.0"
|
||||||
|
nano-time "1.0.0"
|
||||||
|
rimraf "3.0.2"
|
||||||
|
unload "2.2.0"
|
||||||
|
|
||||||
brorand@^1.0.1:
|
brorand@^1.0.1:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
|
resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
|
||||||
@@ -7888,6 +7913,11 @@ js-cookie@^2.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
|
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
|
||||||
integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
|
integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
|
||||||
|
|
||||||
|
js-sha3@0.8.0:
|
||||||
|
version "0.8.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
|
||||||
|
integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
|
||||||
|
|
||||||
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
|
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||||
@@ -8587,6 +8617,11 @@ micromatch@^3.1.10, micromatch@^3.1.4:
|
|||||||
snapdragon "^0.8.1"
|
snapdragon "^0.8.1"
|
||||||
to-regex "^3.0.2"
|
to-regex "^3.0.2"
|
||||||
|
|
||||||
|
microseconds@0.2.0:
|
||||||
|
version "0.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39"
|
||||||
|
integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==
|
||||||
|
|
||||||
miller-rabin@^4.0.0:
|
miller-rabin@^4.0.0:
|
||||||
version "4.0.1"
|
version "4.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
|
resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
|
||||||
@@ -8849,6 +8884,13 @@ nano-css@^5.2.1:
|
|||||||
stacktrace-js "^2.0.0"
|
stacktrace-js "^2.0.0"
|
||||||
stylis "3.5.0"
|
stylis "3.5.0"
|
||||||
|
|
||||||
|
nano-time@1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef"
|
||||||
|
integrity sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=
|
||||||
|
dependencies:
|
||||||
|
big-integer "^1.6.16"
|
||||||
|
|
||||||
nanomatch@^1.2.9:
|
nanomatch@^1.2.9:
|
||||||
version "1.2.13"
|
version "1.2.13"
|
||||||
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
|
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
|
||||||
@@ -11868,6 +11910,13 @@ redux-saga@^1.1.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@redux-saga/core" "^1.1.3"
|
"@redux-saga/core" "^1.1.3"
|
||||||
|
|
||||||
|
redux-state-sync@^3.1.1:
|
||||||
|
version "3.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/redux-state-sync/-/redux-state-sync-3.1.1.tgz#cd5d53edb48688cbad38aba52983cdb88ef6ff46"
|
||||||
|
integrity sha512-cYz2+DCXMKD+Tz0jxHY8fOby3X+7l5QmSMoeNLW+RoZnixZgqKKqAfaTKjw18UG6gsN8Wd4PSwCdeyuqxPrgSA==
|
||||||
|
dependencies:
|
||||||
|
broadcast-channel "^3.1.0"
|
||||||
|
|
||||||
redux@^4.0.0, redux@^4.0.4, redux@^4.0.5:
|
redux@^4.0.0, redux@^4.0.4, redux@^4.0.5:
|
||||||
version "4.0.5"
|
version "4.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
|
resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f"
|
||||||
@@ -12231,6 +12280,13 @@ rimraf@2.6.3, rimraf@~2.6.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
glob "^7.1.3"
|
glob "^7.1.3"
|
||||||
|
|
||||||
|
rimraf@3.0.2:
|
||||||
|
version "3.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
|
||||||
|
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
|
||||||
|
dependencies:
|
||||||
|
glob "^7.1.3"
|
||||||
|
|
||||||
ripemd160@^2.0.0, ripemd160@^2.0.1:
|
ripemd160@^2.0.0, ripemd160@^2.0.1:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
|
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
|
||||||
@@ -13741,6 +13797,14 @@ universalify@^0.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
|
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
|
||||||
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
|
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
|
||||||
|
|
||||||
|
unload@2.2.0:
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7"
|
||||||
|
integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.6.2"
|
||||||
|
detect-node "^2.0.4"
|
||||||
|
|
||||||
unpipe@1.0.0, unpipe@~1.0.0:
|
unpipe@1.0.0, unpipe@~1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
|
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
|
||||||
|
|||||||
Reference in New Issue
Block a user