BOD-21 Added some custom components to render CT, BP, PP to production. Schema changes for view to include body and refinish hrs.

This commit is contained in:
Patrick Fic
2020-04-22 11:09:47 -07:00
parent 9c84024a08
commit 400dfabcec
25 changed files with 703 additions and 107 deletions

View File

@@ -1,4 +1,4 @@
<babeledit_project be_version="2.6.1" version="1.2"> <babeledit_project version="1.2" be_version="2.6.1">
<!-- <!--
BabelEdit project file BabelEdit project file
@@ -8184,6 +8184,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>bodyhours</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<folder_node> <folder_node>
<name>cards</name> <name>cards</name>
<children> <children>
@@ -8850,6 +8871,27 @@
</concept_node> </concept_node>
</children> </children>
</folder_node> </folder_node>
<concept_node>
<name>refinishhours</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>vehicle_info</name> <name>vehicle_info</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -9437,6 +9479,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>productionlist</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>schedule</name> <name>schedule</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -11011,6 +11074,90 @@
<folder_node> <folder_node>
<name>actions</name> <name>actions</name>
<children> <children>
<concept_node>
<name>bodypriority-clear</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>bodypriority-set</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>paintpriority-clear</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>paintpriority-set</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>saveconfig</name> <name>saveconfig</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -11058,6 +11205,90 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>alertoff</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>alerton</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>bodypriority</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>cycletime</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node> <concept_node>
<name>note</name> <name>note</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>
@@ -11079,6 +11310,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>paintpriority</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children> </children>
</folder_node> </folder_node>
</children> </children>

View File

