Report center filtering and shop info instance management.

This commit is contained in:
Patrick Fic
2024-03-12 09:40:39 -04:00
parent 53a55dd1ef
commit d9d30b59f0
9 changed files with 197 additions and 169 deletions

View File

@@ -19,6 +19,7 @@ export default function FormsFieldChanged({form, skipPrompt}) {
style={{margin: 0, padding: 0, minHeight: "unset"}} style={{margin: 0, padding: 0, minHeight: "unset"}}
> >
{() => { {() => {
console.log("should update",form.isFieldsTouched())
const errors = form.getFieldsError().filter((e) => e.errors.length > 0); const errors = form.getFieldsError().filter((e) => e.errors.length > 0);
if (form.isFieldsTouched()) if (form.isFieldsTouched())
return ( return (

View File

@@ -18,6 +18,7 @@ import EmployeeSearchSelect from "../employee-search-select/employee-search-sele
import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component"; import VendorSearchSelect from "../vendor-search-select/vendor-search-select.component";
import "./report-center-modal.styles.scss"; import "./report-center-modal.styles.scss";
import ReportCenterModalFiltersSortersComponent from "./report-center-modal-filters-sorters-component"; import ReportCenterModalFiltersSortersComponent from "./report-center-modal-filters-sorters-component";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
reportCenterModal: selectReportCenter, reportCenterModal: selectReportCenter,
@@ -140,6 +141,10 @@ export function ReportCenterModalComponent({reportCenterModal, bodyshop}) {
const grouped = _.groupBy(FilteredReportsList, "group"); const grouped = _.groupBy(FilteredReportsList, "group");
const groupExcludeKeyFilter = [...!HasFeatureAccess({featureName: 'bills'})? ["purchases"]:[],
...!HasFeatureAccess({featureName: 'timetickets'})? ["payroll"]:[],
]
return ( return (
<div> <div>
<Form <Form
@@ -172,7 +177,7 @@ export function ReportCenterModalComponent({reportCenterModal, bodyshop}) {
))} */} ))} */}
<Row gutter={[16, 16]}> <Row gutter={[16, 16]}>
{Object.keys(grouped).map((key) => ( {Object.keys(grouped).filter(key => !groupExcludeKeyFilter.includes(key)).map((key) => (
<Col md={8} sm={12} key={key}> <Col md={8} sm={12} key={key}>
<Card.Grid <Card.Grid
style={{ style={{

View File

@@ -18,6 +18,8 @@ import ShopInfoSpeedPrint from "./shop-info.speedprint.component";
import {useLocation, useNavigate} from "react-router-dom"; import {useLocation, useNavigate} from "react-router-dom";
import ShopInfoTaskPresets from "./shop-info.task-presets.component"; import ShopInfoTaskPresets from "./shop-info.task-presets.component";
import queryString from "query-string"; import queryString from "query-string";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -76,11 +78,12 @@ export function ShopInfoComponent({bodyshop, form, saveLoading}) {
label: t("bodyshop.labels.responsibilitycenters.title"), label: t("bodyshop.labels.responsibilitycenters.title"),
children: <ShopInfoResponsibilityCenterComponent form={form}/>, children: <ShopInfoResponsibilityCenterComponent form={form}/>,
}, },
{ ...InstanceRenderManager({imex: [ {
key: "checklists", key: "checklists",
label: t("bodyshop.labels.checklists"), label: t("bodyshop.labels.checklists"),
children: <ShopInfoIntakeChecklistComponent form={form}/>, children: <ShopInfoIntakeChecklistComponent form={form}/>,
}, }], rome: "USE_IMEX", promanager:[]})
,
{ {
key: "laborrates", key: "laborrates",
label: t("bodyshop.labels.laborrates"), label: t("bodyshop.labels.laborrates"),

View File

@@ -41,7 +41,7 @@ export function ShopInfoResponsibilityCenters({bodyshop, form}) {
}) })
); );
} }
formItems.push(Space({children: section, wrap: true})); formItems.push(<Space wrap>{section}</Space> );
formItems.push(<Divider/>); formItems.push(<Divider/>);
} }
return ( return (

View File

@@ -6,6 +6,7 @@ import ColorpickerFormItemComponent from "../form-items-formatted/colorpicker-fo
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import {ColorPicker} from "./shop-info.rostatus.component"; import {ColorPicker} from "./shop-info.rostatus.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr";
export default function ShopInfoSchedulingComponent({form}) { export default function ShopInfoSchedulingComponent({form}) {
const {t} = useTranslation(); const {t} = useTranslation();
@@ -198,140 +199,143 @@ export default function ShopInfoSchedulingComponent({form}) {
}} }}
</Form.List> </Form.List>
</LayoutFormRow> </LayoutFormRow>
<LayoutFormRow header={t("bodyshop.labels.ssbuckets")} id="ssbuckets"> {
<Form.List name={["ssbuckets"]}> InstanceRenderManager({imex: <LayoutFormRow header={t("bodyshop.labels.ssbuckets")} id="ssbuckets">
{(fields, {add, remove, move}) => { <Form.List name={["ssbuckets"]}>
return ( {(fields, {add, remove, move}) => {
<div> return (
{fields.map((field, index) => ( <div>
<Form.Item key={field.key}> {fields.map((field, index) => (
<LayoutFormRow noDivider> <Form.Item key={field.key}>
<Form.Item <LayoutFormRow noDivider>
label={t("bodyshop.fields.ssbuckets.id")} <Form.Item
key={`${index}id`} label={t("bodyshop.fields.ssbuckets.id")}
name={[field.name, "id"]} key={`${index}id`}
rules={[ name={[field.name, "id"]}
{ rules={[
required: true, {
//message: t("general.validation.required"), required: true,
}, //message: t("general.validation.required"),
]} },
> ]}
<Input/> >
</Form.Item> <Input/>
<Form.Item </Form.Item>
label={t("bodyshop.fields.ssbuckets.label")} <Form.Item
key={`${index}label`} label={t("bodyshop.fields.ssbuckets.label")}
name={[field.name, "label"]} key={`${index}label`}
rules={[ name={[field.name, "label"]}
{ rules={[
required: true, {
//message: t("general.validation.required"), required: true,
}, //message: t("general.validation.required"),
]} },
> ]}
<Input/> >
</Form.Item> <Input/>
</Form.Item>
<Form.Item <Form.Item
label={t("bodyshop.fields.ssbuckets.gte")} label={t("bodyshop.fields.ssbuckets.gte")}
key={`${index}gte`} key={`${index}gte`}
name={[field.name, "gte"]} name={[field.name, "gte"]}
rules={[ rules={[
{ {
required: true, required: true,
//message: t("general.validation.required"), //message: t("general.validation.required"),
}, },
]} ]}
> >
<InputNumber/> <InputNumber/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label={t("bodyshop.fields.ssbuckets.lt")} label={t("bodyshop.fields.ssbuckets.lt")}
key={`${index}lt`} key={`${index}lt`}
name={[field.name, "lt"]} name={[field.name, "lt"]}
> >
<InputNumber/> <InputNumber/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label={t("bodyshop.fields.ssbuckets.target")} label={t("bodyshop.fields.ssbuckets.target")}
key={`${index}target`} key={`${index}target`}
name={[field.name, "target"]} name={[field.name, "target"]}
rules={[ rules={[
{ {
required: true, required: true,
//message: t("general.validation.required"), //message: t("general.validation.required"),
}, },
]} ]}
> >
<InputNumber/> <InputNumber/>
</Form.Item> </Form.Item>
<Space direction="horizontal"> <Space direction="horizontal">
<Form.Item <Form.Item
label={ label={
<Space> <Space>
{t("bodyshop.fields.ssbuckets.color")} {t("bodyshop.fields.ssbuckets.color")}
<Button <Button
size="small" size="small"
onClick={() => { onClick={() => {
form.setFieldValue([ form.setFieldValue([
"ssbuckets", "ssbuckets",
field.name, field.name,
"color", "color",
]); ]);
form.setFields([ form.setFields([
{ {
name: ["ssbuckets", field.name, "color"], name: ["ssbuckets", field.name, "color"],
touched: true, touched: true,
}, },
]); ]);
}} }}
> >
Reset Reset
</Button> </Button>
</Space> </Space>
} }
key={`${index}color`} key={`${index}color`}
name={[field.name, "color"]} name={[field.name, "color"]}
> >
<ColorPicker/> <ColorPicker/>
</Form.Item> </Form.Item>
<Space wrap> <Space wrap>
<DeleteFilled <DeleteFilled
onClick={() => { onClick={() => {
remove(field.name); remove(field.name);
}} }}
/> />
<FormListMoveArrows <FormListMoveArrows
move={move} move={move}
index={index} index={index}
total={fields.length} total={fields.length}
/> />
</Space> </Space>
</Space> </Space>
</LayoutFormRow> </LayoutFormRow>
</Form.Item> </Form.Item>
))} ))}
<Form.Item> <Form.Item>
<Button <Button
type="dashed" type="dashed"
onClick={() => { onClick={() => {
add(); add();
}} }}
style={{width: "100%"}} style={{width: "100%"}}
> >
{t("bodyshop.actions.addbucket")} {t("bodyshop.actions.addbucket")}
</Button> </Button>
</Form.Item> </Form.Item>
</div> </div>
); );
}} }}
</Form.List> </Form.List>
</LayoutFormRow> </LayoutFormRow>, rome: "USE_IMEX", promanager: null})
}
</div> </div>
); );
} }

View File

@@ -10,6 +10,7 @@ import JobsCreateOwnerInfoContainer from "../../components/jobs-create-owner-inf
import JobsCreateVehicleInfoContainer import JobsCreateVehicleInfoContainer
from "../../components/jobs-create-vehicle-info/jobs-create-vehicle-info.container"; from "../../components/jobs-create-vehicle-info/jobs-create-vehicle-info.container";
import JobCreateContext from "../../pages/jobs-create/jobs-create.context"; import JobCreateContext from "../../pages/jobs-create/jobs-create.context";
import FormsFieldChanged from "../../components/form-fields-changed-alert/form-fields-changed-alert.component";
export default function JobsCreateComponent({form}) { export default function JobsCreateComponent({form}) {
const [pageIndex, setPageIndex] = useState(0); const [pageIndex, setPageIndex] = useState(0);
@@ -41,6 +42,7 @@ export default function JobsCreateComponent({form}) {
const next = () => { const next = () => {
setPageIndex(pageIndex + 1); setPageIndex(pageIndex + 1);
console.log("NExt")
}; };
const prev = () => { const prev = () => {
setPageIndex(pageIndex - 1); setPageIndex(pageIndex - 1);
@@ -57,24 +59,32 @@ export default function JobsCreateComponent({form}) {
<Button <Button
type="primary" type="primary"
onClick={() => { onClick={() => {
form next();
.validateFields() // form
.then((r) => { // .validateFields()
if (steps[pageIndex].validation) { // .then((r) => {
setErrorMessage(null); // if (steps[pageIndex].validation) {
next(); // setErrorMessage(null);
} else { // next();
setErrorMessage(steps[pageIndex].error); // } else {
} // setErrorMessage(steps[pageIndex].error);
}) // }
.catch((error) => console.log("error", error)); // })
// .catch((error) => console.log("error", error));
}} }}
> >
Next Next
</Button> </Button>
)} )}
{pageIndex === steps.length - 1 && ( {pageIndex === steps.length - 1 && (
<Button type="primary" htmlType="submit"> <Button type="primary" onClick={() => {
form
.validateFields()
.then((r) => {
})
.catch((error) => console.log("error", error));
form.submit()}}>
Done Done
</Button> </Button>
)} )}
@@ -91,18 +101,18 @@ export default function JobsCreateComponent({form}) {
cursor: "pointer", cursor: "pointer",
fontWeight: idx === pageIndex && "bolder", fontWeight: idx === pageIndex && "bolder",
}} }}
onClick={() => { onClick={() => { setPageIndex(idx);
form // form
.validateFields() // .validateFields()
.then((r) => { // .then((r) => {
if (steps[pageIndex].validation) { // if (steps[pageIndex].validation) {
setErrorMessage(null); // setErrorMessage(null);
setPageIndex(idx); // setPageIndex(idx);
} else { // } else {
setErrorMessage(steps[pageIndex].error); // setErrorMessage(steps[pageIndex].error);
} // }
}) // })
.catch((error) => console.log("error", error)); // .catch((error) => console.log("error", error));
}} }}
/> />
))} ))}
@@ -132,7 +142,7 @@ export default function JobsCreateComponent({form}) {
) : ( ) : (
<div> <div>
<ProgressButtons top/> <ProgressButtons top/>
<FormsFieldChanged form={form} />
{errorMessage ? ( {errorMessage ? (
<div> <div>
<AlertComponent message={errorMessage} type="error"/> <AlertComponent message={errorMessage} type="error"/>

View File

@@ -153,7 +153,7 @@ function JobsCreateContainer({bodyshop, setBreadcrumbs, setSelectedHeader}) {
<JobCreateContext.Provider value={contextState}> <JobCreateContext.Provider value={contextState}>
<RbacWrapper action="jobs:create"> <RbacWrapper action="jobs:create">
<Form <Form
scrollToFirstError
form={form} form={form}
onFinish={handleFinish} onFinish={handleFinish}
layout="vertical" layout="vertical"

View File

@@ -15,6 +15,7 @@ import {selectBodyshop} from "../../redux/user/user.selectors";
import ShopInfoUsersComponent from "../../components/shop-users/shop-users.component"; import ShopInfoUsersComponent from "../../components/shop-users/shop-users.component";
import ShopTeamsContainer from "../../components/shop-teams/shop-teams.container"; import ShopTeamsContainer from "../../components/shop-teams/shop-teams.container";
import { HasFeatureAccess } from "../../components/feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -69,12 +70,15 @@ export function ShopPage({bodyshop, setSelectedHeader, setBreadcrumbs}) {
label: t("bodyshop.labels.licensing"), label: t("bodyshop.labels.licensing"),
children: <ShopInfoUsersComponent/>, children: <ShopInfoUsersComponent/>,
}, },
{ );
key: "csiq",
label: t("bodyshop.labels.csiq"),
children: <ShopCsiConfig/>,
});
if(HasFeatureAccess("csi")){
items.push({
key: "csiq",
label: t("bodyshop.labels.csiq"),
children: <ShopCsiConfig/>,
})
}
return ( return (
<RbacWrapper action="shop:config"> <RbacWrapper action="shop:config">
<Tabs <Tabs

View File

@@ -5,9 +5,10 @@ import InstanceRenderManager from './instanceRenderMgr'
export const EmailSettings = { export const EmailSettings = {
fromNameDefault: InstanceRenderManager({ fromNameDefault: InstanceRenderManager({
imex: "ImEX Online", imex: "ImEX Online",
rome:"Rome Online" rome:"Rome Online",
promanager: "ProManager"
}) , }) ,
fromAddress: InstanceRenderManager({imex: "noreply@imex.online" ,rome:"noreply@romeonline.io"}) , fromAddress: InstanceRenderManager({imex: "noreply@imex.online" ,rome:"noreply@romeonline.io", promanager: "noreply@promanager.web-est.com"}) ,
}; };
export const TemplateList = (type, context) => { export const TemplateList = (type, context) => {