diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 748864b85..296cfd489 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -2337,6 +2337,27 @@ + + production_statuses + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + 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 46283d820..968263418 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 @@ -25,9 +25,16 @@ export function ProductionBoardKanbanComponent({ data, bodyshop }) { const { t } = useTranslation(); useEffect(() => { - setBoardLanes(createBoardData(bodyshop.md_ro_statuses.open_statuses, data)); + setBoardLanes( + createBoardData(bodyshop.md_ro_statuses.production_statuses, data) + ); setIsMoving(false); - }, [data, setBoardLanes, setIsMoving, bodyshop.md_ro_statuses.open_statuses]); + }, [ + data, + setBoardLanes, + setIsMoving, + bodyshop.md_ro_statuses.production_statuses, + ]); const findById = (id) => { return id; @@ -108,7 +115,6 @@ export function ProductionBoardKanbanComponent({ data, bodyshop }) { return (
-
{isMoving}
); } +export default connect(mapStateToProps, null)(ProductionBoardKanbanContainer); 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 624bb0076..ddbb9b936 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 @@ -25,6 +25,16 @@ const sortByParentId = (arr) => { if (byParentsIdsList["null"]) byParentsIdsList["null"].map((i) => sortedList.push(i)); + //Validate that the 2 arrays are of the same length and no children are missing. + if (arr.length !== sortedList.length) { + arr.map((origItem) => { + if (!!!sortedList.find((s) => s.id === origItem.id)) { + sortedList.push(origItem); + console.log("DATA CONSISTENCY ERROR: ", origItem.ro_number); + } + }); + } + return sortedList; }; diff --git a/client/src/components/production-list-table/production-list-table.container.jsx b/client/src/components/production-list-table/production-list-table.container.jsx index b92fe8b0f..fc31dfa9c 100644 --- a/client/src/components/production-list-table/production-list-table.container.jsx +++ b/client/src/components/production-list-table/production-list-table.container.jsx @@ -1,10 +1,35 @@ import { useSubscription } from "@apollo/react-hooks"; -import React from "react"; +import React, { useState } from "react"; +import { connect } from "react-redux"; +import { createStructuredSelector } from "reselect"; import { SUBSCRIPTION_JOBS_IN_PRODUCTION } from "../../graphql/jobs.queries"; +import { selectBodyshop } from "../../redux/user/user.selectors"; +import ProductionListColumns from "../production-list-columns/production-list-columns.data"; import ProductionListTable from "./production-list-table.component"; -export default function ProductionListTableContainer({ columnState }) { - const { loading, data } = useSubscription(SUBSCRIPTION_JOBS_IN_PRODUCTION); +const mapStateToProps = createStructuredSelector({ + bodyshop: selectBodyshop, +}); + +export default connect(mapStateToProps, null)(ProductionListTableContainer); + +export function ProductionListTableContainer({ bodyshop }) { + const { loading, data } = useSubscription(SUBSCRIPTION_JOBS_IN_PRODUCTION, { + variables: { + statusList: bodyshop.md_ro_statuses.production_statuses || [], + }, + }); + + const columnState = useState( + (bodyshop.production_config && + bodyshop.production_config.columnKeys.map((k) => { + return { + ...ProductionListColumns.find((e) => e.key === k.key), + width: k.width, + }; + })) || + [] + ); return ( ( + style={{ padding: 0, margin: 2 }} + >
+ message: t("general.validation.required"), + }, + ]} + > @@ -80,10 +83,30 @@ export default function ShopInfoROStatusComponent({ form }) { { required: true, message: t("general.validation.required"), - type: "array" - } - ]}> - + {options.map((item, idx) => ( + + {item} + + ))} + + + + {options.map((item, idx) => ( {item} @@ -111,10 +135,11 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} - name={["md_ro_statuses", "default_arrived"]}> + name={["md_ro_statuses", "default_arrived"]} + > {options.map((item, idx) => ( {item} @@ -141,10 +167,11 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} - name={["md_ro_statuses", "default_imported"]}> + name={["md_ro_statuses", "default_imported"]} + > {options.map((item, idx) => ( {item} @@ -171,10 +199,11 @@ export default function ShopInfoROStatusComponent({ form }) { rules={[ { required: true, - message: t("general.validation.required") - } + message: t("general.validation.required"), + }, ]} - name={["md_ro_statuses", "default_completed"]}> + name={["md_ro_statuses", "default_completed"]} + > {options.map((item, idx) => ( {item} diff --git a/client/src/graphql/jobs.queries.js b/client/src/graphql/jobs.queries.js index 28637c36d..93e092378 100644 --- a/client/src/graphql/jobs.queries.js +++ b/client/src/graphql/jobs.queries.js @@ -80,8 +80,8 @@ export const QUERY_JOBS_IN_PRODUCTION = gql` `; export const SUBSCRIPTION_JOBS_IN_PRODUCTION = gql` - subscription SUBSCRIPTION_JOBS_IN_PRODUCTION { - productionview { + subscription SUBSCRIPTION_JOBS_IN_PRODUCTION($statusList: [String!]!) { + productionview(where: { status: { _in: $statusList } }) { id status ro_number diff --git a/client/src/pages/production-list/production-list.component.jsx b/client/src/pages/production-list/production-list.component.jsx index 161c02891..0049d759c 100644 --- a/client/src/pages/production-list/production-list.component.jsx +++ b/client/src/pages/production-list/production-list.component.jsx @@ -2,5 +2,5 @@ import React from "react"; import ProductionListTable from "../../components/production-list-table/production-list-table.container"; export default function ProductionListComponent({ columnState }) { - return ; + return ; } diff --git a/client/src/pages/production-list/production-list.container.jsx b/client/src/pages/production-list/production-list.container.jsx index 4d1980453..9633a05bc 100644 --- a/client/src/pages/production-list/production-list.container.jsx +++ b/client/src/pages/production-list/production-list.container.jsx @@ -1,11 +1,10 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { setBreadcrumbs } from "../../redux/application/application.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; import ProductionListComponent from "./production-list.component"; -import ProductionListColumns from "../../components/production-list-columns/production-list-columns.data"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -17,16 +16,6 @@ const mapDispatchToProps = (dispatch) => ({ export function ProductionListContainer({ setBreadcrumbs, bodyshop }) { const { t } = useTranslation(); - const columnState = useState( - (bodyshop.production_config && - bodyshop.production_config.columnKeys.map((k) => { - return { - ...ProductionListColumns.find((e) => e.key === k.key), - width: k.width, - }; - })) || - [] - ); useEffect(() => { document.title = t("titles.productionlist"); @@ -37,7 +26,7 @@ export function ProductionListContainer({ setBreadcrumbs, bodyshop }) { return (
- +
); } diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 4729d386d..081b7b1c9 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -149,7 +149,8 @@ "default_received": "Default Received Status", "default_returned": "Default Returned", "default_scheduled": "Default Scheduled Status", - "open_statuses": "Open Statuses" + "open_statuses": "Open Statuses", + "production_statuses": "Production Statuses" }, "zip_post": "Zip/Postal Code" }, diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 73d7273af..092fbfad0 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -149,7 +149,8 @@ "default_received": "", "default_returned": "", "default_scheduled": "", - "open_statuses": "" + "open_statuses": "", + "production_statuses": "" }, "zip_post": "" }, diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 89c1e7fd7..8b290ab95 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -149,7 +149,8 @@ "default_received": "", "default_returned": "", "default_scheduled": "", - "open_statuses": "" + "open_statuses": "", + "production_statuses": "" }, "zip_post": "" },