Added production level statuses for shop page and updated production board to filter accordingly BOD-4

This commit is contained in:
Patrick Fic
2020-06-24 14:21:17 -07:00
parent dab34aef49
commit db08be58ac
12 changed files with 154 additions and 58 deletions

View File

@@ -2337,6 +2337,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>production_statuses</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<concept_node>

View File

@@ -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 (
<div>
<IndefiniteLoading loading={isMoving} />
<div>{isMoving}</div>
<Board
children={boardLanes}
disableCardDrag={isMoving}

View File

@@ -1,10 +1,21 @@
import { useSubscription } from "@apollo/react-hooks";
import React 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 ProductionBoardKanbanComponent from "./production-board-kanban.component";
export default function ProductionBoardKanbanContainer({ columnState }) {
const { loading, data } = useSubscription(SUBSCRIPTION_JOBS_IN_PRODUCTION);
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop,
});
export function ProductionBoardKanbanContainer({ bodyshop }) {
const { loading, data } = useSubscription(SUBSCRIPTION_JOBS_IN_PRODUCTION, {
variables: {
statusList: bodyshop.md_ro_statuses.production_statuses || [],
},
});
return (
<ProductionBoardKanbanComponent
@@ -13,3 +24,4 @@ export default function ProductionBoardKanbanContainer({ columnState }) {
/>
);
}
export default connect(mapStateToProps, null)(ProductionBoardKanbanContainer);

View File

@@ -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;
};

View File

@@ -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 (
<ProductionListTable

View File

@@ -33,7 +33,8 @@ export default function ShopInfoROStatusComponent({ form }) {
{fields.map((field, index) => (
<Form.Item
key={field.key}
style={{ padding: 0, margin: 2 }}>
style={{ padding: 0, margin: 2 }}
>
<div style={{ display: "flex" }}>
<Form.Item
style={{ padding: 0, margin: 2 }}
@@ -43,9 +44,10 @@ export default function ShopInfoROStatusComponent({ form }) {
rules={[
{
required: true,
message: t("general.validation.required")
}
]}>
message: t("general.validation.required"),
},
]}
>
<Input onBlur={handleBlur} />
</Form.Item>
<DeleteFilled
@@ -58,11 +60,12 @@ export default function ShopInfoROStatusComponent({ form }) {
))}
<Form.Item>
<Button
type='dashed'
type="dashed"
onClick={() => {
add();
}}
style={{ width: "100%" }}>
style={{ width: "100%" }}
>
{t("bodyshop.actions.newstatus")}
</Button>
</Form.Item>
@@ -80,10 +83,30 @@ export default function ShopInfoROStatusComponent({ form }) {
{
required: true,
message: t("general.validation.required"),
type: "array"
}
]}>
<Select mode='multiple'>
type: "array",
},
]}
>
<Select mode="multiple">
{options.map((item, idx) => (
<Select.Option key={idx} value={item}>
{item}
</Select.Option>
))}
</Select>
</Form.Item>
<Form.Item
name={["md_ro_statuses", "production_statuses"]}
label={t("bodyshop.fields.statuses.production_statuses")}
rules={[
{
required: true,
message: t("general.validation.required"),
type: "array",
},
]}
>
<Select mode="multiple">
{options.map((item, idx) => (
<Select.Option key={idx} value={item}>
{item}
@@ -96,10 +119,11 @@ export default function ShopInfoROStatusComponent({ form }) {
rules={[
{
required: true,
message: t("general.validation.required")
}
message: t("general.validation.required"),
},
]}
name={["md_ro_statuses", "default_scheduled"]}>
name={["md_ro_statuses", "default_scheduled"]}
>
<Select>
{options.map((item, idx) => (
<Select.Option key={idx}>{item}</Select.Option>
@@ -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"]}
>
<Select>
{options.map((item, idx) => (
<Select.Option key={idx}>{item}</Select.Option>
@@ -126,10 +151,11 @@ export default function ShopInfoROStatusComponent({ form }) {
rules={[
{
required: true,
message: t("general.validation.required")
}
message: t("general.validation.required"),
},
]}
name={["md_ro_statuses", "default_exported"]}>
name={["md_ro_statuses", "default_exported"]}
>
<Select>
{options.map((item, idx) => (
<Select.Option key={idx}>{item}</Select.Option>
@@ -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"]}
>
<Select>
{options.map((item, idx) => (
<Select.Option key={idx}>{item}</Select.Option>
@@ -156,10 +183,11 @@ export default function ShopInfoROStatusComponent({ form }) {
rules={[
{
required: true,
message: t("general.validation.required")
}
message: t("general.validation.required"),
},
]}
name={["md_ro_statuses", "default_invoiced"]}>
name={["md_ro_statuses", "default_invoiced"]}
>
<Select>
{options.map((item, idx) => (
<Select.Option key={idx}>{item}</Select.Option>
@@ -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"]}
>
<Select>
{options.map((item, idx) => (
<Select.Option key={idx}>{item}</Select.Option>
@@ -186,10 +215,11 @@ export default function ShopInfoROStatusComponent({ form }) {
rules={[
{
required: true,
message: t("general.validation.required")
}
message: t("general.validation.required"),
},
]}
name={["md_ro_statuses", "default_delivered"]}>
name={["md_ro_statuses", "default_delivered"]}
>
<Select>
{options.map((item, idx) => (
<Select.Option key={idx}>{item}</Select.Option>

View File

@@ -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

View File

@@ -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 <ProductionListTable columnState={columnState} />;
return <ProductionListTable />;
}

View File

@@ -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 (
<div>
<ProductionListComponent columnState={columnState} />
<ProductionListComponent />
</div>
);
}

View File

@@ -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"
},

View File

@@ -149,7 +149,8 @@
"default_received": "",
"default_returned": "",
"default_scheduled": "",
"open_statuses": ""
"open_statuses": "",
"production_statuses": ""
},
"zip_post": ""
},

View File

@@ -149,7 +149,8 @@
"default_received": "",
"default_returned": "",
"default_scheduled": "",
"open_statuses": ""
"open_statuses": "",
"production_statuses": ""
},
"zip_post": ""
},