Added remove from production button to kanban card. BOD-261

This commit is contained in:
Patrick Fic
2020-08-24 11:00:52 -07:00
parent 2acef8f726
commit 2cb8ae1359
10 changed files with 205 additions and 92 deletions

View File

@@ -7383,6 +7383,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>view</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>
<name>yes</name>
<definition_loaded>false</definition_loaded>
@@ -10321,6 +10342,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>viewdetail</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>
<folder_node>
@@ -19424,6 +19466,32 @@
</concept_node>
</children>
</folder_node>
<folder_node>
<name>successes</name>
<children>
<concept_node>
<name>removed</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>
</children>
</folder_node>
<folder_node>

View File

@@ -106,7 +106,7 @@ export default function GlobalSearch() {
vehicle.v_model_yr || ""
} ${vehicle.v_make_desc || ""} ${
vehicle.v_model_desc || ""
}`}</span>
} - ${vehicle.plate_no} - ${vehicle.v_vin}`}</span>
</div>
</Link>
),

View File

@@ -49,7 +49,13 @@ export function InvoiceDetailEditContainer({ bodyshop }) {
delete il.__typename;
updates.push(
updateInvoiceLine({
variables: { invoicelineId: il.id, invoiceLine: il },
variables: {
invoicelineId: il.id,
invoiceLine: {
...il,
joblineid: il.joblineid === "noline" ? null : il.joblineid,
},
},
})
);
});

View File

@@ -1,24 +1,25 @@
import React from "react";
export default function PartsStatusPie({ partsList }) {
return <div>Parts Pie</div>;
//const [pieData, setPieData] = useState([]);
const result = partsList
? partsList.reduce((names, name) => {
const val = name || "?";
const count = names[val] || 0;
names[val] = count + 1;
return names;
}, {})
: {};
// const result = partsList
// ? partsList.reduce((names, name) => {
// const val = name || "?";
// const count = names[val] || 0;
// names[val] = count + 1;
// return names;
// }, {})
// : {};
const pieData = Object.keys(result).map((i) => {
return {
id: i,
label: i,
value: result[i],
};
});
// const pieData = Object.keys(result).map((i) => {
// return {
// id: i,
// label: i,
// value: result[i],
// };
// });
return <div>{JSON.stringify(pieData)}</div>;
// return <div>{JSON.stringify(pieData)}</div>;
}

View File

@@ -1,74 +1,87 @@
import React from "react";
import { Card, Row, Col } from "antd";
import { Card, Row, Col, Dropdown } from "antd";
import { DateTimeFormatter } from "../../utils/DateFormatter";
import ProductionAlert from "../production-list-columns/production-list-columns.alert.component";
import { EyeFilled } from "@ant-design/icons";
import { Link } from "react-router-dom";
import "./production-board-card.styles.scss";
import ProductionRemoveButton from "../production-remove-button/production-remove-button.component";
import { useTranslation } from "react-i18next";
export default function ProductionBoardCard(card) {
const { t } = useTranslation();
const menu = (
<div>
<Card title={t("general.labels.actions")}>
<ProductionRemoveButton jobId={card.id} />
</Card>
</div>
);
return (
<Card
className="react-kanban-card imex-kanban-card tight-antd-rows"
style={{ margin: ".2rem 0rem" }}
size="small"
title={`${card.ro_number || card.est_number} - ${card.v_model_yr} ${
card.v_make_desc || ""
} ${card.v_model_desc || ""}`}
>
<Row>
<Col span={24}>
<div className="ellipses">{`${card.ownr_fn || ""} ${
card.ownr_ln || ""
} ${card.ownr_co_nm || ""}`}</div>
</Col>
</Row>
<Row>
<Col span={12}>
<div className="ellipses">{card.clm_no || ""}</div>
</Col>
<Col span={12}>
<div className="ellipses">{card.ins_co_nm || ""}</div>
</Col>
</Row>
<Row>
<Col span={24}>
<div className="imex-flex-row imex-flex-row__flex-space-around">
<div className="mex-flex-row__margin">
<div>{`B: ${card.labhrs.aggregate.sum.mod_lb_hrs || "?"}`}</div>
<div>{`R: ${card.larhrs.aggregate.sum.mod_lb_hrs || "?"}`}</div>
<Dropdown overlay={menu} trigger={["contextMenu"]}>
<Card
className="react-kanban-card imex-kanban-card tight-antd-rows"
style={{ margin: ".2rem 0rem" }}
size="small"
title={`${card.ro_number || card.est_number} - ${card.v_model_yr} ${
card.v_make_desc || ""
} ${card.v_model_desc || ""}`}
>
<Row>
<Col span={24}>
<div className="ellipses">{`${card.ownr_fn || ""} ${
card.ownr_ln || ""
} ${card.ownr_co_nm || ""}`}</div>
</Col>
</Row>
<Row>
<Col span={12}>
<div className="ellipses">{card.clm_no || ""}</div>
</Col>
<Col span={12}>
<div className="ellipses">{card.ins_co_nm || ""}</div>
</Col>
</Row>
<Row>
<Col span={24}>
<div className="imex-flex-row imex-flex-row__flex-space-around">
<div className="mex-flex-row__margin">
<div>{`B: ${card.labhrs.aggregate.sum.mod_lb_hrs || "?"}`}</div>
<div>{`R: ${card.larhrs.aggregate.sum.mod_lb_hrs || "?"}`}</div>
</div>
<div className="mex-flex-row__margin">
<div>{`B: ${
card.employee_body_rel
? `${card.employee_body_rel.first_name} ${card.employee_body_rel.last_name}`
: ""
}`}</div>
<div>{`P: ${
card.employee_prep_rel
? `${card.employee_prep_rel.first_name} ${card.employee_prep_rel.last_name}`
: ""
}`}</div>
<div>{`R: ${
card.employee_refinish_rel
? `${card.employee_refinish_rel.first_name} ${card.employee_refinish_rel.last_name}`
: ""
}`}</div>
</div>
</div>
<div className="mex-flex-row__margin">
<div>{`B: ${
card.employee_body_rel
? `${card.employee_body_rel.first_name} ${card.employee_body_rel.last_name}`
: ""
}`}</div>
<div>{`P: ${
card.employee_prep_rel
? `${card.employee_prep_rel.first_name} ${card.employee_prep_rel.last_name}`
: ""
}`}</div>
<div>{`R: ${
card.employee_refinish_rel
? `${card.employee_refinish_rel.first_name} ${card.employee_refinish_rel.last_name}`
: ""
}`}</div>
</div>
</div>
</Col>
</Row>
<Row>
<Col span={24}>
<DateTimeFormatter>{card.scheduled_completion}</DateTimeFormatter>
</Col>
</Row>
<div className="imex-flex-row imex-flex-row__flex-space-around">
<ProductionAlert record={card} key="alert" />
<Link to={`/manage/jobs/${card.id}`}>
<EyeFilled key="setting" />
</Link>
</div>
</Card>
</Col>
</Row>
<Row>
<Col span={24}>
<DateTimeFormatter>{card.scheduled_completion}</DateTimeFormatter>
</Col>
</Row>
<div className="imex-flex-row imex-flex-row__flex-space-around">
<ProductionAlert record={card} key="alert" />
<Link to={`/manage/jobs/${card.id}`}>
<EyeFilled key="setting" />
</Link>
</div>
</Card>
</Dropdown>
);
}