@@ -42,29 +42,28 @@ function Header({
//TODO Add //TODO Add
return ( return (
<Row type="flex" justify="space-around" align="middle"> <Row type='flex' justify='space-around' align='middle'>
{logo ? ( {logo ? (
<Col span={3}> <Col span={3}>
<img alt="Shop Logo" src={logo} style={{ height: "40px" }} /> <img alt='Shop Logo' src={logo} style={{ height: "40px" }} />
</Col> </Col>
) : null} ) : null}
<Col span={21}> <Col span={21}>
{landingHeader ? ( {landingHeader ? (
<Menu <Menu
theme="dark" theme='dark'
className="header" className='header'
selectedKeys={selectedNavItem} selectedKeys={selectedNavItem}
mode="horizontal" mode='horizontal'
onClick={handleMenuClick} onClick={handleMenuClick}>
>
<ManageSignInButton /> <ManageSignInButton />
<Menu.SubMenu <Menu.SubMenu
title={ title={
<div> <div>
<Avatar <Avatar
size="medium" size='medium'
alt="Avatar" alt='Avatar'
src={ src={
currentUser.photoURL ? currentUser.photoURL : UserImage currentUser.photoURL ? currentUser.photoURL : UserImage
} }
@@ -72,13 +71,12 @@ function Header({
/> />
{currentUser.displayName || t("general.labels.unknown")} {currentUser.displayName || t("general.labels.unknown")}
</div> </div>
} }>
>
<Menu.Item onClick={() => signOutStart()}> <Menu.Item onClick={() => signOutStart()}>
{t("user.actions.signout")} {t("user.actions.signout")}
</Menu.Item> </Menu.Item>
<Menu.Item> <Menu.Item>
<Link to="/manage/profile"> <Link to='/manage/profile'>
{t("menus.currentuser.profile")} {t("menus.currentuser.profile")}
</Link> </Link>
</Menu.Item> </Menu.Item>
@@ -88,15 +86,14 @@ function Header({
<GlobalOutlined /> <GlobalOutlined />
<span>{t("menus.currentuser.languageselector")}</span> <span>{t("menus.currentuser.languageselector")}</span>
</span> </span>
} }>
> <Menu.Item actiontype='lang-select' key='en-US'>
<Menu.Item actiontype="lang-select" key="en-US">
{t("general.languages.english")} {t("general.languages.english")}
</Menu.Item> </Menu.Item>
<Menu.Item actiontype="lang-select" key="fr-CA"> <Menu.Item actiontype='lang-select' key='fr-CA'>
{t("general.languages.french")} {t("general.languages.french")}
</Menu.Item> </Menu.Item>
<Menu.Item actiontype="lang-select" key="es-MX"> <Menu.Item actiontype='lang-select' key='es-MX'>
{t("general.languages.spanish")} {t("general.languages.spanish")}
</Menu.Item> </Menu.Item>
</Menu.SubMenu> </Menu.SubMenu>
@@ -104,14 +101,13 @@ function Header({
</Menu> </Menu>
) : ( ) : (
<Menu <Menu
theme="dark" theme='dark'
className="header" className='header'
selectedKeys={selectedNavItem} selectedKeys={selectedNavItem}
mode="horizontal" mode='horizontal'
onClick={handleMenuClick} onClick={handleMenuClick}>
> <Menu.Item key='home'>
<Menu.Item key="home"> <Link to='/manage'>
<Link to="/manage">
<HomeFilled /> <HomeFilled />
{t("menus.header.home")} {t("menus.header.home")}
</Link> </Link>
@@ -122,32 +118,37 @@ function Header({
<Icon component={FaCarCrash} /> <Icon component={FaCarCrash} />
<span>{t("menus.header.jobs")}</span> <span>{t("menus.header.jobs")}</span>
</span> </span>
} }>
> <Menu.Item key='schedule'>
<Menu.Item key="schedule"> <Link to='/manage/schedule'>
<Link to="/manage/schedule">
<Icon component={FaCalendarAlt} /> <Icon component={FaCalendarAlt} />
{t("menus.header.schedule")} {t("menus.header.schedule")}
</Link> </Link>
</Menu.Item> </Menu.Item>
<Menu.Item key="activejobs"> <Menu.Item key='production'>
<Link to="/manage/jobs">{t("menus.header.activejobs")}</Link> <Link to='/manage/production/list'>
<Icon component={FaCalendarAlt} />
{t("menus.header.productionlist")}
</Link>
</Menu.Item> </Menu.Item>
<Menu.Item key="availablejobs"> <Menu.Item key='activejobs'>
<Link to="/manage/available"> <Link to='/manage/jobs'>{t("menus.header.activejobs")}</Link>
</Menu.Item>
<Menu.Item key='availablejobs'>
<Link to='/manage/available'>
{t("menus.header.availablejobs")} {t("menus.header.availablejobs")}
</Link> </Link>
</Menu.Item> </Menu.Item>
</Menu.SubMenu> </Menu.SubMenu>
<Menu.SubMenu title={t("menus.header.customers")}> <Menu.SubMenu title={t("menus.header.customers")}>
<Menu.Item key="owners"> <Menu.Item key='owners'>
<Link to="/manage/owners"> <Link to='/manage/owners'>
<TeamOutlined /> <TeamOutlined />
{t("menus.header.owners")} {t("menus.header.owners")}
</Link> </Link>
</Menu.Item> </Menu.Item>
<Menu.Item key="vehicles"> <Menu.Item key='vehicles'>
<Link to="/manage/vehicles"> <Link to='/manage/vehicles'>
<CarFilled /> <CarFilled />
{t("menus.header.vehicles")} {t("menus.header.vehicles")}
</Link> </Link>
@@ -160,22 +161,21 @@ function Header({
<CarFilled /> <CarFilled />
<span>{t("menus.header.courtesycars")}</span> <span>{t("menus.header.courtesycars")}</span>
</span> </span>
} }>
> <Menu.Item key='courtesycarsall'>
<Menu.Item key="courtesycarsall"> <Link to='/manage/courtesycars'>
<Link to="/manage/courtesycars">
<CarFilled /> <CarFilled />
{t("menus.header.courtesycars-all")} {t("menus.header.courtesycars-all")}
</Link> </Link>
</Menu.Item> </Menu.Item>
<Menu.Item key="contracts"> <Menu.Item key='contracts'>
<Link to="/manage/courtesycars/contracts"> <Link to='/manage/courtesycars/contracts'>
<FileFilled /> <FileFilled />
{t("menus.header.courtesycars-contracts")} {t("menus.header.courtesycars-contracts")}
</Link> </Link>
</Menu.Item> </Menu.Item>
<Menu.Item key="newcontract"> <Menu.Item key='newcontract'>
<Link to="/manage/courtesycars/contracts/new"> <Link to='/manage/courtesycars/contracts/new'>
<FileAddFilled /> <FileAddFilled />
{t("menus.header.courtesycars-newcontract")} {t("menus.header.courtesycars-newcontract")}
</Link> </Link>
@@ -188,41 +188,38 @@ function Header({
<DollarCircleFilled /> <DollarCircleFilled />
<span>{t("menus.header.accounting")}</span> <span>{t("menus.header.accounting")}</span>
</span> </span>
} }>
>
<Menu.Item <Menu.Item
key="enterinvoices" key='enterinvoices'
onClick={() => { onClick={() => {
setInvoiceEnterContext({ setInvoiceEnterContext({
actions: {}, actions: {},
context: {}, context: {},
}); });
}} }}>
>
{t("menus.header.enterinvoices")} {t("menus.header.enterinvoices")}
</Menu.Item> </Menu.Item>
<Menu.Item key="invoices"> <Menu.Item key='invoices'>
<Link to="/manage/invoices">{t("menus.header.invoices")}</Link> <Link to='/manage/invoices'>{t("menus.header.invoices")}</Link>
</Menu.Item> </Menu.Item>
<Menu.Item <Menu.Item
key="entertimetickets" key='entertimetickets'
onClick={() => { onClick={() => {
setTimeTicketContext({ setTimeTicketContext({
actions: {}, actions: {},
context: {}, context: {},
}); });
}} }}>
>
{t("menus.header.entertimeticket")} {t("menus.header.entertimeticket")}
</Menu.Item> </Menu.Item>
</Menu.SubMenu> </Menu.SubMenu>
<Menu.SubMenu title={t("menus.header.shop")}> <Menu.SubMenu title={t("menus.header.shop")}>
<Menu.Item key="shop"> <Menu.Item key='shop'>
<Link to="/manage/shop">{t("menus.header.shop_config")}</Link> <Link to='/manage/shop'>{t("menus.header.shop_config")}</Link>
</Menu.Item> </Menu.Item>
<Menu.Item key="shop-vendors"> <Menu.Item key='shop-vendors'>
<Link to="/manage/shop/vendors"> <Link to='/manage/shop/vendors'>
{t("menus.header.shop_vendors")} {t("menus.header.shop_vendors")}
</Link> </Link>
</Menu.Item> </Menu.Item>
@@ -232,8 +229,8 @@ function Header({
title={ title={
<div> <div>
<Avatar <Avatar
size="medium" size='medium'
alt="Avatar" alt='Avatar'
src={ src={
currentUser.photoURL ? currentUser.photoURL : UserImage currentUser.photoURL ? currentUser.photoURL : UserImage
} }
@@ -241,13 +238,12 @@ function Header({
/> />
{currentUser.displayName || t("general.labels.unknown")} {currentUser.displayName || t("general.labels.unknown")}
</div> </div>
} }>
>
<Menu.Item onClick={() => signOutStart()}> <Menu.Item onClick={() => signOutStart()}>
{t("user.actions.signout")} {t("user.actions.signout")}
</Menu.Item> </Menu.Item>
<Menu.Item> <Menu.Item>
<Link to="/manage/profile"> <Link to='/manage/profile'>
{t("menus.currentuser.profile")} {t("menus.currentuser.profile")}
</Link> </Link>
</Menu.Item> </Menu.Item>
@@ -257,15 +253,14 @@ function Header({
<GlobalOutlined /> <GlobalOutlined />
<span>{t("menus.currentuser.languageselector")}</span> <span>{t("menus.currentuser.languageselector")}</span>
</span> </span>
} }>
> <Menu.Item actiontype='lang-select' key='en-US'>
<Menu.Item actiontype="lang-select" key="en-US">
{t("general.languages.english")} {t("general.languages.english")}
</Menu.Item> </Menu.Item>
<Menu.Item actiontype="lang-select" key="fr-CA"> <Menu.Item actiontype='lang-select' key='fr-CA'>
{t("general.languages.french")} {t("general.languages.french")}
</Menu.Item> </Menu.Item>
<Menu.Item actiontype="lang-select" key="es-MX"> <Menu.Item actiontype='lang-select' key='es-MX'>
{t("general.languages.spanish")} {t("general.languages.spanish")}
</Menu.Item> </Menu.Item>
</Menu.SubMenu> </Menu.SubMenu>

View File

@@ -0,0 +1,48 @@
import { ExclamationCircleFilled } from "@ant-design/icons";
import { Dropdown, Menu } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import { useMutation } from "@apollo/react-hooks";
import { UPDATE_JOB } from "../../graphql/jobs.queries";
export default function ProductionListColumnAlert({ record }) {
const { t } = useTranslation();
const [updateAlert] = useMutation(UPDATE_JOB);
const handleAlertToggle = () => {
updateAlert({
variables: {
jobId: record.id,
job: {
production_vars: {
...record.production_vars,
alert: !record.production_vars.alert,
},
},
},
}).then(() => {
if (record.refetch) record.refetch();
});
};
return (
<Dropdown
overlay={
<Menu>
<Menu.Item key='toggleAlert' onClick={handleAlertToggle}>
{record.production_vars && record.production_vars.alert
? t("production.labels.alertoff")
: t("production.labels.alerton")}
</Menu.Item>
</Menu>
}
trigger={["contextMenu"]}>
<div style={{ width: "100%", height: "19px" }}>
{record.production_vars && record.production_vars.alert ? (
<ExclamationCircleFilled className='production-alert' />
) : null}
</div>
</Dropdown>
);
}

View File

@@ -0,0 +1,51 @@
import { useMutation } from "@apollo/react-hooks";
import { Dropdown, Menu } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import { UPDATE_JOB } from "../../graphql/jobs.queries";
export default function ProductionListColumnBodyPriority({ record }) {
const { t } = useTranslation();
const [updateAlert] = useMutation(UPDATE_JOB);
const handleSetBodyPriority = (e) => {
const { key } = e;
updateAlert({
variables: {
jobId: record.id,
job: {
production_vars: {
...record.production_vars,
bodypriority: key === "clearBodyPriority" ? null : key,
},
},
},
}).then(() => {
if (record.refetch) record.refetch();
});
};
return (
<Dropdown
overlay={
<Menu onClick={handleSetBodyPriority}>
<Menu.Item key='clearBodyPriority'>
{t("production.actions.bodypriority-clear")}
</Menu.Item>
<Menu.SubMenu
key='set'
title={t("production.actions.bodypriority-set")}>
{new Array(9).fill().map((value, index) => (
<Menu.Item key={index + 1}>{index + 1}</Menu.Item>
))}
</Menu.SubMenu>
</Menu>
}
trigger={["contextMenu"]}>
<div style={{ width: "100%", height: "19px" }}>
{record.production_vars && record.production_vars.bodypriority}
</div>
</Dropdown>
);
}

View File

@@ -5,8 +5,9 @@ import CurrencyFormatter from "../../utils/CurrencyFormatter";
import { DateFormatter } from "../../utils/DateFormatter"; import { DateFormatter } from "../../utils/DateFormatter";
import PhoneFormatter from "../../utils/PhoneFormatter"; import PhoneFormatter from "../../utils/PhoneFormatter";
import { alphaSort } from "../../utils/sorters"; import { alphaSort } from "../../utils/sorters";
import { ExclamationCircleFilled } from "@ant-design/icons"; import ProductionListColumnAlert from "./production-list-columns.alert.component";
import { Menu, Dropdown } from "antd"; import ProductionListColumnBodyPriority from "./production-list-columns.bodypriority.component";
import ProductionListColumnPaintPriority from "./production-list-columns.paintpriority.component";
export default [ export default [
{ {
@@ -133,32 +134,25 @@ export default [
dataIndex: "status", dataIndex: "status",
key: "status", key: "status",
ellipsis: true, ellipsis: true,
sorter: (a, b) => alphaSort(a.status, b.status),
},
{
title: i18n.t("jobs.labels.bodyhours"),
dataIndex: "labhrs",
key: "labhrs",
sorter: (a, b) => a.labhrs - b.labhrs,
},
{
title: i18n.t("jobs.labels.refinishhours"),
dataIndex: "larhrs",
key: "larhrs",
sorter: (a, b) => a.larhrs - b.larhrs,
}, },
{ {
title: i18n.t("production.labels.alert"), title: i18n.t("production.labels.alert"),
dataIndex: "alert", dataIndex: "alert",
key: "alert", key: "alert",
render: (text, record) => ( render: (text, record) => <ProductionListColumnAlert record={record} />,
<Dropdown
overlay={
<Menu>
<Menu.Item key="1">1st menu item {text}</Menu.Item>
<Menu.Item key="2">2nd menu item</Menu.Item>
<Menu.Item key="3">3rd menu item</Menu.Item>
</Menu>
}
trigger={["contextMenu"]}
>
<div
onClick={() => console.log("Hi")}
style={{ width: "100%", height: "19px" }}
>
{record.production_vars && record.production_vars.alert ? (
<ExclamationCircleFilled className="production-alert" />
) : null}
</div>
</Dropdown>
),
}, },
{ {
title: i18n.t("production.labels.note"), title: i18n.t("production.labels.note"),
@@ -175,11 +169,34 @@ export default [
dataIndex: "ct", dataIndex: "ct",
key: "ct", key: "ct",
render: (text, record) => { render: (text, record) => {
return ( let ct = 0;
<span> if (!!record.actual_in) {
{(record.production_vars && record.production_vars.note) || ""} const totalHrs = record.larhrs + record.labhrs;
</span> const Difference_In_Time = new Date() - new Date(record.actual_in);
); const Difference_In_Days = Difference_In_Time / (1000 * 3600 * 24);
ct = (totalHrs / Difference_In_Days).toFixed(2);
}
return <span>{ct || 0}</span>;
}, },
}, },
{
title: i18n.t("production.labels.bodypriority"),
dataIndex: "bodypriority",
key: "bodypriority",
sorter: (a, b) =>
a.production_vars.bodypriority - b.production_vars.bodypriority,
render: (text, record) => (
<ProductionListColumnBodyPriority record={record} />
),
},
{
title: i18n.t("production.labels.paintpriority"),
dataIndex: "paintpriority",
key: "paintpriority",
sorter: (a, b) =>
a.production_vars.paintpriority - b.production_vars.paintpriority,
render: (text, record) => (
<ProductionListColumnPaintPriority record={record} />
),
},
]; ];

View File

@@ -0,0 +1,51 @@
import { useMutation } from "@apollo/react-hooks";
import { Dropdown, Menu } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
import { UPDATE_JOB } from "../../graphql/jobs.queries";
export default function ProductionListColumnPaintPriority({ record }) {
const { t } = useTranslation();
const [updateAlert] = useMutation(UPDATE_JOB);
const handleSetPaintPriority = (e) => {
const { key } = e;
updateAlert({
variables: {
jobId: record.id,
job: {
production_vars: {
...record.production_vars,
paintpriority: key === "clearPaintPriority" ? null : key,
},
},
},
}).then(() => {
if (record.refetch) record.refetch();
});
};
return (
<Dropdown
overlay={
<Menu onClick={handleSetPaintPriority}>
<Menu.Item key='clearPaintPriority'>
{t("production.actions.paintpriority-clear")}
</Menu.Item>
<Menu.SubMenu
key='set'
title={t("production.actions.paintpriority-set")}>
{new Array(9).fill().map((value, index) => (
<Menu.Item key={index + 1}>{index + 1}</Menu.Item>
))}
</Menu.SubMenu>
</Menu>
}
trigger={["contextMenu"]}>
<div style={{ width: "100%", height: "19px" }}>
{record.production_vars && record.production_vars.paintpriority}
</div>
</Dropdown>
);
}

View File

@@ -45,9 +45,10 @@ export function ProductionListTable({
if (!!!columns) return <div>No columns found.</div>; if (!!!columns) return <div>No columns found.</div>;
return ( return (
<ReactDragListView.DragColumn onDragEnd={onDragEnd} nodeSelector="th"> <ReactDragListView.DragColumn onDragEnd={onDragEnd} nodeSelector='th'>
<Table <Table
size="small" size='small'
pagination={false}
title={() => ( title={() => (
<div> <div>
<ProductionListSaveConfigButton <ProductionListSaveConfigButton
@@ -67,11 +68,12 @@ export function ProductionListTable({
state.sortedInfo.columnKey === c.key && state.sortedInfo.order, state.sortedInfo.columnKey === c.key && state.sortedInfo.order,
}; };
})} })}
rowKey="id" rowKey='id'
loading={loading} loading={loading}
dataSource={data} dataSource={data}
onChange={handleTableChange} onChange={handleTableChange}
rowClassName={(record, index) => (index % 2 === 0 ? "red" : "blue")} //TODO What could be good usage here? rowClassName={(record, index) => (index % 2 === 0 ? "red" : "blue")} //TODO What could be good usage here?
onRow={(record, index) => (record.refetch = refetch)}
/> />
</ReactDragListView.DragColumn> </ReactDragListView.DragColumn>
); );

View File

@@ -12,7 +12,7 @@ export default function ProductionListTableContainer({ columnState }) {
<div> <div>
<ProductionListTable <ProductionListTable
loading={loading} loading={loading}
data={data ? data.jobs : []} data={data ? data.productionview : []}
refetch={refetch} refetch={refetch}
columnState={columnState} columnState={columnState}
/> />

View File

@@ -1,9 +1,10 @@
.production-alert { .production-alert {
animation: alertBlinker 2s linear infinite; animation: alertBlinker 1s linear infinite;
} }
@keyframes alertBlinker { @keyframes alertBlinker {
50% { 50% {
color: red; color: red;
opacity: 100;
//opacity: 0; //opacity: 0;
} }
} }

View File

@@ -52,7 +52,7 @@ export const QUERY_ALL_ACTIVE_JOBS = gql`
export const QUERY_JOBS_IN_PRODUCTION = gql` export const QUERY_JOBS_IN_PRODUCTION = gql`
query QUERY_JOBS_IN_PRODUCTION { query QUERY_JOBS_IN_PRODUCTION {
jobs { productionview {
id id
status status
ro_number ro_number
@@ -72,8 +72,9 @@ export const QUERY_JOBS_IN_PRODUCTION = gql`
clm_total clm_total
ownr_ph1 ownr_ph1
special_coverage_policy special_coverage_policy
status
production_vars production_vars
labhrs
larhrs
} }
} }
`; `;

View File

@@ -528,6 +528,7 @@
"audit": "Audit Trail", "audit": "Audit Trail",
"availablenew": "Available New Jobs", "availablenew": "Available New Jobs",
"availablesupplements": "Available Supplements", "availablesupplements": "Available Supplements",
"bodyhours": "Body Hrs",
"cards": { "cards": {
"appraiser": "Appraiser", "appraiser": "Appraiser",
"customer": "Customer Information", "customer": "Customer Information",
@@ -565,6 +566,7 @@
"ratetotals": { "ratetotals": {
"lab": "Body Total" "lab": "Body Total"
}, },
"refinishhours": "Refinish Hrs",
"vehicle_info": "Vehicle" "vehicle_info": "Vehicle"
}, },
"successes": { "successes": {
@@ -600,6 +602,7 @@
"invoices": "Invoices", "invoices": "Invoices",
"jobs": "Jobs", "jobs": "Jobs",
"owners": "Owners", "owners": "Owners",
"productionlist": "Production - List",
"schedule": "Schedule", "schedule": "Schedule",
"shop": "My Shop", "shop": "My Shop",
"shop_config": "Configuration", "shop_config": "Configuration",
@@ -719,11 +722,20 @@
}, },
"production": { "production": {
"actions": { "actions": {
"bodypriority-clear": "Clear Body Priority",
"bodypriority-set": "Set Body Priority",
"paintpriority-clear": "Clear Paint Priority",
"paintpriority-set": "Set Paint Priority",
"saveconfig": "Save Configuration" "saveconfig": "Save Configuration"
}, },
"labels": { "labels": {
"alert": "Alert", "alert": "Alert",
"note": "Production Note" "alertoff": "Remove alert from job",
"alerton": "Add alert to job",
"bodypriority": "B/P",
"cycletime": "C/T",
"note": "Production Note",
"paintpriority": "P/P"
} }
}, },
"profile": { "profile": {

View File

@@ -528,6 +528,7 @@
"audit": "", "audit": "",
"availablenew": "", "availablenew": "",
"availablesupplements": "", "availablesupplements": "",
"bodyhours": "",
"cards": { "cards": {
"appraiser": "Tasador", "appraiser": "Tasador",
"customer": "Información al cliente", "customer": "Información al cliente",
@@ -565,6 +566,7 @@
"ratetotals": { "ratetotals": {
"lab": "" "lab": ""
}, },
"refinishhours": "",
"vehicle_info": "Vehículo" "vehicle_info": "Vehículo"
}, },
"successes": { "successes": {
@@ -600,6 +602,7 @@
"invoices": "", "invoices": "",
"jobs": "Trabajos", "jobs": "Trabajos",
"owners": "propietarios", "owners": "propietarios",
"productionlist": "",
"schedule": "Programar", "schedule": "Programar",
"shop": "Mi tienda", "shop": "Mi tienda",
"shop_config": "Configuración", "shop_config": "Configuración",
@@ -719,11 +722,20 @@
}, },
"production": { "production": {
"actions": { "actions": {
"bodypriority-clear": "",
"bodypriority-set": "",
"paintpriority-clear": "",
"paintpriority-set": "",
"saveconfig": "" "saveconfig": ""
}, },
"labels": { "labels": {
"alert": "", "alert": "",
"note": "" "alertoff": "",
"alerton": "",
"bodypriority": "",
"cycletime": "",
"note": "",
"paintpriority": ""
} }
}, },
"profile": { "profile": {

View File

@@ -528,6 +528,7 @@
"audit": "", "audit": "",
"availablenew": "", "availablenew": "",
"availablesupplements": "", "availablesupplements": "",
"bodyhours": "",
"cards": { "cards": {
"appraiser": "Expert", "appraiser": "Expert",
"customer": "Informations client", "customer": "Informations client",
@@ -565,6 +566,7 @@
"ratetotals": { "ratetotals": {
"lab": "" "lab": ""
}, },
"refinishhours": "",
"vehicle_info": "Véhicule" "vehicle_info": "Véhicule"
}, },
"successes": { "successes": {
@@ -600,6 +602,7 @@
"invoices": "", "invoices": "",
"jobs": "Emplois", "jobs": "Emplois",
"owners": "Propriétaires", "owners": "Propriétaires",
"productionlist": "",
"schedule": "Programme", "schedule": "Programme",
"shop": "Mon magasin", "shop": "Mon magasin",
"shop_config": "Configuration", "shop_config": "Configuration",
@@ -719,11 +722,20 @@
}, },
"production": { "production": {
"actions": { "actions": {
"bodypriority-clear": "",
"bodypriority-set": "",
"paintpriority-clear": "",
"paintpriority-set": "",
"saveconfig": "" "saveconfig": ""
}, },
"labels": { "labels": {
"alert": "", "alert": "",
"note": "" "alertoff": "",
"alerton": "",
"bodypriority": "",
"cycletime": "",
"note": "",
"paintpriority": ""
} }
}, },
"profile": { "profile": {

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,23 @@
- args:
cascade: true
read_only: false
sql: "create view productionview as \r\nselect j.id ,\r\n
\ j.status ,\r\n j.ro_number ,\r\n j.est_number
\ ,\r\n j.ownr_fn ,\r\n j.ownr_ln ,\r\n
\ j.v_model_yr ,\r\n j.v_model_desc ,\r\n j.clm_no
\ ,\r\n j.v_make_desc ,\r\n j.v_color
\ ,\r\n j.plate_no ,\r\n j.actual_in
\ ,\r\n j.scheduled_completion ,\r\n j.scheduled_delivery
\ ,\r\n j.ins_co_nm ,\r\n j.clm_total ,\r\n
\ j.ownr_ph1 ,\r\n j.special_coverage_policy ,\r\n j.production_vars
\ ,\r\n lab.labhrs, lar.larhrs\r\n from public.jobs j\r\n left
join \r\n (select l.jobid, sum(l.mod_lb_hrs ) labhrs from public.joblines
l where mod_lbr_ty = 'LAB' group by l.jobid ) lab on lab.jobid = j.id \r\n
\ left join (select l2.jobid, sum(l2.mod_lb_hrs ) larhrs from public.joblines
l2 where mod_lbr_ty = 'LAR' group by l2.jobid ) lar on lar.jobid = j.id\r\n
\ where j.inproduction =true;"
type: run_sql
- args:
name: productionview
schema: public
type: add_existing_table_or_view

View File

@@ -0,0 +1,6 @@
- args:
relationship: bodyshop
table:
name: productionview
schema: public
type: drop_relationship

View File

@@ -0,0 +1,13 @@
- args:
name: bodyshop
table:
name: productionview
schema: public
using:
manual_configuration:
column_mapping:
id: id
remote_table:
name: jobs
schema: public
type: create_object_relationship

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,16 @@
- args:
cascade: true
read_only: false
sql: "CREATE OR REPLACE VIEW \"public\".\"productionview\" AS \n SELECT j.id,\n
\ j.status,\n j.ro_number,\n j.est_number,\n j.ownr_fn,\n j.ownr_ln,\n
\ j.v_model_yr,\n j.v_model_desc,\n j.clm_no,\n j.v_make_desc,\n
\ j.v_color,\n j.plate_no,\n j.actual_in,\n j.scheduled_completion,\n
\ j.scheduled_delivery,\n j.ins_co_nm,\n j.clm_total,\n j.ownr_ph1,\n
\ j.special_coverage_policy,\n j.production_vars,\n lab.labhrs,\n lar.larhrs,\n
\ j.shopid\n FROM ((jobs j\n LEFT JOIN ( SELECT l.jobid,\n sum(l.mod_lb_hrs)
AS labhrs\n FROM joblines l\n WHERE (l.mod_lbr_ty = 'LAB'::text)\n
\ GROUP BY l.jobid) lab ON ((lab.jobid = j.id)))\n LEFT JOIN ( SELECT
l2.jobid,\n sum(l2.mod_lb_hrs) AS larhrs\n FROM joblines
l2\n WHERE (l2.mod_lbr_ty = 'LAR'::text)\n GROUP BY l2.jobid)
lar ON ((lar.jobid = j.id)))\n WHERE (j.inproduction = true);"
type: run_sql

View File

@@ -0,0 +1,8 @@
- args:
name: bodyshop
table:
name: productionview
schema: public
using:
foreign_key_constraint_on: id
type: create_object_relationship

View File

@@ -0,0 +1,6 @@
- args:
relationship: bodyshop
table:
name: productionview
schema: public
type: drop_relationship

View File

@@ -0,0 +1,6 @@
- args:
relationship: bodyshop
table:
name: productionview
schema: public
type: drop_relationship

View File

@@ -0,0 +1,13 @@
- args:
name: bodyshop
table:
name: productionview
schema: public
using:
manual_configuration:
column_mapping:
shopid: id
remote_table:
name: bodyshops
schema: public
type: create_object_relationship

View File

@@ -0,0 +1,6 @@
- args:
role: user
table:
name: productionview
schema: public
type: drop_select_permission

View File

@@ -0,0 +1,43 @@
- args:
permission:
allow_aggregations: false
columns:
- id
- status
- ro_number
- est_number
- ownr_fn
- ownr_ln
- v_model_yr
- v_model_desc
- clm_no
- v_make_desc
- v_color
- plate_no
- actual_in
- scheduled_completion
- scheduled_delivery
- ins_co_nm
- clm_total
- ownr_ph1
- special_coverage_policy
- production_vars
- labhrs
- larhrs
- shopid
computed_fields: []
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
limit: null
role: user
table:
name: productionview
schema: public
type: create_select_permission