import { DownCircleFilled } from "@ant-design/icons"; import { useApolloClient, useMutation } from "@apollo/react-hooks"; import { Button, Dropdown, Menu, notification, Popconfirm } 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 { DELETE_JOB } from "../../graphql/jobs.queries"; import { selectJobReadOnly } from "../../redux/application/application.selectors"; import { setModalContext } from "../../redux/modals/modals.actions"; import { selectBodyshop } from "../../redux/user/user.selectors"; 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"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, jobRO: selectJobReadOnly, }); 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" })), }); export function JobsDetailHeaderActions({ job, bodyshop, refetch, setScheduleContext, setBillEnterContext, setPaymentContext, setJobCostingContext, jobRO, }) { const { t } = useTranslation(); const client = useApolloClient(); const history = useHistory(); const [deleteJob] = useMutation(DELETE_JOB); 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 = ( { logImEXEvent("job_header_schedule"); setScheduleContext({ actions: { refetch: refetch }, context: { jobId: job.id, job: job, }, }); }} > {t("jobs.actions.schedule")} {!!job.intakechecklist || !jobInPreProduction || !job.converted || jobRO ? ( t("jobs.actions.intake") ) : ( {t("jobs.actions.intake")} )} {!jobInProduction ? ( t("jobs.actions.deliver") ) : ( {t("jobs.actions.deliver")} )} { logImEXEvent("job_header_enter_payment"); setPaymentContext({ actions: {}, context: { jobid: job.id }, }); }} > {t("menus.header.enterpayment")} {t("menus.jobsactions.newcccontract")} {job.inproduction ? ( AddToProduction(client, job.id, refetch, true)} > {t("jobs.actions.removefromproduction")} ) : ( AddToProduction(client, job.id, refetch)} > {t("jobs.actions.addtoproduction")} )} e.stopPropagation()} onConfirm={() => DuplicateJob( client, job.id, { defaultOpenStatus: bodyshop.md_ro_statuses.default_imported }, (newJobId) => { history.push(`/manage/jobs/${newJobId}`); notification["success"]({ message: t("jobs.successes.duplicated"), }); }, true ) } getPopupContainer={(trigger) => trigger.parentNode} > {t("menus.jobsactions.duplicate")} e.stopPropagation()} onConfirm={() => DuplicateJob( client, job.id, { defaultOpenStatus: bodyshop.md_ro_statuses.default_imported }, (newJobId) => { history.push(`/manage/jobs/${newJobId}`); notification["success"]({ message: t("jobs.successes.duplicated"), }); } ) } getPopupContainer={(trigger) => trigger.parentNode} > {t("menus.jobsactions.duplicatenolines")} { logImEXEvent("job_header_enter_bills"); setBillEnterContext({ actions: { refetch: refetch }, context: { job: job, }, }); }} > {t("jobs.actions.postbills")} {!!job.date_invoiced || !jobInPostProduction || jobRO ? ( t("menus.jobsactions.closejob") ) : ( {t("menus.jobsactions.closejob")} )} {!!job.date_invoiced || jobRO ? ( t("menus.jobsactions.admin") ) : ( {t("menus.jobsactions.admin")} )} { logImEXEvent("job_header_job_costing"); setJobCostingContext({ actions: { refetch: refetch }, context: { jobId: job.id, }, }); }} > {t("jobs.labels.jobcosting")} {job && !job.converted && ( e.stopPropagation()} onConfirm={async () => { //delete the job. const result = await deleteJob({ variables: { id: job.id } }); if (!!!result.errors) { notification["success"]({ message: t("jobs.successes.delete"), }); //go back to jobs list. history.push(`/manage/`); } else { notification["error"]({ message: t("jobs.errors.deleted", { error: JSON.stringify(result.errors), }), }); } }} getPopupContainer={(trigger) => trigger.parentNode} > {t("menus.jobsactions.deletejob")} )} ); return ( ); } export default connect( mapStateToProps, mapDispatchToProps )(JobsDetailHeaderActions);