Added validation to job actions BOD-391

This commit is contained in:
Patrick Fic
2020-09-22 10:47:03 -07:00
parent 489ef3df0d
commit abb22a5d0f
10 changed files with 83 additions and 21 deletions

View File

@@ -1,4 +1,4 @@
<babeledit_project be_version="2.7.1" version="1.2"> <babeledit_project version="1.2" be_version="2.7.1">
<!-- <!--
BabelEdit project file BabelEdit project file
@@ -12064,6 +12064,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>cannotintake</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>closing</name> <name>closing</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>

View File

@@ -30,7 +30,7 @@ export function JobLinesComponent({
setSearchText, setSearchText,
selectedLines, selectedLines,
setSelectedLines, setSelectedLines,
jobId, job,
setJobLineEditContext, setJobLineEditContext,
}) { }) {
const [state, setState] = useState({ const [state, setState] = useState({
@@ -308,12 +308,14 @@ export function JobLinesComponent({
<SyncOutlined /> <SyncOutlined />
</Button> </Button>
<Button <Button
disabled={selectedLines.length > 0 ? false : true} disabled={
!job.converted || (selectedLines.length > 0 ? false : true)
}
onClick={() => { onClick={() => {
setPartsOrderContext({ setPartsOrderContext({
actions: { refetch: refetch }, actions: { refetch: refetch },
context: { context: {
jobId: jobId, jobId: job.jobId,
linesToOrder: selectedLines, linesToOrder: selectedLines,
}, },
}); });
@@ -346,7 +348,7 @@ export function JobLinesComponent({
onClick={() => { onClick={() => {
setJobLineEditContext({ setJobLineEditContext({
actions: { refetch: refetch }, actions: { refetch: refetch },
context: { jobid: jobId }, context: { jobid: job.jobId },
}); });
}} }}
> >
@@ -370,7 +372,7 @@ export function JobLinesComponent({
{record.parts_order_lines.map((item) => ( {record.parts_order_lines.map((item) => (
<div key={item.id}> <div key={item.id}>
<Link <Link
to={`/manage/jobs/${jobId}?tab=partssublet&partsorderid=${item.parts_order.id}`} to={`/manage/jobs/${job.jobId}?tab=partssublet&partsorderid=${item.parts_order.id}`}
> >
{item.parts_order.order_number || ""} {item.parts_order.order_number || ""}
</Link> </Link>

View File

@@ -1,7 +1,7 @@
import React, { useState } from "react"; import React, { useState } from "react";
import JobLinesComponent from "./job-lines.component"; import JobLinesComponent from "./job-lines.component";
function JobLinesContainer({ jobId, joblines, refetch }) { function JobLinesContainer({ job, joblines, refetch }) {
const [searchText, setSearchText] = useState(""); const [searchText, setSearchText] = useState("");
const [selectedLines, setSelectedLines] = useState([]); const [selectedLines, setSelectedLines] = useState([]);
@@ -38,7 +38,7 @@ function JobLinesContainer({ jobId, joblines, refetch }) {
setSearchText={setSearchText} setSearchText={setSearchText}
selectedLines={selectedLines} selectedLines={selectedLines}
setSelectedLines={setSelectedLines} setSelectedLines={setSelectedLines}
jobId={jobId} job={job}
/> />
); );
} }

View File

@@ -1,7 +1,7 @@
import { DownCircleFilled } from "@ant-design/icons"; import { DownCircleFilled } from "@ant-design/icons";
import { useApolloClient } from "@apollo/react-hooks"; import { useApolloClient } from "@apollo/react-hooks";
import { Button, Dropdown, Menu, Popconfirm } from "antd"; import { Button, Dropdown, Menu, Popconfirm } from "antd";
import React from "react"; import React, { useMemo } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { Link, useHistory } from "react-router-dom"; import { Link, useHistory } from "react-router-dom";
@@ -40,9 +40,25 @@ export function JobsDetailHeaderActions({
const { t } = useTranslation(); const { t } = useTranslation();
const client = useApolloClient(); const client = useApolloClient();
const history = useHistory(); const history = useHistory();
const jobInProduction = useMemo(() => {
return bodyshop.md_ro_statuses.production_statuses.includes(job.status);
}, [job, bodyshop.md_ro_statuses.production_statuses]);
const jobInPreProduction = useMemo(() => {
return bodyshop.md_ro_statuses.pre_production_statuses.includes(job.status);
}, [job.status, bodyshop.md_ro_statuses.pre_production_statuses]);
const jobInPostProduction = useMemo(() => {
return bodyshop.md_ro_statuses.post_production_statuses.includes(
job.status
);
}, [job.status, bodyshop.md_ro_statuses.post_production_statuses]);
const statusmenu = ( const statusmenu = (
<Menu key="popovermenu"> <Menu key="popovermenu">
<Menu.Item <Menu.Item
disabled={!jobInPreProduction || !job.converted}
onClick={() => { onClick={() => {
logImEXEvent("job_header_schedule"); logImEXEvent("job_header_schedule");
@@ -57,8 +73,12 @@ export function JobsDetailHeaderActions({
> >
{t("jobs.actions.schedule")} {t("jobs.actions.schedule")}
</Menu.Item> </Menu.Item>
<Menu.Item disabled={!!job.intakechecklist}> <Menu.Item
{!!job.intakechecklist ? ( disabled={
!!job.intakechecklist || !jobInPreProduction || !job.converted
}
>
{!!job.intakechecklist || !jobInPreProduction || !job.converted ? (
t("jobs.actions.intake") t("jobs.actions.intake")
) : ( ) : (
<Link to={`/manage/jobs/${job.id}/intake`}> <Link to={`/manage/jobs/${job.id}/intake`}>
@@ -66,8 +86,8 @@ export function JobsDetailHeaderActions({
</Link> </Link>
)} )}
</Menu.Item> </Menu.Item>
<Menu.Item disabled={!!job.deliverchecklist}> <Menu.Item disabled={!jobInProduction}>
{!!job.deliveryhecklist ? ( {!jobInProduction ? (
t("jobs.actions.deliver") t("jobs.actions.deliver")
) : ( ) : (
<Link to={`/manage/jobs/${job.id}/deliver`}> <Link to={`/manage/jobs/${job.id}/deliver`}>
@@ -141,8 +161,11 @@ export function JobsDetailHeaderActions({
> >
{t("jobs.actions.postInvoices")} {t("jobs.actions.postInvoices")}
</Menu.Item> </Menu.Item>
<Menu.Item disabled={!!job.date_invoiced} key="closejob"> <Menu.Item
{job.date_invoiced ? ( disabled={!!job.date_invoiced || !jobInPostProduction}
key="closejob"
>
{!!job.date_invoiced || !jobInPostProduction ? (
t("menus.jobsactions.closejob") t("menus.jobsactions.closejob")
) : ( ) : (
<Link <Link

View File

@@ -161,6 +161,8 @@ export const QUERY_INTAKE_CHECKLIST = gql`
est_number est_number
scheduled_completion scheduled_completion
scheduled_delivery scheduled_delivery
intakechecklist
status
} }
} }
`; `;

View File

@@ -182,7 +182,7 @@ export function JobsDetailPage({
key="repairdata" key="repairdata"
> >
<JobsLinesContainer <JobsLinesContainer
jobId={job.id} job={job}
joblines={job.joblines} joblines={job.joblines}
refetch={refetch} refetch={refetch}
/> />

View File

@@ -14,6 +14,7 @@ import {
} 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 RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { Result } from "antd";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser //currentUser: selectCurrentUser
@@ -66,11 +67,21 @@ export function JobsIntakeContainer({
return ( return (
<RbacWrapper action="jobs:intake"> <RbacWrapper action="jobs:intake">
<div> <div>
<JobChecklist {!!data.jobs_by_pk.intakechecklist ||
type="intake" !(
checklistConfig={(data && data.bodyshops_by_pk.intakechecklist) || {}} data.jobs_by_pk.status === bodyshop.md_ro_statuses.default_open ||
job={data && data.jobs_by_pk} data.jobs_by_pk.status === bodyshop.md_ro_statuses.default_scheduled
/> ) ? (
<Result status="warning" title={t("jobs.errors.cannotintake")} />
) : (
<JobChecklist
type="intake"
checklistConfig={
(data && data.bodyshops_by_pk.intakechecklist) || {}
}
job={data && data.jobs_by_pk}
/>
)}
</div> </div>
</RbacWrapper> </RbacWrapper>
); );

View File

@@ -785,6 +785,7 @@
}, },
"errors": { "errors": {
"addingtoproduction": "Error adding to production. {{error}}", "addingtoproduction": "Error adding to production. {{error}}",
"cannotintake": "Intake cannot be completed for this job. It has either already been completed or the job is already here.",
"closing": "Error closing job. {{error}}", "closing": "Error closing job. {{error}}",
"creating": "Error encountered while creating job. {{error}}", "creating": "Error encountered while creating job. {{error}}",
"deleted": "Error deleting job.", "deleted": "Error deleting job.",

View File

@@ -785,6 +785,7 @@
}, },
"errors": { "errors": {
"addingtoproduction": "", "addingtoproduction": "",
"cannotintake": "",
"closing": "", "closing": "",
"creating": "", "creating": "",
"deleted": "Error al eliminar el trabajo.", "deleted": "Error al eliminar el trabajo.",

View File

@@ -785,6 +785,7 @@
}, },
"errors": { "errors": {
"addingtoproduction": "", "addingtoproduction": "",
"cannotintake": "",
"closing": "", "closing": "",
"creating": "", "creating": "",
"deleted": "Erreur lors de la suppression du travail.", "deleted": "Erreur lors de la suppression du travail.",