Added basic RBAC component BOD-232

This commit is contained in:
Patrick Fic
2020-08-10 16:07:30 -07:00
parent 0df61a2701
commit 83c83ac06e
52 changed files with 670 additions and 288 deletions

View File

@@ -8,7 +8,7 @@ import AlertComponent from "../../components/alert/alert.component";
import { QUERY_INVOICES_FOR_EXPORT } from "../../graphql/accounting.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
@@ -35,10 +35,12 @@ export function AccountingPayablesContainer({ bodyshop, setBreadcrumbs }) {
return (
<div>
<AccountingPayablesTable
loadaing={loading}
invoices={data ? data.invoices : []}
/>
<RbacWrapper action="accounting:payables">
<AccountingPayablesTable
loadaing={loading}
invoices={data ? data.invoices : []}
/>
</RbacWrapper>
</div>
);
}

View File

@@ -8,6 +8,7 @@ import AlertComponent from "../../components/alert/alert.component";
import { QUERY_PAYMENTS_FOR_EXPORT } from "../../graphql/accounting.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -35,10 +36,12 @@ export function AccountingPaymentsContainer({ bodyshop, setBreadcrumbs }) {
return (
<div>
<AccountingPaymentsTable
loadaing={loading}
payments={data ? data.payments : []}
/>
<RbacWrapper action="accounting:payments">
<AccountingPaymentsTable
loadaing={loading}
payments={data ? data.payments : []}
/>
</RbacWrapper>
</div>
);
}

View File

@@ -8,6 +8,7 @@ import AlertComponent from "../../components/alert/alert.component";
import { QUERY_JOBS_FOR_EXPORT } from "../../graphql/accounting.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -38,10 +39,12 @@ export function AccountingReceivablesContainer({ bodyshop, setBreadcrumbs }) {
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<div>
<AccountingReceivablesTable
loadaing={loading}
jobs={data ? data.jobs : []}
/>
<RbacWrapper action="accounting:receivables">
<AccountingReceivablesTable
loadaing={loading}
jobs={data ? data.jobs : []}
/>
</RbacWrapper>
</div>
);
}

View File

