Added barcode scanning to populate contract form BOD-88

This commit is contained in:
Patrick Fic
2020-07-13 15:01:50 -07:00
parent 924aa5d99a
commit 934dc1f647
13 changed files with 536 additions and 269 deletions

View File

@@ -2844,6 +2844,53 @@
<folder_node> <folder_node>
<name>contracts</name> <name>contracts</name>
<children> <children>
<folder_node>
<name>actions</name>
<children>
<concept_node>
<name>decodelicense</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>senddltoform</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>
<folder_node> <folder_node>
<name>errors</name> <name>errors</name>
<children> <children>
@@ -3400,6 +3447,53 @@
</concept_node> </concept_node>
</children> </children>
</folder_node> </folder_node>
<folder_node>
<name>labels</name>
<children>
<concept_node>
<name>correctdataonform</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>waitingforscan</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>
<folder_node> <folder_node>
<name>status</name> <name>status</name>
<children> <children>

View File

@@ -7,12 +7,12 @@ export default function ContractsCarsComponent({
loading, loading,
data, data,
selectedCar, selectedCar,
handleSelect handleSelect,
}) { }) {
const [state, setState] = useState({ const [state, setState] = useState({
sortedInfo: {}, sortedInfo: {},
filteredInfo: { text: "" }, filteredInfo: { text: "" },
search: "" search: "",
}); });
const { t } = useTranslation(); const { t } = useTranslation();
@@ -24,7 +24,7 @@ export default function ContractsCarsComponent({
key: "fleetnumber", key: "fleetnumber",
sorter: (a, b) => alphaSort(a.fleetnumber, b.fleetnumber), sorter: (a, b) => alphaSort(a.fleetnumber, b.fleetnumber),
sortOrder: sortOrder:
state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order,
}, },
{ {
title: t("courtesycars.fields.status"), title: t("courtesycars.fields.status"),
@@ -32,21 +32,24 @@ export default function ContractsCarsComponent({
key: "status", key: "status",
sorter: (a, b) => alphaSort(a.status, b.status), sorter: (a, b) => alphaSort(a.status, b.status),
sortOrder: sortOrder:
state.sortedInfo.columnKey === "status" && state.sortedInfo.order state.sortedInfo.columnKey === "status" && state.sortedInfo.order,
render: (text, record) => <div>{t(record.status)}</div>,
}, },
{ {
title: t("courtesycars.fields.year"), title: t("courtesycars.fields.year"),
dataIndex: "year", dataIndex: "year",
key: "year", key: "year",
sorter: (a, b) => alphaSort(a.year, b.year), sorter: (a, b) => alphaSort(a.year, b.year),
sortOrder: state.sortedInfo.columnKey === "year" && state.sortedInfo.order sortOrder:
state.sortedInfo.columnKey === "year" && state.sortedInfo.order,
}, },
{ {
title: t("courtesycars.fields.make"), title: t("courtesycars.fields.make"),
dataIndex: "make", dataIndex: "make",
key: "make", key: "make",
sorter: (a, b) => alphaSort(a.make, b.make), sorter: (a, b) => alphaSort(a.make, b.make),
sortOrder: state.sortedInfo.columnKey === "make" && state.sortedInfo.order sortOrder:
state.sortedInfo.columnKey === "make" && state.sortedInfo.order,
}, },
{ {
title: t("courtesycars.fields.model"), title: t("courtesycars.fields.model"),
@@ -54,7 +57,7 @@ export default function ContractsCarsComponent({
key: "model", key: "model",
sorter: (a, b) => alphaSort(a.model, b.model), sorter: (a, b) => alphaSort(a.model, b.model),
sortOrder: sortOrder:
state.sortedInfo.columnKey === "model" && state.sortedInfo.order state.sortedInfo.columnKey === "model" && state.sortedInfo.order,
}, },
{ {
title: t("courtesycars.fields.plate"), title: t("courtesycars.fields.plate"),
@@ -62,8 +65,8 @@ export default function ContractsCarsComponent({
key: "plate", key: "plate",
sorter: (a, b) => alphaSort(a.plate, b.plate), sorter: (a, b) => alphaSort(a.plate, b.plate),
sortOrder: sortOrder:
state.sortedInfo.columnKey === "plate" && state.sortedInfo.order state.sortedInfo.columnKey === "plate" && state.sortedInfo.order,
} },
]; ];
const handleTableChange = (pagination, filters, sorter) => { const handleTableChange = (pagination, filters, sorter) => {
@@ -74,7 +77,7 @@ export default function ContractsCarsComponent({
state.search === "" state.search === ""
? data ? data
: data.filter( : data.filter(
cc => (cc) =>
(cc.fleetnumber || "") (cc.fleetnumber || "")
.toLowerCase() .toLowerCase()
.includes(state.search.toLowerCase()) || .includes(state.search.toLowerCase()) ||
@@ -100,19 +103,19 @@ export default function ContractsCarsComponent({
<Input.Search <Input.Search
placeholder={t("general.labels.search")} placeholder={t("general.labels.search")}
value={state.search} value={state.search}
onChange={e => setState({ ...state, search: e.target.value })} onChange={(e) => setState({ ...state, search: e.target.value })}
/> />
)} )}
size="small" size="small"
pagination={{ position: "top" }} pagination={{ position: "top" }}
columns={columns.map(item => ({ ...item }))} columns={columns.map((item) => ({ ...item }))}
rowKey="id" rowKey="id"
dataSource={filteredData} dataSource={filteredData}
onChange={handleTableChange} onChange={handleTableChange}
rowSelection={{ rowSelection={{
onSelect: handleSelect, onSelect: handleSelect,
type: "radio", type: "radio",
selectedRowKeys: [selectedCar] selectedRowKeys: [selectedCar],
}} }}
/> />
); );

View File

@@ -1,241 +1,255 @@
import React, { useState } from "react"; import { DatePicker, Form, Input, InputNumber } from "antd";
import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Form, Input, DatePicker, InputNumber, Button } from "antd";
import aamva from "../../utils/aamva";
import InputPhone from "../form-items-formatted/phone-form-item.component";
import ContractStatusSelector from "../contract-status-select/contract-status-select.component"; import ContractStatusSelector from "../contract-status-select/contract-status-select.component";
import InputPhone from "../form-items-formatted/phone-form-item.component";
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
export default function ContractFormComponent() { export default function ContractFormComponent({ form }) {
const [state, setState] = useState("");
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<div> <div>
<div style={{ background: "#f00" }}> <LayoutFormRow>
TEST AREA <Form.Item
<Input.TextArea label={t("contracts.fields.status")}
//value={state} name="status"
rows={3} rules={[
onPressEnter={(e) => { {
console.log("e", e); required: true,
setState(e.target.value); message: t("general.validation.required"),
}} },
/> ]}
<Button >
onClick={() => { <ContractStatusSelector />
var res = aamva.parse(state); </Form.Item>
console.log("Entire object", res); <Form.Item
}}> label={t("contracts.fields.start")}
Decode name="start"
</Button> rules={[
</div> {
required: true,
message: t("general.validation.required"),
},
]}
>
<DatePicker />
</Form.Item>
<Form.Item
label={t("contracts.fields.scheduledreturn")}
name="scheduledreturn"
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}
>
<DatePicker />
</Form.Item>
<Form.Item
label={t("contracts.fields.actualreturn")}
name="actualreturn"
>
<DatePicker />
</Form.Item>
</LayoutFormRow>
<Form.Item <LayoutFormRow>
label={t("contracts.fields.status")} <Form.Item
name='status' label={t("contracts.fields.kmstart")}
rules={[ name="kmstart"
{ rules={[
required: true, {
message: t("general.validation.required"), required: true,
}, message: t("general.validation.required"),
]}> },
<ContractStatusSelector /> ]}
</Form.Item> >
<Form.Item <InputNumber />
label={t("contracts.fields.start")} </Form.Item>
name='start' <Form.Item label={t("contracts.fields.kmend")} name="kmend">
rules={[ <InputNumber />
{ </Form.Item>
required: true, </LayoutFormRow>
message: t("general.validation.required"), <LayoutFormRow>
}, <Form.Item
]}> label={t("contracts.fields.driver_dlnumber")}
<DatePicker /> name="driver_dlnumber"
</Form.Item> rules={[
<Form.Item {
label={t("contracts.fields.scheduledreturn")} required: true,
name='scheduledreturn' message: t("general.validation.required"),
rules={[ },
{ ]}
required: true, >
message: t("general.validation.required"), <Input />
}, </Form.Item>
]}> <Form.Item
<DatePicker /> label={t("contracts.fields.driver_dlexpiry")}
</Form.Item> name="driver_dlexpiry"
<Form.Item label={t("contracts.fields.actualreturn")} name='actualreturn'> rules={[
<DatePicker /> {
</Form.Item> required: true,
<Form.Item message: t("general.validation.required"),
label={t("contracts.fields.kmstart")} },
name='kmstart' ]}
rules={[ >
{ <DatePicker />
required: true, </Form.Item>
message: t("general.validation.required"), <Form.Item
}, label={t("contracts.fields.driver_dlst")}
]}> name="driver_dlst"
<InputNumber /> rules={[
</Form.Item> {
<Form.Item label={t("contracts.fields.kmend")} name='kmend'> required: true,
<InputNumber /> message: t("general.validation.required"),
</Form.Item> },
<Form.Item ]}
label={t("contracts.fields.driver_dlnumber")} >
name='driver_dlnumber' <Input />
rules={[ </Form.Item>
{ <Form.Item
required: true, label={t("contracts.fields.driver_fn")}
message: t("general.validation.required"), name="driver_fn"
}, rules={[
]}> {
<Input /> required: true,
</Form.Item> message: t("general.validation.required"),
<Form.Item },
label={t("contracts.fields.driver_dlexpiry")} ]}
name='driver_dlexpiry' >
rules={[ <Input />
{ </Form.Item>
required: true, <Form.Item
message: t("general.validation.required"), label={t("contracts.fields.driver_ln")}
}, name="driver_ln"
]}> rules={[
<DatePicker /> {
</Form.Item> required: true,
<Form.Item message: t("general.validation.required"),
label={t("contracts.fields.driver_dlst")} },
name='driver_dlst' ]}
rules={[ >
{ <Input />
required: true, </Form.Item>
message: t("general.validation.required"), <Form.Item
}, label={t("contracts.fields.driver_addr1")}
]}> name="driver_addr1"
<Input /> rules={[
</Form.Item> {
<Form.Item required: true,
label={t("contracts.fields.driver_fn")} message: t("general.validation.required"),
name='driver_fn' },
rules={[ ]}
{ >
required: true, <Input />
message: t("general.validation.required"), </Form.Item>
}, <Form.Item
]}> label={t("contracts.fields.driver_addr2")}
<Input /> name="driver_addr2"
</Form.Item> >
<Form.Item <Input />
label={t("contracts.fields.driver_ln")} </Form.Item>
name='driver_ln' <Form.Item
rules={[ label={t("contracts.fields.driver_city")}
{ name="driver_city"
required: true, rules={[
message: t("general.validation.required"), {
}, required: true,
]}> message: t("general.validation.required"),
<Input /> },
</Form.Item> ]}
<Form.Item >
label={t("contracts.fields.driver_addr1")} <Input />
name='driver_addr1' </Form.Item>
rules={[ <Form.Item
{ label={t("contracts.fields.driver_state")}
required: true, name="driver_state"
message: t("general.validation.required"), rules={[
}, {
]}> required: true,
<Input /> message: t("general.validation.required"),
</Form.Item> },
<Form.Item label={t("contracts.fields.driver_addr2")} name='driver_addr2'> ]}
<Input /> >
</Form.Item> <Input />
<Form.Item </Form.Item>
label={t("contracts.fields.driver_city")} <Form.Item
name='driver_city' label={t("contracts.fields.driver_zip")}
rules={[ name="driver_zip"
{ rules={[
required: true, {
message: t("general.validation.required"), required: true,
}, message: t("general.validation.required"),
]}> },
<Input /> ]}
</Form.Item> >
<Form.Item <Input />
label={t("contracts.fields.driver_state")} </Form.Item>
name='driver_state' <Form.Item
rules={[ label={t("contracts.fields.driver_ph1")}
{ name="driver_ph1"
required: true, rules={[
message: t("general.validation.required"), {
}, required: true,
]}> message: t("general.validation.required"),
<Input /> },
</Form.Item> ]}
<Form.Item >
label={t("contracts.fields.driver_zip")} <InputPhone />
name='driver_zip' </Form.Item>
rules={[ <Form.Item
{ label={t("contracts.fields.driver_dob")}
required: true, name="driver_dob"
message: t("general.validation.required"), rules={[
}, {
]}> required: true,
<Input /> message: t("general.validation.required"),
</Form.Item> },
<Form.Item ]}
label={t("contracts.fields.driver_ph1")} >
name='driver_ph1' <DatePicker />
rules={[ </Form.Item>
{ </LayoutFormRow>
required: true,
message: t("general.validation.required"), <LayoutFormRow>
}, <Form.Item
]}> label={t("contracts.fields.cc_num")}
<InputPhone /> name="cc_num"
</Form.Item> rules={[
<Form.Item {
label={t("contracts.fields.driver_dob")} required: true,
name='driver_dob' message: t("general.validation.required"),
rules={[ },
{ ]}
required: true, >
message: t("general.validation.required"), <Input />
}, </Form.Item>
]}> <Form.Item
<DatePicker /> label={t("contracts.fields.cc_expiry")}
</Form.Item> name="cc_expiry"
<Form.Item rules={[
label={t("contracts.fields.cc_num")} {
name='cc_num' required: true,
rules={[ message: t("general.validation.required"),
{ },
required: true, ]}
message: t("general.validation.required"), >
}, <Input />
]}> </Form.Item>
<Input /> <Form.Item
</Form.Item> label={t("contracts.fields.cc_cardholder")}
<Form.Item name="cc_cardholder"
label={t("contracts.fields.cc_expiry")} rules={[
name='cc_expiry' {
rules={[ required: true,
{ message: t("general.validation.required"),
required: true, },
message: t("general.validation.required"), ]}
}, >
]}> <Input />
<Input /> </Form.Item>
</Form.Item> </LayoutFormRow>
<Form.Item
label={t("contracts.fields.cc_cardholder")}
name='cc_cardholder'
rules={[
{
required: true,
message: t("general.validation.required"),
},
]}>
<Input />
</Form.Item>
</div> </div>
); );
} }

View File

@@ -0,0 +1,120 @@
import { Button, Input, Modal, Typography } from "antd";
import moment from "moment";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import aamva from "../../utils/aamva";
import aamva_npm from "aamva";
import DataLabel from "../data-label/data-label.component";
import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component";
export default function ContractLicenseDecodeButton({ form }) {
const { t } = useTranslation();
const [modalVisible, setModalVisible] = useState(false);
const [loading, setLoading] = useState(false);
const [decodedBarcode, setDecodedBarcode] = useState(null);
console.log("form", form);
const handleDecode = (e) => {
setLoading(true);
const aamvaParse = aamva.parse(e.currentTarget.value);
console.log("AAMVA", aamvaParse);
setDecodedBarcode(aamvaParse);
setLoading(false);
};
const handleInsertForm = () => {
const values = {
driver_dlnumber: decodedBarcode.dl,
driver_dlexpiry: moment(
`20${decodedBarcode.expiration_date}${moment(
decodedBarcode.birthday
).format("DD")}`
),
driver_dlst: decodedBarcode.state,
driver_fn: decodedBarcode.name.first,
driver_ln: decodedBarcode.name.last,
driver_addr1: decodedBarcode.address,
driver_city: decodedBarcode.city,
driver_state: decodedBarcode.state,
driver_zip: decodedBarcode.postal_code,
driver_dob: moment(decodedBarcode.birthday),
};
form.setFieldsValue(values);
setModalVisible(false);
setDecodedBarcode(null);
};
const handleClick = () => {
setModalVisible(true);
};
const handleCancel = () => {
setModalVisible(false);
};
return (
<div>
<Modal
visible={modalVisible}
okText={t("contracts.actions.senddltoform")}
onOk={handleInsertForm}
okButtonProps={{ disabled: !!!decodedBarcode }}
onCancel={handleCancel}
>
<div>
<div>
<Input
autoFocus
allowClear
onChange={(e) => {
if (!loading) setLoading(true);
}}
onPressEnter={handleDecode}
/>
</div>
<LoadingSkeleton loading={loading}>
{decodedBarcode ? (
<div>
<DataLabel label={t("contracts.fields.driver_dlst")}>
{decodedBarcode.state}
</DataLabel>
<DataLabel label={t("contracts.fields.driver_dlnumber")}>
{decodedBarcode.dl}
</DataLabel>
<DataLabel label={t("contracts.fields.driver_fn")}>
{decodedBarcode.name.first}
</DataLabel>
<DataLabel label={t("contracts.fields.driver_ln")}>
{decodedBarcode.name.last}
</DataLabel>
<DataLabel label={t("contracts.fields.driver_addr1")}>
{decodedBarcode.address}
</DataLabel>
<DataLabel label={t("contracts.fields.driver_addr2")}>
{decodedBarcode.address}
</DataLabel>
<DataLabel label={t("contracts.fields.driver_dlexpiry")}>
{moment(
`20${decodedBarcode.expiration_date}${moment(
decodedBarcode.birthday
).format("DD")}`
).format("MM/DD/YYYY")}
</DataLabel>
<DataLabel label={t("contracts.fields.driver_dob")}>
{moment(decodedBarcode.birthday).format("MM/DD/YYYY")}
</DataLabel>
<div>
<Typography.Title level={4}>
{t("contracts.labels.correctdataonform")}
</Typography.Title>
</div>
</div>
) : (
<div>{t("contracts.labels.waitingforscan")}</div>
)}
</LoadingSkeleton>
</div>
</Modal>
<Button onClick={handleClick}>
{t("contracts.actions.decodelicense")}
</Button>
</div>
);
}

View File

@@ -1,13 +1,14 @@
import React from "react";
import ContractFormComponent from "../../components/contract-form/contract-form.component";
import { Button } from "antd"; import { Button } from "antd";
import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import ContractJobsContainer from "../../components/contract-jobs/contract-jobs.container";
import ContractCarsContainer from "../../components/contract-cars/contract-cars.container"; import ContractCarsContainer from "../../components/contract-cars/contract-cars.container";
import ContractFormComponent from "../../components/contract-form/contract-form.component";
import ContractJobsContainer from "../../components/contract-jobs/contract-jobs.container";
import ContractLicenseDecodeButton from "../../components/contract-license-decode-button/contract-license-decode-button.component";
export default function ContractCreatePageComponent({ export default function ContractCreatePageComponent({
form,
selectedJobState, selectedJobState,
selectedCarState selectedCarState,
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
@@ -15,7 +16,8 @@ export default function ContractCreatePageComponent({
<Button htmlType="submit">{t("general.actions.create")}</Button> <Button htmlType="submit">{t("general.actions.create")}</Button>
<ContractJobsContainer selectedJobState={selectedJobState} /> <ContractJobsContainer selectedJobState={selectedJobState} />
<ContractCarsContainer selectedCarState={selectedCarState} /> <ContractCarsContainer selectedCarState={selectedCarState} />
<ContractFormComponent /> <ContractLicenseDecodeButton form={form} />
<ContractFormComponent form={form} />
</div> </div>
); );
} }

View File

@@ -29,8 +29,6 @@ export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs }) {
); );
const [insertContract] = useMutation(INSERT_NEW_CONTRACT); const [insertContract] = useMutation(INSERT_NEW_CONTRACT);
console.log("test");
const handleFinish = (values) => { const handleFinish = (values) => {
if (!!selectedCarState[0] && !!selectedJobState[0]) { if (!!selectedCarState[0] && !!selectedJobState[0]) {
insertContract({ insertContract({
@@ -81,8 +79,14 @@ export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs }) {
}, [t, setBreadcrumbs]); }, [t, setBreadcrumbs]);
return ( return (
<Form form={form} autoComplete="no" onFinish={handleFinish}> <Form
form={form}
layout="vertical"
autoComplete="no"
onFinish={handleFinish}
>
<ContractCreatePageComponent <ContractCreatePageComponent
form={form}
selectedJobState={selectedJobState} selectedJobState={selectedJobState}
selectedCarState={selectedCarState} selectedCarState={selectedCarState}
/> />

View File

@@ -7,9 +7,9 @@ import ContractFormComponent from "../../components/contract-form/contract-form.
import ContractJobBlock from "../../components/contract-job-block/contract-job-block.component"; import ContractJobBlock from "../../components/contract-job-block/contract-job-block.component";
import { setModalContext } from "../../redux/modals/modals.actions"; import { setModalContext } from "../../redux/modals/modals.actions";
const mapDispatchToProps = dispatch => ({ const mapDispatchToProps = (dispatch) => ({
setCourtesyCarReturnModalContext: context => setCourtesyCarReturnModalContext: (context) =>
dispatch(setModalContext({ context: context, modal: "courtesyCarReturn" })) dispatch(setModalContext({ context: context, modal: "courtesyCarReturn" })),
}); });
export function ContractDetailPage({ export function ContractDetailPage({
@@ -17,27 +17,30 @@ export function ContractDetailPage({
job, job,
courtesyCar, courtesyCar,
setCourtesyCarReturnModalContext, setCourtesyCarReturnModalContext,
refetch refetch,
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<div> <div>
<Row align="middle"> <Row align="middle">
<Typography.Title>{`Agreement ${(contract && <Typography.Title>{`Agreement ${
contract.agreementnumber) || (contract && contract.agreementnumber) || ""
""} - ${t((contract && contract.status) || "")}`}</Typography.Title> } - ${t((contract && contract.status) || "")}`}</Typography.Title>
<Button type="primary" htmlType="submit"> <Button type="primary" htmlType="submit">
{t("general.actions.save")} {t("general.actions.save")}
</Button> </Button>
<Button <Button
disabled={contract && contract.status !== "contracts.status.out"} disabled={
!!!contract ||
(contract && contract.status !== "contracts.status.out")
}
onClick={() => { onClick={() => {
setCourtesyCarReturnModalContext({ setCourtesyCarReturnModalContext({
actions: { refetch }, actions: { refetch },
context: { context: {
contractId: contract.id, contractId: contract.id,
courtesyCarId: courtesyCar.id courtesyCarId: courtesyCar.id,
} },
}); });
}} }}
> >

View File

@@ -65,7 +65,7 @@ export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem }) {
`/manage/courtesycars/contracts/${contractId}` `/manage/courtesycars/contracts/${contractId}`
) )
); );
}, [t, data, error, loading, setBreadcrumbs, addRecentItem]); }, [t, data, error, loading, setBreadcrumbs, addRecentItem, contractId]);
const handleFinish = (values) => { const handleFinish = (values) => {
updateContract({ updateContract({
@@ -92,6 +92,7 @@ export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem }) {
<Form <Form
form={form} form={form}
autoComplete="no" autoComplete="no"
layout='vertical'
onFinish={handleFinish} onFinish={handleFinish}
initialValues={ initialValues={
data data

View File

@@ -60,7 +60,7 @@ export function CourtesyCarDetailPageContainer({
`/manage/courtesycars/${ccId}` `/manage/courtesycars/${ccId}`
) )
); );
}, [t, data, error, loading, setBreadcrumbs, addRecentItem]); }, [t, data, error, loading, setBreadcrumbs, ccId, addRecentItem]);
const handleFinish = (values) => { const handleFinish = (values) => {
insertCourtesyCar({ insertCourtesyCar({

View File

@@ -183,6 +183,10 @@
} }
}, },
"contracts": { "contracts": {
"actions": {
"decodelicense": "Decode License",
"senddltoform": "Insert Driver's License Information"
},
"errors": { "errors": {
"returning": "Error returning courtesy car. {{error}}", "returning": "Error returning courtesy car. {{error}}",
"saving": "Error saving contract. {{error}}", "saving": "Error saving contract. {{error}}",
@@ -213,6 +217,10 @@
"start": "Contract Start", "start": "Contract Start",
"status": "Status" "status": "Status"
}, },
"labels": {
"correctdataonform": "Please review the information above. If any of it is not correct, you can fix it later.",
"waitingforscan": "Please scan driver's license barcode..."
},
"status": { "status": {
"new": "New Contract", "new": "New Contract",
"out": "Out", "out": "Out",

View File

@@ -183,6 +183,10 @@
} }
}, },
"contracts": { "contracts": {
"actions": {
"decodelicense": "",
"senddltoform": ""
},
"errors": { "errors": {
"returning": "", "returning": "",
"saving": "", "saving": "",
@@ -213,6 +217,10 @@
"start": " ", "start": " ",
"status": "" "status": ""
}, },
"labels": {
"correctdataonform": "",
"waitingforscan": ""
},
"status": { "status": {
"new": "", "new": "",
"out": "", "out": "",

View File

@@ -183,6 +183,10 @@
} }
}, },
"contracts": { "contracts": {
"actions": {
"decodelicense": "",
"senddltoform": ""
},
"errors": { "errors": {
"returning": "", "returning": "",
"saving": "", "saving": "",
@@ -213,6 +217,10 @@
"start": "", "start": "",
"status": "" "status": ""
}, },
"labels": {
"correctdataonform": "",
"waitingforscan": ""
},
"status": { "status": {
"new": "", "new": "",
"out": "", "out": "",

View File

@@ -85,15 +85,17 @@
restrictions: res3[6], restrictions: res3[6],
endorsments: res3[7], endorsments: res3[7],
sex: (function () { sex: (function () {
switch (Number(res3[8])) { switch (res3[8]) {
case 1: case "1":
case "M":
return "MALE"; return "MALE";
case 2: case "2":
case "F":
return "FEMALE"; return "FEMALE";
default: default:
return "MISSING/INVALID"; return res3[8] + ": MISSING/INVALID";
} }
})(), })(),
height: res3[9], height: res3[9],