import { useQuery } from "@apollo/client/react"; import { gql } from "@apollo/client"; import { Badge, Card, Space, Tag } from "antd"; import ResponsiveTable from "../responsive-table/responsive-table.component"; import axios from "axios"; import { isEmpty } from "lodash"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { createStructuredSelector } from "reselect"; import { logImEXEvent } from "../../firebase/firebase.utils"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { DateTimeFormatterFunction } from "../../utils/DateFormatter"; import dayjs from "../../utils/day"; import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import "./job-lifecycle.styles.scss"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop }); const mapDispatchToProps = () => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) }); // show text on bar if text can fit export function JobLifecycleComponent({ bodyshop, job, statuses }) { const [loading, setLoading] = useState(true); const [lifecycleData, setLifecycleData] = useState(null); const { t } = useTranslation(); // Used for tracking external state changes. const hasLifeCycleAccess = HasFeatureAccess({ bodyshop, featureName: "lifecycle" }); const { data } = useQuery( gql` query get_job_test($id: uuid!) { jobs_by_pk(id: $id) { id status } } `, { variables: { id: job.id }, fetchPolicy: "cache-only" } ); /** * Gets the lifecycle data for the job. * @returns {Promise} */ const getLifecycleData = useCallback(async () => { if (job && job.id && statuses && statuses.statuses) { try { setLoading(true); const response = await axios.post("/job/lifecycle", { jobids: job.id, statuses: statuses.statuses }); logImEXEvent("jobs_lifecycle_data", {}); const data = response.data.transition[job.id]; setLifecycleData(data); } catch (err) { console.error(`${t("job_lifecycle.errors.fetch")}: ${err.message}`); } finally { setLoading(false); } } }, [job, statuses, t]); useEffect(() => { if (!data) return; setTimeout(() => { getLifecycleData().catch((err) => console.error(`${t("job_lifecycle.errors.fetch")}: ${err.message}`)); }, 500); }, [data, getLifecycleData, t]); const columns = [ { title: t("job_lifecycle.columns.value"), dataIndex: "value", key: "value", render: (text) => ( {text} ) }, { title: t("job_lifecycle.columns.start"), dataIndex: "start", key: "start", sorter: (a, b) => dayjs(a.start).unix() - dayjs(b.start).unix(), render: (text) => ( {DateTimeFormatterFunction(text)} ) }, { title: t("job_lifecycle.columns.relative_start"), dataIndex: "start_readable", key: "start_readable" }, { title: t("job_lifecycle.columns.end"), dataIndex: "end", key: "end", sorter: (a, b) => { if (isEmpty(a.end) || isEmpty(b.end)) { if (isEmpty(a.end) && isEmpty(b.end)) { return 0; } return isEmpty(a.end) ? 1 : -1; } return dayjs(a.end).unix() - dayjs(b.end).unix(); }, render: (text) => ( {isEmpty(text) ? t("job_lifecycle.content.not_available") : DateTimeFormatterFunction(text)} ) }, { title: t("job_lifecycle.columns.relative_end"), dataIndex: "end_readable", key: "end_readable" }, { title: t("job_lifecycle.columns.duration"), dataIndex: "duration_readable", key: "duration_readable", sorter: (a, b) => a.duration - b.duration } ]; return ( {!loading ? ( lifecycleData && lifecycleData.lifecycle && lifecycleData.durations ? ( {t("job_lifecycle.content.title_durations")} } style={{ width: "100%" }} > {!hasLifeCycleAccess && ( )}
{lifecycleData.durations.summations.map((key, index, array) => { const isFirst = index === 0; const isLast = index === array.length - 1; return (
{key.percentage > 15 ? ( <>
{key.roundedPercentage}
{key.status}
) : null}
); })}
{lifecycleData.durations.summations.map((key) => (
{key.status} ( {key.roundedPercentage} )
))}
{lifecycleData?.durations?.humanReadableTotal || (lifecycleData.lifecycle[0] && lifecycleData.lifecycle[0].value && lifecycleData?.durations?.totalCurrentStatusDuration?.humanReadable) ? (
    {lifecycleData.durations && lifecycleData.durations.humanReadableTotal && (
  • {t("job_lifecycle.content.previous_status_accumulated_time")}: {" "} {lifecycleData.durations.humanReadableTotal}
  • )} {lifecycleData.lifecycle[0] && lifecycleData.lifecycle[0].value && lifecycleData?.durations?.totalCurrentStatusDuration?.humanReadable && (
  • {t("job_lifecycle.content.current_status_accumulated_time")} ( {lifecycleData.lifecycle[0].value}): {lifecycleData.durations.totalCurrentStatusDuration.humanReadable}
  • )}
) : null}
{t("job_lifecycle.content.title_transitions")} } > ) : ( {t("job_lifecycle.content.data_unavailable")} ) ) : ( {t("job_lifecycle.content.loading")} )} ); } export default connect(mapStateToProps, mapDispatchToProps)(JobLifecycleComponent);