@@ -1,15 +1,15 @@
import React, { useEffect, useState } from "react";
import ContractCreatePageComponent from "./contract-create.page.component";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
import { Form, notification } from "antd";
import { useTranslation } from "react-i18next";
import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries";
import { useMutation } from "@apollo/react-hooks";
import { Form, notification } from "antd";
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useHistory, useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { INSERT_NEW_CONTRACT } from "../../graphql/cccontracts.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import ContractCreatePageComponent from "./contract-create.page.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -79,18 +79,20 @@ export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs }) {
}, [t, setBreadcrumbs]);
return (
<Form
form={form}
layout="vertical"
autoComplete="no"
onFinish={handleFinish}
>
<ContractCreatePageComponent
<RbacWrapper action="contracts:create">
<Form
form={form}
selectedJobState={selectedJobState}
selectedCarState={selectedCarState}
/>
</Form>
layout="vertical"
autoComplete="no"
onFinish={handleFinish}
>
<ContractCreatePageComponent
form={form}
selectedJobState={selectedJobState}
selectedCarState={selectedCarState}
/>
</Form>
</RbacWrapper>
);
}
export default connect(

View File

@@ -7,17 +7,18 @@ import { connect } from "react-redux";
import { useParams } from "react-router-dom";
import AlertComponent from "../../components/alert/alert.component";
import CourtesyCarReturnModalContainer from "../../components/courtesy-car-return-modal/courtesy-car-return-modal.container";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import {
QUERY_CONTRACT_BY_PK,
UPDATE_CONTRACT,
} from "../../graphql/cccontracts.queries";
import {
setBreadcrumbs,
addRecentItem,
setBreadcrumbs,
} from "../../redux/application/application.actions";
import ContractDetailPageComponent from "./contract-detail.page.component";
import { CreateRecentItem } from "../../utils/create-recent-item";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
import ContractDetailPageComponent from "./contract-detail.page.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -94,41 +95,43 @@ export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem }) {
if (loading) return <LoadingSpinner />;
return (
<div>
<CourtesyCarReturnModalContainer />
<Form
form={form}
autoComplete="no"
layout="vertical"
onFinish={handleFinish}
initialValues={{
...data.cccontracts_by_pk,
start: data.cccontracts_by_pk.start
? moment(data.cccontracts_by_pk.start)
: null,
scheduledreturn: data.cccontracts_by_pk.scheduledreturn
? moment(data.cccontracts_by_pk.scheduledreturn)
: null,
actualreturn: data.cccontracts_by_pk.actualreturn
? moment(data.cccontracts_by_pk.actualreturn)
: null,
driver_dlexpiry: data.cccontracts_by_pk.driver_dlexpiry
? moment(data.cccontracts_by_pk.driver_dlexpiry)
: null,
driver_dob: data.cccontracts_by_pk.driver_dob
? moment(data.cccontracts_by_pk.driver_dob)
: null,
}}
>
<ContractDetailPageComponent
contract={data ? data.cccontracts_by_pk : null}
job={data ? data.cccontracts_by_pk.job : null}
courtesyCar={data ? data.cccontracts_by_pk.courtesycar : null}
refetch={refetch}
<RbacWrapper action="contracts:detail">
<div>
<CourtesyCarReturnModalContainer />
<Form
form={form}
/>
</Form>
</div>
autoComplete="no"
layout="vertical"
onFinish={handleFinish}
initialValues={{
...data.cccontracts_by_pk,
start: data.cccontracts_by_pk.start
? moment(data.cccontracts_by_pk.start)
: null,
scheduledreturn: data.cccontracts_by_pk.scheduledreturn
? moment(data.cccontracts_by_pk.scheduledreturn)
: null,
actualreturn: data.cccontracts_by_pk.actualreturn
? moment(data.cccontracts_by_pk.actualreturn)
: null,
driver_dlexpiry: data.cccontracts_by_pk.driver_dlexpiry
? moment(data.cccontracts_by_pk.driver_dlexpiry)
: null,
driver_dob: data.cccontracts_by_pk.driver_dob
? moment(data.cccontracts_by_pk.driver_dob)
: null,
}}
>
<ContractDetailPageComponent
contract={data ? data.cccontracts_by_pk : null}
job={data ? data.cccontracts_by_pk.job : null}
courtesyCar={data ? data.cccontracts_by_pk.courtesycar : null}
refetch={refetch}
form={form}
/>
</Form>
</div>
</RbacWrapper>
);
}
export default connect(null, mapDispatchToProps)(ContractDetailPageContainer);

View File

@@ -9,6 +9,8 @@ import ContractsPageComponent from "./contracts.page.component";
import queryString from "query-string";
import { useLocation } from "react-router-dom";
import moment from "moment";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
});
@@ -53,14 +55,16 @@ export function ContractsPageContainer({ setBreadcrumbs }) {
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<div>
<ContractsPageComponent
loading={loading}
refetch={refetch}
data={data ? data.cccontracts : []}
total={data ? data.cccontracts_aggregate.aggregate.count : 0}
/>
</div>
<RbacWrapper action="contracts:list">
<div>
<ContractsPageComponent
loading={loading}
refetch={refetch}
data={data ? data.cccontracts : []}
total={data ? data.cccontracts_aggregate.aggregate.count : 0}
/>
</div>
</RbacWrapper>
);
}
export default connect(null, mapDispatchToProps)(ContractsPageContainer);

View File

