Added speedprint rework to checklist. IO-709
This commit is contained in:
@@ -70,7 +70,7 @@ function Header({
|
|||||||
<div style={{ display: "flex", alignItems: "center" }}>
|
<div style={{ display: "flex", alignItems: "center" }}>
|
||||||
<Menu
|
<Menu
|
||||||
mode="horizontal"
|
mode="horizontal"
|
||||||
// theme="dark"
|
theme="dark"
|
||||||
style={{ flex: 5 }}
|
style={{ flex: 5 }}
|
||||||
selectedKeys={[selectedHeader]}
|
selectedKeys={[selectedHeader]}
|
||||||
onClick={handleMenuClick}
|
onClick={handleMenuClick}
|
||||||
@@ -301,8 +301,7 @@ function Header({
|
|||||||
<GlobalSearch />
|
<GlobalSearch />
|
||||||
<Menu
|
<Menu
|
||||||
mode="horizontal"
|
mode="horizontal"
|
||||||
// theme="dark"
|
theme="dark"
|
||||||
|
|
||||||
selectedKeys={[selectedHeader]}
|
selectedKeys={[selectedHeader]}
|
||||||
onClick={handleMenuClick}
|
onClick={handleMenuClick}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import { PrinterFilled } from "@ant-design/icons";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
export default function JobChecklistTemplateItem({
|
|
||||||
templateKey,
|
|
||||||
renderTemplate,
|
|
||||||
}) {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
{t(`printcenter.jobs.${templateKey}`)}
|
|
||||||
<PrinterFilled onClick={() => renderTemplate(templateKey)} />
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,18 +1,26 @@
|
|||||||
import { Button } from "antd";
|
import { PrinterFilled } from "@ant-design/icons";
|
||||||
import React from "react";
|
import { Button, List } from "antd";
|
||||||
|
import React, { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useParams } from "react-router-dom";
|
import { useParams } from "react-router-dom";
|
||||||
import { logImEXEvent } from "../../../../firebase/firebase.utils";
|
import { logImEXEvent } from "../../../../firebase/firebase.utils";
|
||||||
import { GenerateDocument } from "../../../../utils/RenderTemplate";
|
import {
|
||||||
import JobIntakeTemplateItem from "../job-checklist-template-item/job-checklist-template-item.component";
|
GenerateDocument,
|
||||||
|
GenerateDocuments,
|
||||||
|
} from "../../../../utils/RenderTemplate";
|
||||||
|
import { TemplateList } from "../../../../utils/TemplateConstants";
|
||||||
|
const TemplateListGenerated = TemplateList();
|
||||||
|
|
||||||
export default function JobIntakeTemplateList({ templates }) {
|
export default function JobIntakeTemplateList({ templates }) {
|
||||||
const { jobId } = useParams();
|
const { jobId } = useParams();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const [loading, setLoading] = useState(false);
|
||||||
|
|
||||||
const renderTemplate = async (templateKey) => {
|
const renderTemplate = async (templateKey) => {
|
||||||
|
setLoading(true);
|
||||||
logImEXEvent("job_checklist_template_render");
|
logImEXEvent("job_checklist_template_render");
|
||||||
|
|
||||||
GenerateDocument(
|
await GenerateDocument(
|
||||||
{
|
{
|
||||||
name: templateKey,
|
name: templateKey,
|
||||||
variables: { id: jobId },
|
variables: { id: jobId },
|
||||||
@@ -20,27 +28,50 @@ export default function JobIntakeTemplateList({ templates }) {
|
|||||||
{},
|
{},
|
||||||
"p"
|
"p"
|
||||||
);
|
);
|
||||||
|
setLoading(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderAllTemplates = () => {
|
const renderAllTemplates = async () => {
|
||||||
logImEXEvent("job_checklist_render_all_templates");
|
logImEXEvent("checklist_render_all_templates");
|
||||||
|
setLoading(true);
|
||||||
templates.forEach((template) => renderTemplate(template));
|
console.log("templates :>> ", templates);
|
||||||
|
await GenerateDocuments(
|
||||||
|
templates.map((key) => {
|
||||||
|
return { name: key, variables: { id: jobId } };
|
||||||
|
})
|
||||||
|
);
|
||||||
|
setLoading(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{t("intake.labels.printpack")}
|
<Button onClick={renderAllTemplates} loading={loading}>
|
||||||
<Button onClick={renderAllTemplates}>
|
|
||||||
{t("checklist.actions.printall")}
|
{t("checklist.actions.printall")}
|
||||||
</Button>
|
</Button>
|
||||||
{templates.map((template) => (
|
<List
|
||||||
<JobIntakeTemplateItem
|
itemLayout="horizontal"
|
||||||
key={template}
|
dataSource={templates}
|
||||||
templateKey={template}
|
renderItem={(template) => (
|
||||||
renderTemplate={renderTemplate}
|
<List.Item
|
||||||
/>
|
actions={[
|
||||||
))}
|
<Button
|
||||||
|
loading={loading}
|
||||||
|
onClick={() => renderTemplate(template)}
|
||||||
|
>
|
||||||
|
<PrinterFilled />
|
||||||
|
</Button>,
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<List.Item.Meta
|
||||||
|
title={
|
||||||
|
TemplateListGenerated[template] &&
|
||||||
|
TemplateListGenerated[template].title
|
||||||
|
}
|
||||||
|
// description={renderTemplateList(template.templates)}
|
||||||
|
/>
|
||||||
|
</List.Item>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ export default function JobIntakeComponent({ checklistConfig, type, job }) {
|
|||||||
const { form, templates } = checklistConfig;
|
const { form, templates } = checklistConfig;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Row>
|
<Row gutter={[48, 48]}>
|
||||||
<Col span={12}>
|
<Col span={6}>
|
||||||
<JobChecklistTemplateList templates={templates} type={type} />
|
<JobChecklistTemplateList templates={templates} type={type} />
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={12}>
|
<Col span={18}>
|
||||||
<JobChecklistForm formItems={form} type={type} job={job} />
|
<JobChecklistForm formItems={form} type={type} job={job} />
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
|
import { DownOutlined } from "@ant-design/icons";
|
||||||
|
import { Dropdown, Menu } from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
import { useTranslation } from "react-i18next";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { selectBodyshop } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import { DownOutlined } from "@ant-design/icons";
|
|
||||||
import { Dropdown, Menu } from "antd";
|
|
||||||
import { useTranslation } from "react-i18next";
|
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -19,14 +19,20 @@ export function JobsDetailRatesChangeButton({ disabled, form, bodyshop }) {
|
|||||||
form.setFieldsValue(rate);
|
form.setFieldsValue(rate);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
"🚀 ~ file: jobs-detail-rates-change-button.component.jsx ~ line 26 ~ bodyshop.md_labor_rates",
|
||||||
|
bodyshop.md_labor_rates
|
||||||
|
);
|
||||||
const menu = (
|
const menu = (
|
||||||
<Menu onClick={handleClick}>
|
<div>
|
||||||
{bodyshop.md_labor_rates.map((rate, idx) => (
|
<Menu onClick={handleClick}>
|
||||||
<Menu.Item value={rate} key={idx}>
|
{bodyshop.md_labor_rates.map((rate, idx) => (
|
||||||
{rate.label}
|
<Menu.Item value={rate} key={idx}>
|
||||||
</Menu.Item>
|
{rate.rate_label}
|
||||||
))}
|
</Menu.Item>
|
||||||
</Menu>
|
))}
|
||||||
|
</Menu>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -95,34 +95,53 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
|
|||||||
>
|
>
|
||||||
<Switch />
|
<Switch />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item shouldUpdate>
|
||||||
className="imex-flex-row__margin"
|
{() => {
|
||||||
label={t("jobs.fields.intake.min")}
|
if (
|
||||||
key={`${index}min`}
|
form.getFieldValue([
|
||||||
name={[field.name, "min"]}
|
"intakechecklist",
|
||||||
rules={[
|
"form",
|
||||||
{
|
index,
|
||||||
required: true,
|
"type",
|
||||||
message: t("general.validation.required"),
|
]) !== "slider"
|
||||||
},
|
)
|
||||||
]}
|
return null;
|
||||||
>
|
return (
|
||||||
<InputNumber />
|
<>
|
||||||
</Form.Item>
|
<Form.Item
|
||||||
<Form.Item
|
className="imex-flex-row__margin"
|
||||||
className="imex-flex-row__margin"
|
label={t("jobs.fields.intake.min")}
|
||||||
label={t("jobs.fields.intake.max")}
|
key={`${index}min`}
|
||||||
key={`${index}max`}
|
name={[field.name, "min"]}
|
||||||
name={[field.name, "max"]}
|
dependencies={[[field.name, "type"]]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: t("general.validation.required"),
|
message: t("general.validation.required"),
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<InputNumber />
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
className="imex-flex-row__margin"
|
||||||
|
label={t("jobs.fields.intake.max")}
|
||||||
|
key={`${index}max`}
|
||||||
|
name={[field.name, "max"]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: t("general.validation.required"),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<DeleteFilled
|
<DeleteFilled
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
remove(field.name);
|
remove(field.name);
|
||||||
@@ -246,33 +265,57 @@ export default function ShopInfoIntakeChecklistComponent({ form }) {
|
|||||||
>
|
>
|
||||||
<Switch />
|
<Switch />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
|
||||||
className="imex-flex-row__margin"
|
<Form.Item shouldUpdate>
|
||||||
label={t("jobs.fields.intake.min")}
|
{() => {
|
||||||
key={`${index}mind`}
|
if (
|
||||||
name={[field.name, "min"]}
|
form.getFieldValue([
|
||||||
rules={[
|
"deliverchecklist",
|
||||||
{
|
"form",
|
||||||
required: true,
|
index,
|
||||||
message: t("general.validation.required"),
|
"type",
|
||||||
},
|
]) !== "slider"
|
||||||
]}
|
)
|
||||||
>
|
return null;
|
||||||
<InputNumber />
|
return (
|
||||||
</Form.Item>
|
<>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
className="imex-flex-row__margin"
|
className="imex-flex-row__margin"
|
||||||
label={t("jobs.fields.intake.max")}
|
label={t("jobs.fields.intake.min")}
|
||||||
key={`${index}maxd`}
|
key={`${index}mind`}
|
||||||
name={[field.name, "max"]}
|
name={[field.name, "min"]}
|
||||||
rules={[
|
dependencies={[[field.name, "type"]]}
|
||||||
{
|
rules={[
|
||||||
required: true,
|
{
|
||||||
message: t("general.validation.required"),
|
required:
|
||||||
},
|
form.getFieldValue([field.name, "type"]) ===
|
||||||
]}
|
"slider",
|
||||||
>
|
message: t("general.validation.required"),
|
||||||
<InputNumber />
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
className="imex-flex-row__margin"
|
||||||
|
label={t("jobs.fields.intake.max")}
|
||||||
|
key={`${index}maxd`}
|
||||||
|
name={[field.name, "max"]}
|
||||||
|
dependencies={[[field.name, "type"]]}
|
||||||
|
rules={[
|
||||||
|
{
|
||||||
|
required:
|
||||||
|
form.getFieldValue([field.name, "type"]) ===
|
||||||
|
"slider",
|
||||||
|
message: t("general.validation.required"),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}}
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<DeleteFilled
|
<DeleteFilled
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ export function Manage({ match, conflict }) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout className="layout-container">
|
<Layout className="layout-container">
|
||||||
<Header style={{ backgroundColor: "#fff" }}>
|
<Header>
|
||||||
<HeaderContainer />
|
<HeaderContainer />
|
||||||
</Header>
|
</Header>
|
||||||
<Content className="content-container">
|
<Content className="content-container">
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.content-container {
|
.content-container {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
// margin: 0.5rem 0.5rem 0rem 0.5rem;
|
margin: 1rem 1rem 0rem 1rem;
|
||||||
padding: 0.25rem 1rem 0rem 1rem;
|
padding: 0.25rem 2.5rem 1rem 2.5rem;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
padding-bottom: 3rem;
|
padding-bottom: 3rem;
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
- args:
|
||||||
|
cascade: false
|
||||||
|
read_only: false
|
||||||
|
sql: ALTER TABLE "public"."employees" ADD COLUMN "cost_center" text;
|
||||||
|
type: run_sql
|
||||||
|
- args:
|
||||||
|
cascade: false
|
||||||
|
read_only: false
|
||||||
|
sql: ALTER TABLE "public"."employees" ALTER COLUMN "cost_center" DROP NOT NULL;
|
||||||
|
type: run_sql
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
- args:
|
||||||
|
cascade: false
|
||||||
|
read_only: false
|
||||||
|
sql: ALTER TABLE "public"."employees" DROP COLUMN "cost_center" CASCADE;
|
||||||
|
type: run_sql
|
||||||
Reference in New Issue
Block a user