From 136d52ec0b9744f5fcf846dffd0b58c39cfda0f1 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Mon, 22 Jul 2024 14:47:44 -0400 Subject: [PATCH 01/28] - Merge Master, update packages. Signed-off-by: Dave Richer --- client/package-lock.json | 84 ++++++++++++++++++++-------------------- client/package.json | 10 ++--- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 371e2177e..b21c85190 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -44,12 +44,12 @@ "normalize-url": "^8.0.1", "object-hash": "^3.0.0", "prop-types": "^15.8.1", - "query-string": "^9.0.0", + "query-string": "^9.1.0", "raf-schd": "^4.0.3", "react": "^18.3.1", "react-big-calendar": "^1.13.1", "react-color": "^2.19.3", - "react-cookie": "^7.1.4", + "react-cookie": "^7.2.0", "react-dom": "^18.3.1", "react-drag-listview": "^2.0.0", "react-grid-gallery": "^1.0.1", @@ -67,10 +67,10 @@ "react-router-dom": "^6.25.1", "react-sticky": "^6.0.3", "react-virtualized": "^9.22.5", - "react-virtuoso": "^4.7.12", + "react-virtuoso": "^4.7.13", "recharts": "^2.12.7", "redux": "^5.0.1", - "redux-actions": "^3.0.0", + "redux-actions": "^3.0.3", "redux-persist": "^6.0.0", "redux-saga": "^1.3.0", "redux-state-sync": "^3.1.4", @@ -89,7 +89,7 @@ "@babel/preset-react": "^7.24.7", "@dotenvx/dotenvx": "^1.6.4", "@emotion/babel-plugin": "^11.12.0", - "@emotion/react": "^11.12.0", + "@emotion/react": "^11.13.0", "@sentry/webpack-plugin": "^2.21.1", "@testing-library/cypress": "^10.0.2", "browserslist": "^4.23.2", @@ -2792,14 +2792,14 @@ "dev": true }, "node_modules/@emotion/cache": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.12.0.tgz", - "integrity": "sha512-VFo/F1PthkxHwWDCcXkidyXw70eAkdiNiCzthMI2rRQjFiTvmXt8UDlv/VE1DTsd4CIEY2wQf5AnL2QiPgphlw==", + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.0.tgz", + "integrity": "sha512-hPV345J/tH0Cwk2wnU/3PBzORQ9HeX+kQSbwI+jslzpRCHE6fSGTohswksA/Ensr8znPzwfzKZCmAM9Lmlhp7g==", "dev": true, "dependencies": { "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.3.0", - "@emotion/utils": "^1.3.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } @@ -2840,17 +2840,17 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.12.0.tgz", - "integrity": "sha512-kTktYMpG8mHjLi8u6XOTMfDmQvUve/un2ZVj4khcU2KTn17ElMV8BK6QFzT8V/v2QW8013rf07Yc0ayQL3tp3w==", + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", + "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.12.0", - "@emotion/cache": "^11.12.0", - "@emotion/serialize": "^1.2.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.3.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, @@ -2864,15 +2864,15 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.2.0.tgz", - "integrity": "sha512-X5UWpZAhGGp5LOn7OAI9k9JjRtz7nSFhZypatADcuEd/0bECZ0DzVjPdL8hljTrAku8+TjFvWIYHMOCO/0v/Ng==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", + "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", "dev": true, "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.9.0", - "@emotion/utils": "^1.3.0", + "@emotion/utils": "^1.4.0", "csstype": "^3.0.2" } }, @@ -2895,9 +2895,9 @@ "dev": true }, "node_modules/@emotion/sheet": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.3.0.tgz", - "integrity": "sha512-vOPwbKw8fj/oSEa7CWqiKCvLZ1AeLIAApmboGP34xUyUjXalFyf+tMtgMDqP7VMevLPhUa+YWJS46cQUA+tr9A==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", "dev": true }, "node_modules/@emotion/unitless": { @@ -2906,18 +2906,18 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", "dev": true, "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.3.0.tgz", - "integrity": "sha512-+M7u4EaX5t4bCunKTltAdGis3NFHQniikLVEQ+rPQccsX/xV4v5Etwg12paioZ9DsO+CTvimtmnjZbW85kbF8Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==", "dev": true }, "node_modules/@emotion/weak-memoize": { @@ -14108,9 +14108,9 @@ } }, "node_modules/query-string": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.0.0.tgz", - "integrity": "sha512-4EWwcRGsO2H+yzq6ddHcVqkCQ2EFUSfDMEjF8ryp8ReymyZhIuaFRGLomeOQLkrzacMHoyky2HW0Qe30UbzkKw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.1.0.tgz", + "integrity": "sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==", "dependencies": { "decode-uri-component": "^0.4.1", "filter-obj": "^5.1.0", @@ -14823,9 +14823,9 @@ } }, "node_modules/react-cookie": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.1.4.tgz", - "integrity": "sha512-wDxxa/HYaSXSMlyWJvJ5uZTzIVtQTPf1gMksFgwAz/2/W3lCtY8r4OChCXMPE7wax0PAdMY97UkNJedGv7KnDw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.2.0.tgz", + "integrity": "sha512-mqhPERUyfOljq5yJ4woDFI33bjEtigsl8JDJdPPeNhr0eSVZmBc/2Vdf8mFxOUktQxhxTR1T+uF0/FRTZyBEgw==", "dependencies": { "@types/hoist-non-react-statics": "^3.3.5", "hoist-non-react-statics": "^3.3.2", @@ -15264,9 +15264,9 @@ } }, "node_modules/react-virtuoso": { - "version": "4.7.12", - "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.7.12.tgz", - "integrity": "sha512-q8yaykkVJGJbPNQH2Hgm82ik0LsbNGJpHMEjAGz5ibEsTVHKObs5WtEELAd1A99OKFHs091W1M+HN+1sasL08Q==", + "version": "4.7.13", + "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.7.13.tgz", + "integrity": "sha512-rabPhipwJ8rdA6TDk1vdVqVoU6eOkWukqoC1pNQVBCsvjBvIeJMi9nO079s0L7EsRzAxFFQNahX+8vuuY4F1Qg==", "engines": { "node": ">=10" }, @@ -15381,9 +15381,9 @@ "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" }, "node_modules/redux-actions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redux-actions/-/redux-actions-3.0.0.tgz", - "integrity": "sha512-5r+G8JizsTfyfWolVDkCLL2SpZA0Sk9ao2MXwfdXkG5+72s0PcO9qEqpo51D2o8dZY2gXLjNmY5yoRB+BuizRw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/redux-actions/-/redux-actions-3.0.3.tgz", + "integrity": "sha512-ca+ySXmXWrxDqtauRA6lQtjmRO8Z9Ruog3wbb8wDq4RVW9Y677Nl/AXoJPlxJqH0mpY9QGkg03NkAJwTcyN2pQ==", "dependencies": { "just-curry-it": "5.3.0", "reduce-reducers": "1.0.4" diff --git a/client/package.json b/client/package.json index 892ac7bf4..2764e72d0 100644 --- a/client/package.json +++ b/client/package.json @@ -44,12 +44,12 @@ "normalize-url": "^8.0.1", "object-hash": "^3.0.0", "prop-types": "^15.8.1", - "query-string": "^9.0.0", + "query-string": "^9.1.0", "raf-schd": "^4.0.3", "react": "^18.3.1", "react-big-calendar": "^1.13.1", "react-color": "^2.19.3", - "react-cookie": "^7.1.4", + "react-cookie": "^7.2.0", "react-dom": "^18.3.1", "react-drag-listview": "^2.0.0", "react-grid-gallery": "^1.0.1", @@ -67,10 +67,10 @@ "react-router-dom": "^6.25.1", "react-sticky": "^6.0.3", "react-virtualized": "^9.22.5", - "react-virtuoso": "^4.7.12", + "react-virtuoso": "^4.7.13", "recharts": "^2.12.7", "redux": "^5.0.1", - "redux-actions": "^3.0.0", + "redux-actions": "^3.0.3", "redux-persist": "^6.0.0", "redux-saga": "^1.3.0", "redux-state-sync": "^3.1.4", @@ -133,7 +133,7 @@ "@babel/preset-react": "^7.24.7", "@dotenvx/dotenvx": "^1.6.4", "@emotion/babel-plugin": "^11.12.0", - "@emotion/react": "^11.12.0", + "@emotion/react": "^11.13.0", "@sentry/webpack-plugin": "^2.21.1", "@testing-library/cypress": "^10.0.2", "browserslist": "^4.23.2", From 2a1ec4eff3f18a3af132c1cdd1104011d5586412 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Tue, 6 Aug 2024 09:15:37 -0700 Subject: [PATCH 02/28] IO-2861 Disable Editing of Vendor and Invoice Number when In House Signed-off-by: Allan Carr --- .../bill-detail-edit/bill-detail-edit-component.jsx | 7 ++++--- client/src/components/bill-form/bill-form.component.jsx | 7 ++++--- client/src/components/bill-form/bill-form.container.jsx | 3 ++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx b/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx index f5ce3d3d4..937ff9ce1 100644 --- a/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx +++ b/client/src/components/bill-detail-edit/bill-detail-edit-component.jsx @@ -1,6 +1,6 @@ +import { PageHeader } from "@ant-design/pro-layout"; import { useMutation, useQuery } from "@apollo/client"; import { Button, Divider, Form, Popconfirm, Space } from "antd"; -import dayjs from "../../utils/day"; import queryString from "query-string"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; @@ -13,6 +13,7 @@ import { insertAuditTrail } from "../../redux/application/application.actions"; import { setModalContext } from "../../redux/modals/modals.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; +import dayjs from "../../utils/day"; import AlertComponent from "../alert/alert.component"; import BillFormContainer from "../bill-form/bill-form.container"; import BillMarkExportedButton from "../bill-mark-exported-button/bill-mark-exported-button.component"; @@ -22,7 +23,6 @@ import JobDocumentsGallery from "../jobs-documents-gallery/jobs-documents-galler import JobsDocumentsLocalGallery from "../jobs-documents-local-gallery/jobs-documents-local-gallery.container"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import BillDetailEditReturn from "./bill-detail-edit-return.component"; -import { PageHeader } from "@ant-design/pro-layout"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop @@ -153,6 +153,7 @@ export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail if (!search.billid) return <>; //
{t("bills.labels.noneselected")}
; const exported = data && data.bills_by_pk && data.bills_by_pk.exported; + const isinhouse = data && data.bills_by_pk && data.bills_by_pk.isinhouse; return ( <> @@ -188,7 +189,7 @@ export function BillDetailEditcontainer({ setPartsOrderContext, insertAuditTrail } />
- + {t("general.labels.media")} {bodyshop.uselocalmediaserver ? ( - + Date: Tue, 6 Aug 2024 11:54:22 -0700 Subject: [PATCH 03/28] IO-2864 Adjust to LAET and LAUT adjustment to target both Rome and ProManager Signed-off-by: Allan Carr --- .../jobs-available-table.container.jsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/src/components/jobs-available-table/jobs-available-table.container.jsx b/client/src/components/jobs-available-table/jobs-available-table.container.jsx index 5e7681853..d9964d090 100644 --- a/client/src/components/jobs-available-table/jobs-available-table.container.jsx +++ b/client/src/components/jobs-available-table/jobs-available-table.container.jsx @@ -3,7 +3,6 @@ import { useSplitTreatments } from "@splitsoftware/splitio-react"; import { Col, Row, notification } from "antd"; import Axios from "axios"; import _ from "lodash"; -import dayjs from "../../utils/day"; import queryString from "query-string"; import React, { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -24,6 +23,8 @@ import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selecto import AuditTrailMapping from "../../utils/AuditTrailMappings"; import confirmDialog from "../../utils/asyncConfirm"; import CriticalPartsScan from "../../utils/criticalPartsScan"; +import dayjs from "../../utils/day"; +import InstanceRenderManager from "../../utils/instanceRenderMgr"; import AlertComponent from "../alert/alert.component"; import JobsAvailableScan from "../jobs-available-scan/jobs-available-scan.component"; import JobsFindModalContainer from "../jobs-find-modal/jobs-find-modal.container"; @@ -32,7 +33,6 @@ import OwnerFindModalContainer from "../owner-find-modal/owner-find-modal.contai import { GetSupplementDelta } from "./jobs-available-supplement.estlines.util"; import HeaderFields from "./jobs-available-supplement.headerfields"; import JobsAvailableTableComponent from "./jobs-available-table.component"; -import InstanceRenderManager from "../../utils/instanceRenderMgr"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -580,12 +580,13 @@ function ResolveCCCLineIssues(estData, bodyshop) { InstanceRenderManager({ executeFunction: true, args: [], - promanager: () => { + rome: () => { if (line.mod_lbr_ty === "LAET" || line.mod_lbr_ty === "LAUT") { // line.notes += ` | ET/UT Update (prev = ${line.mod_lbr_ty})`; line.mod_lbr_ty = "LAR"; } - } + }, + promanager: "USE_ROME" }); }); From 883043cde379ce594743f3a6ac598d370813d15a Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Tue, 6 Aug 2024 17:39:55 -0700 Subject: [PATCH 04/28] IO-2866 Add OP20 to masterdata Signed-off-by: Allan Carr --- .../1722990947416_add_op20_to_masterdata/down.sql | 9 +++++++++ .../1722990947416_add_op20_to_masterdata/up.sql | 7 +++++++ 2 files changed, 16 insertions(+) create mode 100644 hasura/migrations/1722990947416_add_op20_to_masterdata/down.sql create mode 100644 hasura/migrations/1722990947416_add_op20_to_masterdata/up.sql diff --git a/hasura/migrations/1722990947416_add_op20_to_masterdata/down.sql b/hasura/migrations/1722990947416_add_op20_to_masterdata/down.sql new file mode 100644 index 000000000..c9f184e41 --- /dev/null +++ b/hasura/migrations/1722990947416_add_op20_to_masterdata/down.sql @@ -0,0 +1,9 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- UPDATE "public"."masterdata" +-- SET value = jsonb_set( +-- value::jsonb, +-- '{OP20}', +-- '{"desc": "REMOVE AND REINSTALL", "opcode": "OP20", "partcode": "PAE"}'::jsonb, +-- true +-- ); diff --git a/hasura/migrations/1722990947416_add_op20_to_masterdata/up.sql b/hasura/migrations/1722990947416_add_op20_to_masterdata/up.sql new file mode 100644 index 000000000..583e21e05 --- /dev/null +++ b/hasura/migrations/1722990947416_add_op20_to_masterdata/up.sql @@ -0,0 +1,7 @@ +UPDATE "public"."masterdata" +SET value = jsonb_set( + value::jsonb, + '{OP20}', + '{"desc": "REMOVE AND REINSTALL", "opcode": "OP20", "partcode": "PAE"}'::jsonb, + true +); From 5d1f61753b2ecc12d39eef8294ac11c9ce9e715e Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Wed, 7 Aug 2024 10:36:00 -0400 Subject: [PATCH 05/28] - Add Tasks to production board (and required refactors) Signed-off-by: Dave Richer --- ...ard-kanban-card-color-legend.component.jsx | 0 ...production-board-kanban-card.component.jsx | 20 +++++- .../production-board-kanban.component.jsx | 15 ++--- .../production-board-kanban.statistics.jsx | 62 ++++++++----------- .../settings/InformationSettings.jsx | 3 +- .../settings/defaultKanbanSettings.js | 25 +++++++- ...uction-board-kanban.settings.component.jsx | 29 +++++---- .../trello-board/controllers/Lane.jsx | 2 +- client/src/graphql/jobs.queries.js | 5 ++ client/src/translations/en_us/common.json | 8 ++- client/src/translations/es/common.json | 8 ++- client/src/translations/fr/common.json | 8 ++- 12 files changed, 121 insertions(+), 64 deletions(-) rename client/src/components/{production-board-kanban-card => production-board-kanban}/production-board-kanban-card-color-legend.component.jsx (100%) rename client/src/components/{production-board-kanban-card => production-board-kanban}/production-board-kanban-card.component.jsx (96%) diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx b/client/src/components/production-board-kanban/production-board-kanban-card-color-legend.component.jsx similarity index 100% rename from client/src/components/production-board-kanban-card/production-board-kanban-card-color-legend.component.jsx rename to client/src/components/production-board-kanban/production-board-kanban-card-color-legend.component.jsx diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx b/client/src/components/production-board-kanban/production-board-kanban-card.component.jsx similarity index 96% rename from client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx rename to client/src/components/production-board-kanban/production-board-kanban-card.component.jsx index 4febb86c0..e3fe39ff8 100644 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban-card.component.jsx @@ -290,6 +290,22 @@ const PartsStatusComponent = ({ metadata, cardSettings }) => ); +const TasksToolTip = ({ metadata, cardSettings, t }) => + cardSettings?.tasks && ( + + + {metadata.tasks_aggregate?.aggregate?.count ? ( + `T: ${metadata.tasks_aggregate.aggregate.count}` + ) : ( + T: 0 + )} + + + ); + export default function ProductionBoardCard({ technician, card, bodyshop, cardSettings, clone }) { const { t } = useTranslation(); const { metadata } = card; @@ -336,7 +352,8 @@ export default function ProductionBoardCard({ technician, card, bodyshop, cardSe cardSettings?.production_note || cardSettings?.partsstatus || cardSettings?.estimator || - cardSettings?.subtotal + cardSettings?.subtotal || + cardSettings?.tasks ); }, [cardSettings]); @@ -393,6 +410,7 @@ export default function ProductionBoardCard({ technician, card, bodyshop, cardSe employee_csr={employee_csr} /> + diff --git a/client/src/components/production-board-kanban/production-board-kanban.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.component.jsx index afd0e94e1..62917e9bd 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx @@ -15,13 +15,13 @@ import AuditTrailMapping from "../../utils/AuditTrailMappings"; import IndefiniteLoading from "../indefinite-loading/indefinite-loading.component"; import ProductionBoardFilters from "../production-board-filters/production-board-filters.component"; import ProductionListDetailComponent from "../production-list-detail/production-list-detail.component"; -import CardColorLegend from "../production-board-kanban-card/production-board-kanban-card-color-legend.component"; +import CardColorLegend from "./production-board-kanban-card-color-legend.component.jsx"; import "./production-board-kanban.styles.scss"; import { createBoardData } from "./production-board-kanban.utils.js"; import ProductionBoardKanbanSettings from "./settings/production-board-kanban.settings.component.jsx"; import cloneDeep from "lodash/cloneDeep"; import isEqual from "lodash/isEqual"; -import { defaultKanbanSettings } from "./settings/defaultKanbanSettings.js"; +import { mergeWithDefaults } from "./settings/defaultKanbanSettings.js"; import NoteUpsertModal from "../../components/note-upsert-modal/note-upsert-modal.container"; const mapStateToProps = createStructuredSelector({ @@ -182,13 +182,10 @@ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTr [boardLanes, client, getCardByID, isMoving, t, insertAuditTrail] ); - const cardSettings = useMemo( - () => - associationSettings?.kanban_settings && Object.keys(associationSettings.kanban_settings).length > 0 - ? associationSettings.kanban_settings - : defaultKanbanSettings, - [associationSettings] - ); + const cardSettings = useMemo(() => { + const kanbanSettings = associationSettings?.kanban_settings; + return mergeWithDefaults(kanbanSettings); + }, [associationSettings]); const handleSettingsChange = useCallback((newSettings) => { setLoading(true); diff --git a/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx b/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx index 482ddb726..1af5ec59c 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.statistics.jsx @@ -2,11 +2,13 @@ import React, { useMemo } from "react"; import { Card, Statistic } from "antd"; import { useTranslation } from "react-i18next"; import PropTypes from "prop-types"; -import { statisticsItems, defaultKanbanSettings } from "./settings/defaultKanbanSettings.js"; +import { defaultKanbanSettings, statisticsItems } from "./settings/defaultKanbanSettings.js"; + export const StatisticType = { HOURS: "hours", AMOUNT: "amount", - JOBS: "jobs" + JOBS: "jobs", + TASKS: "tasks" }; const mergeStatistics = (items, values) => { @@ -122,6 +124,20 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { return parseFloat(total.toFixed(2)); }, [reducerData, cardSettings.totalAmountOnBoard]); + const tasksInProduction = useMemo(() => { + if (!data || !cardSettings.tasksInProduction) return null; + return data.reduce((acc, item) => acc + (item.tasks_aggregate?.aggregate?.count || 0), 0); + }, [data, cardSettings.tasksInProduction]); + + const tasksOnBoard = useMemo(() => { + if (!reducerData || !cardSettings.tasksOnBoard) return null; + return reducerData.lanes.reduce((acc, lane) => { + return ( + acc + lane.cards.reduce((laneAcc, card) => laneAcc + (card.metadata.tasks_aggregate?.aggregate?.count || 0), 0) + ); + }, 0); + }, [reducerData, cardSettings.tasksOnBoard]); + const statistics = useMemo( () => mergeStatistics(statisticsItems, [ @@ -134,7 +150,9 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { { id: 6, value: totalAmountOnBoard, type: StatisticType.AMOUNT }, { id: 7, value: totalLABOnBoard, type: StatisticType.HOURS }, { id: 8, value: totalLAROnBoard, type: StatisticType.HOURS }, - { id: 9, value: jobsOnBoard, type: StatisticType.JOBS } + { id: 9, value: jobsOnBoard, type: StatisticType.JOBS }, + { id: 10, value: tasksOnBoard, type: StatisticType.TASKS }, + { id: 11, value: tasksInProduction, type: StatisticType.TASKS } ]), [ totalHrs, @@ -146,7 +164,9 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { totalAmountOnBoard, totalLABOnBoard, totalLAROnBoard, - jobsOnBoard + jobsOnBoard, + tasksOnBoard, + tasksInProduction ] ); @@ -187,37 +207,9 @@ const ProductionStatistics = ({ data, cardSettings, reducerData }) => { }; ProductionStatistics.propTypes = { - data: PropTypes.arrayOf( - PropTypes.shape({ - labhrs: PropTypes.object, - larhrs: PropTypes.object, - job_totals: PropTypes.object - }) - ).isRequired, - cardSettings: PropTypes.shape({ - totalHrs: PropTypes.bool, - totalLAB: PropTypes.bool, - totalLAR: PropTypes.bool, - jobsInProduction: PropTypes.bool, - totalAmountInProduction: PropTypes.bool, - totalHrsOnBoard: PropTypes.bool, - totalLABOnBoard: PropTypes.bool, - totalLAROnBoard: PropTypes.bool, - jobsOnBoard: PropTypes.bool, - totalAmountOnBoard: PropTypes.bool, - statisticsOrder: PropTypes.arrayOf(PropTypes.number) - }).isRequired, - reducerData: PropTypes.shape({ - lanes: PropTypes.arrayOf( - PropTypes.shape({ - cards: PropTypes.arrayOf( - PropTypes.shape({ - metadata: PropTypes.object - }) - ).isRequired - }) - ).isRequired - }) + data: PropTypes.array.isRequired, + cardSettings: PropTypes.object.isRequired, + reducerData: PropTypes.object }; export default ProductionStatistics; diff --git a/client/src/components/production-board-kanban/settings/InformationSettings.jsx b/client/src/components/production-board-kanban/settings/InformationSettings.jsx index c50f61697..3725d1ab8 100644 --- a/client/src/components/production-board-kanban/settings/InformationSettings.jsx +++ b/client/src/components/production-board-kanban/settings/InformationSettings.jsx @@ -18,7 +18,8 @@ const InformationSettings = ({ t }) => ( "sublets", "partsstatus", "estimator", - "subtotal" + "subtotal", + "tasks" ].map((item) => ( diff --git a/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js b/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js index ce0760637..0d10e4e39 100644 --- a/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js +++ b/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js @@ -8,7 +8,9 @@ const statisticsItems = [ { id: 6, name: "totalAmountOnBoard", label: "total_amount_on_board" }, { id: 7, name: "totalLABOnBoard", label: "total_lab_on_board" }, { id: 8, name: "totalLAROnBoard", label: "total_lar_on_board" }, - { id: 9, name: "jobsOnBoard", label: "total_jobs_on_board" } + { id: 9, name: "jobsOnBoard", label: "total_jobs_on_board" }, + { id: 10, name: "tasksOnBoard", label: "tasks_on_board" }, + { id: 11, name: "tasksInProduction", label: "tasks_in_production" } ]; const defaultKanbanSettings = { @@ -23,6 +25,7 @@ const defaultKanbanSettings = { scheduled_completion: true, cardcolor: false, orientation: false, + tasks: false, cardSize: "small", model_info: true, kiosk: false, @@ -35,6 +38,8 @@ const defaultKanbanSettings = { totalLABOnBoard: false, totalLAROnBoard: false, jobsOnBoard: false, + tasksOnBoard: false, + tasksInProduction: false, totalAmountOnBoard: true, estimator: false, subtotal: false, @@ -43,4 +48,20 @@ const defaultKanbanSettings = { selectedEstimators: [] }; -export { defaultKanbanSettings, statisticsItems }; +const mergeWithDefaults = (settings) => { + // Create a new object that starts with the default settings + const mergedSettings = { ...defaultKanbanSettings }; + + // Override with the provided settings, if any + if (settings) { + for (const key in settings) { + if (settings.hasOwnProperty(key)) { + mergedSettings[key] = settings[key]; + } + } + } + + return mergedSettings; +}; + +export { defaultKanbanSettings, statisticsItems, mergeWithDefaults }; diff --git a/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx b/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx index 38b0c9350..23da13412 100644 --- a/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx +++ b/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx @@ -3,13 +3,14 @@ import { Button, Card, Col, Form, notification, Popover, Row, Tabs } from "antd" import React, { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { UPDATE_KANBAN_SETTINGS } from "../../../graphql/user.queries.js"; -import { defaultKanbanSettings } from "./defaultKanbanSettings.js"; +import { defaultKanbanSettings, mergeWithDefaults } from "./defaultKanbanSettings.js"; import LayoutSettings from "./LayoutSettings.jsx"; import InformationSettings from "./InformationSettings.jsx"; import StatisticsSettings from "./StatisticsSettings.jsx"; import FilterSettings from "./FilterSettings.jsx"; +import PropTypes from "prop-types"; -export default function ProductionBoardKanbanSettings({ associationSettings, parentLoading, bodyshop, data }) { +function ProductionBoardKanbanSettings({ associationSettings, parentLoading, bodyshop, data }) { const [form] = Form.useForm(); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); @@ -23,16 +24,11 @@ export default function ProductionBoardKanbanSettings({ associationSettings, par useEffect(() => { if (associationSettings?.kanban_settings) { - form.setFieldsValue(associationSettings.kanban_settings); - if (associationSettings.kanban_settings.statisticsOrder) { - setStatisticsOrder(associationSettings.kanban_settings.statisticsOrder); - } - if (associationSettings.kanban_settings.selectedMdInsCos) { - setSelectedMdInsCos(associationSettings.kanban_settings.selectedMdInsCos); - } - if (associationSettings.kanban_settings.selectedEstimators) { - setSelectedEstimators(associationSettings.kanban_settings.selectedEstimators); - } + const finalSettings = mergeWithDefaults(associationSettings.kanban_settings); + form.setFieldsValue(finalSettings); + setStatisticsOrder(finalSettings.statisticsOrder); + setSelectedMdInsCos(finalSettings.selectedMdInsCos); + setSelectedEstimators(finalSettings.selectedEstimators); } }, [form, associationSettings]); @@ -155,3 +151,12 @@ export default function ProductionBoardKanbanSettings({ associationSettings, par ); } + +ProductionBoardKanbanSettings.propTypes = { + associationSettings: PropTypes.object, + parentLoading: PropTypes.func.isRequired, + bodyshop: PropTypes.object.isRequired, + data: PropTypes.array +}; + +export default ProductionBoardKanbanSettings; diff --git a/client/src/components/production-board-kanban/trello-board/controllers/Lane.jsx b/client/src/components/production-board-kanban/trello-board/controllers/Lane.jsx index 493812840..cd30952fb 100644 --- a/client/src/components/production-board-kanban/trello-board/controllers/Lane.jsx +++ b/client/src/components/production-board-kanban/trello-board/controllers/Lane.jsx @@ -12,7 +12,7 @@ import { EyeInvisibleOutlined, EyeOutlined } from "@ant-design/icons"; import { createStructuredSelector } from "reselect"; import { selectBodyshop } from "../../../../redux/user/user.selectors.js"; import { selectTechnician } from "../../../../redux/tech/tech.selectors.js"; -import ProductionBoardCard from "../../../production-board-kanban-card/production-board-kanban-card.component.jsx"; +import ProductionBoardCard from "../../production-board-kanban-card.component.jsx"; import HeightMemoryWrapper from "../components/HeightMemoryWrapper.jsx"; import SizeMemoryWrapper from "../components/SizeMemoryWrapper.jsx"; import ListComponent from "../components/ListComponent.jsx"; diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index 51ff6927c..569936b7c 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -2465,6 +2465,11 @@ export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql` export const QUERY_JOBS_IN_PRODUCTION = gql` query QUERY_JOBS_IN_PRODUCTION { jobs(where: { inproduction: { _eq: true } }) { + tasks_aggregate(where: { completed: { _eq: false }, deleted: { _eq: false } }) { + aggregate { + count + } + } id updated_at comment diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index f3a95722e..f35baa1d8 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -2757,7 +2757,9 @@ "total_lab_on_board": "Body Hours on Board", "total_lar_on_board": "Refinish Hours on Board", "total_amount_on_board": "Dollars on Board", - "total_jobs_on_board": "Jobs on Board" + "total_jobs_on_board": "Jobs on Board", + "tasks_in_production": "Tasks in Production", + "tasks_on_board": "Tasks on Board" } }, "actions": { @@ -2792,6 +2794,7 @@ "model_info": "Vehicle Info", "actual_in": "Actual In", "alert": "Alert", + "tasks": "Tasks", "alertoff": "Remove alert from Job", "alerton": "Add alert to Job", "ats": "Alternative Transportation", @@ -2845,6 +2848,9 @@ "total_lar_on_board": "Refinish Hours on Board", "total_amount_on_board": "Dollars on Board", "total_jobs_on_board": "Jobs on Board", + "tasks_in_production": "Tasks in Production", + "tasks_on_board": "Tasks on Board", + "tasks": "Tasks", "hours": "Hours", "currency_symbol": "$", "jobs": "Jobs" diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 30cac520b..1d89e15ea 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -2757,7 +2757,9 @@ "total_lab_on_board": "", "total_lar_on_board": "", "total_amount_on_board": "", - "total_jobs_on_board": "" + "total_jobs_on_board": "", + "tasks_in_production": "", + "tasks_on_board": "" } }, "actions": { @@ -2792,6 +2794,7 @@ "model_info": "", "actual_in": "", "alert": "", + "tasks": "", "alertoff": "", "alerton": "", "ats": "", @@ -2845,6 +2848,9 @@ "total_lar_on_board": "", "total_amount_on_board": "", "total_jobs_on_board": "", + "tasks_in_production": "", + "tasks_on_board": "", + "tasks": "", "hours": "", "currency_symbol": "", "jobs": "" diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 967aa9003..4806de18c 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -2757,7 +2757,9 @@ "total_lab_on_board": "", "total_lar_on_board": "", "total_amount_on_board": "", - "total_jobs_on_board": "" + "total_jobs_on_board": "", + "tasks_in_production": "", + "tasks_on_board": "" } }, "actions": { @@ -2792,6 +2794,7 @@ "model_info": "", "actual_in": "", "alert": "", + "tasks": "", "alertoff": "", "alerton": "", "ats": "", @@ -2845,6 +2848,9 @@ "total_lar_on_board": "", "total_amount_on_board": "", "total_jobs_on_board": "", + "tasks_in_production": "", + "tasks_on_board": "", + "tasks": "", "hours": "", "currency_symbol": "", "jobs": "" From efda254981ef0a558696a73b52ea54f393bc1954 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Thu, 8 Aug 2024 11:46:42 -0400 Subject: [PATCH 06/28] - Fix alert in table view - (modify some docs) Signed-off-by: Dave Richer --- _reference/productionBoardNotes.md | 8 ++++++ ...production-board-kanban-card.component.jsx | 9 +------ ...roduction-list-columns.alert.component.jsx | 27 ++++++++++--------- .../production-list-columns.data.jsx | 8 +++--- 4 files changed, 28 insertions(+), 24 deletions(-) diff --git a/_reference/productionBoardNotes.md b/_reference/productionBoardNotes.md index 31bf2b4dc..96ea0d46f 100644 --- a/_reference/productionBoardNotes.md +++ b/_reference/productionBoardNotes.md @@ -31,3 +31,11 @@ These allow users to turn fields on or off, turning them all off will show the card in the most minimal form + +### Statistics + +- The statistics section allows users to see accumulations of both jobs on the board, and jobs in production. +- you can click a statistic to turn it on and off, and drag and drop the statistics to rearrange them + +### Filters +- Allows you to set, and persist filters for estimators and insurance companies diff --git a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx index 4febb86c0..632480a12 100644 --- a/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx +++ b/client/src/components/production-board-kanban-card/production-board-kanban-card.component.jsx @@ -343,14 +343,7 @@ export default function ProductionBoardCard({ technician, card, bodyshop, cardSe const headerContent = (
- + {metadata?.suspended && } {metadata?.iouparent && ( ({ ) }); -const ProductionListColumnAlert = ({ record, insertAuditTrail }) => { +const ProductionListColumnAlert = ({ id, productionVars, refetch, insertAuditTrail }) => { const [updateAlert] = useMutation(UPDATE_JOB); const handleAlertToggle = useCallback(() => { logImEXEvent("production_toggle_alert"); - const newAlertState = !!record.production_vars?.alert ? !record.production_vars.alert : true; + const newAlertState = !!productionVars?.alert ? !productionVars?.alert : true; + const finalProductionVars = { + ...productionVars, + alert: newAlertState + }; updateAlert({ variables: { - jobId: record.id, + jobId: id, job: { - production_vars: { - ...record.production_vars, - alert: newAlertState - } + production_vars: finalProductionVars } } }).catch((err) => { @@ -45,17 +46,17 @@ const ProductionListColumnAlert = ({ record, insertAuditTrail }) => { }); insertAuditTrail({ - jobid: record.id, + jobid: id, operation: AuditTrailMapping.alertToggle(newAlertState), type: "alertToggle" }); - if (record.refetch) record.refetch(); - }, [updateAlert, insertAuditTrail, record]); + if (refetch) refetch(); + }, [updateAlert, insertAuditTrail, id, productionVars, refetch]); - if (!record.production_vars?.alert) return null; - - return ); } diff --git a/client/src/components/production-board-kanban/production-board-kanban.utils.js b/client/src/components/production-board-kanban/production-board-kanban.utils.js index fed3d12db..ba3974c1a 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.utils.js +++ b/client/src/components/production-board-kanban/production-board-kanban.utils.js @@ -29,7 +29,7 @@ const sortByParentId = (arr) => { // Function to create board data based on statuses and jobs, with optional filtering export const createBoardData = ({ statuses, data, filter, cardSettings }) => { - const { search, employeeId } = filter; + const { search, employeeId, alert } = filter; const lanes = statuses.map((status) => ({ id: status, @@ -52,6 +52,11 @@ export const createBoardData = ({ statuses, data, filter, cardSettings }) => { ); } + // Filter jobs by alert if alert filter is true + if (alert) { + filteredJobs = filteredJobs.filter((job) => job.production_vars?.alert); + } + const DataGroupedByStatus = groupBy(filteredJobs, "status"); Object.keys(DataGroupedByStatus).forEach((statusGroupKey) => { diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 4dd123fd8..c2d776fbf 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -2833,7 +2833,8 @@ "sublets": "Sublets", "totalhours": "Total Hrs ", "touchtime": "T/T", - "viewname": "View Name" + "viewname": "View Name", + "alerts": "Alerts" }, "successes": { "removed": "Job removed from production." diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index bafe9ced5..c2da8510a 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -2833,7 +2833,8 @@ "sublets": "", "totalhours": "", "touchtime": "", - "viewname": "" + "viewname": "", + "alerts": "" }, "successes": { "removed": "" diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 5fd0c1280..005accb1c 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -2833,7 +2833,8 @@ "sublets": "", "totalhours": "", "touchtime": "", - "viewname": "" + "viewname": "", + "alerts": "" }, "successes": { "removed": "" From 134ce05d27b1616a0eadcf168f84641341ae3b26 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Fri, 16 Aug 2024 11:16:20 -0400 Subject: [PATCH 25/28] - Add Alert Filter to visual production board Signed-off-by: Dave Richer --- .../production-board-filters.component.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/production-board-filters/production-board-filters.component.jsx b/client/src/components/production-board-filters/production-board-filters.component.jsx index 90afb4fe7..eea1fc3d9 100644 --- a/client/src/components/production-board-filters/production-board-filters.component.jsx +++ b/client/src/components/production-board-filters/production-board-filters.component.jsx @@ -41,7 +41,7 @@ export function ProductionBoardFilters({ bodyshop, filter, setFilter, loading }) style={{ minWidth: "20rem" }} options={bodyshop.employees.filter((e) => e.active)} value={filter.employeeId} - placeholder={t("production.labels.alerts")} + placeholder={t("production.labels.employeesearch")} onChange={(emp) => setFilter({ ...filter, employeeId: emp })} allowClear /> From f691aca2417323a2626deba6d66197132eac5f43 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Fri, 16 Aug 2024 09:11:29 -0700 Subject: [PATCH 26/28] IO-2884 Production List Board Filter Signed-off-by: Allan Carr --- .../production-list-columns.data.jsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/client/src/components/production-list-columns/production-list-columns.data.jsx b/client/src/components/production-list-columns/production-list-columns.data.jsx index 2c7b349e3..fbc9236a5 100644 --- a/client/src/components/production-list-columns/production-list-columns.data.jsx +++ b/client/src/components/production-list-columns/production-list-columns.data.jsx @@ -2,10 +2,13 @@ import { BranchesOutlined, PauseCircleOutlined } from "@ant-design/icons"; import { Checkbox, Space, Tooltip } from "antd"; import i18n from "i18next"; import { Link } from "react-router-dom"; +import { setModalContext } from "../../redux/modals/modals.actions"; +import { store } from "../../redux/store"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import { TimeFormatter } from "../../utils/DateFormatter"; import PhoneFormatter from "../../utils/PhoneFormatter"; import { onlyUnique } from "../../utils/arrayHelper"; +import InstanceRenderManager from "../../utils/instanceRenderMgr"; import { alphaSort, dateSort, statusSort } from "../../utils/sorters"; import JobAltTransportChange from "../job-at-change/job-at-change.component"; import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component"; @@ -24,9 +27,6 @@ import ProductionListColumnNote from "./production-list-columns.productionnote.c import ProductionListColumnCategory from "./production-list-columns.status.category"; import ProductionListColumnStatus from "./production-list-columns.status.component"; import ProductionListColumnTouchTime from "./prodution-list-columns.touchtime.component"; -import { store } from "../../redux/store"; -import { setModalContext } from "../../redux/modals/modals.actions"; -import InstanceRenderManager from "../../utils/instanceRenderMgr"; const r = ({ technician, state, activeStatuses, data, bodyshop, refetch, treatments }) => { const { Enhanced_Payroll } = treatments; @@ -258,7 +258,7 @@ const r = ({ technician, state, activeStatuses, data, bodyshop, refetch, treatme { text: "True", value: true }, { text: "False", value: false } ], - onFilter: (value, record) => value.includes(record.special_coverage_policy), + onFilter: (value, record) => value === record.special_coverage_policy, render: (text, record) => }, @@ -349,6 +349,11 @@ const r = ({ technician, state, activeStatuses, data, bodyshop, refetch, treatme key: "alert", sorter: (a, b) => Number(a.production_vars?.alert || false) - Number(b.production_vars?.alert || false), sortOrder: state.sortedInfo.columnKey === "alert" && state.sortedInfo.order, + filters: [ + { text: "True", value: true }, + { text: "False", value: false } + ], + onFilter: (value, record) => value === (record.production_vars?.alert || false), render: (text, record) => ( ) From 01cbdf14a9192d81a28b29af2353303053645d5e Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Fri, 16 Aug 2024 12:14:52 -0400 Subject: [PATCH 27/28] - Add Alert Filter to visual production board Signed-off-by: Dave Richer --- .../production-board-kanban.component.jsx | 12 +++++------- .../settings/defaultKanbanSettings.js | 4 +++- .../production-board-kanban.settings.component.jsx | 9 ++++++++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/client/src/components/production-board-kanban/production-board-kanban.component.jsx b/client/src/components/production-board-kanban/production-board-kanban.component.jsx index 62917e9bd..0c515132b 100644 --- a/client/src/components/production-board-kanban/production-board-kanban.component.jsx +++ b/client/src/components/production-board-kanban/production-board-kanban.component.jsx @@ -21,7 +21,7 @@ import { createBoardData } from "./production-board-kanban.utils.js"; import ProductionBoardKanbanSettings from "./settings/production-board-kanban.settings.component.jsx"; import cloneDeep from "lodash/cloneDeep"; import isEqual from "lodash/isEqual"; -import { mergeWithDefaults } from "./settings/defaultKanbanSettings.js"; +import { defaultFilters, mergeWithDefaults } from "./settings/defaultKanbanSettings.js"; import NoteUpsertModal from "../../components/note-upsert-modal/note-upsert-modal.container"; const mapStateToProps = createStructuredSelector({ @@ -41,7 +41,7 @@ const mapDispatchToProps = (dispatch) => ({ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTrail, associationSettings, statuses }) { const [boardLanes, setBoardLanes] = useState({ lanes: [] }); - const [filter, setFilter] = useState({ search: "", employeeId: null }); + const [filter, setFilter] = useState(defaultFilters); const [loading, setLoading] = useState(true); const [isMoving, setIsMoving] = useState(false); const [orientation, setOrientation] = useState("vertical"); @@ -187,11 +187,9 @@ function ProductionBoardKanbanComponent({ data, bodyshop, refetch, insertAuditTr return mergeWithDefaults(kanbanSettings); }, [associationSettings]); - const handleSettingsChange = useCallback((newSettings) => { - setLoading(true); - setOrientation(newSettings.orientation ? "vertical" : "horizontal"); - setLoading(false); - }, []); + const handleSettingsChange = () => { + setFilter(defaultFilters); + }; if (loading) { return ; diff --git a/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js b/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js index 0d10e4e39..87b364ea2 100644 --- a/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js +++ b/client/src/components/production-board-kanban/settings/defaultKanbanSettings.js @@ -48,6 +48,8 @@ const defaultKanbanSettings = { selectedEstimators: [] }; +const defaultFilters = { search: "", employeeId: null, alert: false }; + const mergeWithDefaults = (settings) => { // Create a new object that starts with the default settings const mergedSettings = { ...defaultKanbanSettings }; @@ -64,4 +66,4 @@ const mergeWithDefaults = (settings) => { return mergedSettings; }; -export { defaultKanbanSettings, statisticsItems, mergeWithDefaults }; +export { defaultKanbanSettings, statisticsItems, mergeWithDefaults, defaultFilters }; diff --git a/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx b/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx index 23da13412..0d78416f8 100644 --- a/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx +++ b/client/src/components/production-board-kanban/settings/production-board-kanban.settings.component.jsx @@ -9,8 +9,9 @@ import InformationSettings from "./InformationSettings.jsx"; import StatisticsSettings from "./StatisticsSettings.jsx"; import FilterSettings from "./FilterSettings.jsx"; import PropTypes from "prop-types"; +import { isFunction } from "lodash"; -function ProductionBoardKanbanSettings({ associationSettings, parentLoading, bodyshop, data }) { +function ProductionBoardKanbanSettings({ associationSettings, parentLoading, bodyshop, data, onSettingsChange }) { const [form] = Form.useForm(); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); @@ -61,6 +62,11 @@ function ProductionBoardKanbanSettings({ associationSettings, parentLoading, bod setOpen(false); setLoading(false); parentLoading(false); + + if (onSettingsChange && isFunction(onSettingsChange)) { + onSettingsChange(values); + } + setHasChanges(false); }; @@ -156,6 +162,7 @@ ProductionBoardKanbanSettings.propTypes = { associationSettings: PropTypes.object, parentLoading: PropTypes.func.isRequired, bodyshop: PropTypes.object.isRequired, + onSettingsChange: PropTypes.func, data: PropTypes.array }; From e628b1364c3914a01f5859093774542c937e38a5 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Fri, 16 Aug 2024 12:27:26 -0700 Subject: [PATCH 28/28] IO-2879 Adjust placement of variable Signed-off-by: Allan Carr --- server/accounting/qb-receivables-lines.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/accounting/qb-receivables-lines.js b/server/accounting/qb-receivables-lines.js index 40b5bec9c..0dedb4472 100644 --- a/server/accounting/qb-receivables-lines.js +++ b/server/accounting/qb-receivables-lines.js @@ -20,7 +20,6 @@ exports.default = function ({ bodyshop, jobs_by_pk, qbo = false, items, taxCodes //Otherwise, calculate them and add them to the default MAPA and MASH centers. let hasMapaLine = false; let hasMashLine = false; - let isTowingLine = false; //Create the invoice lines mapping. jobs_by_pk.joblines.map((jobline) => { @@ -31,6 +30,9 @@ exports.default = function ({ bodyshop, jobs_by_pk, qbo = false, items, taxCodes if (jobline.db_ref === "936007") { hasMashLine = true; } + + //Check if the line is a Towing Line and flag as such. + let isTowingLine = false; if (jobline.db_ref === "936001" && jobline.line_desc.includes("Towing")) { isTowingLine = true; }