@@ -9,6 +9,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import CourtesyCarCreateComponent from "./courtesy-car-create.page.component";
import { useHistory } from "react-router-dom";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -47,9 +48,11 @@ export function CourtesyCarCreateContainer({ bodyshop, setBreadcrumbs }) {
}, [t, setBreadcrumbs]);
return (
<Form form={form} autoComplete="new-password" onFinish={handleFinish}>
<CourtesyCarCreateComponent />
</Form>
<RbacWrapper action="courtesycar:create">
<Form form={form} autoComplete="new-password" onFinish={handleFinish}>
<CourtesyCarCreateComponent />
</Form>
</RbacWrapper>
);
}
export default connect(

View File

@@ -6,6 +6,7 @@ import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useParams } from "react-router-dom";
import AlertComponent from "../../components/alert/alert.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { QUERY_CC_BY_PK, UPDATE_CC } from "../../graphql/courtesy-car.queries";
import {
addRecentItem,
@@ -82,44 +83,46 @@ export function CourtesyCarDetailPageContainer({
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<Form
form={form}
autoComplete="no"
onFinish={handleFinish}
initialValues={
data
? {
...data.courtesycars_by_pk,
purchasedate: data.courtesycars_by_pk.purchasedate
? moment(data.courtesycars_by_pk.purchasedate)
: null,
servicestartdate: data.courtesycars_by_pk.servicestartdate
? moment(data.courtesycars_by_pk.servicestartdate)
: null,
serviceenddate: data.courtesycars_by_pk.serviceenddate
? moment(data.courtesycars_by_pk.serviceenddate)
: null,
leaseenddate: data.courtesycars_by_pk.leaseenddate
? moment(data.courtesycars_by_pk.leaseenddate)
: null,
nextservicedate: data.courtesycars_by_pk.nextservicedate
? moment(data.courtesycars_by_pk.nextservicedate)
: null,
registrationexpires: data.courtesycars_by_pk.registrationexpires
? moment(data.courtesycars_by_pk.registrationexpires)
: null,
insuranceexpires: data.courtesycars_by_pk.insuranceexpires
? moment(data.courtesycars_by_pk.insuranceexpires)
: null,
}
: {}
}
>
<CourtesyCarDetailPageComponent
contracts={data ? data.courtesycars_by_pk.cccontracts : []}
<RbacWrapper action="courtesycar:detail">
<Form
form={form}
/>
</Form>
autoComplete="no"
onFinish={handleFinish}
initialValues={
data
? {
...data.courtesycars_by_pk,
purchasedate: data.courtesycars_by_pk.purchasedate
? moment(data.courtesycars_by_pk.purchasedate)
: null,
servicestartdate: data.courtesycars_by_pk.servicestartdate
? moment(data.courtesycars_by_pk.servicestartdate)
: null,
serviceenddate: data.courtesycars_by_pk.serviceenddate
? moment(data.courtesycars_by_pk.serviceenddate)
: null,
leaseenddate: data.courtesycars_by_pk.leaseenddate
? moment(data.courtesycars_by_pk.leaseenddate)
: null,
nextservicedate: data.courtesycars_by_pk.nextservicedate
? moment(data.courtesycars_by_pk.nextservicedate)
: null,
registrationexpires: data.courtesycars_by_pk.registrationexpires
? moment(data.courtesycars_by_pk.registrationexpires)
: null,
insuranceexpires: data.courtesycars_by_pk.insuranceexpires
? moment(data.courtesycars_by_pk.insuranceexpires)
: null,
}
: {}
}
>
<CourtesyCarDetailPageComponent
contracts={data ? data.courtesycars_by_pk.cccontracts : []}
form={form}
/>
</Form>
</RbacWrapper>
);
}
export default connect(

View File

@@ -1,11 +1,12 @@
import React, { useEffect } from "react";
import CourtesyCarsPageComponent from "./courtesy-cars.page.component";
import { useQuery } from "@apollo/react-hooks";
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import AlertComponent from "../../components/alert/alert.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { QUERY_ALL_CC } from "../../graphql/courtesy-car.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { connect } from "react-redux";
import { useTranslation } from "react-i18next";
import CourtesyCarsPageComponent from "./courtesy-cars.page.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -21,13 +22,15 @@ export function CourtesyCarsPageContainer({ setBreadcrumbs }) {
{ link: "/manage/courtesycars", label: t("titles.bc.courtesycars") },
]);
}, [setBreadcrumbs, t]);
if (error) return <AlertComponent message={error.message} type='error' />;
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<CourtesyCarsPageComponent
loading={loading}
data={(data && data.courtesycars) || []}
refetch={refetch}
/>
<RbacWrapper action="courtesycar:list">
<CourtesyCarsPageComponent
loading={loading}
data={(data && data.courtesycars) || []}
refetch={refetch}
/>
</RbacWrapper>
);
}

View File

