FIrst round of changes for Instance Manger & Pro Manager

This commit is contained in:
Patrick Fic
2024-02-16 14:01:39 -07:00
parent 3e44458f5c
commit af7ff2d8b5
36 changed files with 1068 additions and 885 deletions

View File

@@ -11,6 +11,7 @@ import {QUERY_BILLS_FOR_EXPORT} from "../../graphql/accounting.queries";
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import {selectPartnerVersion} from "../../redux/application/application.selectors";
import {selectBodyshop} from "../../redux/user/user.selectors";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -60,6 +61,7 @@ export function AccountingPayablesContainer({
return (
<div>
<FeatureWrapperComponent featureName='export'>
<RbacWrapper action="accounting:payables">
{noPath && (
<AlertComponent
@@ -73,6 +75,7 @@ export function AccountingPayablesContainer({
refetch={refetch}
/>
</RbacWrapper>
</FeatureWrapperComponent>
</div>
);
}

View File

@@ -11,6 +11,7 @@ import {selectBodyshop} from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import {checkPartnerStatus} from "../../components/partner-ping/partner-ping.component";
import {selectPartnerVersion} from "../../redux/application/application.selectors";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -61,6 +62,7 @@ export function AccountingPaymentsContainer({
);
return (
<div>
<FeatureWrapperComponent featureName='export'>
<RbacWrapper action="accounting:payments">
{noPath && (
<AlertComponent
@@ -74,6 +76,7 @@ export function AccountingPaymentsContainer({
refetch={refetch}
/>
</RbacWrapper>
</FeatureWrapperComponent>
</div>
);
}

View File

@@ -12,6 +12,7 @@ import {selectBodyshop} from "../../redux/user/user.selectors";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import {checkPartnerStatus} from "../../components/partner-ping/partner-ping.component";
import {selectPartnerVersion} from "../../redux/application/application.selectors";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -64,6 +65,7 @@ export function AccountingReceivablesContainer({
return (
<div>
<FeatureWrapperComponent featureName="export">
<RbacWrapper action="accounting:receivables">
{noPath && (
<AlertComponent
@@ -77,6 +79,7 @@ export function AccountingReceivablesContainer({
refetch={refetch}
/>
</RbacWrapper>
</FeatureWrapperComponent>
</div>
);
}

View File

@@ -11,6 +11,7 @@ import {QUERY_ALL_BILLS_PAGINATED} from "../../graphql/bills.queries";
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import BillsPageComponent from "./bills.page.component";
import {pageLimit} from "../../utils/config";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -55,6 +56,7 @@ export function BillsPageContainer({setBreadcrumbs, setSelectedHeader}) {
if (error) return <AlertComponent message={error.message} type="error"/>;
return (
<FeatureWrapperComponent featureName='bills'>
<RbacWrapper action="bills:list">
<div>
<BillsPageComponent
@@ -67,6 +69,7 @@ export function BillsPageContainer({setBreadcrumbs, setSelectedHeader}) {
<BillDetailEditContainer/>
</div>
</RbacWrapper>
</FeatureWrapperComponent>
);
}

View File

@@ -15,6 +15,7 @@ import {addRecentItem, setBreadcrumbs, setSelectedHeader,} from "../../redux/app
import {CreateRecentItem} from "../../utils/create-recent-item";
import ContractDetailPageComponent from "./contract-detail.page.component";
import NotFound from "../../components/not-found/not-found.component";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -122,6 +123,7 @@ export function ContractDetailPageContainer({
if (!!!data.cccontracts_by_pk) return <NotFound/>;
return (
<FeatureWrapperComponent featureName='courtesycars'>
<RbacWrapper action="contracts:detail">
<div>
<CourtesyCarReturnModalContainer/>
@@ -160,6 +162,7 @@ export function ContractDetailPageContainer({
</Form>
</div>
</RbacWrapper>
</FeatureWrapperComponent>
);
}

View File

@@ -10,6 +10,7 @@ import {QUERY_ACTIVE_CONTRACTS_PAGINATED} from "../../graphql/cccontracts.querie
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import ContractsPageComponent from "./contracts.page.component";
import {pageLimit} from "../../utils/config";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -56,14 +57,16 @@ export function ContractsPageContainer({setBreadcrumbs, setSelectedHeader}) {
if (error) return <AlertComponent message={error.message} type="error"/>;
return (
<FeatureWrapperComponent featureName="courtesycars">
<RbacWrapper action="contracts:list">
<ContractsPageComponent
loading={loading}
refetch={refetch}
data={data ? data.search_cccontracts : []}
total={data ? data.search_cccontracts_aggregate.aggregate.count : 0}
/>
<ContractsPageComponent
loading={loading}
refetch={refetch}
data={data ? data.search_cccontracts : []}
total={data ? data.search_cccontracts_aggregate.aggregate.count : 0}
/>
</RbacWrapper>
</FeatureWrapperComponent>
);
}

View File

@@ -10,6 +10,7 @@ import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import {INSERT_NEW_COURTESY_CAR} from "../../graphql/courtesy-car.queries";
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import {selectBodyshop} from "../../redux/user/user.selectors";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -67,16 +68,13 @@ export function CourtesyCarCreateContainer({
}, [t, setBreadcrumbs, setSelectedHeader]);
return (
<RbacWrapper action="courtesycar:create">
<Form
form={form}
autoComplete="new-password"
onFinish={handleFinish}
layout="vertical"
>
<CourtesyCarFormComponent form={form} saveLoading={loading}/>
</Form>
</RbacWrapper>
<RbacWrapper action="courtesycar:create">
<FeatureWrapperComponent featureName="courtesycars">
<Form form={form} autoComplete="new-password" onFinish={handleFinish} layout="vertical">
<CourtesyCarFormComponent form={form} saveLoading={loading} />
</Form>
</FeatureWrapperComponent>
</RbacWrapper>
);
}

View File

@@ -7,6 +7,7 @@ import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import {QUERY_ALL_CC} from "../../graphql/courtesy-car.queries";
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import CourtesyCarsPageComponent from "./courtesy-cars.page.component";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -32,13 +33,15 @@ export function CourtesyCarsPageContainer({
if (error) return <AlertComponent message={error.message} type="error"/>;
return (
<RbacWrapper action="courtesycar:list">
<CourtesyCarsPageComponent
loading={loading}
data={(data && data.courtesycars) || []}
refetch={refetch}
/>
</RbacWrapper>
<RbacWrapper action="courtesycar:list">
<FeatureWrapperComponent featureName="courtesycars">
<CourtesyCarsPageComponent
loading={loading}
data={(data && data.courtesycars) || []}
refetch={refetch}
/>
</FeatureWrapperComponent>
</RbacWrapper>
);
}

View File

@@ -4,6 +4,7 @@ import {connect} from "react-redux";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import ExportLogsPage from "./export-logs.page.component";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -25,9 +26,11 @@ export function ExportsLogPageContainer({setBreadcrumbs, setSelectedHeader}) {
}, [setBreadcrumbs, t, setSelectedHeader]);
return (
<FeatureWrapperComponent featureName='export'>
<RbacWrapper action="accounting:exportlogs">
<ExportLogsPage/>
</RbacWrapper>
</FeatureWrapperComponent>
);
}

View File

@@ -52,6 +52,8 @@ import _ from "lodash";
import JobProfileDataWarning from "../../components/job-profile-data-warning/job-profile-data-warning.component";
import {DateTimeFormat} from "../../utils/DateFormatter";
import JobLifecycleComponent from "../../components/job-lifecycle/job-lifecycle.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { HasFeatureAccess } from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -333,12 +335,12 @@ export function JobsDetailPage({
label: t("menus.jobsdetail.partssublet"),
children: <JobsDetailPliContainer job={job}/>,
},
{
...InstanceRenderManager({ imex: true, rome: true, promanager: HasFeatureAccess({ featureName: 'timetickets', bodyshop }) }) ? [ {
key: "labor",
icon: <Icon component={FaHardHat}/>,
label: t("menus.jobsdetail.labor"),
children: <JobsDetailLaborContainer job={job} jobId={job.id}/>,
},
},]: [],
{
key: 'lifecycle',
icon: <BarsOutlined/>,
@@ -352,7 +354,7 @@ export function JobsDetailPage({
forceRender: true,
children: <JobsDetailDatesComponent job={job}/>,
},
{
...InstanceRenderManager({ imex: true, rome: true, promanager: HasFeatureAccess({ featureName: 'media', bodyshop }) }) ? [ {
key: "documents",
icon: <FileImageFilled/>,
label: t("jobs.labels.documents"),
@@ -361,7 +363,7 @@ export function JobsDetailPage({
) : (
<JobsDocumentsGalleryContainer jobId={job.id}/>
),
},
},]:[],
{
key: "notes",
icon: <Icon component={FaRegStickyNote}/>,
@@ -402,4 +404,4 @@ const transformJobToForm = (job) => {
transformedJob.date_estimated = transformedJob.date_estimated ? dayjs(transformedJob.date_estimated) : null;
return transformedJob;
};
};

View File

@@ -12,6 +12,7 @@ import {QUERY_ALL_PAYMENTS_PAGINATED} from "../../graphql/payments.queries";
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import {selectBodyshop} from "../../redux/user/user.selectors";
import {pageLimit} from "../../utils/config";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -60,6 +61,7 @@ export function AllJobs({bodyshop, setBreadcrumbs, setSelectedHeader}) {
if (error) return <AlertComponent message={error.message} type="error"/>;
return (
<FeatureWrapperComponent featureName='payments'>
<RbacWrapper action="payments:list">
<PaymentsListPaginated
refetch={refetch}
@@ -69,6 +71,7 @@ export function AllJobs({bodyshop, setBreadcrumbs, setSelectedHeader}) {
payments={data ? data.payments : []}
/>
</RbacWrapper>
</FeatureWrapperComponent>
);
}

View File

@@ -1,11 +1,14 @@
import React from "react";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import TimeTicketShift from "../../components/time-ticket-shift/time-ticket-shift.container";
import React from 'react';
import RbacWrapper from '../../components/rbac-wrapper/rbac-wrapper.component';
import TimeTicketShift from '../../components/time-ticket-shift/time-ticket-shift.container';
import FeatureWrapperComponent from '../../components/feature-wrapper/feature-wrapper.component';
export default function ShiftClock() {
return (
<RbacWrapper action="shiftclock:view">
<TimeTicketShift/>
</RbacWrapper>
);
return (
<FeatureWrapperComponent featureName="timetickets">
<RbacWrapper action="shiftclock:view">
<TimeTicketShift />
</RbacWrapper>
</FeatureWrapperComponent>
);
}

View File

@@ -6,6 +6,7 @@ import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import {selectBodyshop} from "../../redux/user/user.selectors";
import TemporaryDocsComponent from "./temporary-docs.component";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -31,9 +32,11 @@ export function TempDocumentsContainer({setBreadcrumbs, setSelectedHeader}) {
}, [t, setBreadcrumbs, setSelectedHeader]);
return (
<RbacWrapper action="temporarydocs:view">
<TemporaryDocsComponent/>
</RbacWrapper>
<RbacWrapper action="temporarydocs:view">
<FeatureWrapperComponent featureName="media">
<TemporaryDocsComponent />
</FeatureWrapperComponent>
</RbacWrapper>
);
}

View File

@@ -19,6 +19,7 @@ import TimeTicketsAttendanceTable
from "../../components/time-tickets-attendance-table/time-tickets-attendance-table.component";
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import TimeTicketsCommit from "../../components/time-tickets-commit/time-tickets-commit.component";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({});
@@ -64,6 +65,7 @@ export function TimeTicketsContainer({
if (error) return <AlertComponent message={error.message} type="error"/>;
return (
<FeatureWrapperComponent featureName='timetickets'>
<RbacWrapper action="timetickets:list">
<Row gutter={[16, 16]}>
<Col span={24}>
@@ -90,10 +92,11 @@ export function TimeTicketsContainer({
</Col>
</Row>
</RbacWrapper>
</FeatureWrapperComponent>
);
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(TimeTicketsContainer);
)(TimeTicketsContainer);

View File

@@ -6,6 +6,7 @@ import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import TtApprovalsList from "../../components/tt-approvals-list/tt-approvals-list.container";
import {setBreadcrumbs, setSelectedHeader,} from "../../redux/application/application.actions";
import {selectBodyshop} from "../../redux/user/user.selectors";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
@@ -31,9 +32,11 @@ export function TtApprovalsPage({setBreadcrumbs, setSelectedHeader}) {
}, [t, setBreadcrumbs, setSelectedHeader]);
return (
<FeatureWrapperComponent featureName='timetickets'>
<RbacWrapper action="ttapprovals:view">
<TtApprovalsList/>
</RbacWrapper>
</FeatureWrapperComponent>
);
}