diff --git a/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx new file mode 100644 index 000000000..87d1980a1 --- /dev/null +++ b/client/src/components/dashboard-components/scheduled-in-today/scheduled-in-today.component.jsx @@ -0,0 +1,235 @@ +import { + BranchesOutlined, + ExclamationCircleFilled, + PauseCircleOutlined, +} from "@ant-design/icons"; +import { Card, Space, Table, Tooltip } from "antd"; +import moment from "moment"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import ChatOpenButton from "../../chat-open-button/chat-open-button.component"; +import OwnerNameDisplay from "../../owner-name-display/owner-name-display.component"; +import DashboardRefreshRequired from "../refresh-required.component"; + +export default function DashboardScheduledInToday({ data, ...cardProps }) { + const { t } = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + }); + if (!data) return null; + if (!data.scheduled_in_today) + return ; + + const appt = []; // Flatten Data + data.scheduled_in_today.forEach((item) => { + var i = { + canceled: item.canceled, + id: item.id, + alt_transport: item.job.alt_transport, + clm_no: item.job.clm_no, + jobid: item.job.jobid, + ins_co_nm: item.job.ins_co_nm, + iouparent: item.job.iouparent, + ownerid: item.job.ownerid, + ownr_co_nm: item.job.ownr_co_nm, + ownr_ea: item.job.ownr_ea, + ownr_fn: item.job.ownr_fn, + ownr_ln: item.job.ownr_ln, + ownr_ph1: item.job.ownr_ph1, + ownr_ph2: item.job.ownr_ph2, + production_vars: item.job.production_vars, + ro_number: item.job.ro_number, + suspended: item.job.suspended, + v_make_desc: item.job.v_make_desc, + v_model_desc: item.job.v_model_desc, + v_model_yr: item.job.v_model_yr, + v_vin: item.job.v_vin, + vehicleid: item.job.vehicleid, + note: item.note, + start: moment(item.start).format("hh:mm a"), + title: item.title, + }; + appt.push(i); + }); + appt.sort ( function (a, b) { return new Date(a.start) - new Date(b.start); }); + + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + render: (text, record) => ( + e.stopPropagation()} + > + + {record.ro_number || t("general.labels.na")} + {record.production_vars && record.production_vars.alert ? ( + + ) : null} + {record.suspended && ( + + )} + {record.iouparent && ( + + + + )} + + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + responsive: ["md"], + render: (text, record) => { + return record.ownerid ? ( + e.stopPropagation()} + > + + + ) : ( + + + + ); + }, + }, + { + title: t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ea"), + dataIndex: "ownr_ea", + key: "ownr_ea", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + e.stopPropagation()} + > + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + { + title: t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + ellipsis: true, + responsive: ["md"], + }, + { + title: t("appointments.fields.time"), + dataIndex: "start", + key: "start", + ellipsis: true, + responsive: ["md"], + }, + { + title: t("appointments.fields.alt_transport"), + dataIndex: "alt_transport", + key: "alt_transport", + ellipsis: true, + responsive: ["md"], + }, + ]; + + const handleTableChange = (sorter) => { + setState({ ...state, sortedInfo: sorter }); + }; + + return ( + +
+ + + + ); +} + +export const DashboardScheduledInTodayGql = ` + scheduled_in_today: appointments(where: {start: {_gte: "${moment() + .startOf("day") + .toISOString()}", _lte: "${moment() + .endOf("day") + .toISOString()}"}, canceled: {_eq: false}, block: {_neq: true}}) { + canceled + id + job { + alt_transport + clm_no + jobid: id + ins_co_nm + iouparent + ownerid + ownr_co_nm + ownr_ea + ownr_fn + ownr_ln + ownr_ph1 + ownr_ph2 + production_vars + ro_number + suspended + v_make_desc + v_model_desc + v_model_yr + v_vin + vehicleid + } + note + start + title + } +`; diff --git a/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx b/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx new file mode 100644 index 000000000..586e719ab --- /dev/null +++ b/client/src/components/dashboard-components/scheduled-out-today/scheduled-out-today.component.jsx @@ -0,0 +1,210 @@ +import { + BranchesOutlined, + ExclamationCircleFilled, + PauseCircleOutlined, +} from "@ant-design/icons"; +import { Card, Space, Table, Tooltip } from "antd"; +import moment from "moment"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Link } from "react-router-dom"; +import ChatOpenButton from "../../chat-open-button/chat-open-button.component"; +import OwnerNameDisplay from "../../owner-name-display/owner-name-display.component"; +import DashboardRefreshRequired from "../refresh-required.component"; + +export default function DashboardScheduledOutToday({ data, ...cardProps }) { + const { t } = useTranslation(); + const [state, setState] = useState({ + sortedInfo: {}, + }); + if (!data) return null; + if (!data.scheduled_out_today) + return ; + + data.scheduled_out_today.forEach((item) => { + item.scheduled_completion= moment(item.scheduled_completion).format("hh:mm a") + }); + data.scheduled_out_today.sort(function (a, b) { + return new Date(a.scheduled_completion) - new Date(b.scheduled_completion); + }); + + const columns = [ + { + title: t("jobs.fields.ro_number"), + dataIndex: "ro_number", + key: "ro_number", + render: (text, record) => ( + e.stopPropagation()} + > + + {record.ro_number || t("general.labels.na")} + {record.production_vars && record.production_vars.alert ? ( + + ) : null} + {record.suspended && ( + + )} + {record.iouparent && ( + + + + )} + + + ), + }, + { + title: t("jobs.fields.owner"), + dataIndex: "owner", + key: "owner", + ellipsis: true, + responsive: ["md"], + render: (text, record) => { + return record.ownerid ? ( + e.stopPropagation()} + > + + + ) : ( + + + + ); + }, + }, + { + title: t("jobs.fields.ownr_ph1"), + dataIndex: "ownr_ph1", + key: "ownr_ph1", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ph2"), + dataIndex: "ownr_ph2", + key: "ownr_ph2", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.ownr_ea"), + dataIndex: "ownr_ea", + key: "ownr_ea", + ellipsis: true, + responsive: ["md"], + render: (text, record) => ( + + ), + }, + { + title: t("jobs.fields.vehicle"), + dataIndex: "vehicle", + key: "vehicle", + ellipsis: true, + render: (text, record) => { + return record.vehicleid ? ( + e.stopPropagation()} + > + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + + ) : ( + {`${record.v_model_yr || ""} ${record.v_make_desc || ""} ${ + record.v_model_desc || "" + }`} + ); + }, + }, + { + title: t("jobs.fields.ins_co_nm"), + dataIndex: "ins_co_nm", + key: "ins_co_nm", + ellipsis: true, + responsive: ["md"], + }, + { + title: t("jobs.fields.scheduled_completion"), + dataIndex: "scheduled_completion", + key: "scheduled_completion", + ellipsis: true, + responsive: ["md"], + }, + { + title: t("appointments.fields.alt_transport"), + dataIndex: "alt_transport", + key: "alt_transport", + ellipsis: true, + responsive: ["md"], + }, + ]; + + const handleTableChange = (sorter) => { + setState({ ...state, sortedInfo: sorter }); + }; + + return ( + +
+
+ + + ); +} + +export const DashboardScheduledOutTodayGql = ` + scheduled_out_today: jobs(where: { + date_invoiced: {_is_null: true}, + ro_number: {_is_null: false}, + voided: {_eq: false}, + scheduled_completion: {_gte: "${moment().startOf("day").toISOString()}", + _lte: "${moment().endOf("day").toISOString()}"}}) { + alt_transport + clm_no + jobid: id + ins_co_nm + iouparent + ownerid + ownr_co_nm + ownr_ea + ownr_fn + ownr_ln + ownr_ph1 + ownr_ph2 + production_vars + ro_number + scheduled_completion + suspended + v_make_desc + v_model_desc + v_model_yr + v_vin + vehicleid + + } +`; diff --git a/client/src/components/dashboard-grid/dashboard-grid.component.jsx b/client/src/components/dashboard-grid/dashboard-grid.component.jsx index 39a5432c2..d24dd5641 100644 --- a/client/src/components/dashboard-grid/dashboard-grid.component.jsx +++ b/client/src/components/dashboard-grid/dashboard-grid.component.jsx @@ -1,6 +1,6 @@ import Icon, { SyncOutlined } from "@ant-design/icons"; import { gql, useMutation, useQuery } from "@apollo/client"; -import { Button, Dropdown, Menu, notification, PageHeader, Space } from "antd"; +import { Button, Dropdown, Menu, PageHeader, Space, notification } from "antd"; import i18next from "i18next"; import _ from "lodash"; import moment from "moment"; @@ -37,6 +37,12 @@ import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; //Combination of the following: // /node_modules/react-grid-layout/css/styles.css // /node_modules/react-resizable/css/styles.css +import DashboardScheduledInToday, { + DashboardScheduledInTodayGql, +} from "../dashboard-components/scheduled-in-today/scheduled-in-today.component"; +import DashboardScheduledOutToday, { + DashboardScheduledOutTodayGql, +} from "../dashboard-components/scheduled-out-today/scheduled-out-today.component"; import "./dashboard-grid.styles.scss"; import { GenerateDashboardData } from "./dashboard-grid.utils"; @@ -268,6 +274,28 @@ const componentList = { w: 2, h: 2, }, + ScheduleInToday: { + label: i18next.t("dashboard.titles.scheduledintoday", { + date: moment().startOf("day").format("MM/DD/YYYY"), + }), + component: DashboardScheduledInToday, + gqlFragment: DashboardScheduledInTodayGql, + minW: 10, + minH: 2, + w: 10, + h: 2, + }, + ScheduleOutToday: { + label: i18next.t("dashboard.titles.scheduledouttoday", { + date: moment().startOf("day").format("MM/DD/YYYY"), + }), + component: DashboardScheduledOutToday, + gqlFragment: DashboardScheduledOutTodayGql, + minW: 10, + minH: 2, + w: 10, + h: 2, + }, }; const createDashboardQuery = (state) => { @@ -283,8 +311,12 @@ const createDashboardQuery = (state) => { monthly_sales: jobs(where: {_and: [ { voided: {_eq: false}}, {date_invoiced: {_gte: "${moment() - .startOf("month").startOf('day').toISOString()}"}}, {date_invoiced: {_lte: "${moment() - .endOf("month").endOf('day').toISOString()}"}}]}) { + .startOf("month") + .startOf("day") + .toISOString()}"}}, {date_invoiced: {_lte: "${moment() + .endOf("month") + .endOf("day") + .toISOString()}"}}]}) { id ro_number date_invoiced diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 5a057c73e..ad7662c82 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -858,7 +858,9 @@ "prodhrssummary": "Production Hours Summary", "productiondollars": "Total dollars in Production", "productionhours": "Total hours in Production", - "projectedmonthlysales": "Projected Monthly Sales" + "projectedmonthlysales": "Projected Monthly Sales", + "scheduledintoday": "Sheduled In Today: {{date}}", + "scheduledouttoday": "Sheduled Out Today: {{date}}" } }, "dms": { diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 244ccc21f..662c3e005 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -858,7 +858,9 @@ "prodhrssummary": "", "productiondollars": "", "productionhours": "", - "projectedmonthlysales": "" + "projectedmonthlysales": "", + "scheduledintoday": "", + "scheduledouttoday": "" } }, "dms": { diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 98d10ef58..d93183bfc 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -858,7 +858,9 @@ "prodhrssummary": "", "productiondollars": "", "productionhours": "", - "projectedmonthlysales": "" + "projectedmonthlysales": "", + "scheduledintoday": "", + "scheduledouttoday": "" } }, "dms": {