@@ -9,6 +9,7 @@ import { QUERY_ALL_INVOICES_PAGINATED } from "../../graphql/invoices.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import InvoicesPageComponent from "./invoices.page.component";
import AlertComponent from "../../components/alert/alert.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -48,16 +49,18 @@ export function InvoicesPageContainer({ setBreadcrumbs }) {
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<div>
<InvoicesPageComponent
data={data ? data.search_invoices : []}
loading={loading}
refetch={refetch}
total={data ? data.search_invoices_aggregate.aggregate.count : 0}
/>
<RbacWrapper action="invoices:list">
<div>
<InvoicesPageComponent
data={data ? data.search_invoices : []}
loading={loading}
refetch={refetch}
total={data ? data.search_invoices_aggregate.aggregate.count : 0}
/>
<InvoiceDetailEditContainer />
</div>
<InvoiceDetailEditContainer />
</div>
</RbacWrapper>
);
}
export default connect(null, mapDispatchToProps)(InvoicesPageContainer);

View File

@@ -9,17 +9,17 @@ import AlertComponent from "../../components/alert/alert.component";
import JobsListPaginated from "../../components/jobs-list-paginated/jobs-list-paginated.component";
import { QUERY_ALL_JOBS_PAGINATED } from "../../graphql/jobs.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
//bodyshop: selectBodyshop,
});
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
});
export function AllJobs({ bodyshop, setBreadcrumbs }) {
export function AllJobs({ setBreadcrumbs }) {
const searchParams = queryString.parse(useLocation().search);
const { page, sortcolumn, sortorder, search } = searchParams;
@@ -48,15 +48,17 @@ export function AllJobs({ bodyshop, setBreadcrumbs }) {
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<div>
<JobsListPaginated
refetch={refetch}
loading={loading}
searchParams={searchParams}
total={data ? data.search_jobs_aggregate.aggregate.count : 0}
jobs={data ? data.search_jobs : []}
/>
</div>
<RbacWrapper action="jobs:list-all">
<div>
<JobsListPaginated
refetch={refetch}
loading={loading}
searchParams={searchParams}
total={data ? data.search_jobs_aggregate.aggregate.count : 0}
jobs={data ? data.search_jobs : []}
/>
</div>
</RbacWrapper>
);
}

View File

@@ -7,6 +7,7 @@ import {
import JobsAvailablePageComponent from "./jobs-available.page.component";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { setBreadcrumbs } from "../../redux/application/application.actions";
const mapDispatchToProps = (dispatch) => ({
@@ -27,12 +28,14 @@ export function JobsAvailablePageContainer({ setBreadcrumbs }) {
}, [t, setBreadcrumbs]);
return (
<div>
<JobsAvailablePageComponent
deleteJob={deleteJob}
estDataLazyLoad={estDataLazyLoad}
/>
</div>
<RbacWrapper action="jobs:available-list">
<div>
<JobsAvailablePageComponent
deleteJob={deleteJob}
estDataLazyLoad={estDataLazyLoad}
/>
</div>
</RbacWrapper>
);
}
export default connect(null, mapDispatchToProps)(JobsAvailablePageContainer);

View File

@@ -7,6 +7,7 @@ import { createStructuredSelector } from "reselect";
import AlertComponent from "../../components/alert/alert.component";
import { CalculateJob } from "../../components/job-totals-table/job-totals.utility";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { QUERY_JOB_CLOSE_DETAILS } from "../../graphql/jobs.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
@@ -54,12 +55,14 @@ export function JobsCloseContainer({ setBreadcrumbs, bodyshop }) {
const jobTotals = CalculateJob(data.jobs_by_pk, bodyshop.shoprates);
return (
<div>
<JobsCloseComponent
job={data ? data.jobs_by_pk : {}}
jobTotals={jobTotals}
/>
</div>
<RbacWrapper action="jobs:close">
<div>
<JobsCloseComponent
job={data ? data.jobs_by_pk : {}}
jobTotals={jobTotals}
/>
</div>
</RbacWrapper>
);
}
export default connect(mapStateToProps, mapDispatchToProps)(JobsCloseContainer);

View File

@@ -10,6 +10,7 @@ import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors";
import { useTranslation } from "react-i18next";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -131,13 +132,16 @@ function JobsCreateContainer({ bodyshop, setBreadcrumbs }) {
return (
<JobCreateContext.Provider value={contextState}>
<Form
form={form}
onFinish={handleFinish}
layout='vertical'
autoComplete={"off"}>
<JobsCreateComponent form={form} />
</Form>
<RbacWrapper action="jobs:create">
<Form
form={form}
onFinish={handleFinish}
layout="vertical"
autoComplete={"off"}
>
<JobsCreateComponent form={form} />
</Form>
</RbacWrapper>
</JobCreateContext.Provider>
);
}

View File

@@ -17,6 +17,7 @@ import {
} from "../../redux/application/application.actions";
import { CreateRecentItem } from "../../utils/create-recent-item";
import JobsDetailPage from "./jobs-detail.page.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -90,13 +91,15 @@ function JobsDetailPageContainer({ match, setBreadcrumbs, addRecentItem }) {
if (error) return <AlertComponent message={error.message} type="error" />;
return data.jobs_by_pk ? (
<JobsDetailPage
job={data.jobs_by_pk}
mutationConvertJob={mutationConvertJob}
mutationUpdateJob={mutationUpdateJob}
refetch={refetch}
updateJobStatus={updateJobStatus}
/>
<RbacWrapper action="jobs:detail">
<JobsDetailPage
job={data.jobs_by_pk}
mutationConvertJob={mutationConvertJob}
mutationUpdateJob={mutationUpdateJob}
refetch={refetch}
updateJobStatus={updateJobStatus}
/>
</RbacWrapper>
) : (
<AlertComponent message={t("jobs.errors.noaccess")} type="error" />
);

View File

@@ -10,6 +10,8 @@ import LoadingSpinner from "../../components/loading-spinner/loading-spinner.com
import { QUERY_INTAKE_CHECKLIST } from "../../graphql/bodyshop.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser
bodyshop: selectBodyshop,
@@ -42,19 +44,21 @@ export function JobsIntakeContainer({ bodyshop, setBreadcrumbs }) {
}, [t, setBreadcrumbs, jobId]);
if (loading) return <LoadingSpinner />;
if (error) return <AlertComponent message={error.message} type='error' />;
if (error) return <AlertComponent message={error.message} type="error" />;
if (data && !!!data.bodyshops_by_pk.intakechecklist)
return (
<AlertComponent message={t("intake.errors.nochecklist")} type='error' />
<AlertComponent message={t("intake.errors.nochecklist")} type="error" />
);
return (
<div>
<JobIntakeComponent
intakeChecklistConfig={
(data && data.bodyshops_by_pk.intakechecklist) || {}
}
/>
</div>
<RbacWrapper action="jobs:intake">
<div>
<JobIntakeComponent
intakeChecklistConfig={
(data && data.bodyshops_by_pk.intakechecklist) || {}
}
/>
</div>
</RbacWrapper>
);
}

