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": {