Package update modifications & IO-2192 Add ability to preselect make and model when creating a job.
This commit is contained in:
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"eslint.workingDirectories": ["./client", "./"],
|
||||||
"xml.fileAssociations": [
|
"xml.fileAssociations": [
|
||||||
{
|
{
|
||||||
"pattern": "**/Test.xml",
|
"pattern": "**/Test.xml",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@apollo/client": "^3.7.9",
|
"@apollo/client": "^3.7.9",
|
||||||
"@asseinfo/react-kanban": "^2.2.0",
|
"@asseinfo/react-kanban": "^2.2.0",
|
||||||
"@craco/craco": "^6.4.5",
|
"@craco/craco": "^7.0.0",
|
||||||
"@fingerprintjs/fingerprintjs": "^3.3.3",
|
"@fingerprintjs/fingerprintjs": "^3.3.3",
|
||||||
"@jsreport/browser-client": "^3.1.0",
|
"@jsreport/browser-client": "^3.1.0",
|
||||||
"@sentry/react": "^7.40.0",
|
"@sentry/react": "^7.40.0",
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
"antd": "^4.24.8",
|
"antd": "^4.24.8",
|
||||||
"apollo-link-logger": "^2.0.1",
|
"apollo-link-logger": "^2.0.1",
|
||||||
"axios": "^1.3.4",
|
"axios": "^1.3.4",
|
||||||
"craco-less": "^1.20.0",
|
"craco-less": "^2.0.0",
|
||||||
"dinero.js": "^1.9.1",
|
"dinero.js": "^1.9.1",
|
||||||
"dotenv": "^16.0.1",
|
"dotenv": "^16.0.1",
|
||||||
"enquire-js": "^0.2.1",
|
"enquire-js": "^0.2.1",
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
"phone": "^3.1.35",
|
"phone": "^3.1.35",
|
||||||
"preval.macro": "^5.0.0",
|
"preval.macro": "^5.0.0",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"query-string": "^8.1.0",
|
"query-string": "^7.1.3",
|
||||||
"rc-queue-anim": "^2.0.0",
|
"rc-queue-anim": "^2.0.0",
|
||||||
"rc-scroll-anim": "^2.7.6",
|
"rc-scroll-anim": "^2.7.6",
|
||||||
"react": "^17.0.2",
|
"react": "^17.0.2",
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
"react-redux": "^8.0.5",
|
"react-redux": "^8.0.5",
|
||||||
"react-resizable": "^3.0.4",
|
"react-resizable": "^3.0.4",
|
||||||
"react-router-dom": "^5.3.0",
|
"react-router-dom": "^5.3.0",
|
||||||
"react-scripts": "^4.0.3",
|
"react-scripts": "^5.0.1",
|
||||||
"react-sticky": "^6.0.3",
|
"react-sticky": "^6.0.3",
|
||||||
"react-sublime-video": "^0.2.5",
|
"react-sublime-video": "^0.2.5",
|
||||||
"react-virtualized": "^9.22.3",
|
"react-virtualized": "^9.22.3",
|
||||||
|
|||||||
@@ -9,7 +9,11 @@ const colSpan = {
|
|||||||
lg: { span: 12 },
|
lg: { span: 12 },
|
||||||
};
|
};
|
||||||
|
|
||||||
export default function JobsCreateVehicleInfoComponent({ loading, vehicles }) {
|
export default function JobsCreateVehicleInfoComponent({
|
||||||
|
loading,
|
||||||
|
vehicles,
|
||||||
|
form,
|
||||||
|
}) {
|
||||||
const [state, setState] = useContext(JobCreateContext);
|
const [state, setState] = useContext(JobCreateContext);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
return (
|
return (
|
||||||
@@ -58,7 +62,7 @@ export default function JobsCreateVehicleInfoComponent({ loading, vehicles }) {
|
|||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
<Col {...colSpan}>
|
<Col {...colSpan}>
|
||||||
<JobsCreateVehicleInfoNewComponent />
|
<JobsCreateVehicleInfoNewComponent form={form}/>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ export default function JobsCreateVehicleInfoContainer({ form }) {
|
|||||||
<JobsCreateVehicleInfoComponent
|
<JobsCreateVehicleInfoComponent
|
||||||
loading={loading}
|
loading={loading}
|
||||||
vehicles={data ? data.search_vehicles : null}
|
vehicles={data ? data.search_vehicles : null}
|
||||||
|
form={form}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,9 @@ import { useTranslation } from "react-i18next";
|
|||||||
import JobCreateContext from "../../pages/jobs-create/jobs-create.context";
|
import JobCreateContext from "../../pages/jobs-create/jobs-create.context";
|
||||||
import FormDatePicker from "../form-date-picker/form-date-picker.component";
|
import FormDatePicker from "../form-date-picker/form-date-picker.component";
|
||||||
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
import JobsCreateVehicleInfoPredefined from "./jobs-create-vehicle-info.predefined.component";
|
||||||
|
|
||||||
export default function JobsCreateVehicleInfoNewComponent() {
|
export default function JobsCreateVehicleInfoNewComponent({ form }) {
|
||||||
const [state] = useContext(JobCreateContext);
|
const [state] = useContext(JobCreateContext);
|
||||||
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -25,7 +26,7 @@ export default function JobsCreateVehicleInfoNewComponent() {
|
|||||||
<Input disabled={!state.vehicle.new} />
|
<Input disabled={!state.vehicle.new} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
<LayoutFormRow grow>
|
<LayoutFormRow grow noDivider>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("vehicles.fields.v_color")}
|
label={t("vehicles.fields.v_color")}
|
||||||
name={["vehicle", "data", "v_color"]}
|
name={["vehicle", "data", "v_color"]}
|
||||||
@@ -52,8 +53,9 @@ export default function JobsCreateVehicleInfoNewComponent() {
|
|||||||
</Form.Item>
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
|
|
||||||
<LayoutFormRow grow>
|
<LayoutFormRow grow noDivider>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
|
span={10}
|
||||||
label={t("vehicles.fields.v_make_desc")}
|
label={t("vehicles.fields.v_make_desc")}
|
||||||
name={["vehicle", "data", "v_make_desc"]}
|
name={["vehicle", "data", "v_make_desc"]}
|
||||||
rules={[
|
rules={[
|
||||||
@@ -66,6 +68,7 @@ export default function JobsCreateVehicleInfoNewComponent() {
|
|||||||
<Input disabled={!state.vehicle.new} />
|
<Input disabled={!state.vehicle.new} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
|
span={11}
|
||||||
label={t("vehicles.fields.v_model_desc")}
|
label={t("vehicles.fields.v_model_desc")}
|
||||||
name={["vehicle", "data", "v_model_desc"]}
|
name={["vehicle", "data", "v_model_desc"]}
|
||||||
rules={[
|
rules={[
|
||||||
@@ -77,6 +80,7 @@ export default function JobsCreateVehicleInfoNewComponent() {
|
|||||||
>
|
>
|
||||||
<Input disabled={!state.vehicle.new} />
|
<Input disabled={!state.vehicle.new} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
<JobsCreateVehicleInfoPredefined form={form} span={1} />
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
|
|
||||||
<LayoutFormRow header={t("vehicles.forms.registration")} grow>
|
<LayoutFormRow header={t("vehicles.forms.registration")} grow>
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
import { PlusOutlined, SearchOutlined } from "@ant-design/icons";
|
||||||
|
import { Button, Input, Popover, Table } from "antd";
|
||||||
|
import React, { useState } from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import PredefinedVehicles from "./predefined-vehicles.json";
|
||||||
|
|
||||||
|
export default function JobsCreateVehicleInfoPredefined({ form }) {
|
||||||
|
const [open, setOpen] = useState(false);
|
||||||
|
const [search, setSearch] = useState("");
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const handleOpenChange = (newOpen) => {
|
||||||
|
setOpen(newOpen);
|
||||||
|
setSearch("");
|
||||||
|
};
|
||||||
|
const filteredPredefinedVehicles =
|
||||||
|
search === ""
|
||||||
|
? PredefinedVehicles
|
||||||
|
: PredefinedVehicles.filter((v) =>
|
||||||
|
v.make
|
||||||
|
.toLowerCase()
|
||||||
|
.includes(
|
||||||
|
search.toLowerCase() ||
|
||||||
|
v.model.toLowerCase().includes(search.toLowerCase())
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const popContent = () => (
|
||||||
|
<div>
|
||||||
|
<Table
|
||||||
|
title={() => <Input.Search onSearch={(value) => setSearch(value)} />}
|
||||||
|
dataSource={filteredPredefinedVehicles}
|
||||||
|
columns={[
|
||||||
|
{
|
||||||
|
dataIndex: "make",
|
||||||
|
key: "make",
|
||||||
|
title: t("vehicles.fields.v_make_desc"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataIndex: "model",
|
||||||
|
key: "model",
|
||||||
|
title: t("vehicles.fields.v_model_desc"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
dataIndex: "select",
|
||||||
|
key: "select",
|
||||||
|
title: t("general.labels.actions"),
|
||||||
|
render: (value, record) => (
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
form.setFieldsValue({
|
||||||
|
vehicle: {
|
||||||
|
data: {
|
||||||
|
v_make_desc: record.make,
|
||||||
|
v_model_desc: record.model,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
setOpen(false);
|
||||||
|
setSearch("");
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<PlusOutlined />
|
||||||
|
</Button>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
return (
|
||||||
|
<Popover
|
||||||
|
content={popContent}
|
||||||
|
trigger="click"
|
||||||
|
open={open}
|
||||||
|
placement="left"
|
||||||
|
onOpenChange={handleOpenChange}
|
||||||
|
destroyTooltipOnHide
|
||||||
|
>
|
||||||
|
<SearchOutlined style={{ cursor: "pointer" }} />
|
||||||
|
</Popover>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
[
|
||||||
|
{ "make": "Toyota", "model": "Camry" },
|
||||||
|
{ "make": "Volkswagen", "model": "Golf" }
|
||||||
|
]
|
||||||
@@ -5,7 +5,7 @@ import { useTranslation } from "react-i18next";
|
|||||||
import { logImEXEvent } from "../../firebase/firebase.utils";
|
import { logImEXEvent } from "../../firebase/firebase.utils";
|
||||||
import cleanAxios from "../../utils/CleanAxios";
|
import cleanAxios from "../../utils/CleanAxios";
|
||||||
import formatBytes from "../../utils/formatbytes";
|
import formatBytes from "../../utils/formatbytes";
|
||||||
import yauzl from "yauzl";
|
//import yauzl from "yauzl";
|
||||||
import { useTreatments } from "@splitsoftware/splitio-react";
|
import { useTreatments } from "@splitsoftware/splitio-react";
|
||||||
|
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
@@ -69,44 +69,44 @@ export function JobsDocumentsDownloadButton({
|
|||||||
setDownload(null);
|
setDownload(null);
|
||||||
if (Direct_Media_Download.treatment === "on") {
|
if (Direct_Media_Download.treatment === "on") {
|
||||||
try {
|
try {
|
||||||
const parentDir = await window.showDirectoryPicker({
|
// const parentDir = await window.showDirectoryPicker({
|
||||||
id: "media",
|
// id: "media",
|
||||||
startIn: "downloads",
|
// startIn: "downloads",
|
||||||
});
|
// });
|
||||||
|
|
||||||
const directory = await parentDir.getDirectoryHandle(identifier, {
|
// const directory = await parentDir.getDirectoryHandle(identifier, {
|
||||||
create: true,
|
// create: true,
|
||||||
});
|
// });
|
||||||
|
|
||||||
yauzl.fromBuffer(
|
// yauzl.fromBuffer(
|
||||||
Buffer.from(theDownloadedZip.data),
|
// Buffer.from(theDownloadedZip.data),
|
||||||
{},
|
// {},
|
||||||
(err, zipFile) => {
|
// (err, zipFile) => {
|
||||||
if (err) throw err;
|
// if (err) throw err;
|
||||||
zipFile.on("entry", (entry) => {
|
// zipFile.on("entry", (entry) => {
|
||||||
zipFile.openReadStream(entry, async (readErr, readStream) => {
|
// zipFile.openReadStream(entry, async (readErr, readStream) => {
|
||||||
if (readErr) {
|
// if (readErr) {
|
||||||
zipFile.close();
|
// zipFile.close();
|
||||||
throw readErr;
|
// throw readErr;
|
||||||
}
|
// }
|
||||||
if (err) throw err;
|
// if (err) throw err;
|
||||||
let fileSystemHandle = await directory.getFileHandle(
|
// let fileSystemHandle = await directory.getFileHandle(
|
||||||
entry.fileName,
|
// entry.fileName,
|
||||||
{
|
// {
|
||||||
create: true,
|
// create: true,
|
||||||
}
|
// }
|
||||||
);
|
// );
|
||||||
const writable = await fileSystemHandle.createWritable();
|
// const writable = await fileSystemHandle.createWritable();
|
||||||
readStream.on("data", async function (chunk) {
|
// readStream.on("data", async function (chunk) {
|
||||||
await writable.write(chunk);
|
// await writable.write(chunk);
|
||||||
});
|
// });
|
||||||
readStream.on("end", async function () {
|
// readStream.on("end", async function () {
|
||||||
await writable.close();
|
// await writable.close();
|
||||||
});
|
// });
|
||||||
});
|
// });
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
);
|
// );
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
standardMediaDownload(theDownloadedZip.data);
|
standardMediaDownload(theDownloadedZip.data);
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export default function JobsCreateComponent({ form }) {
|
|||||||
const steps = [
|
const steps = [
|
||||||
{
|
{
|
||||||
title: t("jobs.labels.create.vehicleinfo"),
|
title: t("jobs.labels.create.vehicleinfo"),
|
||||||
content: <JobsCreateVehicleInfoContainer />,
|
content: <JobsCreateVehicleInfoContainer form={form} />,
|
||||||
validation:
|
validation:
|
||||||
!!state.vehicle.new ||
|
!!state.vehicle.new ||
|
||||||
!!state.vehicle.selectedid ||
|
!!state.vehicle.selectedid ||
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
import NumberFormat from "react-number-format";
|
import { NumericFormat } from "react-number-format";
|
||||||
|
|
||||||
export default function CurrencyFormatter(props) {
|
export default function CurrencyFormatter(props) {
|
||||||
return (
|
return (
|
||||||
<NumberFormat
|
<NumericFormat
|
||||||
thousandSeparator={true}
|
thousandSeparator={true}
|
||||||
decimalScale={2}
|
decimalScale={2}
|
||||||
fixedDecimalScale={true}
|
fixedDecimalScale={true}
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ middlewares.push(
|
|||||||
|
|
||||||
const cache = new InMemoryCache({});
|
const cache = new InMemoryCache({});
|
||||||
|
|
||||||
export default new ApolloClient({
|
const client = new ApolloClient({
|
||||||
link: ApolloLink.from(middlewares),
|
link: ApolloLink.from(middlewares),
|
||||||
cache,
|
cache,
|
||||||
connectToDevTools: process.env.NODE_ENV !== "production",
|
connectToDevTools: process.env.NODE_ENV !== "production",
|
||||||
@@ -161,3 +161,4 @@ export default new ApolloClient({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
export default client;
|
||||||
|
|||||||
9451
client/yarn.lock
9451
client/yarn.lock
File diff suppressed because it is too large
Load Diff
5634
package-lock.json
generated
5634
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user