View File

@@ -1,28 +1,36 @@
import React from "react";
import { useMutation } from "@apollo/react-hooks";
import { UPDATE_JOB } from "../../graphql/jobs.queries";
import { Button, notification } from "antd";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { logImEXEvent } from "../../firebase/firebase.utils";
import { UPDATE_JOB } from "../../graphql/jobs.queries";
export default function ProductionRemoveButton({ jobId }) {
const [removeJobFromProduction] = useMutation(UPDATE_JOB);
const { t } = useTranslation();
const handleRemoveFromProd = () => {
logImEXEvent("production_remove_job");
const [loading, setLoading] = useState(false);
removeJobFromProduction({
const handleRemoveFromProd = async () => {
logImEXEvent("production_remove_job");
setLoading(true);
const result = await removeJobFromProduction({
variables: { jobId: jobId, job: { inproduction: false } },
}).catch((error) => {
});
if (!!!result.errors) {
notification["success"]({ message: t("production.successes.removed") });
} else {
notification["error"]({
message: t("production.errors.removing", {
error: JSON.stringify(error),
error: JSON.stringify(result.errors),
}),
});
});
}
setLoading(false);
};
return (
<Button onClick={handleRemoveFromProd} type={"danger"}>
<Button loading={loading} onClick={handleRemoveFromProd} type={"danger"}>
{t("production.actions.remove")}
</Button>
);

View File

@@ -29,6 +29,8 @@ export const GLOBAL_SEARCH_QUERY = gql`
v_model_desc
v_make_desc
v_color
v_vin
plate_no
}
search_payments(args: { search: $search }) {
id

View File

@@ -474,6 +474,7 @@
"text": "Text",
"unknown": "Unknown",
"username": "Username",
"view": "View",
"yes": "Yes"
},
"languages": {
@@ -664,7 +665,8 @@
"recalculate": "Recalculate",
"reconcile": "Reconcile",
"schedule": "Schedule",
"sendcsi": "Send CSI"
"sendcsi": "Send CSI",
"viewdetail": "View Details"
},
"errors": {
"addingtoproduction": "Error adding to production. {{error}}",
@@ -1190,6 +1192,9 @@
"note": "Production Note",
"paintpriority": "P/P",
"refinishhours": "R"
},
"successes": {
"removed": "Job removed from production."
}
},
"profile": {

View File

@@ -474,6 +474,7 @@
"text": "",
"unknown": "Desconocido",
"username": "",
"view": "",
"yes": ""
},
"languages": {
@@ -664,7 +665,8 @@
"recalculate": "",
"reconcile": "",
"schedule": "Programar",
"sendcsi": ""
"sendcsi": "",
"viewdetail": ""
},
"errors": {
"addingtoproduction": "",
@@ -1190,6 +1192,9 @@
"note": "",
"paintpriority": "",
"refinishhours": ""
},
"successes": {
"removed": ""
}
},
"profile": {

View File

@@ -474,6 +474,7 @@
"text": "",
"unknown": "Inconnu",
"username": "",
"view": "",
"yes": ""
},
"languages": {
@@ -664,7 +665,8 @@
"recalculate": "",
"reconcile": "",
"schedule": "Programme",
"sendcsi": ""
"sendcsi": "",
"viewdetail": ""
},
"errors": {
"addingtoproduction": "",
@@ -1190,6 +1192,9 @@
"note": "",
"paintpriority": "",
"refinishhours": ""
},
"successes": {
"removed": ""
}
},
"profile": {