@@ -1,39 +0,0 @@
|
|||||||
import { Col, List, Space, Typography } from "antd";
|
|
||||||
import React from "react";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
const CardColorLegend = ({ bodyshop, cardSettings }) => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const data = bodyshop.ssbuckets.map((size) => ({
|
|
||||||
label: size.label,
|
|
||||||
color: size.color?.hex ?? "white",
|
|
||||||
}));
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Col>
|
|
||||||
<Typography>{t("production.labels.legend")}</Typography>
|
|
||||||
<List
|
|
||||||
grid={{
|
|
||||||
gutter: 16,
|
|
||||||
}}
|
|
||||||
dataSource={data}
|
|
||||||
renderItem={(item) => (
|
|
||||||
<List.Item>
|
|
||||||
<Space>
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
width: "1.5rem",
|
|
||||||
aspectRatio: "1/1",
|
|
||||||
backgroundColor: item.color,
|
|
||||||
}}
|
|
||||||
></div>
|
|
||||||
<div>{item.label}</div>
|
|
||||||
</Space>
|
|
||||||
</List.Item>
|
|
||||||
)}
|
|
||||||
/>
|
|
||||||
</Col>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default CardColorLegend;
|
|
||||||
@@ -18,28 +18,6 @@ import moment from "moment";
|
|||||||
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
|
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
|
||||||
import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component";
|
import JobPartsQueueCount from "../job-parts-queue-count/job-parts-queue-count.component";
|
||||||
|
|
||||||
const cardColor = (ssbuckets, totalHrs) => {
|
|
||||||
const bucket = ssbuckets.filter(
|
|
||||||
(bucket) =>
|
|
||||||
bucket.gte <= totalHrs && (!!bucket.lt ? bucket.lt > totalHrs : true)
|
|
||||||
)[0];
|
|
||||||
|
|
||||||
if (bucket.color) {
|
|
||||||
return bucket.color.hex;
|
|
||||||
}
|
|
||||||
|
|
||||||
return "";
|
|
||||||
};
|
|
||||||
|
|
||||||
function getContrastYIQ(hexColor) {
|
|
||||||
const r = parseInt(hexColor.substr(1, 2), 16);
|
|
||||||
const g = parseInt(hexColor.substr(3, 2), 16);
|
|
||||||
const b = parseInt(hexColor.substr(5, 2), 16);
|
|
||||||
const yiq = (r * 299 + g * 587 + b * 114) / 1000;
|
|
||||||
|
|
||||||
return yiq >= 128 ? "black" : "white";
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function ProductionBoardCard(
|
export default function ProductionBoardCard(
|
||||||
technician,
|
technician,
|
||||||
card,
|
card,
|
||||||
@@ -76,19 +54,10 @@ export default function ProductionBoardCard(
|
|||||||
.isSame(moment(card.scheduled_completion), "day") &&
|
.isSame(moment(card.scheduled_completion), "day") &&
|
||||||
"production-completion-soon"));
|
"production-completion-soon"));
|
||||||
|
|
||||||
const totalHrs =
|
|
||||||
card.labhrs.aggregate.sum.mod_lb_hrs + card.larhrs.aggregate.sum.mod_lb_hrs;
|
|
||||||
const bgColor = cardColor(bodyshop.ssbuckets, totalHrs);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card
|
||||||
className="react-kanban-card imex-kanban-card"
|
className="react-kanban-card imex-kanban-card"
|
||||||
size="small"
|
size="small"
|
||||||
style={{
|
|
||||||
backgroundColor: cardSettings && cardSettings.cardcolor && bgColor,
|
|
||||||
|
|
||||||
color: getContrastYIQ(bgColor),
|
|
||||||
}}
|
|
||||||
title={
|
title={
|
||||||
<Space>
|
<Space>
|
||||||
<ProductionAlert record={card} key="alert" />
|
<ProductionAlert record={card} key="alert" />
|
||||||
|
|||||||
@@ -104,13 +104,6 @@ export default function ProductionBoardKanbanCardSettings({
|
|||||||
>
|
>
|
||||||
<Switch />
|
<Switch />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
|
||||||
valuePropName="checked"
|
|
||||||
label={t("production.labels.cardcolor")}
|
|
||||||
name="cardcolor"
|
|
||||||
>
|
|
||||||
<Switch />
|
|
||||||
</Form.Item>
|
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={12}>
|
<Col span={12}>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import ProductionBoardKanbanCardSettings from "./production-board-kanban.card-se
|
|||||||
//import "@asseinfo/react-kanban/dist/styles.css";
|
//import "@asseinfo/react-kanban/dist/styles.css";
|
||||||
import "./production-board-kanban.styles.scss";
|
import "./production-board-kanban.styles.scss";
|
||||||
import { createBoardData } from "./production-board-kanban.utils.js";
|
import { createBoardData } from "./production-board-kanban.utils.js";
|
||||||
import CardColorLegend from "../production-board-kanban-card/production-board-kanban-card-color-legend.component";
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
technician: selectTechnician,
|
technician: selectTechnician,
|
||||||
@@ -222,7 +221,6 @@ export function ProductionBoardKanbanComponent({
|
|||||||
employeeassignments: true,
|
employeeassignments: true,
|
||||||
scheduled_completion: true,
|
scheduled_completion: true,
|
||||||
stickyheader: false,
|
stickyheader: false,
|
||||||
cardcolor: false,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -258,11 +256,6 @@ export function ProductionBoardKanbanComponent({
|
|||||||
</Space>
|
</Space>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{cardSettings.cardcolor && (
|
|
||||||
<CardColorLegend cardSettings={cardSettings} bodyshop={bodyshop} />
|
|
||||||
)}
|
|
||||||
|
|
||||||
<ProductionListDetailComponent jobs={data} />
|
<ProductionListDetailComponent jobs={data} />
|
||||||
<StickyContainer>
|
<StickyContainer>
|
||||||
<Board
|
<Board
|
||||||
|
|||||||
@@ -277,15 +277,6 @@ export default function ShopInfoSchedulingComponent({ form }) {
|
|||||||
>
|
>
|
||||||
<InputNumber />
|
<InputNumber />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.ssbuckets.color")}
|
|
||||||
key={`${index}color`}
|
|
||||||
name={[field.name, "color"]}
|
|
||||||
>
|
|
||||||
<ColorpickerFormItemComponent />
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<Space wrap>
|
<Space wrap>
|
||||||
<DeleteFilled
|
<DeleteFilled
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
|||||||
@@ -508,8 +508,7 @@
|
|||||||
"id": "ID",
|
"id": "ID",
|
||||||
"label": "Label",
|
"label": "Label",
|
||||||
"lt": "Less than (hrs)",
|
"lt": "Less than (hrs)",
|
||||||
"target": "Target (count)",
|
"target": "Target (count)"
|
||||||
"color": "Job Color"
|
|
||||||
},
|
},
|
||||||
"state": "Province/State",
|
"state": "Province/State",
|
||||||
"state_tax_id": "Provincial/State Tax ID (PST, QST)",
|
"state_tax_id": "Provincial/State Tax ID (PST, QST)",
|
||||||
@@ -2386,9 +2385,7 @@
|
|||||||
"sublets": "Sublets",
|
"sublets": "Sublets",
|
||||||
"totalhours": "Total Hrs ",
|
"totalhours": "Total Hrs ",
|
||||||
"touchtime": "T/T",
|
"touchtime": "T/T",
|
||||||
"viewname": "View Name",
|
"viewname": "View Name"
|
||||||
"legend": "Legend:",
|
|
||||||
"cardcolor": "Card Colors"
|
|
||||||
},
|
},
|
||||||
"successes": {
|
"successes": {
|
||||||
"removed": "Job removed from production."
|
"removed": "Job removed from production."
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { notification } from "antd";
|
|||||||
import jsreport from "@jsreport/browser-client";
|
import jsreport from "@jsreport/browser-client";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
//import { auth } from "../firebase/firebase.utils";
|
import { auth } from "../firebase/firebase.utils";
|
||||||
import { setEmailOptions } from "../redux/email/email.actions";
|
import { setEmailOptions } from "../redux/email/email.actions";
|
||||||
import { store } from "../redux/store";
|
import { store } from "../redux/store";
|
||||||
import client from "../utils/GraphQLClient";
|
import client from "../utils/GraphQLClient";
|
||||||
@@ -27,7 +27,7 @@ export default async function RenderTemplate(
|
|||||||
jsreport.serverUrl = "https://reports3.test.imex.online/";
|
jsreport.serverUrl = "https://reports3.test.imex.online/";
|
||||||
}
|
}
|
||||||
const jsrAuth = (await axios.post("/utils/jsr")).data;
|
const jsrAuth = (await axios.post("/utils/jsr")).data;
|
||||||
console.log("🚀 ~ file: RenderTemplate.js:30 ~ jsrAuth:", jsrAuth);
|
|
||||||
jsreport.headers["Authorization"] = jsrAuth;
|
jsreport.headers["Authorization"] = jsrAuth;
|
||||||
|
|
||||||
//Query assets that match the template name. Must be in format <<templateName>>.query
|
//Query assets that match the template name. Must be in format <<templateName>>.query
|
||||||
@@ -309,8 +309,8 @@ export const GenerateDocuments = async (templates) => {
|
|||||||
const fetchContextData = async (templateObject, jsrAuth) => {
|
const fetchContextData = async (templateObject, jsrAuth) => {
|
||||||
const bodyshop = store.getState().user.bodyshop;
|
const bodyshop = store.getState().user.bodyshop;
|
||||||
|
|
||||||
// jsreport.headers["Authorization"] =
|
jsreport.headers["FirebaseAuthorization"] =
|
||||||
// "Bearer " + (await auth.currentUser.getIdToken());
|
"Bearer " + (await auth.currentUser.getIdToken());
|
||||||
|
|
||||||
const folders = await cleanAxios.get(`${server}/odata/folders`, {
|
const folders = await cleanAxios.get(`${server}/odata/folders`, {
|
||||||
headers: { Authorization: jsrAuth },
|
headers: { Authorization: jsrAuth },
|
||||||
|
|||||||
@@ -247,9 +247,9 @@ app.post("/search", fb.validateFirebaseIdToken, os.search);
|
|||||||
var cdkGetMake = require("./server/cdk/cdk-get-makes");
|
var cdkGetMake = require("./server/cdk/cdk-get-makes");
|
||||||
app.post("/cdk/getvehicles", fb.validateFirebaseIdToken, cdkGetMake.default);
|
app.post("/cdk/getvehicles", fb.validateFirebaseIdToken, cdkGetMake.default);
|
||||||
|
|
||||||
// app.get("/", async function (req, res) {
|
app.get("/", async function (req, res) {
|
||||||
// res.status(200).send("Access Forbidden.");
|
res.status(200).send("Access Forbidden.");
|
||||||
// });
|
});
|
||||||
|
|
||||||
server.listen(port, (error) => {
|
server.listen(port, (error) => {
|
||||||
if (error) throw error;
|
if (error) throw error;
|
||||||
|
|||||||
Reference in New Issue
Block a user