Added speedprint rework to checklist. IO-709

This commit is contained in:
Patrick Fic
2021-02-24 16:45:32 -08:00
parent dfcc18c8dc
commit 56db1e9e97
10 changed files with 185 additions and 107 deletions

View File

@@ -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}
> >

View File

@@ -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>
);
}

View File

@@ -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>
); );
} }

View File

@@ -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>

View File

@@ -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 (

View File

@@ -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={() => {

View File

@@ -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">

View File

@@ -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;

View File

@@ -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

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: ALTER TABLE "public"."employees" DROP COLUMN "cost_center" CASCADE;
type: run_sql