View File

@@ -4,6 +4,7 @@ import { connect } from "react-redux";
import JobDetailCards from "../../components/job-detail-cards/job-detail-cards.component";
import JobsList from "../../components/jobs-list/jobs-list.component";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -20,10 +21,12 @@ export function JobsPage({ setBreadcrumbs }) {
}, [t, setBreadcrumbs]);
return (
<div className='jobs-list-container'>
<JobsList />
<JobDetailCards />
</div>
<RbacWrapper action="jobs:list-active">
<div className="jobs-list-container">
<JobsList />
<JobDetailCards />
</div>
</RbacWrapper>
);
}

View File

@@ -4,6 +4,7 @@ import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import AlertComponent from "../../components/alert/alert.component";
import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { QUERY_OWNER_BY_ID } from "../../graphql/owners.queries";
import {
addRecentItem,
@@ -71,7 +72,9 @@ export function OwnersDetailContainer({
if (data.owners_by_pk)
return (
<OwnersDetailComponent owner={data.owners_by_pk} refetch={refetch} />
<RbacWrapper action="owners:detail">
<OwnersDetailComponent owner={data.owners_by_pk} refetch={refetch} />
</RbacWrapper>
);
else
return (

View File

@@ -3,6 +3,7 @@ import OwnersPageComponent from "./owners.page.component";
import { useTranslation } from "react-i18next";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { connect } from "react-redux";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -15,6 +16,10 @@ export function OwnersPageContainer({ setBreadcrumbs }) {
setBreadcrumbs([{ link: "/manage/owners", label: t("titles.bc.owners") }]);
}, [t, setBreadcrumbs]);
return <OwnersPageComponent />;
return (
<RbacWrapper action="owners:list">
<OwnersPageComponent />
</RbacWrapper>
);
}
export default connect(null, mapDispatchToProps)(OwnersPageContainer);

View File

@@ -7,6 +7,7 @@ import { useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import AlertComponent from "../../components/alert/alert.component";
import PaymentsListPaginated from "../../components/payments-list-paginated/payment-list-paginated.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { QUERY_ALL_PAYMENTS_PAGINATED } from "../../graphql/payments.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
@@ -53,15 +54,17 @@ export function AllJobs({ bodyshop, setBreadcrumbs }) {
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<div>
<PaymentsListPaginated
refetch={refetch}
loading={loading}
searchParams={searchParams}
total={data ? data.search_payments_aggregate.aggregate.count : 0}
payments={data ? data.search_payments : []}
/>
</div>
<RbacWrapper action="payments:list">
<div>
<PaymentsListPaginated
refetch={refetch}
loading={loading}
searchParams={searchParams}
total={data ? data.search_payments_aggregate.aggregate.count : 0}
payments={data ? data.search_payments : []}
/>
</div>
</RbacWrapper>
);
}

View File

@@ -2,6 +2,7 @@ import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import ProductionBoardComponent from "./production-board.component";
@@ -27,7 +28,11 @@ export function ProductionBoardContainer({ setBreadcrumbs, bodyshop }) {
]);
}, [t, setBreadcrumbs]);
return <ProductionBoardComponent />;
return (
<RbacWrapper action="production-board">
<ProductionBoardComponent />
</RbacWrapper>
);
}
export default connect(
mapStateToProps,

View File

@@ -5,6 +5,7 @@ import { createStructuredSelector } from "reselect";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import ProductionListComponent from "./production-list.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -25,9 +26,9 @@ export function ProductionListContainer({ setBreadcrumbs, bodyshop }) {
}, [t, setBreadcrumbs]);
return (
<div>
<RbacWrapper action="production-list">
<ProductionListComponent />
</div>
</RbacWrapper>
);
}
export default connect(

View File

@@ -1,8 +1,10 @@
import React, { useEffect } from "react";
import SchedulePageComponent from "./schedule.page.component";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import SchedulePageComponent from "./schedule.page.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
});
@@ -17,6 +19,10 @@ export function SchedulePageContainer({ setBreadcrumbs }) {
]);
}, [t, setBreadcrumbs]);
return <SchedulePageComponent />;
return (
<RbacWrapper action="schedule:view">
<SchedulePageComponent />
</RbacWrapper>
);
}
export default connect(null, mapDispatchToProps)(SchedulePageContainer);

