Added selected header navigation BOD-164

This commit is contained in:
Patrick Fic
2020-09-09 11:57:58 -07:00
parent 637670da50
commit eff6f361ee
31 changed files with 309 additions and 76 deletions

View File

@@ -26,7 +26,10 @@ import {
import { connect } from "react-redux"; import { connect } from "react-redux";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectRecentItems } from "../../redux/application/application.selectors"; import {
selectRecentItems,
selectSelectedHeader,
} from "../../redux/application/application.selectors";
import { setModalContext } from "../../redux/modals/modals.actions"; import { setModalContext } from "../../redux/modals/modals.actions";
import { signOutStart } from "../../redux/user/user.actions"; import { signOutStart } from "../../redux/user/user.actions";
import { selectCurrentUser } from "../../redux/user/user.selectors"; import { selectCurrentUser } from "../../redux/user/user.selectors";
@@ -36,6 +39,7 @@ import "./header.styles.scss";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser, currentUser: selectCurrentUser,
recentItems: selectRecentItems, recentItems: selectRecentItems,
selectedHeader: selectSelectedHeader,
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
@@ -51,6 +55,7 @@ const mapDispatchToProps = (dispatch) => ({
function Header({ function Header({
handleMenuClick, handleMenuClick,
currentUser, currentUser,
selectedHeader,
signOutStart, signOutStart,
setInvoiceEnterContext, setInvoiceEnterContext,
setTimeTicketContext, setTimeTicketContext,
@@ -64,7 +69,7 @@ function Header({
mode="horizontal" mode="horizontal"
theme="dark" theme="dark"
className="header-main-menu" className="header-main-menu"
selectedKeys={["home"]} selectedKeys={[selectedHeader]}
onClick={handleMenuClick} onClick={handleMenuClick}
> >
<Menu.Item key="home"> <Menu.Item key="home">

View File

@@ -4,6 +4,6 @@
max-height: 3.5rem; max-height: 3.5rem;
} }
.header-main-menu { .header-main-menu {
width: 80vw; //width: 95vw;
float: left; //float: left;
} }

View File

@@ -32,7 +32,7 @@ const JobSearchSelect = ({ value, onChange, onBlur, disabled }, ref) => {
const [option, setOption] = useState(value); const [option, setOption] = useState(value);
useEffect(() => { useEffect(() => {
if (value === option) { if (value === option && value) {
callIdSearch({ variables: { id: value } }); callIdSearch({ variables: { id: value } });
} }
}, [value, option, callIdSearch]); }, [value, option, callIdSearch]);
@@ -46,7 +46,7 @@ const JobSearchSelect = ({ value, onChange, onBlur, disabled }, ref) => {
const handleSelect = (value) => { const handleSelect = (value) => {
setOption(value); setOption(value);
if (value !== option && onChange) { if (value !== option && onChange) {
onChange(option); onChange(value);
} }
}; };
@@ -69,6 +69,7 @@ const JobSearchSelect = ({ value, onChange, onBlur, disabled }, ref) => {
filterOption={false} filterOption={false}
onSearch={handleSearch} onSearch={handleSearch}
// onChange={setOption} // onChange={setOption}
onChange={handleSelect}
onSelect={handleSelect} onSelect={handleSelect}
notFoundContent={loading ? <LoadingOutlined /> : <Empty />} notFoundContent={loading ? <LoadingOutlined /> : <Empty />}
onBlur={onBlur} onBlur={onBlur}

View File

@@ -6,7 +6,10 @@ import { createStructuredSelector } from "reselect";
import AccountingPayablesTable from "../../components/accounting-payables-table/accounting-payables-table.component"; import AccountingPayablesTable from "../../components/accounting-payables-table/accounting-payables-table.component";
import AlertComponent from "../../components/alert/alert.component"; import AlertComponent from "../../components/alert/alert.component";
import { QUERY_INVOICES_FOR_EXPORT } from "../../graphql/accounting.queries"; import { QUERY_INVOICES_FOR_EXPORT } from "../../graphql/accounting.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -15,19 +18,25 @@ const mapStateToProps = createStructuredSelector({
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function AccountingPayablesContainer({ bodyshop, setBreadcrumbs }) { export function AccountingPayablesContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.accounting-payables"); document.title = t("titles.accounting-payables");
setSelectedHeader("payables");
setBreadcrumbs([ setBreadcrumbs([
{ {
link: "/manage/accounting/payables", link: "/manage/accounting/payables",
label: t("titles.bc.accounting-payables"), label: t("titles.bc.accounting-payables"),
}, },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
const { loading, error, data } = useQuery(QUERY_INVOICES_FOR_EXPORT); const { loading, error, data } = useQuery(QUERY_INVOICES_FOR_EXPORT);

View File

@@ -6,7 +6,10 @@ import { createStructuredSelector } from "reselect";
import AccountingPaymentsTable from "../../components/accounting-payments-table/accounting-payments-table.component"; import AccountingPaymentsTable from "../../components/accounting-payments-table/accounting-payments-table.component";
import AlertComponent from "../../components/alert/alert.component"; import AlertComponent from "../../components/alert/alert.component";
import { QUERY_PAYMENTS_FOR_EXPORT } from "../../graphql/accounting.queries"; import { QUERY_PAYMENTS_FOR_EXPORT } from "../../graphql/accounting.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
@@ -16,19 +19,25 @@ const mapStateToProps = createStructuredSelector({
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function AccountingPaymentsContainer({ bodyshop, setBreadcrumbs }) { export function AccountingPaymentsContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.accounting-payments"); document.title = t("titles.accounting-payments");
setSelectedHeader("payments");
setBreadcrumbs([ setBreadcrumbs([
{ {
link: "/manage/accounting/payments", link: "/manage/accounting/payments",
label: t("titles.bc.accounting-payments"), label: t("titles.bc.accounting-payments"),
}, },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
const { loading, error, data } = useQuery(QUERY_PAYMENTS_FOR_EXPORT); const { loading, error, data } = useQuery(QUERY_PAYMENTS_FOR_EXPORT);

View File

@@ -6,7 +6,10 @@ import { createStructuredSelector } from "reselect";
import AccountingReceivablesTable from "../../components/accounting-receivables-table/accounting-receivables-table.component"; import AccountingReceivablesTable from "../../components/accounting-receivables-table/accounting-receivables-table.component";
import AlertComponent from "../../components/alert/alert.component"; import AlertComponent from "../../components/alert/alert.component";
import { QUERY_JOBS_FOR_EXPORT } from "../../graphql/accounting.queries"; import { QUERY_JOBS_FOR_EXPORT } from "../../graphql/accounting.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
@@ -16,19 +19,25 @@ const mapStateToProps = createStructuredSelector({
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function AccountingReceivablesContainer({ bodyshop, setBreadcrumbs }) { export function AccountingReceivablesContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.accounting-receivables"); document.title = t("titles.accounting-receivables");
setSelectedHeader("receivables");
setBreadcrumbs([ setBreadcrumbs([
{ {
link: "/manage/accounting/receivables", link: "/manage/accounting/receivables",
label: t("titles.bc.accounting-receivables"), label: t("titles.bc.accounting-receivables"),
}, },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
const { loading, error, data } = useQuery(QUERY_JOBS_FOR_EXPORT, { const { loading, error, data } = useQuery(QUERY_JOBS_FOR_EXPORT, {
variables: { variables: {

View File

@@ -7,7 +7,10 @@ import { useHistory, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries"; import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import ContractCreatePageComponent from "./contract-create.page.component"; import ContractCreatePageComponent from "./contract-create.page.component";
@@ -16,9 +19,14 @@ const mapStateToProps = createStructuredSelector({
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs }) { export function ContractCreatePageContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const [form] = Form.useForm(); const [form] = Form.useForm();
const { t } = useTranslation(); const { t } = useTranslation();
const history = useHistory(); const history = useHistory();
@@ -70,6 +78,7 @@ export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs }) {
useEffect(() => { useEffect(() => {
document.title = t("titles.contracts-create"); document.title = t("titles.contracts-create");
setSelectedHeader("newcontract");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") },
{ {
@@ -81,7 +90,7 @@ export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs }) {
label: t("titles.bc.contracts-create"), label: t("titles.bc.contracts-create"),
}, },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
return ( return (
<RbacWrapper action="contracts:create"> <RbacWrapper action="contracts:create">

View File

@@ -16,6 +16,7 @@ import {
import { import {
addRecentItem, addRecentItem,
setBreadcrumbs, setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions"; } from "../../redux/application/application.actions";
import { CreateRecentItem } from "../../utils/create-recent-item"; import { CreateRecentItem } from "../../utils/create-recent-item";
import ContractDetailPageComponent from "./contract-detail.page.component"; import ContractDetailPageComponent from "./contract-detail.page.component";
@@ -24,9 +25,14 @@ import NotFound from "../../components/not-found/not-found.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
addRecentItem: (item) => dispatch(addRecentItem(item)), addRecentItem: (item) => dispatch(addRecentItem(item)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem }) { export function ContractDetailPageContainer({
setBreadcrumbs,
addRecentItem,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
const [updateContract] = useMutation(UPDATE_CONTRACT); const [updateContract] = useMutation(UPDATE_CONTRACT);
const [form] = Form.useForm(); const [form] = Form.useForm();
@@ -37,6 +43,7 @@ export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem }) {
}); });
useEffect(() => { useEffect(() => {
setSelectedHeader("contracts");
document.title = loading document.title = loading
? t("titles.app") ? t("titles.app")
: error : error
@@ -76,7 +83,16 @@ export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem }) {
`/manage/courtesycars/contracts/${contractId}` `/manage/courtesycars/contracts/${contractId}`
) )
); );
}, [t, data, error, loading, setBreadcrumbs, addRecentItem, contractId]); }, [
t,
data,
error,
loading,
setBreadcrumbs,
addRecentItem,
contractId,
setSelectedHeader,
]);
const handleFinish = async (values) => { const handleFinish = async (values) => {
const result = await updateContract({ const result = await updateContract({

View File

@@ -4,7 +4,10 @@ import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import AlertComponent from "../../components/alert/alert.component"; import AlertComponent from "../../components/alert/alert.component";
import { QUERY_ACTIVE_CONTRACTS_PAGINATED } from "../../graphql/cccontracts.queries"; import { QUERY_ACTIVE_CONTRACTS_PAGINATED } from "../../graphql/cccontracts.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import ContractsPageComponent from "./contracts.page.component"; import ContractsPageComponent from "./contracts.page.component";
import queryString from "query-string"; import queryString from "query-string";
import { useLocation } from "react-router-dom"; import { useLocation } from "react-router-dom";
@@ -13,12 +16,12 @@ import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function ContractsPageContainer({ setBreadcrumbs }) { export function ContractsPageContainer({ setBreadcrumbs, setSelectedHeader }) {
const searchParams = queryString.parse(useLocation().search); const searchParams = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder, start, end } = searchParams; const { page, sortcolumn, sortorder, start, end } = searchParams;
console.log("ContractsPageContainer -> searchParams", searchParams);
const { loading, error, data, refetch } = useQuery( const { loading, error, data, refetch } = useQuery(
QUERY_ACTIVE_CONTRACTS_PAGINATED, QUERY_ACTIVE_CONTRACTS_PAGINATED,
@@ -46,7 +49,7 @@ export function ContractsPageContainer({ setBreadcrumbs }) {
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.contracts"); document.title = t("titles.contracts");
setSelectedHeader("contracts");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") },
{ {
@@ -54,7 +57,7 @@ export function ContractsPageContainer({ setBreadcrumbs }) {
label: t("titles.bc.contracts"), label: t("titles.bc.contracts"),
}, },
]); ]);
}, [setBreadcrumbs, t]); }, [setBreadcrumbs, t, setSelectedHeader]);
if (error) return <AlertComponent message={error.message} type="error" />; if (error) return <AlertComponent message={error.message} type="error" />;
return ( return (

View File

@@ -8,7 +8,10 @@ import { INSERT_NEW_COURTESY_CAR } from "../../graphql/courtesy-car.queries";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import CourtesyCarCreateComponent from "./courtesy-car-create.page.component"; import CourtesyCarCreateComponent from "./courtesy-car-create.page.component";
import { useHistory } from "react-router-dom"; import { useHistory } from "react-router-dom";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -16,8 +19,13 @@ const mapStateToProps = createStructuredSelector({
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function CourtesyCarCreateContainer({ bodyshop, setBreadcrumbs }) { export function CourtesyCarCreateContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const [form] = Form.useForm(); const [form] = Form.useForm();
const [insertCourtesyCar] = useMutation(INSERT_NEW_COURTESY_CAR); const [insertCourtesyCar] = useMutation(INSERT_NEW_COURTESY_CAR);
const { t } = useTranslation(); const { t } = useTranslation();
@@ -37,6 +45,7 @@ export function CourtesyCarCreateContainer({ bodyshop, setBreadcrumbs }) {
}; };
useEffect(() => { useEffect(() => {
setSelectedHeader("courtesycarsall");
document.title = t("titles.courtesycars-create"); document.title = t("titles.courtesycars-create");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") },
@@ -45,12 +54,12 @@ export function CourtesyCarCreateContainer({ bodyshop, setBreadcrumbs }) {
label: t("titles.bc.courtesycars-new"), label: t("titles.bc.courtesycars-new"),
}, },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
return ( return (
<RbacWrapper action="courtesycar:create"> <RbacWrapper action="courtesycar:create">
<Form form={form} autoComplete="new-password" onFinish={handleFinish}> <Form form={form} autoComplete="new-password" onFinish={handleFinish}>
<CourtesyCarCreateComponent /> <CourtesyCarCreateComponent form={form} />
</Form> </Form>
</RbacWrapper> </RbacWrapper>
); );

View File

@@ -11,6 +11,7 @@ import { QUERY_CC_BY_PK, UPDATE_CC } from "../../graphql/courtesy-car.queries";
import { import {
addRecentItem, addRecentItem,
setBreadcrumbs, setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions"; } from "../../redux/application/application.actions";
import { CreateRecentItem } from "../../utils/create-recent-item"; import { CreateRecentItem } from "../../utils/create-recent-item";
import CourtesyCarDetailPageComponent from "./courtesy-car-detail.page.component"; import CourtesyCarDetailPageComponent from "./courtesy-car-detail.page.component";
@@ -22,10 +23,12 @@ import { useLocation } from "react-router-dom";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
addRecentItem: (item) => dispatch(addRecentItem(item)), addRecentItem: (item) => dispatch(addRecentItem(item)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function CourtesyCarDetailPageContainer({ export function CourtesyCarDetailPageContainer({
setBreadcrumbs, setBreadcrumbs,
addRecentItem, addRecentItem,
setSelectedHeader,
}) { }) {
const searchParams = queryString.parse(useLocation().search); const searchParams = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder } = searchParams; const { page, sortcolumn, sortorder } = searchParams;
@@ -53,6 +56,8 @@ export function CourtesyCarDetailPageContainer({
}); });
useEffect(() => { useEffect(() => {
setSelectedHeader("courtesycarsall");
document.title = loading document.title = loading
? t("titles.app") ? t("titles.app")
: error : error
@@ -89,7 +94,16 @@ export function CourtesyCarDetailPageContainer({
`/manage/courtesycars/${ccId}` `/manage/courtesycars/${ccId}`
) )
); );
}, [t, data, error, loading, setBreadcrumbs, ccId, addRecentItem]); }, [
t,
data,
error,
loading,
setBreadcrumbs,
ccId,
addRecentItem,
setSelectedHeader,
]);
const handleFinish = async (values) => { const handleFinish = async (values) => {
setSaveLoading(true); setSaveLoading(true);

View File

@@ -5,23 +5,31 @@ import { connect } from "react-redux";
import AlertComponent from "../../components/alert/alert.component"; import AlertComponent from "../../components/alert/alert.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { QUERY_ALL_CC } from "../../graphql/courtesy-car.queries"; import { QUERY_ALL_CC } from "../../graphql/courtesy-car.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import CourtesyCarsPageComponent from "./courtesy-cars.page.component"; import CourtesyCarsPageComponent from "./courtesy-cars.page.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function CourtesyCarsPageContainer({ setBreadcrumbs }) { export function CourtesyCarsPageContainer({
setBreadcrumbs,
setSelectedHeader,
}) {
const { loading, error, data, refetch } = useQuery(QUERY_ALL_CC); const { loading, error, data, refetch } = useQuery(QUERY_ALL_CC);
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.courtesycars"); document.title = t("titles.courtesycars");
setSelectedHeader("courtesycarsall");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/courtesycars", label: t("titles.bc.courtesycars") }, { link: "/manage/courtesycars", label: t("titles.bc.courtesycars") },
]); ]);
}, [setBreadcrumbs, t]); }, [setBreadcrumbs, t, setSelectedHeader]);
if (error) return <AlertComponent message={error.message} type="error" />; if (error) return <AlertComponent message={error.message} type="error" />;
return ( return (
<RbacWrapper action="courtesycar:list"> <RbacWrapper action="courtesycar:list">

View File

@@ -6,26 +6,31 @@ import { connect } from "react-redux";
import { useLocation } from "react-router-dom"; import { useLocation } from "react-router-dom";
import InvoiceDetailEditContainer from "../../components/invoice-detail-edit/invoice-detail-edit.container"; import InvoiceDetailEditContainer from "../../components/invoice-detail-edit/invoice-detail-edit.container";
import { QUERY_ALL_INVOICES_PAGINATED } from "../../graphql/invoices.queries"; import { QUERY_ALL_INVOICES_PAGINATED } from "../../graphql/invoices.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import InvoicesPageComponent from "./invoices.page.component"; import InvoicesPageComponent from "./invoices.page.component";
import AlertComponent from "../../components/alert/alert.component"; import AlertComponent from "../../components/alert/alert.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function InvoicesPageContainer({ setBreadcrumbs }) { export function InvoicesPageContainer({ setBreadcrumbs, setSelectedHeader }) {
const { t } = useTranslation(); const { t } = useTranslation();
const searchParams = queryString.parse(useLocation().search); const searchParams = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder, search } = searchParams; const { page, sortcolumn, sortorder, search } = searchParams;
useEffect(() => { useEffect(() => {
document.title = t("titles.invoices-list"); document.title = t("titles.invoices-list");
setSelectedHeader("invoices");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/invoices", label: t("titles.bc.invoices-list") }, { link: "/manage/invoices", label: t("titles.bc.invoices-list") },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
const { loading, error, data, refetch } = useQuery( const { loading, error, data, refetch } = useQuery(
QUERY_ALL_INVOICES_PAGINATED, QUERY_ALL_INVOICES_PAGINATED,

View File

@@ -8,7 +8,10 @@ import { createStructuredSelector } from "reselect";
import AlertComponent from "../../components/alert/alert.component"; import AlertComponent from "../../components/alert/alert.component";
import JobsListPaginated from "../../components/jobs-list-paginated/jobs-list-paginated.component"; import JobsListPaginated from "../../components/jobs-list-paginated/jobs-list-paginated.component";
import { QUERY_ALL_JOBS_PAGINATED } from "../../graphql/jobs.queries"; import { QUERY_ALL_JOBS_PAGINATED } from "../../graphql/jobs.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -17,9 +20,10 @@ const mapStateToProps = createStructuredSelector({
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function AllJobs({ setBreadcrumbs }) { export function AllJobs({ setBreadcrumbs, setSelectedHeader }) {
const searchParams = queryString.parse(useLocation().search); const searchParams = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder, search } = searchParams; const { page, sortcolumn, sortorder, search } = searchParams;
@@ -43,8 +47,9 @@ export function AllJobs({ setBreadcrumbs }) {
useEffect(() => { useEffect(() => {
document.title = t("titles.jobs-all"); document.title = t("titles.jobs-all");
setSelectedHeader("alljobs");
setBreadcrumbs([{ link: "/manage/jobs", label: t("titles.bc.jobs-all") }]); setBreadcrumbs([{ link: "/manage/jobs", label: t("titles.bc.jobs-all") }]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
if (error) return <AlertComponent message={error.message} type="error" />; if (error) return <AlertComponent message={error.message} type="error" />;
return ( return (

View File

@@ -9,12 +9,19 @@ import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function JobsAvailablePageContainer({ setBreadcrumbs }) { export function JobsAvailablePageContainer({
setBreadcrumbs,
setSelectedHeader,
}) {
const [deleteJob] = useMutation(DELETE_AVAILABLE_JOB); const [deleteJob] = useMutation(DELETE_AVAILABLE_JOB);
const { t } = useTranslation(); const { t } = useTranslation();
@@ -22,10 +29,11 @@ export function JobsAvailablePageContainer({ setBreadcrumbs }) {
useEffect(() => { useEffect(() => {
document.title = t("titles.jobsavailable"); document.title = t("titles.jobsavailable");
setSelectedHeader("availablejobs");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/available", label: t("titles.bc.availablejobs") }, { link: "/manage/available", label: t("titles.bc.availablejobs") },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
return ( return (
<RbacWrapper action="jobs:available-list"> <RbacWrapper action="jobs:available-list">

View File

@@ -8,22 +8,27 @@ import LoadingSpinner from "../../components/loading-spinner/loading-spinner.com
import NotFound from "../../components/not-found/not-found.component"; import NotFound from "../../components/not-found/not-found.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { QUERY_JOB_CLOSE_DETAILS } from "../../graphql/jobs.queries"; import { QUERY_JOB_CLOSE_DETAILS } from "../../graphql/jobs.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import JobsCloseComponent from "./jobs-close.component"; import JobsCloseComponent from "./jobs-close.component";
import { Result } from "antd"; import { Result } from "antd";
import JobCalculateTotals from "../../components/job-calculate-totals/job-calculate-totals.component"; import JobCalculateTotals from "../../components/job-calculate-totals/job-calculate-totals.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function JobsCloseContainer({ setBreadcrumbs }) { export function JobsCloseContainer({ setBreadcrumbs, setSelectedHeader }) {
const { jobId } = useParams(); const { jobId } = useParams();
const { loading, error, data } = useQuery(QUERY_JOB_CLOSE_DETAILS, { const { loading, error, data } = useQuery(QUERY_JOB_CLOSE_DETAILS, {
variables: { id: jobId }, variables: { id: jobId },
}); });
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
setSelectedHeader("activejobs");
document.title = t("titles.jobs-close", { document.title = t("titles.jobs-close", {
number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null, number: data ? data.jobs_by_pk && data.jobs_by_pk.ro_number : null,
}); });
@@ -44,7 +49,7 @@ export function JobsCloseContainer({ setBreadcrumbs }) {
label: t("titles.bc.jobs-close"), label: t("titles.bc.jobs-close"),
}, },
]); ]);
}, [setBreadcrumbs, t, jobId, data]); }, [setBreadcrumbs, t, jobId, data, setSelectedHeader]);
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" />;

View File

@@ -9,7 +9,10 @@ import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -17,8 +20,9 @@ const mapStateToProps = createStructuredSelector({
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
function JobsCreateContainer({ bodyshop, setBreadcrumbs }) { function JobsCreateContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
const { t } = useTranslation(); const { t } = useTranslation();
const contextState = useState({ const contextState = useState({
vehicle: { new: false, search: "", selectedid: null, vehicleObj: null }, vehicle: { new: false, search: "", selectedid: null, vehicleObj: null },
@@ -46,6 +50,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) {
useEffect(() => { useEffect(() => {
document.title = t("titles.jobs-create"); document.title = t("titles.jobs-create");
setSelectedHeader("availablejobs");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/available", label: t("titles.bc.availablejobs") }, { link: "/manage/available", label: t("titles.bc.availablejobs") },
{ {
@@ -53,7 +58,7 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) {
label: t("titles.bc.jobs-new"), label: t("titles.bc.jobs-new"),
}, },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
const runInsertJob = (job) => { const runInsertJob = (job) => {
insertJob({ variables: { job: job } }) insertJob({ variables: { job: job } })

View File

@@ -8,7 +8,10 @@ import AlertComponent from "../../components/alert/alert.component";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { QUERY_DELIVER_CHECKLIST } from "../../graphql/bodyshop.queries"; import { QUERY_DELIVER_CHECKLIST } from "../../graphql/bodyshop.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import JobchecklistComponent from "../../components/job-checklist/job-checklist.component"; import JobchecklistComponent from "../../components/job-checklist/job-checklist.component";
@@ -18,9 +21,14 @@ const mapStateToProps = createStructuredSelector({
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function JobsDeliverContainer({ bodyshop, setBreadcrumbs }) { export function JobsDeliverContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
const { jobId } = useParams(); const { jobId } = useParams();
const { loading, error, data } = useQuery(QUERY_DELIVER_CHECKLIST, { const { loading, error, data } = useQuery(QUERY_DELIVER_CHECKLIST, {
@@ -29,6 +37,7 @@ export function JobsDeliverContainer({ bodyshop, setBreadcrumbs }) {
useEffect(() => { useEffect(() => {
document.title = t("titles.jobs-deliver"); document.title = t("titles.jobs-deliver");
setSelectedHeader("activejobs");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/jobs", label: t("titles.bc.jobs") }, { link: "/manage/jobs", label: t("titles.bc.jobs") },
{ {
@@ -42,7 +51,7 @@ export function JobsDeliverContainer({ bodyshop, setBreadcrumbs }) {
label: t("titles.bc.jobs-deliver"), label: t("titles.bc.jobs-deliver"),
}, },
]); ]);
}, [t, setBreadcrumbs, jobId, data]); }, [t, setBreadcrumbs, jobId, data, setSelectedHeader]);
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" />;

View File

@@ -8,7 +8,10 @@ import AlertComponent from "../../components/alert/alert.component";
import JobChecklist from "../../components/job-checklist/job-checklist.component"; import JobChecklist from "../../components/job-checklist/job-checklist.component";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
import { QUERY_INTAKE_CHECKLIST } from "../../graphql/bodyshop.queries"; import { QUERY_INTAKE_CHECKLIST } from "../../graphql/bodyshop.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
@@ -18,9 +21,14 @@ const mapStateToProps = createStructuredSelector({
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function JobsIntakeContainer({ bodyshop, setBreadcrumbs }) { export function JobsIntakeContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
const { jobId } = useParams(); const { jobId } = useParams();
@@ -30,6 +38,7 @@ export function JobsIntakeContainer({ bodyshop, setBreadcrumbs }) {
useEffect(() => { useEffect(() => {
document.title = t("titles.jobs-intake"); document.title = t("titles.jobs-intake");
setSelectedHeader("activejobs");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/jobs", label: t("titles.bc.jobs") }, { link: "/manage/jobs", label: t("titles.bc.jobs") },
{ {
@@ -45,7 +54,7 @@ export function JobsIntakeContainer({ bodyshop, setBreadcrumbs }) {
label: t("titles.bc.jobs-intake"), label: t("titles.bc.jobs-intake"),
}, },
]); ]);
}, [t, setBreadcrumbs, jobId, data]); }, [t, setBreadcrumbs, jobId, data, setSelectedHeader]);
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" />;

View File

@@ -3,22 +3,27 @@ import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import JobDetailCards from "../../components/job-detail-cards/job-detail-cards.component"; import JobDetailCards from "../../components/job-detail-cards/job-detail-cards.component";
import JobsList from "../../components/jobs-list/jobs-list.component"; import JobsList from "../../components/jobs-list/jobs-list.component";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function JobsPage({ setBreadcrumbs }) { export function JobsPage({ setBreadcrumbs, setSelectedHeader }) {
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.jobs"); document.title = t("titles.jobs");
setSelectedHeader("activejobs");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/jobs", label: t("titles.bc.jobs-active") }, { link: "/manage/jobs", label: t("titles.bc.jobs-active") },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
return ( return (
<RbacWrapper action="jobs:list-active"> <RbacWrapper action="jobs:list-active">

View File

@@ -1,20 +1,25 @@
import React, { useEffect } from "react"; import React, { useEffect } from "react";
import OwnersPageComponent from "./owners.page.component"; import OwnersPageComponent from "./owners.page.component";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { connect } from "react-redux"; import { connect } from "react-redux";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function OwnersPageContainer({ setBreadcrumbs }) { export function OwnersPageContainer({ setBreadcrumbs, setSelectedHeader }) {
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.owners"); document.title = t("titles.owners");
setSelectedHeader("owners");
setBreadcrumbs([{ link: "/manage/owners", label: t("titles.bc.owners") }]); setBreadcrumbs([{ link: "/manage/owners", label: t("titles.bc.owners") }]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
return ( return (
<RbacWrapper action="owners:list"> <RbacWrapper action="owners:list">

View File

@@ -10,7 +10,10 @@ import AlertComponent from "../../components/alert/alert.component";
import CsiResponseFormContainer from "../../components/csi-response-form/csi-response-form.container"; import CsiResponseFormContainer from "../../components/csi-response-form/csi-response-form.container";
import CsiResponseListPaginated from "../../components/csi-response-list-paginated/csi-response-list-paginated.component"; import CsiResponseListPaginated from "../../components/csi-response-list-paginated/csi-response-list-paginated.component";
import { QUERY_CSI_RESPONSE_PAGINATED } from "../../graphql/csi.queries"; import { QUERY_CSI_RESPONSE_PAGINATED } from "../../graphql/csi.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -19,9 +22,14 @@ const mapStateToProps = createStructuredSelector({
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function ShopCsiContainer({ bodyshop, setBreadcrumbs }) { export function ShopCsiContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
const searchParams = queryString.parse(useLocation().search); const searchParams = queryString.parse(useLocation().search);
@@ -49,6 +57,7 @@ export function ShopCsiContainer({ bodyshop, setBreadcrumbs }) {
useEffect(() => { useEffect(() => {
document.title = t("titles.shop-csi"); document.title = t("titles.shop-csi");
setSelectedHeader("shop-csi");
setBreadcrumbs([ setBreadcrumbs([
{ {
link: "/manage/shop", link: "/manage/shop",
@@ -56,7 +65,7 @@ export function ShopCsiContainer({ bodyshop, setBreadcrumbs }) {
}, },
{ link: "/manage/shop/csi", label: t("titles.bc.shop-csi") }, { link: "/manage/shop/csi", label: t("titles.bc.shop-csi") },
]); ]);
}, [t, setBreadcrumbs, bodyshop.shopname]); }, [t, setBreadcrumbs, bodyshop.shopname, setSelectedHeader]);
if (error) return <AlertComponent message={error.message} type="error" />; if (error) return <AlertComponent message={error.message} type="error" />;

View File

@@ -6,7 +6,10 @@ import { createStructuredSelector } from "reselect";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import ShopTemplateEditor from "../../components/shop-template-editor/shop-template-editor.container"; import ShopTemplateEditor from "../../components/shop-template-editor/shop-template-editor.container";
import ShopTemplatesListContainer from "../../components/shop-templates-list/shop-templates-list.container"; import ShopTemplatesListContainer from "../../components/shop-templates-list/shop-templates-list.container";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -14,13 +17,19 @@ const mapStateToProps = createStructuredSelector({
}); });
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function ShopTemplatesContainer({ setBreadcrumbs, bodyshop }) { export function ShopTemplatesContainer({
setBreadcrumbs,
bodyshop,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
const drawerVisibility = useState(false); const drawerVisibility = useState(false);
useEffect(() => { useEffect(() => {
document.title = t("titles.shop-templates"); document.title = t("titles.shop-templates");
setSelectedHeader("shop-templates");
setBreadcrumbs([ setBreadcrumbs([
{ {
link: "/manage/shop", link: "/manage/shop",
@@ -28,7 +37,7 @@ export function ShopTemplatesContainer({ setBreadcrumbs, bodyshop }) {
}, },
{ link: "/manage/shop/templates", label: t("titles.bc.shop-templates") }, { link: "/manage/shop/templates", label: t("titles.bc.shop-templates") },
]); ]);
}, [t, setBreadcrumbs, bodyshop.shopname]); }, [t, setBreadcrumbs, bodyshop.shopname, setSelectedHeader]);
return ( return (
<RbacWrapper action="shop:templates"> <RbacWrapper action="shop:templates">

View File

@@ -3,11 +3,38 @@ import { useTranslation } from "react-i18next";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import ShopVendorPageComponent from "./shop-vendor.page.component"; import ShopVendorPageComponent from "./shop-vendor.page.component";
export default function ShopVendorPageContainer() { import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
});
export function ShopVendorPageContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.shop_vendors"); document.title = t("titles.shop_vendors");
}, [t]); setSelectedHeader("shop-vendors");
setBreadcrumbs([
{
link: "/manage/shop",
label: t("titles.bc.shop", { shopname: bodyshop.shopname }),
},
{ link: "/manage/shop/vendors", label: t("titles.bc.shop-vendors") },
]);
}, [t, bodyshop.shopname, setBreadcrumbs, setSelectedHeader]);
return ( return (
<RbacWrapper action="shop:vendors"> <RbacWrapper action="shop:vendors">
@@ -15,3 +42,7 @@ export default function ShopVendorPageContainer() {
</RbacWrapper> </RbacWrapper>
); );
} }
export default connect(
mapStateToProps,
mapDispatchToProps
)(ShopVendorPageContainer);

View File

@@ -12,25 +12,34 @@ import TimeTicketsDatesSelector from "../../components/ticket-tickets-dates-sele
import TimeTicketList from "../../components/time-ticket-list/time-ticket-list.component"; import TimeTicketList from "../../components/time-ticket-list/time-ticket-list.component";
import TimeTicketsSummary from "../../components/time-tickets-summary/time-tickets-summary.component"; import TimeTicketsSummary from "../../components/time-tickets-summary/time-tickets-summary.component";
import { QUERY_TIME_TICKETS_IN_RANGE } from "../../graphql/timetickets.queries"; import { QUERY_TIME_TICKETS_IN_RANGE } from "../../graphql/timetickets.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
const mapStateToProps = createStructuredSelector({}); const mapStateToProps = createStructuredSelector({});
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function TimeTicketsContainer({ bodyshop, setBreadcrumbs }) { export function TimeTicketsContainer({
bodyshop,
setBreadcrumbs,
setSelectedHeader,
}) {
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.timetickets"); document.title = t("titles.timetickets");
setSelectedHeader("timetickets");
setBreadcrumbs([ setBreadcrumbs([
{ {
link: "/manage/timetickets", link: "/manage/timetickets",
label: t("titles.bc.timetickets"), label: t("titles.bc.timetickets"),
}, },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
const searchParams = queryString.parse(useLocation().search); const searchParams = queryString.parse(useLocation().search);
const { start, end } = searchParams; const { start, end } = searchParams;

View File

@@ -8,6 +8,7 @@ import { useTranslation } from "react-i18next";
import { import {
setBreadcrumbs, setBreadcrumbs,
addRecentItem, addRecentItem,
setSelectedHeader,
} from "../../redux/application/application.actions"; } from "../../redux/application/application.actions";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { CreateRecentItem } from "../../utils/create-recent-item"; import { CreateRecentItem } from "../../utils/create-recent-item";
@@ -16,12 +17,14 @@ import NotFound from "../../components/not-found/not-found.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
addRecentItem: (item) => dispatch(addRecentItem(item)), addRecentItem: (item) => dispatch(addRecentItem(item)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function VehicleDetailContainer({ export function VehicleDetailContainer({
match, match,
setBreadcrumbs, setBreadcrumbs,
addRecentItem, addRecentItem,
setSelectedHeader,
}) { }) {
const { vehId } = match.params; const { vehId } = match.params;
const { t } = useTranslation(); const { t } = useTranslation();
@@ -40,6 +43,8 @@ export function VehicleDetailContainer({
} ${data.vehicles_by_pk && data.vehicles_by_pk.v_model_desc}` } ${data.vehicles_by_pk && data.vehicles_by_pk.v_model_desc}`
: "", : "",
}); });
setSelectedHeader("vehicles");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/vehicles", label: t("titles.bc.vehicles") }, { link: "/manage/vehicles", label: t("titles.bc.vehicles") },
{ {
@@ -62,7 +67,7 @@ export function VehicleDetailContainer({
`/manage/vehicles/${vehId}` `/manage/vehicles/${vehId}`
) )
); );
}, [t, data, setBreadcrumbs, vehId, addRecentItem]); }, [t, data, setBreadcrumbs, vehId, addRecentItem, setSelectedHeader]);
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" />;

View File

@@ -3,20 +3,25 @@ import VehiclesPageComponent from "./vehicles.page.component";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { setBreadcrumbs } from "../../redux/application/application.actions"; import {
setBreadcrumbs,
setSelectedHeader,
} from "../../redux/application/application.actions";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
setSelectedHeader: (key) => dispatch(setSelectedHeader(key)),
}); });
export function VehiclesPageContainer({ setBreadcrumbs }) { export function VehiclesPageContainer({ setBreadcrumbs, setSelectedHeader }) {
const { t } = useTranslation(); const { t } = useTranslation();
useEffect(() => { useEffect(() => {
document.title = t("titles.vehicles"); document.title = t("titles.vehicles");
setSelectedHeader("vehicles");
setBreadcrumbs([ setBreadcrumbs([
{ link: "/manage/vehicles", label: t("titles.bc.vehicles") }, { link: "/manage/vehicles", label: t("titles.bc.vehicles") },
]); ]);
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs, setSelectedHeader]);
return <VehiclesPageComponent />; return <VehiclesPageComponent />;
} }

View File

@@ -33,3 +33,8 @@ export const addRecentItem = (item) => ({
type: ApplicationActionTypes.ADD_RECENT_ITEM, type: ApplicationActionTypes.ADD_RECENT_ITEM,
payload: item, payload: item,
}); });
export const setSelectedHeader = (key) => ({
type: ApplicationActionTypes.SET_SELECTED_HEADER,
payload: key,
});

View File

@@ -4,6 +4,7 @@ const INITIAL_STATE = {
loading: false, loading: false,
breadcrumbs: [], breadcrumbs: [],
recentItems: [], recentItems: [],
selectedHeader: "home",
scheduleLoad: { scheduleLoad: {
load: {}, load: {},
calculating: false, calculating: false,
@@ -13,6 +14,11 @@ const INITIAL_STATE = {
const applicationReducer = (state = INITIAL_STATE, action) => { const applicationReducer = (state = INITIAL_STATE, action) => {
switch (action.type) { switch (action.type) {
case ApplicationActionTypes.SET_SELECTED_HEADER:
return {
...state,
selectedHeader: action.payload,
};
case ApplicationActionTypes.ADD_RECENT_ITEM: case ApplicationActionTypes.ADD_RECENT_ITEM:
return { return {
...state, ...state,

View File

@@ -26,3 +26,8 @@ export const selectScheduleLoadCalculating = createSelector(
[selectApplication], [selectApplication],
(application) => application.scheduleLoad.calculating (application) => application.scheduleLoad.calculating
); );
export const selectSelectedHeader = createSelector(
[selectApplication],
(application) => application.selectedHeader
);

View File

@@ -6,5 +6,6 @@ const ApplicationActionTypes = {
CALCULATE_SCHEDULE_LOAD_SUCCESS: "CALCULATE_SCHEDULE_LOAD_SUCCESS", CALCULATE_SCHEDULE_LOAD_SUCCESS: "CALCULATE_SCHEDULE_LOAD_SUCCESS",
CALCULATE_SCHEDULE_LOAD_FAILURE: "CALCULATE_SCHEDULE_LOAD_FAILURE", CALCULATE_SCHEDULE_LOAD_FAILURE: "CALCULATE_SCHEDULE_LOAD_FAILURE",
ADD_RECENT_ITEM: "ADD_RECENT_ITEM", ADD_RECENT_ITEM: "ADD_RECENT_ITEM",
SET_SELECTED_HEADER: "SET_SELECTED_HEADER",
}; };
export default ApplicationActionTypes; export default ApplicationActionTypes;