Added intake checklist modification to shop management BOD-128

This commit is contained in:
Patrick Fic
2020-07-27 08:55:43 -07:00
parent 081b33cc22
commit 6105854b73
10 changed files with 321 additions and 21 deletions

View File

@@ -1,4 +1,4 @@
<babeledit_project be_version="2.6.1" version="1.2"> <babeledit_project version="1.2" be_version="2.6.1">
<!-- <!--
BabelEdit project file BabelEdit project file
@@ -6449,6 +6449,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>required</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>search</name> <name>search</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -8721,6 +8742,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>intake</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>manualnew</name> <name>manualnew</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -10012,6 +10054,74 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<folder_node>
<name>intake</name>
<children>
<concept_node>
<name>label</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>name</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>type</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>
</children>
</folder_node>
<concept_node> <concept_node>
<name>kmin</name> <name>kmin</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -12678,6 +12788,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>intake</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>job</name> <name>job</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>

View File

@@ -1,29 +1,16 @@
import React from "react"; import React from "react";
import CheckboxFormItem from "./checkbox/checkbox.component"; import FormTypes from "./config-form-types";
import Slider from "./slider/slider.component";
import Text from "./text/text.component";
import Textarea from "./textarea/textarea.component";
import Rate from "./rate/rate.component";
export default function ConfirmFormComponents({ componentList, readOnly }) { export default function ConfirmFormComponents({ componentList, readOnly }) {
return ( return (
<div> <div>
{componentList.map((f, idx) => { {componentList.map((f, idx) => {
switch (f.type) { const Comp = FormTypes[f.type];
case "checkbox":
return ( if (!!Comp) {
<CheckboxFormItem key={idx} formItem={f} readOnly={readOnly} /> return <Comp key={idx} formItem={f} readOnly={readOnly} />;
); } else {
case "slider": return <div key={idx}>Error</div>;
return <Slider key={idx} formItem={f} readOnly={readOnly} />;
case "text":
return <Text key={idx} formItem={f} readOnly={readOnly} />;
case "textarea":
return <Textarea key={idx} formItem={f} readOnly={readOnly} />;
case "rate":
return <Rate key={idx} formItem={f} readOnly={readOnly} />;
default:
return <div key={idx}>Error</div>;
} }
})} })}
</div> </div>

View File

@@ -0,0 +1,13 @@
import CheckboxFormItem from "./checkbox/checkbox.component";
import Rate from "./rate/rate.component";
import Slider from "./slider/slider.component";
import Text from "./text/text.component";
import Textarea from "./textarea/textarea.component";
export default {
checkbox: CheckboxFormItem,
slider: Slider,
text: Text,
textarea: Textarea,
rate: Rate,
};

View File

@@ -56,6 +56,11 @@ export function JobsDetailHeaderActions({
}}> }}>
{t("jobs.actions.schedule")} {t("jobs.actions.schedule")}
</Menu.Item> </Menu.Item>
<Menu.Item>
<Link to={`/manage/jobs/${job.id}/intake`}>
{t("jobs.actions.intake")}
</Link>
</Menu.Item>
<Menu.Item <Menu.Item
key='enterpayments' key='enterpayments'
onClick={() => { onClick={() => {

View File

@@ -15,6 +15,7 @@ import ShopInfoOrderStatusComponent from "./shop-info.orderstatus.component";
import ShopInfoResponsibilityCenterComponent from "./shop-info.responsibilitycenters.component"; import ShopInfoResponsibilityCenterComponent from "./shop-info.responsibilitycenters.component";
import ShopInfoSchedulingComponent from "./shop-info.scheduling.component"; import ShopInfoSchedulingComponent from "./shop-info.scheduling.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component"; import LayoutFormRow from "../layout-form-row/layout-form-row.component";
import ShopInfoIntakeChecklistComponent from "./shop-info.intake.component";
export default function ShopInfoComponent({ form }) { export default function ShopInfoComponent({ form }) {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -296,6 +297,12 @@ export default function ShopInfoComponent({ form }) {
> >
<ShopInfoResponsibilityCenterComponent form={form} /> <ShopInfoResponsibilityCenterComponent form={form} />
</Collapse.Panel> </Collapse.Panel>
<Collapse.Panel
key="intake"
header={t("bodyshop.labels.intake")}
>
<ShopInfoIntakeChecklistComponent form={form} />
</Collapse.Panel>
</Collapse> </Collapse>
</div> </div>
); );

View File

@@ -0,0 +1,131 @@
import { DeleteFilled } from "@ant-design/icons";
import { Button, Form, Input, Select, Switch } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import styled from "styled-components";
import { TemplateList } from "../../utils/TemplateConstants";
import ConfigFormTypes from "../config-form-components/config-form-types";
const SelectorDiv = styled.div`
.ant-form-item .ant-select {
width: 200px;
}
`;
//TODO Fix up styles.
export default function ShopInfoIntakeChecklistComponent({ form }) {
const { t } = useTranslation();
return (
<div>
<Form.List name={["intakechecklist", "form"]}>
{(fields, { add, remove }) => {
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("jobs.fields.intake.name")}
key={`${index}name`}
name={[field.name, "name"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}>
<Input />
</Form.Item>
<Form.Item
className='imex-flex-row__margin'
label={t("jobs.fields.intake.type")}
key={`${index}type`}
name={[field.name, "type"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}>
<Select>
{Object.keys(ConfigFormTypes).map((i, idx) => (
<Select.Option key={i} value={i}>
{i}
</Select.Option>
))}
</Select>
</Form.Item>
<Form.Item
className='imex-flex-row__margin'
label={t("jobs.fields.intake.label")}
key={`${index}label`}
name={[field.name, "label"]}
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}>
<Input />
</Form.Item>
<Form.Item
className='imex-flex-row__margin'
label={t("general.fields.required")}
key={`${index}required`}
name={[field.name, "required"]}
valuePropName='checked'>
<Switch />
</Form.Item>
<DeleteFilled
onClick={() => {
remove(field.name);
}}
/>
</div>
</Form.Item>
))}
<Form.Item>
<Button
type='dashed'
onClick={() => {
add();
}}
style={{ width: "100%" }}>
{t("general.actions.add")}
</Button>
</Form.Item>
</div>
);
}}
</Form.List>
<SelectorDiv>
<Form.Item
name={["intakechecklist", "templates"]}
label={t("bodyshop.fields.statuses.open_statuses")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}>
<Select mode='multiple'>
{Object.keys(TemplateList).map((i) => (
<Select.Option
key={TemplateList[i].key}
value={TemplateList[i].key}>
{TemplateList[i].title}
</Select.Option>
))}
</Select>
</Form.Item>
</SelectorDiv>
</div>
);
}

View File

@@ -46,6 +46,7 @@ export const QUERY_BODYSHOP = gql`
scoreboard_target scoreboard_target
md_referral_sources md_referral_sources
md_messaging_presets md_messaging_presets
intakechecklist
employees { employees {
id id
first_name first_name
@@ -100,6 +101,7 @@ export const UPDATE_SHOP = gql`
scoreboard_target scoreboard_target
md_referral_sources md_referral_sources
md_messaging_presets md_messaging_presets
intakechecklist
employees { employees {
id id
first_name first_name

View File

@@ -426,6 +426,7 @@
"passwordresetsuccess_sub": "You should receive this email in the next few minutes. Please check your email including any junk or spam folders. ", "passwordresetsuccess_sub": "You should receive this email in the next few minutes. Please check your email including any junk or spam folders. ",
"passwordsdonotmatch": "The passwords you have entered do not match.", "passwordsdonotmatch": "The passwords you have entered do not match.",
"print": "Print", "print": "Print",
"required": "Required",
"search": "Search...", "search": "Search...",
"selectdate": "Select date...", "selectdate": "Select date...",
"sendagain": "Send Again", "sendagain": "Send Again",
@@ -580,6 +581,7 @@
"export": "Export", "export": "Export",
"exportselected": "Export Selected", "exportselected": "Export Selected",
"gotojob": "Go to Job", "gotojob": "Go to Job",
"intake": "Intake",
"manualnew": "Create New Job Manually", "manualnew": "Create New Job Manually",
"mark": "Mark", "mark": "Mark",
"postInvoices": "Post Invoices", "postInvoices": "Post Invoices",
@@ -645,6 +647,11 @@
"ins_ct_ln": "File Handler Last Name", "ins_ct_ln": "File Handler Last Name",
"ins_ea": "File Handler Email", "ins_ea": "File Handler Email",
"ins_ph1": "File Handler Phone #", "ins_ph1": "File Handler Phone #",
"intake": {
"label": "Label",
"name": "Name",
"type": "Type"
},
"kmin": "Mileage In", "kmin": "Mileage In",
"kmout": "Mileage Out", "kmout": "Mileage Out",
"la1": "LA1", "la1": "LA1",
@@ -779,6 +786,7 @@
"hrs_claimed": "Hours Claimed", "hrs_claimed": "Hours Claimed",
"hrs_total": "Hours Total", "hrs_total": "Hours Total",
"inproduction": "In Production", "inproduction": "In Production",
"intake": "Job Intake",
"job": "Job Details", "job": "Job Details",
"jobcosting": "Job Costing", "jobcosting": "Job Costing",
"laborallocations": "Labor Allocations", "laborallocations": "Labor Allocations",

View File

@@ -426,6 +426,7 @@
"passwordresetsuccess_sub": "", "passwordresetsuccess_sub": "",
"passwordsdonotmatch": "", "passwordsdonotmatch": "",
"print": "", "print": "",
"required": "",
"search": "Buscar...", "search": "Buscar...",
"selectdate": "", "selectdate": "",
"sendagain": "", "sendagain": "",
@@ -580,6 +581,7 @@
"export": "", "export": "",
"exportselected": "", "exportselected": "",
"gotojob": "", "gotojob": "",
"intake": "",
"manualnew": "", "manualnew": "",
"mark": "", "mark": "",
"postInvoices": "Contabilizar facturas", "postInvoices": "Contabilizar facturas",
@@ -645,6 +647,11 @@
"ins_ct_ln": "Apellido del manejador de archivos", "ins_ct_ln": "Apellido del manejador de archivos",
"ins_ea": "Correo electrónico del controlador de archivos", "ins_ea": "Correo electrónico del controlador de archivos",
"ins_ph1": "File Handler Phone #", "ins_ph1": "File Handler Phone #",
"intake": {
"label": "",
"name": "",
"type": ""
},
"kmin": "Kilometraje en", "kmin": "Kilometraje en",
"kmout": "Kilometraje", "kmout": "Kilometraje",
"la1": "", "la1": "",
@@ -779,6 +786,7 @@
"hrs_claimed": "", "hrs_claimed": "",
"hrs_total": "", "hrs_total": "",
"inproduction": "", "inproduction": "",
"intake": "",
"job": "", "job": "",
"jobcosting": "", "jobcosting": "",
"laborallocations": "", "laborallocations": "",

View File

@@ -426,6 +426,7 @@
"passwordresetsuccess_sub": "", "passwordresetsuccess_sub": "",
"passwordsdonotmatch": "", "passwordsdonotmatch": "",
"print": "", "print": "",
"required": "",
"search": "Chercher...", "search": "Chercher...",
"selectdate": "", "selectdate": "",
"sendagain": "", "sendagain": "",
@@ -580,6 +581,7 @@
"export": "", "export": "",
"exportselected": "", "exportselected": "",
"gotojob": "", "gotojob": "",
"intake": "",
"manualnew": "", "manualnew": "",
"mark": "", "mark": "",
"postInvoices": "Poster des factures", "postInvoices": "Poster des factures",
@@ -645,6 +647,11 @@
"ins_ct_ln": "Nom du gestionnaire de fichiers", "ins_ct_ln": "Nom du gestionnaire de fichiers",
"ins_ea": "Courriel du gestionnaire de fichiers", "ins_ea": "Courriel du gestionnaire de fichiers",
"ins_ph1": "Numéro de téléphone du gestionnaire de fichiers", "ins_ph1": "Numéro de téléphone du gestionnaire de fichiers",
"intake": {
"label": "",
"name": "",
"type": ""
},
"kmin": "Kilométrage en", "kmin": "Kilométrage en",
"kmout": "Kilométrage hors", "kmout": "Kilométrage hors",
"la1": "", "la1": "",
@@ -779,6 +786,7 @@
"hrs_claimed": "", "hrs_claimed": "",
"hrs_total": "", "hrs_total": "",
"inproduction": "", "inproduction": "",
"intake": "",
"job": "", "job": "",
"jobcosting": "", "jobcosting": "",
"laborallocations": "", "laborallocations": "",