Cleanup Shop Config.

This commit is contained in:
Patrick Fic
2021-04-07 17:39:46 -07:00
parent bac671ff5c
commit 54e5129fd4
16 changed files with 2682 additions and 2585 deletions

View File

@@ -1,4 +1,4 @@
<babeledit_project version="1.2" be_version="2.7.1"> <babeledit_project be_version="2.7.1" version="1.2">
<!-- <!--
BabelEdit project file BabelEdit project file
@@ -6451,6 +6451,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>accountingsetup</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>accountingtiers</name> <name>accountingtiers</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -6535,6 +6556,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>businessinformation</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>checklists</name> <name>checklists</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -6682,6 +6724,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>insurancecos</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>intakechecklist</name> <name>intakechecklist</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -6766,6 +6829,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>messagingpresets</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>notemplatesavailable</name> <name>notemplatesavailable</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -6787,6 +6871,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>notespresets</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>orderstatuses</name> <name>orderstatuses</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -6808,6 +6913,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>partslocations</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>rbac</name> <name>rbac</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -6960,6 +7086,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>scoreboardsetup</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>shopinfo</name> <name>shopinfo</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -7002,6 +7149,48 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>ssbuckets</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>systemsettings</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>workingdays</name> <name>workingdays</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>

View File

@@ -1,14 +1,14 @@
import React, { forwardRef } from "react"; import React from "react";
import { BlockPicker } from "react-color"; import { SliderPicker } from "react-color";
//To be used as a form element only. //To be used as a form element only.
const ColorPickerFormItem = ({ value, onChange, style, ...restProps }, ref) => { const ColorPickerFormItem = ({ value, onChange, style, ...restProps }) => {
const handleChangeComplete = (color) => { const handleChangeComplete = (color) => {
if (onChange) onChange(color); if (onChange) onChange(color);
}; };
return ( return (
<BlockPicker <SliderPicker
{...restProps} {...restProps}
style={{ width: "100%", ...style }} style={{ width: "100%", ...style }}
color={value} color={value}
@@ -17,4 +17,4 @@ const ColorPickerFormItem = ({ value, onChange, style, ...restProps }, ref) => {
/> />
); );
}; };
export default forwardRef(ColorPickerFormItem); export default ColorPickerFormItem;

View File

@@ -1,4 +1,4 @@
import { Col, Divider, Row, Typography } from "antd"; import { Col, Divider, Row } from "antd";
import React from "react"; import React from "react";
import "./layout-form-row.styles.scss"; import "./layout-form-row.styles.scss";
@@ -9,13 +9,26 @@ export default function LayoutFormRow({
noDivider = false, noDivider = false,
...restProps ...restProps
}) { }) {
const DividerHeader = () =>
!noDivider && (
<Divider
orientation="left"
type="horizontal"
style={{ marginTop: ".8rem" }}
>
{header}
</Divider>
);
if (!!!children.length) { if (!!!children.length) {
//We have only one element. It's going to get the whole thing. //We have only one element. It's going to get the whole thing.
return ( return (
<div className="imex-form-row"> <div
{header ? ( className="imex-form-row"
<Typography.Title level={4}>{header}</Typography.Title> {...restProps}
) : null} style={{ marginBottom: ".8rem", ...restProps.style }}
>
<DividerHeader />
{children} {children}
</div> </div>
); );
@@ -44,12 +57,12 @@ export default function LayoutFormRow({
}; };
//{header ? <Typography.Title level={4}>{header}</Typography.Title> : null} //{header ? <Typography.Title level={4}>{header}</Typography.Title> : null}
return ( return (
<div className="imex-form-row" {...restProps}> <div
{!noDivider && ( className="imex-form-row"
<Divider orientation="left" type="horizontal"> {...restProps}
{header} style={{ marginBottom: ".8rem", ...restProps.style }}
</Divider> >
)} <DividerHeader />
<Row {...rowGutter}> <Row {...rowGutter}>
{children.map( {children.map(
(c, idx) => (c, idx) =>

View File

@@ -1,21 +1,7 @@
import { DeleteFilled } from "@ant-design/icons"; import { Button, Card, Tabs } from "antd";
import {
Button,
Collapse,
Form,
Input,
InputNumber,
Radio,
Select,
Switch,
} from "antd";
import React from "react"; import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import PhoneFormItem, { import ShopInfoGeneral from "./shop-info.general.component";
PhoneItemFormatterValidation,
} from "../form-items-formatted/phone-form-item.component";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import ShopInfoIntakeChecklistComponent from "./shop-info.intake.component"; import ShopInfoIntakeChecklistComponent from "./shop-info.intake.component";
import ShopInfoLaborRates from "./shop-info.laborrates.component"; import ShopInfoLaborRates from "./shop-info.laborrates.component";
import ShopInfoOrderStatusComponent from "./shop-info.orderstatus.component"; import ShopInfoOrderStatusComponent from "./shop-info.orderstatus.component";
@@ -28,7 +14,8 @@ import ShopInfoSpeedPrint from "./shop-info.speedprint.component";
export default function ShopInfoComponent({ form, saveLoading }) { export default function ShopInfoComponent({ form, saveLoading }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<div> <Card
extra={
<Button <Button
type="primary" type="primary"
loading={saveLoading} loading={saveLoading}
@@ -36,806 +23,43 @@ export default function ShopInfoComponent({ form, saveLoading }) {
> >
{t("general.actions.save")} {t("general.actions.save")}
</Button> </Button>
<Collapse>
<Collapse.Panel key="shopinfo" header={t("bodyshop.labels.shopinfo")}>
<LayoutFormRow>
<Form.Item
label={t("bodyshop.fields.shopname")}
name="shopname"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.address1")}
name="address1"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item label={t("bodyshop.fields.address2")} name="address2">
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.city")}
name="city"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.state")}
name="state"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item label={t("bodyshop.fields.zip_post")} name="zip_post">
<Input />
</Form.Item>
</LayoutFormRow>
<LayoutFormRow>
<Form.Item label={t("bodyshop.fields.country")} name="country">
<Input />
</Form.Item>
<Form.Item label={t("bodyshop.fields.email")} name="email">
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.phone")}
name="phone"
rules={[
({ getFieldValue }) =>
PhoneItemFormatterValidation(getFieldValue, "phone"),
]}
>
<PhoneFormItem />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.federal_tax_id")}
name="federal_tax_id"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.insurance_vendor_id")}
name="insurance_vendor_id"
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.logo_img_path")}
name={["logo_img_path", "src"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.logo_img_path_height")}
name={["logo_img_path", "height"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.logo_img_path_width")}
name={["logo_img_path", "width"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.state_tax_id")}
name="state_tax_id"
>
<Input />
</Form.Item>
</LayoutFormRow>
<LayoutFormRow>
<Form.Item
label={t("bodyshop.fields.invoice_federal_tax_rate")}
name={["bill_tax_rates", "federal_tax_rate"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.invoice_state_tax_rate")}
name={["bill_tax_rates", "state_tax_rate"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.invoice_local_tax_rate")}
name={["bill_tax_rates", "local_tax_rate"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.appt_length")}
name={"appt_length"}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={15} precision={0} />
</Form.Item>
</LayoutFormRow>
<LayoutFormRow header={t("bodyshop.labels.workingdays")}>
<Form.Item
label={t("general.labels.sunday")}
name={["workingdays", "sunday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.monday")}
name={["workingdays", "monday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.tuesday")}
name={["workingdays", "tuesday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.wednesday")}
name={["workingdays", "wednesday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.thursday")}
name={["workingdays", "thursday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.friday")}
name={["workingdays", "friday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.saturday")}
name={["workingdays", "saturday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
</LayoutFormRow>
<LayoutFormRow>
<Form.Item
label={t("bodyshop.fields.dailypainttarget")}
name={["scoreboard_target", "dailyPaintTarget"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0} precision={0} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.dailybodytarget")}
name={["scoreboard_target", "dailyBodyTarget"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0} precision={0} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.lastnumberworkingdays")}
name={["scoreboard_target", "lastNumberWorkingDays"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0} max={12} precision={0} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.prodtargethrs")}
name={["prodtargethrs"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={1} precision={1} />
</Form.Item>
<Form.Item
name={["md_referral_sources"]}
label={t("bodyshop.fields.md_referral_sources")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.Item
label={t("bodyshop.labels.accountingtiers")}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
name={["accountingconfig", "tiers"]}
>
<Radio.Group>
<Radio value={2}>2</Radio>
<Radio value={3}>3</Radio>
</Radio.Group>
</Form.Item>
<Form.Item
label={t("bodyshop.fields.inhousevendorid")}
name={"inhousevendorid"}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.default_adjustment_rate")}
name={"default_adjustment_rate"}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0} precision={2} />
</Form.Item>
<Form.Item shouldUpdate>
{() => {
return (
<Form.Item
label={t("bodyshop.labels.2tiersetup")}
shouldUpdate
rules={[
{
required:
form.getFieldValue(["accountingconfig", "tiers"]) ===
2,
message: t("general.validation.required"),
},
]}
name={["accountingconfig", "twotierpref"]}
>
<Radio.Group
disabled={
form.getFieldValue(["accountingconfig", "tiers"]) === 3
} }
> >
<Radio value="name"> <Tabs>
{t("bodyshop.labels.2tiername")} <Tabs.TabPane key="general" tab={t("bodyshop.labels.shopinfo")}>
</Radio> <ShopInfoGeneral form={form} />
<Radio value="source"> </Tabs.TabPane>
{t("bodyshop.labels.2tiersource")} <Tabs.TabPane key="speedprint" tab={t("bodyshop.labels.speedprint")}>
</Radio>
</Radio.Group>
</Form.Item>
);
}}
</Form.Item>
</LayoutFormRow>
<Form.List name={["md_messaging_presets"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item
key={field.key}
style={{ padding: 0, margin: 2 }}
>
<div style={{ display: "flex" }}>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.messaginglabel")}
key={`${index}label`}
name={[field.name, "label"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.messagingtext")}
key={`${index}text`}
name={[field.name, "text"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</div>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("general.actions.add")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
<Form.List name={["md_notes_presets"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item
key={field.key}
style={{ padding: 0, margin: 2 }}
>
<div style={{ display: "flex" }}>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.noteslabel")}
key={`${index}label`}
name={[field.name, "label"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.notestext")}
key={`${index}text`}
name={[field.name, "text"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</div>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("general.actions.add")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
<Form.List name={["md_parts_locations"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item
key={field.key}
style={{ padding: 0, margin: 2 }}
>
<div className="imex-flex-row">
<Form.Item
className="imex-flex-row__margin"
label={t("bodyshop.fields.partslocation")}
key={`${index}`}
name={[field.name]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<DeleteFilled
className="imex-flex-row__margin"
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</div>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("bodyshop.actions.addpartslocation")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
<Form.List name={["md_ins_cos"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item
key={field.key}
style={{ padding: 0, margin: 2 }}
>
<div style={{ display: "flex" }}>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.md_ins_co.name")}
key={`${index}name`}
name={[field.name, "name"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.md_ins_co.street1")}
key={`${index}street1`}
name={[field.name, "street1"]}
>
<Input />
</Form.Item>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.md_ins_co.street2")}
key={`${index}street2`}
name={[field.name, "street2"]}
>
<Input />
</Form.Item>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.md_ins_co.city")}
key={`${index}city`}
name={[field.name, "city"]}
>
<Input />
</Form.Item>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.md_ins_co.state")}
key={`${index}state`}
name={[field.name, "state"]}
>
<Input />
</Form.Item>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.md_ins_co.zip")}
key={`${index}zip`}
name={[field.name, "zip"]}
>
<Input />
</Form.Item>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</div>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("general.actions.add")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
<LayoutFormRow>
<Form.Item
name={["md_payment_types"]}
label={t("bodyshop.fields.md_payment_types")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.Item
name={["md_classes"]}
label={t("bodyshop.fields.md_classes")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.Item
name={["md_categories"]}
label={t("bodyshop.fields.md_categories")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.Item
name={["enforce_class"]}
label={t("bodyshop.fields.enforce_class")}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
name={["target_touchtime"]}
label={t("bodyshop.fields.target_touchtime")}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0.1} precision={1} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.use_fippa")}
name={["use_fippa"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_hour_split.prep")}
name={["md_hour_split", "prep"]}
dependencies={[["md_hour_split", "paint"]]}
rules={[
({ getFieldValue }) => ({
validator(rule, value) {
if (!value && !getFieldValue(["md_hour_split", "paint"])) {
return Promise.resolve();
}
if (
value + getFieldValue(["md_hour_split", "paint"]) ===
1
) {
return Promise.resolve();
}
return Promise.reject(t("bodyshop.validation.larsplit"));
},
}),
]}
>
<InputNumber min={0} max={1} precision={2} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_hour_split.paint")}
name={["md_hour_split", "paint"]}
dependencies={[["md_hour_split", "prep"]]}
rules={[
({ getFieldValue }) => ({
validator(rule, value) {
if (!value && !getFieldValue(["md_hour_split", "paint"])) {
return Promise.resolve();
}
if (
value + getFieldValue(["md_hour_split", "prep"]) ===
1
) {
return Promise.resolve();
}
return Promise.reject(t("bodyshop.validation.larsplit"));
},
}),
]}
>
<InputNumber min={0} max={1} precision={2} />
</Form.Item>
</LayoutFormRow>
</Collapse.Panel>
<Collapse.Panel
key="speedprint"
header={t("bodyshop.labels.speedprint")}
>
<ShopInfoSpeedPrint form={form} /> <ShopInfoSpeedPrint form={form} />
</Collapse.Panel> </Tabs.TabPane>
<Collapse.Panel key="rbac" header={t("bodyshop.labels.rbac")}> <Tabs.TabPane key="rbac" tab={t("bodyshop.labels.rbac")}>
<ShopInfoRbacComponent form={form} /> <ShopInfoRbacComponent form={form} />
</Collapse.Panel> </Tabs.TabPane>
<Collapse.Panel <Tabs.TabPane key="roStatus" tab={t("bodyshop.labels.jobstatuses")}>
key="roStatus"
header={t("bodyshop.labels.jobstatuses")}
>
<ShopInfoROStatusComponent form={form} /> <ShopInfoROStatusComponent form={form} />
</Collapse.Panel> </Tabs.TabPane>
<Collapse.Panel <Tabs.TabPane key="scheduling" tab={t("bodyshop.labels.scheduling")}>
key="scheduling"
header={t("bodyshop.labels.scheduling")}
>
<ShopInfoSchedulingComponent form={form} /> <ShopInfoSchedulingComponent form={form} />
</Collapse.Panel> </Tabs.TabPane>
<Collapse.Panel <Tabs.TabPane
key="orderStatus" key="orderStatus"
header={t("bodyshop.labels.orderstatuses")} tab={t("bodyshop.labels.orderstatuses")}
> >
<ShopInfoOrderStatusComponent form={form} /> <ShopInfoOrderStatusComponent form={form} />
</Collapse.Panel> </Tabs.TabPane>
<Collapse.Panel <Tabs.TabPane
key="responsibilityCenters" key="responsibilityCenters"
header={t("bodyshop.labels.responsibilitycenters.title")} tab={t("bodyshop.labels.responsibilitycenters.title")}
> >
<ShopInfoResponsibilityCenterComponent form={form} /> <ShopInfoResponsibilityCenterComponent form={form} />
</Collapse.Panel> </Tabs.TabPane>
<Collapse.Panel <Tabs.TabPane key="checklists" tab={t("bodyshop.labels.checklists")}>
key="checklists"
header={t("bodyshop.labels.checklists")}
>
<ShopInfoIntakeChecklistComponent form={form} /> <ShopInfoIntakeChecklistComponent form={form} />
</Collapse.Panel> </Tabs.TabPane>
<Collapse.Panel <Tabs.TabPane key="laborrates" tab={t("bodyshop.labels.laborrates")}>
key="laborrates"
header={t("bodyshop.labels.laborrates")}
>
<ShopInfoLaborRates form={form} /> <ShopInfoLaborRates form={form} />
</Collapse.Panel> </Tabs.TabPane>
</Collapse> </Tabs>
</div> </Card>
); );
} }

View File

@@ -0,0 +1,690 @@
import { DeleteFilled } from "@ant-design/icons";
import {
Button,
Form,
Input,
InputNumber,
Radio,
Select,
Space,
Switch,
} from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import PhoneFormItem, {
PhoneItemFormatterValidation,
} from "../form-items-formatted/phone-form-item.component";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
export default function ShopInfoGeneral({ form }) {
const { t } = useTranslation();
return (
<div>
<LayoutFormRow header={t("bodyshop.labels.businessinformation")}>
<Form.Item
label={t("bodyshop.fields.shopname")}
name="shopname"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.address1")}
name="address1"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item label={t("bodyshop.fields.address2")} name="address2">
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.city")}
name="city"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.state")}
name="state"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item label={t("bodyshop.fields.zip_post")} name="zip_post">
<Input />
</Form.Item>
<Form.Item label={t("bodyshop.fields.country")} name="country">
<Input />
</Form.Item>
<Form.Item label={t("bodyshop.fields.email")} name="email">
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.phone")}
name="phone"
rules={[
({ getFieldValue }) =>
PhoneItemFormatterValidation(getFieldValue, "phone"),
]}
>
<PhoneFormItem />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.insurance_vendor_id")}
name="insurance_vendor_id"
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.logo_img_path")}
name={["logo_img_path", "src"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.logo_img_path_height")}
name={["logo_img_path", "height"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.logo_img_path_width")}
name={["logo_img_path", "width"]}
>
<Input />
</Form.Item>
</LayoutFormRow>
<LayoutFormRow header={t("bodyshop.labels.accountingsetup")}>
<Form.Item
label={t("bodyshop.labels.accountingtiers")}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
name={["accountingconfig", "tiers"]}
>
<Radio.Group>
<Radio value={2}>2</Radio>
<Radio value={3}>3</Radio>
</Radio.Group>
</Form.Item>
<Form.Item shouldUpdate>
{() => {
return (
<Form.Item
label={t("bodyshop.labels.2tiersetup")}
shouldUpdate
rules={[
{
required:
form.getFieldValue(["accountingconfig", "tiers"]) === 2,
message: t("general.validation.required"),
},
]}
name={["accountingconfig", "twotierpref"]}
>
<Radio.Group
disabled={
form.getFieldValue(["accountingconfig", "tiers"]) === 3
}
>
<Radio value="name">{t("bodyshop.labels.2tiername")}</Radio>
<Radio value="source">
{t("bodyshop.labels.2tiersource")}
</Radio>
</Radio.Group>
</Form.Item>
);
}}
</Form.Item>
<Form.Item
label={t("bodyshop.fields.inhousevendorid")}
name={"inhousevendorid"}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.default_adjustment_rate")}
name={"default_adjustment_rate"}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0} precision={2} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.federal_tax_id")}
name="federal_tax_id"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.state_tax_id")}
name="state_tax_id"
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.invoice_federal_tax_rate")}
name={["bill_tax_rates", "federal_tax_rate"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.invoice_state_tax_rate")}
name={["bill_tax_rates", "state_tax_rate"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.invoice_local_tax_rate")}
name={["bill_tax_rates", "local_tax_rate"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber />
</Form.Item>
<Form.Item
name={["md_payment_types"]}
label={t("bodyshop.fields.md_payment_types")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.Item
name={["md_categories"]}
label={t("bodyshop.fields.md_categories")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.Item
name={["md_classes"]}
label={t("bodyshop.fields.md_classes")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.Item
name={["enforce_class"]}
label={t("bodyshop.fields.enforce_class")}
valuePropName="checked"
>
<Switch />
</Form.Item>
</LayoutFormRow>
<LayoutFormRow header={t("bodyshop.labels.scoreboardsetup")}>
<Form.Item
label={t("bodyshop.fields.dailypainttarget")}
name={["scoreboard_target", "dailyPaintTarget"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0} precision={0} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.dailybodytarget")}
name={["scoreboard_target", "dailyBodyTarget"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0} precision={0} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.lastnumberworkingdays")}
name={["scoreboard_target", "lastNumberWorkingDays"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0} max={12} precision={0} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.prodtargethrs")}
name={["prodtargethrs"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={1} precision={1} />
</Form.Item>
</LayoutFormRow>
<LayoutFormRow header={t("bodyshop.labels.systemsettings")}>
<Form.Item
name={["md_referral_sources"]}
label={t("bodyshop.fields.md_referral_sources")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.Item
name={["target_touchtime"]}
label={t("bodyshop.fields.target_touchtime")}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={0.1} precision={1} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.use_fippa")}
name={["use_fippa"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_hour_split.prep")}
name={["md_hour_split", "prep"]}
dependencies={[["md_hour_split", "paint"]]}
rules={[
({ getFieldValue }) => ({
validator(rule, value) {
if (!value && !getFieldValue(["md_hour_split", "paint"])) {
return Promise.resolve();
}
if (value + getFieldValue(["md_hour_split", "paint"]) === 1) {
return Promise.resolve();
}
return Promise.reject(t("bodyshop.validation.larsplit"));
},
}),
]}
>
<InputNumber min={0} max={1} precision={2} />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_hour_split.paint")}
name={["md_hour_split", "paint"]}
dependencies={[["md_hour_split", "prep"]]}
rules={[
({ getFieldValue }) => ({
validator(rule, value) {
if (!value && !getFieldValue(["md_hour_split", "paint"])) {
return Promise.resolve();
}
if (value + getFieldValue(["md_hour_split", "prep"]) === 1) {
return Promise.resolve();
}
return Promise.reject(t("bodyshop.validation.larsplit"));
},
}),
]}
>
<InputNumber min={0} max={1} precision={2} />
</Form.Item>
</LayoutFormRow>
<LayoutFormRow grow header={t("bodyshop.labels.messagingpresets")}>
<Form.List name={["md_messaging_presets"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item key={field.key}>
<LayoutFormRow noDivider>
<Form.Item
label={t("bodyshop.fields.messaginglabel")}
key={`${index}label`}
name={[field.name, "label"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.messagingtext")}
key={`${index}text`}
name={[field.name, "text"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Space wrap>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</Space>
</LayoutFormRow>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("general.actions.add")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
</LayoutFormRow>
<LayoutFormRow grow header={t("bodyshop.labels.notespresets")}>
<Form.List name={["md_notes_presets"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item key={field.key}>
<LayoutFormRow noDivider>
<Form.Item
label={t("bodyshop.fields.noteslabel")}
key={`${index}label`}
name={[field.name, "label"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.notestext")}
key={`${index}text`}
name={[field.name, "text"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Space wrap>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</Space>
</LayoutFormRow>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("general.actions.add")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
</LayoutFormRow>
<LayoutFormRow grow header={t("bodyshop.labels.partslocations")}>
<Form.List name={["md_parts_locations"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item key={field.key}>
<LayoutFormRow noDivider>
<Form.Item
className="imex-flex-row__margin"
label={t("bodyshop.fields.partslocation")}
key={`${index}`}
name={[field.name]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Space wrap>
<DeleteFilled
className="imex-flex-row__margin"
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</Space>
</LayoutFormRow>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("bodyshop.actions.addpartslocation")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
</LayoutFormRow>
<LayoutFormRow grow header={t("bodyshop.labels.insurancecos")}>
<Form.List name={["md_ins_cos"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item key={field.key}>
<LayoutFormRow noDivider>
<Form.Item
label={t("bodyshop.fields.md_ins_co.name")}
key={`${index}name`}
name={[field.name, "name"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_ins_co.street1")}
key={`${index}street1`}
name={[field.name, "street1"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_ins_co.street2")}
key={`${index}street2`}
name={[field.name, "street2"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_ins_co.city")}
key={`${index}city`}
name={[field.name, "city"]}
>
<Input />
</Form.Item>
<Form.Item
label={t("bodyshop.fields.md_ins_co.state")}
key={`${index}state`}
name={[field.name, "state"]}
>
<Input />
</Form.Item>
<Space wrap>
<Form.Item
label={t("bodyshop.fields.md_ins_co.zip")}
key={`${index}zip`}
name={[field.name, "zip"]}
>
<Input />
</Form.Item>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</Space>
</LayoutFormRow>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("general.actions.add")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
</LayoutFormRow>
</div>
);
}

View File

@@ -1,13 +1,5 @@
import { DeleteFilled } from "@ant-design/icons"; import { DeleteFilled } from "@ant-design/icons";
import { import { Button, Form, Input, InputNumber, Select, Space, Switch } from "antd";
Button,
Form,
Input,
InputNumber,
Select,
Switch,
Typography,
} from "antd";
import React from "react"; import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import styled from "styled-components"; import styled from "styled-components";
@@ -28,18 +20,15 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
const TemplateListGenerated = TemplateList(); const TemplateListGenerated = TemplateList();
return ( return (
<div> <div>
<Typography.Title level={4}> <LayoutFormRow header={t("bodyshop.labels.intakechecklist")}>
{t("bodyshop.labels.intakechecklist")}
</Typography.Title>
<Form.List name={["intakechecklist", "form"]}> <Form.List name={["intakechecklist", "form"]}>
{(fields, { add, remove, move }) => { {(fields, { add, remove, move }) => {
return ( return (
<div> <div>
{fields.map((field, index) => ( {fields.map((field, index) => (
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}> <Form.Item key={field.key}>
<LayoutFormRow grow> <LayoutFormRow noDivider>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.name")} label={t("jobs.fields.intake.name")}
key={`${index}name`} key={`${index}name`}
name={[field.name, "name"]} name={[field.name, "name"]}
@@ -53,7 +42,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.type")} label={t("jobs.fields.intake.type")}
key={`${index}type`} key={`${index}type`}
name={[field.name, "type"]} name={[field.name, "type"]}
@@ -73,7 +61,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
</Select> </Select>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.label")} label={t("jobs.fields.intake.label")}
key={`${index}label`} key={`${index}label`}
name={[field.name, "label"]} name={[field.name, "label"]}
@@ -86,15 +73,7 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
> >
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.required")}
key={`${index}required`}
name={[field.name, "required"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item shouldUpdate> <Form.Item shouldUpdate>
{() => { {() => {
if ( if (
@@ -109,7 +88,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
return ( return (
<> <>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.min")} label={t("jobs.fields.intake.min")}
key={`${index}min`} key={`${index}min`}
name={[field.name, "min"]} name={[field.name, "min"]}
@@ -124,7 +102,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.max")} label={t("jobs.fields.intake.max")}
key={`${index}max`} key={`${index}max`}
name={[field.name, "max"]} name={[field.name, "max"]}
@@ -141,7 +118,15 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
); );
}} }}
</Form.Item> </Form.Item>
<Form.Item
label={t("jobs.fields.intake.required")}
key={`${index}required`}
name={[field.name, "required"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Space wrap>
<DeleteFilled <DeleteFilled
onClick={() => { onClick={() => {
remove(field.name); remove(field.name);
@@ -152,6 +137,7 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
index={index} index={index}
total={fields.length} total={fields.length}
/> />
</Space>
</LayoutFormRow> </LayoutFormRow>
</Form.Item> </Form.Item>
))} ))}
@@ -170,7 +156,7 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
); );
}} }}
</Form.List> </Form.List>
</LayoutFormRow>
<SelectorDiv> <SelectorDiv>
<Form.Item <Form.Item
name={["intakechecklist", "templates"]} name={["intakechecklist", "templates"]}
@@ -195,18 +181,16 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
</Select> </Select>
</Form.Item> </Form.Item>
</SelectorDiv> </SelectorDiv>
<Typography.Title level={4}>
{t("bodyshop.labels.deliverchecklist")} <LayoutFormRow header={t("bodyshop.labels.deliverchecklist")}>
</Typography.Title>
<Form.List name={["deliverchecklist", "form"]}> <Form.List name={["deliverchecklist", "form"]}>
{(fields, { add, remove, move }) => { {(fields, { add, remove, move }) => {
return ( return (
<div> <div>
{fields.map((field, index) => ( {fields.map((field, index) => (
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}> <Form.Item key={field.key}>
<LayoutFormRow grow> <LayoutFormRow noDivider>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.name")} label={t("jobs.fields.intake.name")}
key={`${index}named`} key={`${index}named`}
name={[field.name, "name"]} name={[field.name, "name"]}
@@ -221,7 +205,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
</Form.Item> </Form.Item>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.type")} label={t("jobs.fields.intake.type")}
key={`${index}typed`} key={`${index}typed`}
name={[field.name, "type"]} name={[field.name, "type"]}
@@ -242,7 +225,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
</Form.Item> </Form.Item>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.label")} label={t("jobs.fields.intake.label")}
key={`${index}labeld`} key={`${index}labeld`}
name={[field.name, "label"]} name={[field.name, "label"]}
@@ -256,16 +238,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.required")}
key={`${index}requiredd`}
name={[field.name, "required"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item shouldUpdate> <Form.Item shouldUpdate>
{() => { {() => {
if ( if (
@@ -280,7 +252,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
return ( return (
<> <>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.min")} label={t("jobs.fields.intake.min")}
key={`${index}mind`} key={`${index}mind`}
name={[field.name, "min"]} name={[field.name, "min"]}
@@ -288,8 +259,10 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
rules={[ rules={[
{ {
required: required:
form.getFieldValue([field.name, "type"]) === form.getFieldValue([
"slider", field.name,
"type",
]) === "slider",
message: t("general.validation.required"), message: t("general.validation.required"),
}, },
]} ]}
@@ -297,7 +270,6 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("jobs.fields.intake.max")} label={t("jobs.fields.intake.max")}
key={`${index}maxd`} key={`${index}maxd`}
name={[field.name, "max"]} name={[field.name, "max"]}
@@ -305,8 +277,10 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
rules={[ rules={[
{ {
required: required:
form.getFieldValue([field.name, "type"]) === form.getFieldValue([
"slider", field.name,
"type",
]) === "slider",
message: t("general.validation.required"), message: t("general.validation.required"),
}, },
]} ]}
@@ -317,6 +291,14 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
); );
}} }}
</Form.Item> </Form.Item>
<Form.Item
label={t("jobs.fields.intake.required")}
key={`${index}requiredd`}
name={[field.name, "required"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<DeleteFilled <DeleteFilled
onClick={() => { onClick={() => {
remove(field.name); remove(field.name);
@@ -345,7 +327,7 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
); );
}} }}
</Form.List> </Form.List>
</LayoutFormRow>
<SelectorDiv> <SelectorDiv>
<Form.Item <Form.Item
name={["deliverchecklist", "templates"]} name={["deliverchecklist", "templates"]}

View File

@@ -6,9 +6,7 @@ export default function ShopInfoOrderStatusComponent({ form }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<div> <LayoutFormRow header={t("bodyshop.labels.orderstatuses")}>
<strong>{t("bodyshop.labels.orderstatuses")}</strong>
<LayoutFormRow>
<Form.Item <Form.Item
label={t("bodyshop.fields.statuses.default_bo")} label={t("bodyshop.fields.statuses.default_bo")}
rules={[ rules={[
@@ -59,6 +57,5 @@ export default function ShopInfoOrderStatusComponent({ form }) {
<Input /> <Input />
</Form.Item> </Form.Item>
</LayoutFormRow> </LayoutFormRow>
</div>
); );
} }

View File

@@ -53,19 +53,15 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
return ( return (
<div> <div>
<div> <LayoutFormRow header={t("bodyshop.labels.responsibilitycenters.costs")}>
<Typography.Title level={4}>
{t("bodyshop.labels.responsibilitycenters.costs")}
</Typography.Title>
<Form.List name={["md_responsibility_centers", "costs"]}> <Form.List name={["md_responsibility_centers", "costs"]}>
{(fields, { add, remove }) => { {(fields, { add, remove }) => {
return ( return (
<div> <div>
{fields.map((field, index) => ( {fields.map((field, index) => (
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}> <Form.Item key={field.key}>
<LayoutFormRow> <LayoutFormRow noDivider>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.responsibilitycenter")} label={t("bodyshop.fields.responsibilitycenter")}
key={`${index}name`} key={`${index}name`}
name={[field.name, "name"]} name={[field.name, "name"]}
@@ -79,7 +75,6 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<Input onBlur={handleBlur} /> <Input onBlur={handleBlur} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t( label={t(
"bodyshop.fields.responsibilitycenter_accountname" "bodyshop.fields.responsibilitycenter_accountname"
)} )}
@@ -95,7 +90,6 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<Input onBlur={handleBlur} /> <Input onBlur={handleBlur} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t( label={t(
"bodyshop.fields.responsibilitycenter_accountnumber" "bodyshop.fields.responsibilitycenter_accountnumber"
)} )}
@@ -111,7 +105,6 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<Input onBlur={handleBlur} /> <Input onBlur={handleBlur} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t( label={t(
"bodyshop.fields.responsibilitycenter_accountdesc" "bodyshop.fields.responsibilitycenter_accountdesc"
)} )}
@@ -127,7 +120,6 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<Input onBlur={handleBlur} /> <Input onBlur={handleBlur} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t( label={t(
"bodyshop.fields.responsibilitycenter_accountitem" "bodyshop.fields.responsibilitycenter_accountitem"
)} )}
@@ -158,28 +150,26 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
}} }}
style={{ width: "100%" }} style={{ width: "100%" }}
> >
{t("bodyshop.actions.newstatus")} {t("general.actions.add")}
</Button> </Button>
</Form.Item> </Form.Item>
</div> </div>
); );
}} }}
</Form.List> </Form.List>
</div> </LayoutFormRow>
<div>
<Typography.Title level={4}>
{t("bodyshop.labels.responsibilitycenters.profits")}
</Typography.Title>
<LayoutFormRow
header={t("bodyshop.labels.responsibilitycenters.profits")}
>
<Form.List name={["md_responsibility_centers", "profits"]}> <Form.List name={["md_responsibility_centers", "profits"]}>
{(fields, { add, remove }) => { {(fields, { add, remove }) => {
return ( return (
<div> <div>
{fields.map((field, index) => ( {fields.map((field, index) => (
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}> <Form.Item key={field.key}>
<LayoutFormRow> <LayoutFormRow noDivider>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.responsibilitycenter")} label={t("bodyshop.fields.responsibilitycenter")}
key={`${index}name`} key={`${index}name`}
name={[field.name, "name"]} name={[field.name, "name"]}
@@ -193,7 +183,6 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<Input onBlur={handleBlur} /> <Input onBlur={handleBlur} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t( label={t(
"bodyshop.fields.responsibilitycenter_accountname" "bodyshop.fields.responsibilitycenter_accountname"
)} )}
@@ -209,7 +198,6 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<Input onBlur={handleBlur} /> <Input onBlur={handleBlur} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t( label={t(
"bodyshop.fields.responsibilitycenter_accountnumber" "bodyshop.fields.responsibilitycenter_accountnumber"
)} )}
@@ -225,7 +213,6 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<Input onBlur={handleBlur} /> <Input onBlur={handleBlur} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t( label={t(
"bodyshop.fields.responsibilitycenter_accountdesc" "bodyshop.fields.responsibilitycenter_accountdesc"
)} )}
@@ -241,7 +228,6 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
<Input onBlur={handleBlur} /> <Input onBlur={handleBlur} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
style={{ padding: 0, margin: 2 }}
label={t( label={t(
"bodyshop.fields.responsibilitycenter_accountitem" "bodyshop.fields.responsibilitycenter_accountitem"
)} )}
@@ -272,15 +258,15 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
}} }}
style={{ width: "100%" }} style={{ width: "100%" }}
> >
{t("bodyshop.actions.newstatus")} {t("general.actions.add")}
</Button> </Button>
</Form.Item> </Form.Item>
</div> </div>
); );
}} }}
</Form.List> </Form.List>
</div> </LayoutFormRow>
<div>
<SelectorDiv> <SelectorDiv>
<LayoutFormRow header={t("bodyshop.labels.defaultcostsmapping")}> <LayoutFormRow header={t("bodyshop.labels.defaultcostsmapping")}>
<Form.Item <Form.Item
@@ -680,10 +666,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
</Select> </Select>
</Form.Item> </Form.Item>
</LayoutFormRow> </LayoutFormRow>
</SelectorDiv>
</div>
<SelectorDiv>
<div>
<LayoutFormRow header={t("bodyshop.labels.defaultprofitsmapping")}> <LayoutFormRow header={t("bodyshop.labels.defaultprofitsmapping")}>
<Form.Item <Form.Item
label={t("bodyshop.fields.responsibilitycenters.ats")} label={t("bodyshop.fields.responsibilitycenters.ats")}
@@ -1053,12 +1036,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
message: t("general.validation.required"), message: t("general.validation.required"),
}, },
]} ]}
name={[ name={["md_responsibility_centers", "defaults", "profits", "MAPA"]}
"md_responsibility_centers",
"defaults",
"profits",
"MAPA",
]}
> >
<Select> <Select>
{profitOptions.map((item, idx) => ( {profitOptions.map((item, idx) => (
@@ -1076,12 +1054,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
message: t("general.validation.required"), message: t("general.validation.required"),
}, },
]} ]}
name={[ name={["md_responsibility_centers", "defaults", "profits", "MASH"]}
"md_responsibility_centers",
"defaults",
"profits",
"MASH",
]}
> >
<Select> <Select>
{profitOptions.map((item, idx) => ( {profitOptions.map((item, idx) => (
@@ -1092,10 +1065,8 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
</Select> </Select>
</Form.Item> </Form.Item>
</LayoutFormRow> </LayoutFormRow>
</div>
</SelectorDiv> </SelectorDiv>
<LayoutFormRow <LayoutFormRow
style={{ marginTop: ".8rem" }}
header={t("bodyshop.labels.responsibilitycenters.tax_accounts")} header={t("bodyshop.labels.responsibilitycenters.tax_accounts")}
> >
<Form.Item <Form.Item

View File

@@ -1,9 +1,8 @@
import { DeleteFilled } from "@ant-design/icons"; import { Form, Select } from "antd";
import { Button, Col, Form, Input, Row, Select } from "antd";
import React, { useState } from "react"; import React, { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import styled from "styled-components"; import styled from "styled-components";
import FormListMoveArrows from "../form-list-move-arrows/form-list-move-arrows.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component";
const SelectorDiv = styled.div` const SelectorDiv = styled.div`
.ant-form-item .ant-select { .ant-form-item .ant-select {
width: 200px; width: 200px;
@@ -22,65 +21,20 @@ export default function ShopInfoROStatusComponent({ form }) {
}; };
return ( return (
<div> <SelectorDiv>
<Row>
<Col span={8}>
{t("bodyshop.labels.alljobstatuses")}
<Form.List name={["md_ro_statuses", "statuses"]}>
{(fields, { add, remove, move }) => {
return (
<div>
{fields.map((field, index) => (
<Form.Item <Form.Item
key={field.key} name={["md_ro_statuses", "statuses"]}
style={{ padding: 0, margin: 2 }} label={t("bodyshop.labels.alljobstatuses")}
>
<div style={{ display: "flex" }}>
<Form.Item
style={{ padding: 0, margin: 2 }}
label={t("bodyshop.fields.status")}
key={`${index}`}
name={[field.name]}
rules={[ rules={[
{ {
required: true, required: true,
message: t("general.validation.required"), message: t("general.validation.required"),
type: "array",
}, },
]} ]}
> >
<Input onBlur={handleBlur} /> <Select mode="tags" onBlur={handleBlur} />
</Form.Item> </Form.Item>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
<FormListMoveArrows
move={move}
index={index}
total={fields.length}
/>
</div>
</Form.Item>
))}
<Form.Item>
<Button
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}
>
{t("bodyshop.actions.newstatus")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
</Col>
<Col span={12}>
<SelectorDiv>
<Form.Item <Form.Item
name={["md_ro_statuses", "active_statuses"]} name={["md_ro_statuses", "active_statuses"]}
label={t("bodyshop.fields.statuses.active_statuses")} label={t("bodyshop.fields.statuses.active_statuses")}
@@ -157,6 +111,7 @@ export default function ShopInfoROStatusComponent({ form }) {
))} ))}
</Select> </Select>
</Form.Item> </Form.Item>
<LayoutFormRow noDivider>
<Form.Item <Form.Item
label={t("bodyshop.fields.statuses.default_scheduled")} label={t("bodyshop.fields.statuses.default_scheduled")}
rules={[ rules={[
@@ -301,9 +256,7 @@ export default function ShopInfoROStatusComponent({ form }) {
))} ))}
</Select> </Select>
</Form.Item> </Form.Item>
</LayoutFormRow>
</SelectorDiv> </SelectorDiv>
</Col>
</Row>
</div>
); );
} }

View File

@@ -1,12 +1,13 @@
import { DeleteFilled } from "@ant-design/icons"; import { DeleteFilled } from "@ant-design/icons";
import { import {
Button, Button,
Col, Divider,
Form, Form,
Input, Input,
InputNumber, InputNumber,
Row,
Select, Select,
Space,
Switch,
TimePicker, TimePicker,
} from "antd"; } from "antd";
import React from "react"; import React from "react";
@@ -20,6 +21,19 @@ export default function ShopInfoSchedulingComponent({ form }) {
return ( return (
<div> <div>
<LayoutFormRow>
<Form.Item
label={t("bodyshop.fields.appt_length")}
name={"appt_length"}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<InputNumber min={15} precision={0} />
</Form.Item>
<Form.Item <Form.Item
label={t("bodyshop.fields.schedule_start_time")} label={t("bodyshop.fields.schedule_start_time")}
name={"schedule_start_time"} name={"schedule_start_time"}
@@ -44,21 +58,80 @@ export default function ShopInfoSchedulingComponent({ form }) {
> >
<TimePicker showSecond={false} format="hh:mm" /> <TimePicker showSecond={false} format="hh:mm" />
</Form.Item> </Form.Item>
<strong>{t("bodyshop.labels.apptcolors")}</strong> <Form.Item
<Row> name={["appt_alt_transport"]}
<Col span={24}> label={t("bodyshop.fields.appt_alt_transport")}
rules={[
{
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
</LayoutFormRow>
<Divider orientation="left">{t("bodyshop.labels.workingdays")}</Divider>
<Space wrap size="large">
<Form.Item
label={t("general.labels.sunday")}
name={["workingdays", "sunday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.monday")}
name={["workingdays", "monday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.tuesday")}
name={["workingdays", "tuesday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.wednesday")}
name={["workingdays", "wednesday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.thursday")}
name={["workingdays", "thursday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.friday")}
name={["workingdays", "friday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
<Form.Item
label={t("general.labels.saturday")}
name={["workingdays", "saturday"]}
valuePropName="checked"
>
<Switch />
</Form.Item>
</Space>
<LayoutFormRow header={t("bodyshop.labels.apptcolors")}>
<Form.List name={["appt_colors"]}> <Form.List name={["appt_colors"]}>
{(fields, { add, remove, move }) => { {(fields, { add, remove, move }) => {
return ( return (
<div> <div>
{fields.map((field, index) => ( {fields.map((field, index) => (
<Form.Item key={field.key}>
<LayoutFormRow noDivider>
<Form.Item <Form.Item
key={field.key}
style={{ padding: 0, margin: 2 }}
>
<LayoutFormRow>
<Form.Item
className="imex-flex-row__margin"
label={t("bodyshop.fields.appt_colors.label")} label={t("bodyshop.fields.appt_colors.label")}
key={`${index}aptcolorlabel`} key={`${index}aptcolorlabel`}
name={[field.name, "label"]} name={[field.name, "label"]}
@@ -72,7 +145,6 @@ export default function ShopInfoSchedulingComponent({ form }) {
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("bodyshop.fields.appt_colors.color")} label={t("bodyshop.fields.appt_colors.color")}
key={`${index}aptcolorcolor`} key={`${index}aptcolorcolor`}
name={[field.name, "color"]} name={[field.name, "color"]}
@@ -85,8 +157,8 @@ export default function ShopInfoSchedulingComponent({ form }) {
> >
<ColorpickerFormItemComponent /> <ColorpickerFormItemComponent />
</Form.Item> </Form.Item>
<Space wrap>
<DeleteFilled <DeleteFilled
className="imex-flex-row__margin"
onClick={() => { onClick={() => {
remove(field.name); remove(field.name);
}} }}
@@ -96,6 +168,7 @@ export default function ShopInfoSchedulingComponent({ form }) {
index={index} index={index}
total={fields.length} total={fields.length}
/> />
</Space>
</LayoutFormRow> </LayoutFormRow>
</Form.Item> </Form.Item>
))} ))}
@@ -114,28 +187,15 @@ export default function ShopInfoSchedulingComponent({ form }) {
); );
}} }}
</Form.List> </Form.List>
<Form.Item </LayoutFormRow>
name={["appt_alt_transport"]} <LayoutFormRow header={t("bodyshop.labels.ssbuckets")}>
label={t("bodyshop.fields.appt_alt_transport")}
rules={[
{
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="tags" />
</Form.Item>
<Form.List name={["ssbuckets"]}> <Form.List name={["ssbuckets"]}>
{(fields, { add, remove, move }) => { {(fields, { add, remove, move }) => {
return ( return (
<div> <div>
{fields.map((field, index) => ( {fields.map((field, index) => (
<Form.Item <Form.Item key={field.key}>
key={field.key} <LayoutFormRow noDivider>
style={{ padding: 0, margin: 2 }}
>
<LayoutFormRow>
<Form.Item <Form.Item
label={t("bodyshop.fields.ssbuckets.id")} label={t("bodyshop.fields.ssbuckets.id")}
key={`${index}id`} key={`${index}id`}
@@ -198,7 +258,7 @@ export default function ShopInfoSchedulingComponent({ form }) {
> >
<InputNumber /> <InputNumber />
</Form.Item> </Form.Item>
<div> <Space wrap>
<DeleteFilled <DeleteFilled
onClick={() => { onClick={() => {
remove(field.name); remove(field.name);
@@ -209,7 +269,7 @@ export default function ShopInfoSchedulingComponent({ form }) {
index={index} index={index}
total={fields.length} total={fields.length}
/> />
</div> </Space>
</LayoutFormRow> </LayoutFormRow>
</Form.Item> </Form.Item>
))} ))}
@@ -228,8 +288,7 @@ export default function ShopInfoSchedulingComponent({ form }) {
); );
}} }}
</Form.List> </Form.List>
</Col> </LayoutFormRow>
</Row>
</div> </div>
); );
} }

View File

@@ -1,5 +1,5 @@
import { DeleteFilled } from "@ant-design/icons"; import { DeleteFilled } from "@ant-design/icons";
import { Button, Form, Input, Select } from "antd"; import { Button, Form, Input, Select, Space } from "antd";
import React from "react"; import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { TemplateList } from "../../utils/TemplateConstants"; import { TemplateList } from "../../utils/TemplateConstants";
@@ -9,9 +9,7 @@ import LayoutFormRow from "../layout-form-row/layout-form-row.component";
export default function ShopInfoSpeedPrint({ bodyshop, form }) { export default function ShopInfoSpeedPrint({ bodyshop, form }) {
const { t } = useTranslation(); const { t } = useTranslation();
const TemplateListGenerated = TemplateList(); const TemplateListGenerated = TemplateList();
console.log("TemplateListGenerated", TemplateListGenerated);
return ( return (
<div>
<Form.List name={["speedprint"]}> <Form.List name={["speedprint"]}>
{(fields, { add, remove, move }) => { {(fields, { add, remove, move }) => {
return ( return (
@@ -20,7 +18,6 @@ export default function ShopInfoSpeedPrint({ bodyshop, form }) {
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}> <Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
<LayoutFormRow grow> <LayoutFormRow grow>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("bodyshop.fields.speedprint.id")} label={t("bodyshop.fields.speedprint.id")}
key={`${index}id`} key={`${index}id`}
name={[field.name, "id"]} name={[field.name, "id"]}
@@ -34,7 +31,6 @@ export default function ShopInfoSpeedPrint({ bodyshop, form }) {
<Input /> <Input />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
className="imex-flex-row__margin"
label={t("bodyshop.fields.speedprint.label")} label={t("bodyshop.fields.speedprint.label")}
key={`${index}label`} key={`${index}label`}
name={[field.name, "label"]} name={[field.name, "label"]}
@@ -49,7 +45,6 @@ export default function ShopInfoSpeedPrint({ bodyshop, form }) {
</Form.Item> </Form.Item>
<Form.Item <Form.Item
className="imex-flex-row__margin"
name={[field.name, "templates"]} name={[field.name, "templates"]}
label={t("bodyshop.fields.speedprint.templates")} label={t("bodyshop.fields.speedprint.templates")}
rules={[ rules={[
@@ -72,8 +67,8 @@ export default function ShopInfoSpeedPrint({ bodyshop, form }) {
</Select> </Select>
</Form.Item> </Form.Item>
<Space wrap>
<DeleteFilled <DeleteFilled
className="imex-flex-row__margin"
onClick={() => { onClick={() => {
remove(field.name); remove(field.name);
}} }}
@@ -83,6 +78,7 @@ export default function ShopInfoSpeedPrint({ bodyshop, form }) {
index={index} index={index}
total={fields.length} total={fields.length}
/> />
</Space>
</LayoutFormRow> </LayoutFormRow>
</Form.Item> </Form.Item>
))} ))}
@@ -101,6 +97,5 @@ export default function ShopInfoSpeedPrint({ bodyshop, form }) {
); );
}} }}
</Form.List> </Form.List>
</div>
); );
} }

View File

@@ -1,6 +1,6 @@
import { PrinterFilled } from "@ant-design/icons"; import { PrinterFilled } from "@ant-design/icons";
import { useQuery } from "@apollo/client"; import { useQuery } from "@apollo/client";
import { Button, Divider, Drawer, Grid, PageHeader, Tabs, Tag } from "antd"; import { Button, Divider, Drawer, Grid, PageHeader, Tabs } from "antd";
import queryString from "query-string"; import queryString from "query-string";
import React from "react"; import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
@@ -14,8 +14,6 @@ import JobsDetailHeader from "../jobs-detail-header/jobs-detail-header.component
import JobsDocumentsGalleryContainer from "../jobs-documents-gallery/jobs-documents-gallery.container"; import JobsDocumentsGalleryContainer from "../jobs-documents-gallery/jobs-documents-gallery.container";
import JobNotesContainer from "../jobs-notes/jobs-notes.container"; import JobNotesContainer from "../jobs-notes/jobs-notes.container";
import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component";
import OwnerTagPopoverComponent from "../owner-tag-popover/owner-tag-popover.component";
import VehicleTagPopoverComponent from "../vehicle-tag-popover/vehicle-tag-popover.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setPrintCenterContext: (context) => setPrintCenterContext: (context) =>

View File

@@ -2,7 +2,6 @@ import { Card, Space, Table } from "antd";
import moment from "moment"; import moment from "moment";
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Link } from "react-router-dom";
import { onlyUnique } from "../../utils/arrayHelper"; import { onlyUnique } from "../../utils/arrayHelper";
import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter"; import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter";
import { alphaSort } from "../../utils/sorters"; import { alphaSort } from "../../utils/sorters";

View File

@@ -172,7 +172,7 @@
"bodyshop": { "bodyshop": {
"actions": { "actions": {
"addapptcolor": "Add Appointment Color", "addapptcolor": "Add Appointment Color",
"addbucket": "Add Bucket", "addbucket": "Add Definition",
"addpartslocation": "Add Parts Location", "addpartslocation": "Add Parts Location",
"addspeedprint": "Add Speed Print", "addspeedprint": "Add Speed Print",
"addtemplate": "Add Template", "addtemplate": "Add Template",
@@ -412,10 +412,12 @@
"2tiername": "Name => RO", "2tiername": "Name => RO",
"2tiersetup": "2 Tier Setup", "2tiersetup": "2 Tier Setup",
"2tiersource": "Source => RO", "2tiersource": "Source => RO",
"accountingsetup": "Accounting Setup",
"accountingtiers": "Number of Tiers to Use for Export", "accountingtiers": "Number of Tiers to Use for Export",
"alljobstatuses": "All Job Statuses", "alljobstatuses": "All Job Statuses",
"allopenjobstatuses": "All Open Job Statuses", "allopenjobstatuses": "All Open Job Statuses",
"apptcolors": "Appointment Colors", "apptcolors": "Appointment Colors",
"businessinformation": "Business Information",
"checklists": "Checklists", "checklists": "Checklists",
"csiq": "CSI Questions", "csiq": "CSI Questions",
"customtemplates": "Custom Templates", "customtemplates": "Custom Templates",
@@ -423,12 +425,16 @@
"defaultprofitsmapping": "Default Profits Mapping", "defaultprofitsmapping": "Default Profits Mapping",
"deliverchecklist": "Delivery Checklist", "deliverchecklist": "Delivery Checklist",
"employees": "Employees", "employees": "Employees",
"insurancecos": "Insurance Companies",
"intakechecklist": "Intake Checklist", "intakechecklist": "Intake Checklist",
"jobstatuses": "Job Statuses", "jobstatuses": "Job Statuses",
"laborrates": "Labor Rates", "laborrates": "Labor Rates",
"licensing": "Licensing", "licensing": "Licensing",
"messagingpresets": "Messaging Presets",
"notemplatesavailable": "No templates available to add.", "notemplatesavailable": "No templates available to add.",
"notespresets": "Notes Presets",
"orderstatuses": "Order Statuses", "orderstatuses": "Order Statuses",
"partslocations": "Parts Locations",
"rbac": "Role Based Access Control", "rbac": "Role Based Access Control",
"responsibilitycenters": { "responsibilitycenters": {
"costs": "Cost Centers", "costs": "Cost Centers",
@@ -438,8 +444,11 @@
"title": "Responsibility Centers" "title": "Responsibility Centers"
}, },
"scheduling": "SMART Scheduling", "scheduling": "SMART Scheduling",
"scoreboardsetup": "Scoreboard Setup",
"shopinfo": "Shop Information", "shopinfo": "Shop Information",
"speedprint": "Speed Print Configuration", "speedprint": "Speed Print Configuration",
"ssbuckets": "Job Size Definitions",
"systemsettings": "System Settings",
"workingdays": "Working Days" "workingdays": "Working Days"
}, },
"successes": { "successes": {

View File

@@ -412,10 +412,12 @@
"2tiername": "", "2tiername": "",
"2tiersetup": "", "2tiersetup": "",
"2tiersource": "", "2tiersource": "",
"accountingsetup": "",
"accountingtiers": "", "accountingtiers": "",
"alljobstatuses": "", "alljobstatuses": "",
"allopenjobstatuses": "", "allopenjobstatuses": "",
"apptcolors": "", "apptcolors": "",
"businessinformation": "",
"checklists": "", "checklists": "",
"csiq": "", "csiq": "",
"customtemplates": "", "customtemplates": "",
@@ -423,12 +425,16 @@
"defaultprofitsmapping": "", "defaultprofitsmapping": "",
"deliverchecklist": "", "deliverchecklist": "",
"employees": "", "employees": "",
"insurancecos": "",
"intakechecklist": "", "intakechecklist": "",
"jobstatuses": "", "jobstatuses": "",
"laborrates": "", "laborrates": "",
"licensing": "", "licensing": "",
"messagingpresets": "",
"notemplatesavailable": "", "notemplatesavailable": "",
"notespresets": "",
"orderstatuses": "", "orderstatuses": "",
"partslocations": "",
"rbac": "", "rbac": "",
"responsibilitycenters": { "responsibilitycenters": {
"costs": "", "costs": "",
@@ -438,8 +444,11 @@
"title": "" "title": ""
}, },
"scheduling": "", "scheduling": "",
"scoreboardsetup": "",
"shopinfo": "", "shopinfo": "",
"speedprint": "", "speedprint": "",
"ssbuckets": "",
"systemsettings": "",
"workingdays": "" "workingdays": ""
}, },
"successes": { "successes": {

View File

@@ -412,10 +412,12 @@
"2tiername": "", "2tiername": "",
"2tiersetup": "", "2tiersetup": "",
"2tiersource": "", "2tiersource": "",
"accountingsetup": "",
"accountingtiers": "", "accountingtiers": "",
"alljobstatuses": "", "alljobstatuses": "",
"allopenjobstatuses": "", "allopenjobstatuses": "",
"apptcolors": "", "apptcolors": "",
"businessinformation": "",
"checklists": "", "checklists": "",
"csiq": "", "csiq": "",
"customtemplates": "", "customtemplates": "",
@@ -423,12 +425,16 @@
"defaultprofitsmapping": "", "defaultprofitsmapping": "",
"deliverchecklist": "", "deliverchecklist": "",
"employees": "", "employees": "",
"insurancecos": "",
"intakechecklist": "", "intakechecklist": "",
"jobstatuses": "", "jobstatuses": "",
"laborrates": "", "laborrates": "",
"licensing": "", "licensing": "",
"messagingpresets": "",
"notemplatesavailable": "", "notemplatesavailable": "",
"notespresets": "",
"orderstatuses": "", "orderstatuses": "",
"partslocations": "",
"rbac": "", "rbac": "",
"responsibilitycenters": { "responsibilitycenters": {
"costs": "", "costs": "",
@@ -438,8 +444,11 @@
"title": "" "title": ""
}, },
"scheduling": "", "scheduling": "",
"scoreboardsetup": "",
"shopinfo": "", "shopinfo": "",
"speedprint": "", "speedprint": "",
"ssbuckets": "",
"systemsettings": "",
"workingdays": "" "workingdays": ""
}, },
"successes": { "successes": {