View File

@@ -8,6 +8,7 @@ import ScoreboardPageComponent from "./scoreboard.page.component";
import { useSubscription } from "@apollo/react-hooks";
import { SUBSCRIPTION_SCOREBOARD } from "../../graphql/scoreboard.queries";
import moment from "moment";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -38,7 +39,11 @@ export function ScoreboardContainer({ setBreadcrumbs }) {
}, [t, setBreadcrumbs]);
return (
<ScoreboardPageComponent scoreboardSubscription={scoreboardSubscription} />
<RbacWrapper action="scoreboard:view">
<ScoreboardPageComponent
scoreboardSubscription={scoreboardSubscription}
/>
</RbacWrapper>
);
}
export default connect(

View File

@@ -1,10 +1,13 @@
import React from "react";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import TimeTicketShift from "../../components/time-ticket-shift/time-ticket-shift.container";
export default function ShiftClock() {
return (
<div>
<TimeTicketShift />
</div>
<RbacWrapper action="shiftclock:view">
<div>
<TimeTicketShift />
</div>
</RbacWrapper>
);
}

View File

@@ -12,7 +12,7 @@ import CsiResponseListPaginated from "../../components/csi-response-list-paginat
import { QUERY_CSI_RESPONSE_PAGINATED } from "../../graphql/csi.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
@@ -61,19 +61,26 @@ export function ShopCsiContainer({ bodyshop, setBreadcrumbs }) {
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<Row>
<Col span={10}>
<CsiResponseListPaginated
refetch={refetch}
loading={loading}
responses={data ? data.csi : []}
total={data ? data.csi_aggregate.aggregate.count : 0}
/>
</Col>
<Col span={13} offset={1}>
<CsiResponseFormContainer />
</Col>
</Row>
<RbacWrapper
action="csi:page"
// noauth={
// <AlertComponent message="You don't have acess to see this screen." />
// }
>
<Row>
<Col span={10}>
<CsiResponseListPaginated
refetch={refetch}
loading={loading}
responses={data ? data.csi : []}
total={data ? data.csi_aggregate.aggregate.count : 0}
/>
</Col>
<Col span={13} offset={1}>
<CsiResponseFormContainer />
</Col>
</Row>
</RbacWrapper>
);
}
export default connect(mapStateToProps, mapDispatchToProps)(ShopCsiContainer);

