Merged in release/2022-05-20 (pull request #486)
release/2022-05-20 Approved-by: Patrick Fic
This commit is contained in:
@@ -33533,6 +33533,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>removefrompartsqueue</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>returnpartsorder</name>
|
<name>returnpartsorder</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
@@ -44249,6 +44270,27 @@
|
|||||||
</translation>
|
</translation>
|
||||||
</translations>
|
</translations>
|
||||||
</concept_node>
|
</concept_node>
|
||||||
|
<concept_node>
|
||||||
|
<name>notes</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>plate_no</name>
|
<name>plate_no</name>
|
||||||
<definition_loaded>false</definition_loaded>
|
<definition_loaded>false</definition_loaded>
|
||||||
|
|||||||
@@ -4,54 +4,54 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"proxy": "http://localhost:4000",
|
"proxy": "http://localhost:4000",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@apollo/client": "^3.5.10",
|
"@apollo/client": "^3.6.2",
|
||||||
"@asseinfo/react-kanban": "^2.2.0",
|
"@asseinfo/react-kanban": "^2.2.0",
|
||||||
"@craco/craco": "^6.4.3",
|
"@craco/craco": "^6.4.3",
|
||||||
"@fingerprintjs/fingerprintjs": "^3.3.3",
|
"@fingerprintjs/fingerprintjs": "^3.3.3",
|
||||||
"@sentry/react": "^6.19.6",
|
"@sentry/react": "^6.19.7",
|
||||||
"@sentry/tracing": "^6.19.6",
|
"@sentry/tracing": "^6.19.7",
|
||||||
"@splitsoftware/splitio-react": "^1.4.0",
|
"@splitsoftware/splitio-react": "^1.4.1",
|
||||||
"@stripe/react-stripe-js": "^1.7.1",
|
"@stripe/react-stripe-js": "^1.8.0",
|
||||||
"@stripe/stripe-js": "^1.27.0",
|
"@stripe/stripe-js": "^1.29.0",
|
||||||
"@tanem/react-nprogress": "^4.0.12",
|
"@tanem/react-nprogress": "^5.0.0",
|
||||||
"antd": "^4.19.5",
|
"antd": "^4.20.5",
|
||||||
"apollo-link-logger": "^2.0.0",
|
"apollo-link-logger": "^2.0.0",
|
||||||
"axios": "^0.26.1",
|
"axios": "^0.27.2",
|
||||||
"craco-less": "^1.20.0",
|
"craco-less": "^1.20.0",
|
||||||
"dinero.js": "^1.9.1",
|
"dinero.js": "^1.9.1",
|
||||||
"dotenv": "^16.0.0",
|
"dotenv": "^16.0.1",
|
||||||
"enquire-js": "^0.2.1",
|
"enquire-js": "^0.2.1",
|
||||||
"env-cmd": "^10.1.0",
|
"env-cmd": "^10.1.0",
|
||||||
"exifr": "^7.1.3",
|
"exifr": "^7.1.3",
|
||||||
"firebase": "^9.6.11",
|
"firebase": "^9.8.1",
|
||||||
"graphql": "^16.3.0",
|
"graphql": "^16.5.0",
|
||||||
"i18next": "^21.6.16",
|
"i18next": "^21.8.2",
|
||||||
"i18next-browser-languagedetector": "^6.1.4",
|
"i18next-browser-languagedetector": "^6.1.4",
|
||||||
"jsoneditor": "^9.7.4",
|
"jsoneditor": "^9.7.4",
|
||||||
"jsreport-browser-client-dist": "^1.3.0",
|
"jsreport-browser-client-dist": "^1.3.0",
|
||||||
"libphonenumber-js": "^1.9.51",
|
"libphonenumber-js": "^1.9.53",
|
||||||
"logrocket": "^2.2.1",
|
"logrocket": "^3.0.0",
|
||||||
"markerjs2": "^2.21.1",
|
"markerjs2": "^2.21.4",
|
||||||
"moment-business-days": "^1.2.0",
|
"moment-business-days": "^1.2.0",
|
||||||
"moment-timezone": "^0.5.34",
|
"moment-timezone": "^0.5.34",
|
||||||
"normalize-url": "^7.0.3",
|
"normalize-url": "^7.0.3",
|
||||||
"phone": "^3.1.15",
|
"phone": "^3.1.17",
|
||||||
"preval.macro": "^5.0.0",
|
"preval.macro": "^5.0.0",
|
||||||
"prop-types": "^15.8.1",
|
"prop-types": "^15.8.1",
|
||||||
"query-string": "^7.1.1",
|
"query-string": "^7.1.1",
|
||||||
"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",
|
||||||
"react-big-calendar": "^0.38.2",
|
"react-big-calendar": "^0.40.1",
|
||||||
"react-color": "^2.19.3",
|
"react-color": "^2.19.3",
|
||||||
"react-cookie": "^4.1.1",
|
"react-cookie": "^4.1.1",
|
||||||
"react-dom": "^17.0.2",
|
"react-dom": "^17.0.2",
|
||||||
"react-drag-listview": "^0.1.9",
|
"react-drag-listview": "^0.2.0",
|
||||||
"react-grid-gallery": "^0.5.5",
|
"react-grid-gallery": "^0.5.5",
|
||||||
"react-grid-layout": "^1.3.4",
|
"react-grid-layout": "^1.3.4",
|
||||||
"react-i18next": "^11.16.6",
|
"react-i18next": "^11.16.9",
|
||||||
"react-icons": "^4.3.1",
|
"react-icons": "^4.3.1",
|
||||||
"react-number-format": "^4.9.1",
|
"react-number-format": "^4.9.3",
|
||||||
"react-redux": "^7.2.8",
|
"react-redux": "^7.2.8",
|
||||||
"react-resizable": "^3.0.4",
|
"react-resizable": "^3.0.4",
|
||||||
"react-router-dom": "^5.3.0",
|
"react-router-dom": "^5.3.0",
|
||||||
@@ -60,28 +60,28 @@
|
|||||||
"react-sublime-video": "^0.2.5",
|
"react-sublime-video": "^0.2.5",
|
||||||
"react-virtualized": "^9.22.3",
|
"react-virtualized": "^9.22.3",
|
||||||
"recharts": "^2.1.9",
|
"recharts": "^2.1.9",
|
||||||
"redux": "^4.1.2",
|
"redux": "^4.2.0",
|
||||||
"redux-persist": "^6.0.0",
|
"redux-persist": "^6.0.0",
|
||||||
"redux-saga": "^1.1.3",
|
"redux-saga": "^1.1.3",
|
||||||
"redux-state-sync": "^3.1.2",
|
"redux-state-sync": "^3.1.2",
|
||||||
"reselect": "^4.1.5",
|
"reselect": "^4.1.5",
|
||||||
"sass": "^1.50.0",
|
"sass": "^1.51.0",
|
||||||
"socket.io-client": "^4.4.1",
|
"socket.io-client": "^4.5.0",
|
||||||
"styled-components": "^5.3.5",
|
"styled-components": "^5.3.5",
|
||||||
"subscriptions-transport-ws": "^0.11.0",
|
"subscriptions-transport-ws": "^0.11.0",
|
||||||
"web-vitals": "^2.1.4",
|
"web-vitals": "^2.1.4",
|
||||||
"workbox-background-sync": "^6.5.2",
|
"workbox-background-sync": "^6.5.3",
|
||||||
"workbox-broadcast-update": "^6.5.2",
|
"workbox-broadcast-update": "^6.5.3",
|
||||||
"workbox-cacheable-response": "^6.5.2",
|
"workbox-cacheable-response": "^6.5.3",
|
||||||
"workbox-core": "^6.5.2",
|
"workbox-core": "^6.5.3",
|
||||||
"workbox-expiration": "^6.5.2",
|
"workbox-expiration": "^6.5.3",
|
||||||
"workbox-google-analytics": "^6.5.2",
|
"workbox-google-analytics": "^6.5.3",
|
||||||
"workbox-navigation-preload": "^6.5.2",
|
"workbox-navigation-preload": "^6.5.3",
|
||||||
"workbox-precaching": "^6.5.2",
|
"workbox-precaching": "^6.5.3",
|
||||||
"workbox-range-requests": "^6.5.2",
|
"workbox-range-requests": "^6.5.3",
|
||||||
"workbox-routing": "^6.5.2",
|
"workbox-routing": "^6.5.3",
|
||||||
"workbox-strategies": "^6.5.2",
|
"workbox-strategies": "^6.5.3",
|
||||||
"workbox-streams": "^6.5.2",
|
"workbox-streams": "^6.5.3",
|
||||||
"yauzl": "^2.10.0"
|
"yauzl": "^2.10.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -118,11 +118,11 @@
|
|||||||
"react-error-overlay": "6.0.9"
|
"react-error-overlay": "6.0.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@sentry/webpack-plugin": "^1.18.8",
|
"@sentry/webpack-plugin": "^1.18.9",
|
||||||
"@testing-library/cypress": "^8.0.2",
|
"@testing-library/cypress": "^8.0.2",
|
||||||
"cypress": "^9.5.3",
|
"cypress": "^9.6.1",
|
||||||
"eslint-plugin-cypress": "^2.12.1",
|
"eslint-plugin-cypress": "^2.12.1",
|
||||||
"react-error-overlay": "6.0.10",
|
"react-error-overlay": "6.0.11",
|
||||||
"redux-logger": "^3.0.6",
|
"redux-logger": "^3.0.6",
|
||||||
"source-map-explorer": "^2.5.2"
|
"source-map-explorer": "^2.5.2"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,15 +16,18 @@ export function JobsDetailChangeFilehandler({ disabled, form, bodyshop }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const menu = (
|
const menu = (
|
||||||
<div>
|
<Menu
|
||||||
<Menu onClick={handleClick}>
|
onClick={handleClick}
|
||||||
{bodyshop.md_filehandlers.map((est, idx) => (
|
style={{
|
||||||
<Menu.Item value={est} key={idx}>
|
columnCount: Math.floor(bodyshop.md_filehandlers.length / 10) + 1,
|
||||||
{`${est.ins_ct_fn} ${est.ins_ct_ln}`}
|
}}
|
||||||
</Menu.Item>
|
>
|
||||||
))}
|
{bodyshop.md_filehandlers.map((est, idx) => (
|
||||||
</Menu>
|
<Menu.Item value={est} key={idx} style={{ breakInside: "avoid" }}>
|
||||||
</div>
|
{`${est.ins_ct_fn} ${est.ins_ct_ln}`}
|
||||||
|
</Menu.Item>
|
||||||
|
))}
|
||||||
|
</Menu>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -216,6 +216,22 @@ export function JobsDetailHeader({ job, bodyshop, disabled }) {
|
|||||||
<DataLabel label={t("jobs.labels.relatedros")}>
|
<DataLabel label={t("jobs.labels.relatedros")}>
|
||||||
<JobsRelatedRos jobid={job.id} job={job} />
|
<JobsRelatedRos jobid={job.id} job={job} />
|
||||||
</DataLabel>
|
</DataLabel>
|
||||||
|
{job.vehicle && job.vehicle.notes && (
|
||||||
|
<DataLabel label={t("vehicles.fields.notes")}>
|
||||||
|
<span style={{ whiteSpace: "pre" }}>{job.vehicle.notes}</span>
|
||||||
|
</DataLabel>
|
||||||
|
)}
|
||||||
|
{
|
||||||
|
// job.vehicle && job.vehicle.v_paint_codes && (
|
||||||
|
// <DataLabel label={t("vehicles.fields.v_paint_codes")}>
|
||||||
|
// <span style={{ whiteSpace: "pre" }}>
|
||||||
|
// {Object.keys(job.vehicle.v_paint_codes).map((key, idx) => (
|
||||||
|
// <Tag key={idx}>{job.vehicle.v_paint_codes[key]}</Tag>
|
||||||
|
// ))}
|
||||||
|
// </span>
|
||||||
|
// </DataLabel>
|
||||||
|
// )
|
||||||
|
}
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
</Col>
|
</Col>
|
||||||
|
|||||||
@@ -61,7 +61,9 @@ export function JobNotesContainer({ jobId, insertAuditTrail }) {
|
|||||||
jobId={jobId}
|
jobId={jobId}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
data={data ? data.jobs_by_pk.notes : null}
|
data={data ? data.jobs_by_pk.notes : null}
|
||||||
relatedRos={data ? data.jobs_by_pk.vehicle.jobs : null}
|
relatedRos={
|
||||||
|
data ? data.jobs_by_pk.vehicle && data.jobs_by_pk.vehicle.jobs : null
|
||||||
|
}
|
||||||
refetch={refetch}
|
refetch={refetch}
|
||||||
deleteLoading={deleteLoading}
|
deleteLoading={deleteLoading}
|
||||||
handleNoteDelete={handleNoteDelete}
|
handleNoteDelete={handleNoteDelete}
|
||||||
|
|||||||
@@ -72,13 +72,9 @@ export function NoteUpsertModalContainer({
|
|||||||
toggleModalVisible();
|
toggleModalVisible();
|
||||||
} else {
|
} else {
|
||||||
logImEXEvent("job_note_insert");
|
logImEXEvent("job_note_insert");
|
||||||
const AdditionalNoteInserts = Object.keys(relatedros).filter(
|
const AdditionalNoteInserts = relatedros
|
||||||
(key) => relatedros[key]
|
? Object.keys(relatedros).filter((key) => relatedros[key])
|
||||||
);
|
: [];
|
||||||
console.log(
|
|
||||||
"🚀 ~ file: note-upsert-modal.container.jsx ~ line 78 ~ handleFinish ~ AdditionalNoteInserts",
|
|
||||||
AdditionalNoteInserts
|
|
||||||
);
|
|
||||||
|
|
||||||
await insertNote({
|
await insertNote({
|
||||||
variables: {
|
variables: {
|
||||||
|
|||||||
@@ -22,9 +22,17 @@ export function NotesPresetButton({ bodyshop, form }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const menu = (
|
const menu = (
|
||||||
<Menu>
|
<Menu
|
||||||
|
style={{
|
||||||
|
columnCount: Math.floor(bodyshop.md_notes_presets.length / 10) + 1,
|
||||||
|
}}
|
||||||
|
>
|
||||||
{bodyshop.md_notes_presets.map((i, idx) => (
|
{bodyshop.md_notes_presets.map((i, idx) => (
|
||||||
<Menu.Item onClick={() => handleSelect(i)} key={idx}>
|
<Menu.Item
|
||||||
|
onClick={() => handleSelect(i)}
|
||||||
|
key={idx}
|
||||||
|
style={{ breakInside: "avoid" }}
|
||||||
|
>
|
||||||
{i.label}
|
{i.label}
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import {
|
|||||||
Select,
|
Select,
|
||||||
Menu,
|
Menu,
|
||||||
Dropdown,
|
Dropdown,
|
||||||
|
Checkbox,
|
||||||
} from "antd";
|
} from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
@@ -114,6 +115,15 @@ export function PartsOrderModalComponent({
|
|||||||
</Space>
|
</Space>
|
||||||
</Tag>
|
</Tag>
|
||||||
)}
|
)}
|
||||||
|
{!isReturn && (
|
||||||
|
<Form.Item
|
||||||
|
name="removefrompartsqueue"
|
||||||
|
label={t("parts_orders.labels.removefrompartsqueue")}
|
||||||
|
valuePropName="checked"
|
||||||
|
>
|
||||||
|
<Checkbox />
|
||||||
|
</Form.Item>
|
||||||
|
)}
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
<Divider orientation="left">
|
<Divider orientation="left">
|
||||||
{t("parts_orders.labels.inthisorder")}
|
{t("parts_orders.labels.inthisorder")}
|
||||||
@@ -280,6 +290,7 @@ export function PartsOrderModalComponent({
|
|||||||
>
|
>
|
||||||
<Input.TextArea rows={3} />
|
<Input.TextArea rows={3} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<Radio.Group
|
<Radio.Group
|
||||||
defaultValue={sendType}
|
defaultValue={sendType}
|
||||||
onChange={(e) => setSendType(e.target.value)}
|
onChange={(e) => setSendType(e.target.value)}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import PartsOrderModalComponent from "./parts-order-modal.component";
|
|||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import { useTreatments } from "@splitsoftware/splitio-react";
|
import { useTreatments } from "@splitsoftware/splitio-react";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
|
import { UPDATE_JOB } from "../../graphql/jobs.queries";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
currentUser: selectCurrentUser,
|
currentUser: selectCurrentUser,
|
||||||
@@ -90,8 +91,9 @@ export function PartsOrderModalContainer({
|
|||||||
|
|
||||||
const [insertPartOrder] = useMutation(INSERT_NEW_PARTS_ORDERS);
|
const [insertPartOrder] = useMutation(INSERT_NEW_PARTS_ORDERS);
|
||||||
const [updateJobLines] = useMutation(UPDATE_JOB_LINE_STATUS);
|
const [updateJobLines] = useMutation(UPDATE_JOB_LINE_STATUS);
|
||||||
|
const [updateJob] = useMutation(UPDATE_JOB);
|
||||||
|
|
||||||
const handleFinish = async (values) => {
|
const handleFinish = async ({ removefrompartsqueue, ...values }) => {
|
||||||
logImEXEvent("parts_order_insert");
|
logImEXEvent("parts_order_insert");
|
||||||
setSaving(true);
|
setSaving(true);
|
||||||
const insertResult = await insertPartOrder({
|
const insertResult = await insertPartOrder({
|
||||||
@@ -128,6 +130,17 @@ export function PartsOrderModalContainer({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (!isReturn && removefrompartsqueue) {
|
||||||
|
await updateJob({
|
||||||
|
variables: {
|
||||||
|
jobId: jobId,
|
||||||
|
job: {
|
||||||
|
queued_for_parts: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
insertAuditTrail({
|
insertAuditTrail({
|
||||||
jobid: jobId,
|
jobid: jobId,
|
||||||
operation: isReturn
|
operation: isReturn
|
||||||
|
|||||||
@@ -8,8 +8,11 @@ import { connect } from "react-redux";
|
|||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { useApolloClient } from "@apollo/client";
|
import { useApolloClient, useQuery } from "@apollo/client";
|
||||||
import { GET_BLOCKED_DAYS } from "../../graphql/scoreboard.queries";
|
import {
|
||||||
|
GET_BLOCKED_DAYS,
|
||||||
|
QUERY_SCOREBOARD,
|
||||||
|
} from "../../graphql/scoreboard.queries";
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
//currentUser: selectCurrentUser
|
//currentUser: selectCurrentUser
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -22,10 +25,15 @@ export default connect(
|
|||||||
mapDispatchToProps
|
mapDispatchToProps
|
||||||
)(ScoreboardDisplayComponent);
|
)(ScoreboardDisplayComponent);
|
||||||
|
|
||||||
export function ScoreboardDisplayComponent({
|
export function ScoreboardDisplayComponent({ bodyshop }) {
|
||||||
bodyshop,
|
const scoreboardSubscription = useQuery(QUERY_SCOREBOARD, {
|
||||||
scoreboardSubscription,
|
variables: {
|
||||||
}) {
|
start: moment().startOf("month"),
|
||||||
|
end: moment().endOf("month"),
|
||||||
|
},
|
||||||
|
pollInterval: 60000,
|
||||||
|
});
|
||||||
|
|
||||||
const { data } = scoreboardSubscription;
|
const { data } = scoreboardSubscription;
|
||||||
const client = useApolloClient();
|
const client = useApolloClient();
|
||||||
const scoreBoardlist = (data && data.scoreboard) || [];
|
const scoreBoardlist = (data && data.scoreboard) || [];
|
||||||
|
|||||||
@@ -139,6 +139,9 @@ export default function VehicleDetailFormComponent({ form, loading }) {
|
|||||||
<Input />
|
<Input />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</LayoutFormRow>
|
</LayoutFormRow>
|
||||||
|
<Form.Item label={t("vehicles.fields.notes")} name="notes">
|
||||||
|
<Input.TextArea rows={4} />
|
||||||
|
</Form.Item>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,13 +75,9 @@ export const QUERY_PARTS_QUEUE = gql`
|
|||||||
v_make_desc
|
v_make_desc
|
||||||
v_color
|
v_color
|
||||||
vehicleid
|
vehicleid
|
||||||
actual_completion
|
scheduled_in
|
||||||
actual_delivery
|
|
||||||
actual_in
|
|
||||||
id
|
id
|
||||||
clm_no
|
clm_no
|
||||||
clm_total
|
|
||||||
owner_owing
|
|
||||||
ro_number
|
ro_number
|
||||||
status
|
status
|
||||||
updated_at
|
updated_at
|
||||||
@@ -534,6 +530,8 @@ export const GET_JOB_BY_PK = gql`
|
|||||||
v_model_desc
|
v_model_desc
|
||||||
v_make_desc
|
v_make_desc
|
||||||
v_color
|
v_color
|
||||||
|
notes
|
||||||
|
v_paint_codes
|
||||||
jobs {
|
jobs {
|
||||||
id
|
id
|
||||||
ro_number
|
ro_number
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { gql } from "@apollo/client";
|
import { gql } from "@apollo/client";
|
||||||
|
|
||||||
export const SUBSCRIPTION_SCOREBOARD = gql`
|
export const QUERY_SCOREBOARD = gql`
|
||||||
subscription SUBSCRIPTION_SCOREBOARD($start: date!, $end: date!) {
|
query QUERY_SCOREBOARD($start: date!, $end: date!) {
|
||||||
scoreboard(
|
scoreboard(
|
||||||
where: { _and: { date: { _gte: $start, _lte: $end } } }
|
where: { _and: { date: { _gte: $start, _lte: $end } } }
|
||||||
order_by: { date: asc }
|
order_by: { date: asc }
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export const QUERY_VEHICLE_BY_ID = gql`
|
|||||||
v_bstyle
|
v_bstyle
|
||||||
updated_at
|
updated_at
|
||||||
trim_color
|
trim_color
|
||||||
|
notes
|
||||||
jobs {
|
jobs {
|
||||||
id
|
id
|
||||||
ro_number
|
ro_number
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import OwnerNameDisplay from "../../components/owner-name-display/owner-name-dis
|
|||||||
import { QUERY_PARTS_QUEUE } from "../../graphql/jobs.queries";
|
import { QUERY_PARTS_QUEUE } from "../../graphql/jobs.queries";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import { onlyUnique } from "../../utils/arrayHelper";
|
import { onlyUnique } from "../../utils/arrayHelper";
|
||||||
import { TimeAgoFormatter } from "../../utils/DateFormatter";
|
import { DateTimeFormatter, TimeAgoFormatter } from "../../utils/DateFormatter";
|
||||||
import { alphaSort, dateSort } from "../../utils/sorters";
|
import { alphaSort, dateSort } from "../../utils/sorters";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
@@ -158,6 +158,17 @@ export function PartsQueuePageComponent({ bodyshop }) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: t("jobs.fields.scheduled_in"),
|
||||||
|
dataIndex: "scheduled_in",
|
||||||
|
key: "scheduled_in",
|
||||||
|
ellipsis: true,
|
||||||
|
sorter: (a, b) => dateSort(a.scheduled_in, b.scheduled_in),
|
||||||
|
sortOrder: sortcolumn === "scheduled_in" && sortorder,
|
||||||
|
render: (text, record) => (
|
||||||
|
<DateTimeFormatter>{record.scheduled_in}</DateTimeFormatter>
|
||||||
|
),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.vehicle"),
|
title: t("jobs.fields.vehicle"),
|
||||||
dataIndex: "vehicle",
|
dataIndex: "vehicle",
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ export function PhonebookPageComponent({ bodyshop, authLevel }) {
|
|||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
delete searchParams.search;
|
delete searchParams.search;
|
||||||
|
searchParams.page = 1;
|
||||||
history.push({ search: queryString.stringify(searchParams) });
|
history.push({ search: queryString.stringify(searchParams) });
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -2,17 +2,14 @@ import React, { useEffect } from "react";
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component";
|
||||||
|
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
|
||||||
|
import ScoreboardDisplay from "../../components/scoreboard-display/scoreboard-display.component";
|
||||||
import {
|
import {
|
||||||
setBreadcrumbs,
|
setBreadcrumbs,
|
||||||
setSelectedHeader,
|
setSelectedHeader,
|
||||||
} from "../../redux/application/application.actions";
|
} from "../../redux/application/application.actions";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import ScoreboardDisplay from "../../components/scoreboard-display/scoreboard-display.component";
|
|
||||||
import { useSubscription } from "@apollo/client";
|
|
||||||
import { SUBSCRIPTION_SCOREBOARD } from "../../graphql/scoreboard.queries";
|
|
||||||
import moment from "moment";
|
|
||||||
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
|
|
||||||
import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component";
|
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -26,13 +23,6 @@ const mapDispatchToProps = (dispatch) => ({
|
|||||||
export function ScoreboardContainer({ setBreadcrumbs, setSelectedHeader }) {
|
export function ScoreboardContainer({ setBreadcrumbs, setSelectedHeader }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const scoreboardSubscription = useSubscription(SUBSCRIPTION_SCOREBOARD, {
|
|
||||||
variables: {
|
|
||||||
start: moment().startOf("month"),
|
|
||||||
end: moment().endOf("month"),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
document.title = t("titles.scoreboard");
|
document.title = t("titles.scoreboard");
|
||||||
setSelectedHeader("scoreboard");
|
setSelectedHeader("scoreboard");
|
||||||
@@ -47,7 +37,7 @@ export function ScoreboardContainer({ setBreadcrumbs, setSelectedHeader }) {
|
|||||||
return (
|
return (
|
||||||
<FeatureWrapper featureName="scoreboard">
|
<FeatureWrapper featureName="scoreboard">
|
||||||
<RbacWrapper action="scoreboard:view">
|
<RbacWrapper action="scoreboard:view">
|
||||||
<ScoreboardDisplay scoreboardSubscription={scoreboardSubscription} />
|
<ScoreboardDisplay />
|
||||||
</RbacWrapper>
|
</RbacWrapper>
|
||||||
</FeatureWrapper>
|
</FeatureWrapper>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1980,6 +1980,7 @@
|
|||||||
"parts_orders": "Parts Orders",
|
"parts_orders": "Parts Orders",
|
||||||
"print": "Show Printed Form",
|
"print": "Show Printed Form",
|
||||||
"receive": "Receive Parts Order",
|
"receive": "Receive Parts Order",
|
||||||
|
"removefrompartsqueue": "Remove from Parts Queue?",
|
||||||
"returnpartsorder": "Return Parts Order"
|
"returnpartsorder": "Return Parts Order"
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
@@ -2633,6 +2634,7 @@
|
|||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"description": "Vehicle Description",
|
"description": "Vehicle Description",
|
||||||
|
"notes": "Vehicle Notes",
|
||||||
"plate_no": "License Plate",
|
"plate_no": "License Plate",
|
||||||
"plate_st": "Plate Jurisdiction",
|
"plate_st": "Plate Jurisdiction",
|
||||||
"trim_color": "Trim Color",
|
"trim_color": "Trim Color",
|
||||||
|
|||||||
@@ -1980,6 +1980,7 @@
|
|||||||
"parts_orders": "",
|
"parts_orders": "",
|
||||||
"print": "Mostrar formulario impreso",
|
"print": "Mostrar formulario impreso",
|
||||||
"receive": "",
|
"receive": "",
|
||||||
|
"removefrompartsqueue": "",
|
||||||
"returnpartsorder": ""
|
"returnpartsorder": ""
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
@@ -2633,6 +2634,7 @@
|
|||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"description": "Descripcion del vehiculo",
|
"description": "Descripcion del vehiculo",
|
||||||
|
"notes": "",
|
||||||
"plate_no": "Placa",
|
"plate_no": "Placa",
|
||||||
"plate_st": "Jurisdicción de placas",
|
"plate_st": "Jurisdicción de placas",
|
||||||
"trim_color": "Recortar color",
|
"trim_color": "Recortar color",
|
||||||
|
|||||||
@@ -1980,6 +1980,7 @@
|
|||||||
"parts_orders": "",
|
"parts_orders": "",
|
||||||
"print": "Afficher le formulaire imprimé",
|
"print": "Afficher le formulaire imprimé",
|
||||||
"receive": "",
|
"receive": "",
|
||||||
|
"removefrompartsqueue": "",
|
||||||
"returnpartsorder": ""
|
"returnpartsorder": ""
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
@@ -2633,6 +2634,7 @@
|
|||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
"description": "Description du véhicule",
|
"description": "Description du véhicule",
|
||||||
|
"notes": "",
|
||||||
"plate_no": "Plaque d'immatriculation",
|
"plate_no": "Plaque d'immatriculation",
|
||||||
"plate_st": "Juridiction de la plaque",
|
"plate_st": "Juridiction de la plaque",
|
||||||
"trim_color": "Couleur de garniture",
|
"trim_color": "Couleur de garniture",
|
||||||
|
|||||||
1264
client/yarn.lock
1264
client/yarn.lock
File diff suppressed because it is too large
Load Diff
@@ -4925,60 +4925,62 @@
|
|||||||
- active:
|
- active:
|
||||||
_eq: true
|
_eq: true
|
||||||
columns:
|
columns:
|
||||||
- id
|
|
||||||
- created_at
|
- created_at
|
||||||
- updated_at
|
|
||||||
- v_vin
|
|
||||||
- v_make_desc
|
|
||||||
- v_model_desc
|
|
||||||
- v_model_yr
|
|
||||||
- v_color
|
|
||||||
- v_paint_codes
|
|
||||||
- v_bstyle
|
|
||||||
- v_engine
|
|
||||||
- shopid
|
|
||||||
- db_v_code
|
- db_v_code
|
||||||
|
- id
|
||||||
|
- notes
|
||||||
- plate_no
|
- plate_no
|
||||||
- plate_st
|
- plate_st
|
||||||
- v_cond
|
- shopid
|
||||||
- v_prod_dt
|
|
||||||
- v_type
|
|
||||||
- v_trimcode
|
|
||||||
- trim_color
|
- trim_color
|
||||||
- v_mldgcode
|
- updated_at
|
||||||
- v_options
|
- v_bstyle
|
||||||
- v_tone
|
- v_color
|
||||||
- v_stage
|
- v_cond
|
||||||
|
- v_engine
|
||||||
|
- v_make_desc
|
||||||
- v_makecode
|
- v_makecode
|
||||||
|
- v_mldgcode
|
||||||
|
- v_model_desc
|
||||||
|
- v_model_yr
|
||||||
|
- v_options
|
||||||
|
- v_paint_codes
|
||||||
|
- v_prod_dt
|
||||||
|
- v_stage
|
||||||
|
- v_tone
|
||||||
|
- v_trimcode
|
||||||
|
- v_type
|
||||||
|
- v_vin
|
||||||
select_permissions:
|
select_permissions:
|
||||||
- role: user
|
- role: user
|
||||||
permission:
|
permission:
|
||||||
columns:
|
columns:
|
||||||
- v_paint_codes
|
- created_at
|
||||||
- db_v_code
|
- db_v_code
|
||||||
|
- id
|
||||||
|
- notes
|
||||||
- plate_no
|
- plate_no
|
||||||
- plate_st
|
- plate_st
|
||||||
|
- shopid
|
||||||
- trim_color
|
- trim_color
|
||||||
|
- updated_at
|
||||||
- v_bstyle
|
- v_bstyle
|
||||||
- v_color
|
- v_color
|
||||||
- v_cond
|
- v_cond
|
||||||
- v_engine
|
- v_engine
|
||||||
- v_makecode
|
|
||||||
- v_make_desc
|
- v_make_desc
|
||||||
|
- v_makecode
|
||||||
- v_mldgcode
|
- v_mldgcode
|
||||||
- v_model_desc
|
- v_model_desc
|
||||||
- v_model_yr
|
- v_model_yr
|
||||||
- v_options
|
- v_options
|
||||||
|
- v_paint_codes
|
||||||
- v_prod_dt
|
- v_prod_dt
|
||||||
- v_stage
|
- v_stage
|
||||||
- v_tone
|
- v_tone
|
||||||
- v_trimcode
|
- v_trimcode
|
||||||
- v_type
|
- v_type
|
||||||
- v_vin
|
- v_vin
|
||||||
- created_at
|
|
||||||
- updated_at
|
|
||||||
- id
|
|
||||||
- shopid
|
|
||||||
filter:
|
filter:
|
||||||
bodyshop:
|
bodyshop:
|
||||||
associations:
|
associations:
|
||||||
@@ -4993,31 +4995,32 @@
|
|||||||
- role: user
|
- role: user
|
||||||
permission:
|
permission:
|
||||||
columns:
|
columns:
|
||||||
- v_paint_codes
|
- created_at
|
||||||
- db_v_code
|
- db_v_code
|
||||||
|
- id
|
||||||
|
- notes
|
||||||
- plate_no
|
- plate_no
|
||||||
- plate_st
|
- plate_st
|
||||||
|
- shopid
|
||||||
- trim_color
|
- trim_color
|
||||||
|
- updated_at
|
||||||
- v_bstyle
|
- v_bstyle
|
||||||
- v_color
|
- v_color
|
||||||
- v_cond
|
- v_cond
|
||||||
- v_engine
|
- v_engine
|
||||||
- v_makecode
|
|
||||||
- v_make_desc
|
- v_make_desc
|
||||||
|
- v_makecode
|
||||||
- v_mldgcode
|
- v_mldgcode
|
||||||
- v_model_desc
|
- v_model_desc
|
||||||
- v_model_yr
|
- v_model_yr
|
||||||
- v_options
|
- v_options
|
||||||
|
- v_paint_codes
|
||||||
- v_prod_dt
|
- v_prod_dt
|
||||||
- v_stage
|
- v_stage
|
||||||
- v_tone
|
- v_tone
|
||||||
- v_trimcode
|
- v_trimcode
|
||||||
- v_type
|
- v_type
|
||||||
- v_vin
|
- v_vin
|
||||||
- created_at
|
|
||||||
- updated_at
|
|
||||||
- id
|
|
||||||
- shopid
|
|
||||||
filter:
|
filter:
|
||||||
bodyshop:
|
bodyshop:
|
||||||
associations:
|
associations:
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-- Could not auto-generate a down migration.
|
||||||
|
-- Please write an appropriate down migration for the SQL below:
|
||||||
|
-- alter table "public"."vehicles" add column "notes" text
|
||||||
|
-- null;
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
alter table "public"."vehicles" add column "notes" text
|
||||||
|
null;
|
||||||
30
package.json
30
package.json
@@ -4,7 +4,7 @@
|
|||||||
"license": "UNLICENSED",
|
"license": "UNLICENSED",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16.0.0",
|
"node": ">=16.0.0",
|
||||||
"npm": ">=7.0.0"
|
"npm": ">=8.0.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"setup": "yarn && cd client && yarn",
|
"setup": "yarn && cd client && yarn",
|
||||||
@@ -17,21 +17,21 @@
|
|||||||
"start": "node server.js"
|
"start": "node server.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"aws-sdk": "^2.1116.0",
|
"aws-sdk": "^2.1136.0",
|
||||||
"axios": "^0.24.0",
|
"axios": "^0.27.2",
|
||||||
"bluebird": "^3.7.2",
|
"bluebird": "^3.7.2",
|
||||||
"body-parser": "^1.20.0",
|
"body-parser": "^1.20.0",
|
||||||
"cloudinary": "^1.29.1",
|
"cloudinary": "^1.30.0",
|
||||||
"compression": "^1.7.4",
|
"compression": "^1.7.4",
|
||||||
"cookie-parser": "^1.4.6",
|
"cookie-parser": "^1.4.6",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
"csrf": "^3.1.0",
|
"csrf": "^3.1.0",
|
||||||
"dinero.js": "^1.9.1",
|
"dinero.js": "^1.9.1",
|
||||||
"dotenv": "10.0.0",
|
"dotenv": "16.0.1",
|
||||||
"express": "^4.17.3",
|
"express": "^4.18.1",
|
||||||
"firebase-admin": "^10.0.2",
|
"firebase-admin": "^10.2.0",
|
||||||
"graphql": "^16.3.0",
|
"graphql": "^16.5.0",
|
||||||
"graphql-request": "^3.7.0",
|
"graphql-request": "^4.2.0",
|
||||||
"graylog2": "^0.2.1",
|
"graylog2": "^0.2.1",
|
||||||
"inline-css": "^3.0.0",
|
"inline-css": "^3.0.0",
|
||||||
"intuit-oauth": "^4.0.0",
|
"intuit-oauth": "^4.0.0",
|
||||||
@@ -40,16 +40,16 @@
|
|||||||
"moment": "^2.29.3",
|
"moment": "^2.29.3",
|
||||||
"moment-timezone": "^0.5.34",
|
"moment-timezone": "^0.5.34",
|
||||||
"multer": "^1.4.4",
|
"multer": "^1.4.4",
|
||||||
"node-mailjet": "^3.3.10",
|
"node-mailjet": "^3.4.1",
|
||||||
"node-quickbooks": "^2.0.39",
|
"node-quickbooks": "^2.0.39",
|
||||||
"nodemailer": "^6.7.3",
|
"nodemailer": "^6.7.5",
|
||||||
"phone": "^3.1.15",
|
"phone": "^3.1.17",
|
||||||
"query-string": "^7.1.1",
|
"query-string": "^7.1.1",
|
||||||
"soap": "^0.43.0",
|
"soap": "^0.43.0",
|
||||||
"socket.io": "^4.4.1",
|
"socket.io": "^4.5.0",
|
||||||
"ssh2-sftp-client": "^8.0.0",
|
"ssh2-sftp-client": "^8.0.0",
|
||||||
"stripe": "^8.217.0",
|
"stripe": "^9.1.0",
|
||||||
"twilio": "^3.76.1",
|
"twilio": "^3.77.0",
|
||||||
"uuid": "^8.3.2",
|
"uuid": "^8.3.2",
|
||||||
"xml2js": "^0.4.23",
|
"xml2js": "^0.4.23",
|
||||||
"xmlbuilder2": "^3.0.2"
|
"xmlbuilder2": "^3.0.2"
|
||||||
|
|||||||
@@ -917,7 +917,10 @@ exports.GET_JOB_BY_PK = ` query GET_JOB_BY_PK($id: uuid!) {
|
|||||||
est_co_nm
|
est_co_nm
|
||||||
est_ct_fn
|
est_ct_fn
|
||||||
est_ct_ln
|
est_ct_ln
|
||||||
|
vehicle{
|
||||||
|
id
|
||||||
|
notes
|
||||||
|
}
|
||||||
est_ph1
|
est_ph1
|
||||||
est_ea
|
est_ea
|
||||||
selling_dealer
|
selling_dealer
|
||||||
|
|||||||
Reference in New Issue
Block a user