import { DownCircleFilled } from "@ant-design/icons"; import { useApolloClient, useMutation } from "@apollo/client"; import { Button, Dropdown, Form, Menu, Popconfirm, Popover, Select, notification, } from "antd"; import React, { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { Link, useHistory } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { logImEXEvent } from "../../firebase/firebase.utils"; import { CANCEL_APPOINTMENTS_BY_JOB_ID } from "../../graphql/appointments.queries"; import { DELETE_JOB, UPDATE_JOB, VOID_JOB } from "../../graphql/jobs.queries"; import { insertAuditTrail } from "../../redux/application/application.actions"; import { selectJobReadOnly } from "../../redux/application/application.selectors"; import { setModalContext } from "../../redux/modals/modals.actions"; import { selectBodyshop, selectCurrentUser, } from "../../redux/user/user.selectors"; import AuditTrailMapping from "../../utils/AuditTrailMappings"; import RbacWrapper from "../rbac-wrapper/rbac-wrapper.component"; import JobsDetailHeaderActionsAddevent from "./jobs-detail-header-actions.addevent"; import AddToProduction from "./jobs-detail-header-actions.addtoproduction.util"; import JobsDetaiLheaderCsi from "./jobs-detail-header-actions.csi.component"; import DuplicateJob from "./jobs-detail-header-actions.duplicate.util"; import JobsDetailHeaderActionsExportcustdataComponent from "./jobs-detail-header-actions.exportcustdata.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, jobRO: selectJobReadOnly, currentUser: selectCurrentUser, }); const mapDispatchToProps = (dispatch) => ({ setScheduleContext: (context) => dispatch(setModalContext({ context: context, modal: "schedule" })), setBillEnterContext: (context) => dispatch(setModalContext({ context: context, modal: "billEnter" })), setPaymentContext: (context) => dispatch(setModalContext({ context: context, modal: "payment" })), setJobCostingContext: (context) => dispatch(setModalContext({ context: context, modal: "jobCosting" })), setTimeTicketContext: (context) => dispatch(setModalContext({ context: context, modal: "timeTicket" })), setTimeTicketTaskContext: (context) => dispatch(setModalContext({ context: context, modal: "timeTicketTask" })), setCardPaymentContext: (context) => dispatch(setModalContext({ context: context, modal: "cardPayment" })), insertAuditTrail: ({ jobid, operation }) => dispatch(insertAuditTrail({ jobid, operation })), }); export function JobsDetailHeaderActions({ job, bodyshop, currentUser, refetch, setScheduleContext, setBillEnterContext, setPaymentContext, setJobCostingContext, jobRO, setTimeTicketContext, setTimeTicketTaskContext, setCardPaymentContext, insertAuditTrail, }) { const { t } = useTranslation(); const client = useApolloClient(); const history = useHistory(); const [deleteJob] = useMutation(DELETE_JOB); const [updateJob] = useMutation(UPDATE_JOB); const [voidJob] = useMutation(VOID_JOB); const [cancelAllAppointments] = useMutation(CANCEL_APPOINTMENTS_BY_JOB_ID); 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 handleAlertToggle = (e) => { logImEXEvent("production_toggle_alert"); //e.stopPropagation(); updateJob({ variables: { jobId: job.id, job: { production_vars: { ...job.production_vars, alert: !!job.production_vars && !!job.production_vars.alert ? !job.production_vars.alert : true, }, }, }, }); }; const handleSuspend = (e) => { logImEXEvent("production_toggle_alert"); //e.stopPropagation(); updateJob({ variables: { jobId: job.id, job: { suspended: !job.suspended, }, }, }); }; const statusmenu = ( { logImEXEvent("job_header_schedule"); setScheduleContext({ actions: { refetch: refetch }, context: { jobId: job.id, job: job, alt_transport: job.alt_transport, }, }); }} > {t("jobs.actions.schedule")} {job.status !== bodyshop.md_ro_statuses.default_scheduled ? ( t("menus.jobsactions.cancelallappointments") ) : ( { const jobUpdate = await cancelAllAppointments({ variables: { jobid: job.id, job: { date_scheduled: null, scheduled_in: null, scheduled_completion: null, lost_sale_reason, date_lost_sale: new Date(), status: bodyshop.md_ro_statuses.default_imported, }, }, }); if (!jobUpdate.errors) { notification["success"]({ message: t("appointments.successes.canceled"), }); insertAuditTrail({ jobid: job.id, operation: AuditTrailMapping.appointmentcancel(lost_sale_reason), }); return; } }} >