View File

@@ -1,12 +1,14 @@
import { Col, Row } from "antd";
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import ShopTemplateEditor from "../../components/shop-template-editor/shop-template-editor.container";
import ShopTemplatesListContainer from "../../components/shop-templates-list/shop-templates-list.container";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors";
import ShopTemplatesListContainer from "../../components/shop-templates-list/shop-templates-list.container";
import ShopTemplateEditor from "../../components/shop-template-editor/shop-template-editor.container";
import { Row, Col } from "antd";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
@@ -28,16 +30,18 @@ export function ShopTemplatesContainer({ setBreadcrumbs, bodyshop }) {
}, [t, setBreadcrumbs, bodyshop.shopname]);
return (
<Row>
<Col span={6}>
<ShopTemplatesListContainer />
</Col>
<Col span={18}>
<div>
<ShopTemplateEditor />
</div>
</Col>
</Row>
<RbacWrapper action="shop:templates">
<Row>
<Col span={6}>
<ShopTemplatesListContainer />
</Col>
<Col span={18}>
<div>
<ShopTemplateEditor />
</div>
</Col>
</Row>
</RbacWrapper>
);
}

View File

@@ -1,5 +1,6 @@
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import ShopVendorPageComponent from "./shop-vendor.page.component";
export default function ShopVendorPageContainer() {
@@ -8,5 +9,9 @@ export default function ShopVendorPageContainer() {
document.title = t("titles.shop_vendors");
}, [t]);
return <ShopVendorPageComponent />;
return (
<RbacWrapper action="shop:vendors">
<ShopVendorPageComponent />
</RbacWrapper>
);
}

View File

@@ -6,12 +6,13 @@ import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { useLocation } from "react-router-dom";
import { createStructuredSelector } from "reselect";
import AlertComponent from "../../components/alert/alert.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import TimeTicketsDatesSelector from "../../components/ticket-tickets-dates-selector/time-tickets-dates-selector.component";
import TimeTicketList from "../../components/time-ticket-list/time-ticket-list.component";
import TimeTicketsSummary from "../../components/time-tickets-summary/time-tickets-summary.component";
import { QUERY_TIME_TICKETS_IN_RANGE } from "../../graphql/timetickets.queries";
import { setBreadcrumbs } from "../../redux/application/application.actions";
import AlertComponent from "../../components/alert/alert.component";
const mapStateToProps = createStructuredSelector({});
@@ -46,23 +47,25 @@ export function TimeTicketsContainer({ bodyshop, setBreadcrumbs }) {
},
});
if (error) return <AlertComponent message={error.message} type='error' />;
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<div>
<TimeTicketsDatesSelector />
<RbacWrapper action="timetickets:list">
<div>
<TimeTicketsDatesSelector />
<TimeTicketList
loading={loading}
timetickets={data ? data.timetickets : []}
/>
<TimeTicketsSummary
loading={loading}
timetickets={data ? data.timetickets : []}
startDate={startDate}
endDate={endDate}
/>
</div>
<TimeTicketList
loading={loading}
timetickets={data ? data.timetickets : []}
/>
<TimeTicketsSummary
loading={loading}
timetickets={data ? data.timetickets : []}
startDate={startDate}
endDate={endDate}
/>
</div>
</RbacWrapper>
);
}