Report center filtering and shop info instance management.
This commit is contained in:
@@ -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 (
|
||||||
|
|||||||
@@ -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={{
|
||||||
|
|||||||
@@ -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"),
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"/>
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user