From b88795078cc120eba94ab277b739cf418b9dd5e2 Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Mon, 24 Mar 2025 18:16:31 -0700 Subject: [PATCH] IO-3185 Job Drawer Suspend Job Signed-off-by: Allan Carr --- .../job-detail-cards.component.jsx | 53 ++++++++++++++---- .../production-list-detail.component.jsx | 54 +++++++++++++++---- 2 files changed, 87 insertions(+), 20 deletions(-) diff --git a/client/src/components/job-detail-cards/job-detail-cards.component.jsx b/client/src/components/job-detail-cards/job-detail-cards.component.jsx index ea66c9112..5e5df5b58 100644 --- a/client/src/components/job-detail-cards/job-detail-cards.component.jsx +++ b/client/src/components/job-detail-cards/job-detail-cards.component.jsx @@ -1,17 +1,21 @@ -import { PrinterFilled } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; +import { PauseCircleOutlined, PlayCircleOutlined, PrinterFilled } from "@ant-design/icons"; +import { useMutation, useQuery } from "@apollo/client"; import { Button, Card, Col, Divider, Drawer, Grid, Row, Space } from "antd"; import queryString from "query-string"; -import React from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { Link, useLocation, useNavigate } from "react-router-dom"; import { createStructuredSelector } from "reselect"; -import { QUERY_JOB_CARD_DETAILS } from "../../graphql/jobs.queries"; +import { useSocket } from "../../contexts/SocketIO/useSocket.jsx"; +import { logImEXEvent } from "../../firebase/firebase.utils"; +import { QUERY_JOB_CARD_DETAILS, UPDATE_JOB } from "../../graphql/jobs.queries"; +import { insertAuditTrail } from "../../redux/application/application.actions.js"; import { setModalContext } from "../../redux/modals/modals.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; +import AuditTrailMapping from "../../utils/AuditTrailMappings.js"; import AlertComponent from "../alert/alert.component"; import JobSyncButton from "../job-sync-button/job-sync-button.component"; +import JobWatcherToggleContainer from "../job-watcher-toggle/job-watcher-toggle.container.jsx"; import JobsDetailHeader from "../jobs-detail-header/jobs-detail-header.component"; import LoadingSpinner from "../loading-spinner/loading-spinner.component"; import JobDetailCardsDamageComponent from "./job-detail-cards.damage.component"; @@ -21,15 +25,21 @@ import JobDetailCardsInsuranceComponent from "./job-detail-cards.insurance.compo import JobDetailCardsNotesComponent from "./job-detail-cards.notes.component"; import JobDetailCardsPartsComponent from "./job-detail-cards.parts.component"; import JobDetailCardsTotalsComponent from "./job-detail-cards.totals.component"; -import JobWatcherToggleContainer from "../job-watcher-toggle/job-watcher-toggle.container.jsx"; -import { useSocket } from "../../contexts/SocketIO/useSocket.jsx"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); const mapDispatchToProps = (dispatch) => ({ - setPrintCenterContext: (context) => dispatch(setModalContext({ context: context, modal: "printCenter" })) + setPrintCenterContext: (context) => dispatch(setModalContext({ context: context, modal: "printCenter" })), + insertAuditTrail: ({ jobid, operation, type }) => + dispatch( + insertAuditTrail({ + jobid, + operation, + type + }) + ) }); const span = { @@ -38,8 +48,9 @@ const span = { xxl: { span: 8 } }; -export function JobDetailCards({ bodyshop, setPrintCenterContext }) { +export function JobDetailCards({ bodyshop, setPrintCenterContext, insertAuditTrail }) { const { scenarioNotificationsOn } = useSocket(); + const [updateJob] = useMutation(UPDATE_JOB); const selectedBreakpoint = Object.entries(Grid.useBreakpoint()) .filter((screen) => !!screen[1]) .slice(-1)[0]; @@ -91,7 +102,29 @@ export function JobDetailCards({ bodyshop, setPrintCenterContext }) { extra={ - + diff --git a/client/src/components/production-list-detail/production-list-detail.component.jsx b/client/src/components/production-list-detail/production-list-detail.component.jsx index ea2d6ef67..7db55bd07 100644 --- a/client/src/components/production-list-detail/production-list-detail.component.jsx +++ b/client/src/components/production-list-detail/production-list-detail.component.jsx @@ -1,17 +1,20 @@ -import { PrinterFilled } from "@ant-design/icons"; -import { useQuery } from "@apollo/client"; -import { Button, Descriptions, Drawer, Space } from "antd"; +import { PauseCircleOutlined, PlayCircleOutlined, PrinterFilled } from "@ant-design/icons"; import { PageHeader } from "@ant-design/pro-layout"; +import { useMutation, useQuery } from "@apollo/client"; +import { Button, Descriptions, Drawer, Space } from "antd"; import queryString from "query-string"; -import React from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { useLocation, useNavigate } from "react-router-dom"; import { createStructuredSelector } from "reselect"; -import { QUERY_JOB_CARD_DETAILS } from "../../graphql/jobs.queries"; +import { useSocket } from "../../contexts/SocketIO/useSocket.jsx"; +import { logImEXEvent } from "../../firebase/firebase.utils.js"; +import { QUERY_JOB_CARD_DETAILS, UPDATE_JOB } from "../../graphql/jobs.queries"; +import { insertAuditTrail } from "../../redux/application/application.actions.js"; import { setModalContext } from "../../redux/modals/modals.actions"; import { selectTechnician } from "../../redux/tech/tech.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors"; +import AuditTrailMapping from "../../utils/AuditTrailMappings.js"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import { DateFormatter } from "../../utils/DateFormatter"; import PhoneNumberFormatter from "../../utils/PhoneFormatter"; @@ -24,22 +27,29 @@ import JobDetailCardsPartsComponent from "../job-detail-cards/job-detail-cards.p import CardTemplate from "../job-detail-cards/job-detail-cards.template.component"; import JobEmployeeAssignments from "../job-employee-assignments/job-employee-assignments.container"; import ScoreboardAddButton from "../job-scoreboard-add-button/job-scoreboard-add-button.component"; +import JobWatcherToggleContainer from "../job-watcher-toggle/job-watcher-toggle.container.jsx"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import ProductionRemoveButton from "../production-remove-button/production-remove-button.component"; -import JobWatcherToggleContainer from "../job-watcher-toggle/job-watcher-toggle.container.jsx"; -import { useSocket } from "../../contexts/SocketIO/useSocket.jsx"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, technician: selectTechnician }); const mapDispatchToProps = (dispatch) => ({ - setPrintCenterContext: (context) => dispatch(setModalContext({ context: context, modal: "printCenter" })) + setPrintCenterContext: (context) => dispatch(setModalContext({ context: context, modal: "printCenter" })), + insertAuditTrail: ({ jobid, operation, type }) => + dispatch( + insertAuditTrail({ + jobid, + operation, + type + }) + ) }); export default connect(mapStateToProps, mapDispatchToProps)(ProductionListDetail); -export function ProductionListDetail({ bodyshop, jobs, setPrintCenterContext, technician }) { +export function ProductionListDetail({ bodyshop, jobs, setPrintCenterContext, technician, insertAuditTrail }) { const search = queryString.parse(useLocation().search); const history = useNavigate(); const { selected } = search; @@ -58,6 +68,7 @@ export function ProductionListDetail({ bodyshop, jobs, setPrintCenterContext, te fetchPolicy: "network-only", nextFetchPolicy: "network-only" }); + const [updateJob] = useMutation(UPDATE_JOB); return ( {!technician ? : null} + {!technician && ( + + )} {!technician ? : null}