Minor random fixes
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { LoadingOutlined } from "@ant-design/icons";
|
import { LoadingOutlined, SendOutlined } from "@ant-design/icons";
|
||||||
import { Input, Spin } from "antd";
|
import { Input, Spin } from "antd";
|
||||||
import React, { useEffect, useRef } from "react";
|
import React, { useEffect, useRef } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
@@ -52,12 +52,12 @@ function ChatSendMessageComponent({
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ display: "flex " }}>
|
<div className="imex-flex-row">
|
||||||
<Input.TextArea
|
<Input.TextArea
|
||||||
|
className="imex-flex-row__margin imex-flex-row__grow"
|
||||||
allowClear
|
allowClear
|
||||||
autoFocus
|
autoFocus
|
||||||
ref={inputArea}
|
ref={inputArea}
|
||||||
suffix={<span>a</span>}
|
|
||||||
autoSize={{ minRows: 1, maxRows: 4 }}
|
autoSize={{ minRows: 1, maxRows: 4 }}
|
||||||
value={message}
|
value={message}
|
||||||
disabled={isSending}
|
disabled={isSending}
|
||||||
@@ -68,6 +68,7 @@ function ChatSendMessageComponent({
|
|||||||
if (!!!event.shiftKey) handleEnter();
|
if (!!!event.shiftKey) handleEnter();
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
<SendOutlined className="imex-flex-row__margin" onClick={handleEnter} />
|
||||||
<Spin
|
<Spin
|
||||||
style={{ display: `${isSending ? "" : "none"}` }}
|
style={{ display: `${isSending ? "" : "none"}` }}
|
||||||
indicator={
|
indicator={
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import React, { useState, useEffect } from "react";
|
import React, { useState, useEffect, forwardRef } from "react";
|
||||||
import { Select } from "antd";
|
import { Select } from "antd";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
const { Option } = Select;
|
const { Option } = Select;
|
||||||
|
|
||||||
const ContractStatusComponent = ({
|
const ContractStatusComponent = (
|
||||||
value = "contracts.status.new",
|
{ value = "contracts.status.new", onChange },
|
||||||
onChange
|
ref
|
||||||
}) => {
|
) => {
|
||||||
const [option, setOption] = useState(value);
|
const [option, setOption] = useState(value);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ const ContractStatusComponent = ({
|
|||||||
<Select
|
<Select
|
||||||
value={option}
|
value={option}
|
||||||
style={{
|
style={{
|
||||||
width: 100
|
width: 100,
|
||||||
}}
|
}}
|
||||||
onChange={setOption}
|
onChange={setOption}
|
||||||
>
|
>
|
||||||
@@ -32,4 +32,4 @@ const ContractStatusComponent = ({
|
|||||||
</Select>
|
</Select>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
export default ContractStatusComponent;
|
export default forwardRef(ContractStatusComponent);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ function FormItemCurrency(props, ref) {
|
|||||||
return (
|
return (
|
||||||
<InputNumber
|
<InputNumber
|
||||||
{...props}
|
{...props}
|
||||||
|
ref={ref}
|
||||||
style={{ width: "initial" }}
|
style={{ width: "initial" }}
|
||||||
// formatter={(value) => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ",")}
|
// formatter={(value) => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ",")}
|
||||||
// parser={(value) => value.replace(/\$\s?|(,*)/g, "")}
|
// parser={(value) => value.replace(/\$\s?|(,*)/g, "")}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ function FormItemEmail(props, ref) {
|
|||||||
return (
|
return (
|
||||||
<Input
|
<Input
|
||||||
{...props}
|
{...props}
|
||||||
|
ref={ref}
|
||||||
addonAfter={
|
addonAfter={
|
||||||
props.defaultValue || props.value ? (
|
props.defaultValue || props.value ? (
|
||||||
<a href={`mailto:${props.defaultValue || props.value}`}>
|
<a href={`mailto:${props.defaultValue || props.value}`}>
|
||||||
|
|||||||
@@ -1,14 +1,7 @@
|
|||||||
import React, { forwardRef } from "react";
|
import React, { forwardRef } from "react";
|
||||||
import NumberFormat from "react-number-format";
|
import NumberFormat from "react-number-format";
|
||||||
function FormItemPhone(props, ref) {
|
function FormItemPhone(props, ref) {
|
||||||
return (
|
return <NumberFormat {...props} ref={ref} type="tel" format="###-###-####" />;
|
||||||
<NumberFormat
|
|
||||||
{...props}
|
|
||||||
|
|
||||||
type="tel"
|
|
||||||
format="###-###-####"
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default forwardRef(FormItemPhone);
|
export default forwardRef(FormItemPhone);
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { Button } from "antd";
|
import { Button } from "antd";
|
||||||
import React from "react";
|
import React, { forwardRef } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import AlertComponent from "../alert/alert.component";
|
import AlertComponent from "../alert/alert.component";
|
||||||
|
|
||||||
export default function ResetForm({ resetFields }) {
|
function ResetForm({ resetFields }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
return (
|
return (
|
||||||
<AlertComponent
|
<AlertComponent
|
||||||
@@ -19,3 +19,5 @@ export default function ResetForm({ resetFields }) {
|
|||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export default forwardRef(ResetForm);
|
||||||
|
|||||||
@@ -27,9 +27,10 @@ export default function GlobalSearch() {
|
|||||||
{title}
|
{title}
|
||||||
<a
|
<a
|
||||||
style={{ float: "right" }}
|
style={{ float: "right" }}
|
||||||
href='https://www.google.com/search?q=antd'
|
href="https://www.google.com/search?q=antd"
|
||||||
target='_blank'
|
target="_blank"
|
||||||
rel='noopener noreferrer'>
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
more
|
more
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
@@ -45,8 +46,8 @@ export default function GlobalSearch() {
|
|||||||
value: job.ro_number,
|
value: job.ro_number,
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/jobs/${job.id}`}>
|
<Link to={`/manage/jobs/${job.id}`}>
|
||||||
<div className='imex-flex-row'>
|
<div className="imex-flex-row">
|
||||||
<span className='imex-flex-row__margin-large'>
|
<span className="imex-flex-row__margin-large">
|
||||||
<strong>
|
<strong>
|
||||||
{job.ro_number
|
{job.ro_number
|
||||||
? `${job.ro_number || ""} / ${job.est_number || ""}`
|
? `${job.ro_number || ""} / ${job.est_number || ""}`
|
||||||
@@ -54,16 +55,16 @@ export default function GlobalSearch() {
|
|||||||
</strong>
|
</strong>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span className='imex-flex-row__margin-large'>{`${
|
<span className="imex-flex-row__margin-large">{`${
|
||||||
job.ownr_fn || ""
|
job.ownr_fn || ""
|
||||||
} ${job.ownr_ln || ""} ${job.ownr_co_nm || ""}`}</span>
|
} ${job.ownr_ln || ""} ${job.ownr_co_nm || ""}`}</span>
|
||||||
<span className='imex-flex-row__margin-large'>{`${
|
<span className="imex-flex-row__margin-large">{`${
|
||||||
job.v_model_yr || ""
|
job.v_model_yr || ""
|
||||||
} ${job.v_make_desc || ""} ${
|
} ${job.v_make_desc || ""} ${
|
||||||
job.v_model_desc || ""
|
job.v_model_desc || ""
|
||||||
}`}</span>
|
}`}</span>
|
||||||
<span className='imex-flex-row__margin-large'>{`${job.clm_no}`}</span>
|
<span className="imex-flex-row__margin-large">{`${job.clm_no}`}</span>
|
||||||
<span className='imex-flex-row__margin-large imex-flex-row__grow'>
|
<span className="imex-flex-row__margin-large imex-flex-row__grow">
|
||||||
<CurrencyFormatter>{`${job.clm_total}`}</CurrencyFormatter>
|
<CurrencyFormatter>{`${job.clm_total}`}</CurrencyFormatter>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -81,8 +82,8 @@ export default function GlobalSearch() {
|
|||||||
}`,
|
}`,
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/owners/${owner.id}`}>
|
<Link to={`/manage/owners/${owner.id}`}>
|
||||||
<div className='imex-flex-row'>
|
<div className="imex-flex-row">
|
||||||
<span className='imex-flex-row__margin-large'>{`${
|
<span className="imex-flex-row__margin-large">{`${
|
||||||
owner.ownr_fn || ""
|
owner.ownr_fn || ""
|
||||||
} ${owner.ownr_ln || ""} ${owner.ownr_co_nm || ""}`}</span>
|
} ${owner.ownr_ln || ""} ${owner.ownr_co_nm || ""}`}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -100,8 +101,8 @@ export default function GlobalSearch() {
|
|||||||
} ${vehicle.v_model_desc || ""}`,
|
} ${vehicle.v_model_desc || ""}`,
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/vehicles/${vehicle.id}`}>
|
<Link to={`/manage/vehicles/${vehicle.id}`}>
|
||||||
<div className='imex-flex-row'>
|
<div className="imex-flex-row">
|
||||||
<span className='imex-flex-row__margin-large'>{`${
|
<span className="imex-flex-row__margin-large">{`${
|
||||||
vehicle.v_model_yr || ""
|
vehicle.v_model_yr || ""
|
||||||
} ${vehicle.v_make_desc || ""} ${
|
} ${vehicle.v_make_desc || ""} ${
|
||||||
vehicle.v_model_desc || ""
|
vehicle.v_model_desc || ""
|
||||||
@@ -119,11 +120,11 @@ export default function GlobalSearch() {
|
|||||||
value: `${payment.job.ro_number} ${payment.payer} ${payment.amount}`,
|
value: `${payment.job.ro_number} ${payment.payer} ${payment.amount}`,
|
||||||
label: (
|
label: (
|
||||||
<Link to={`/manage/jobs/${payment.job.id}`}>
|
<Link to={`/manage/jobs/${payment.job.id}`}>
|
||||||
<div className='imex-flex-row'>
|
<div className="imex-flex-row">
|
||||||
<span className='imex-flex-row__margin-large'>{`${payment.job.ro_number}`}</span>
|
<span className="imex-flex-row__margin-large">{`${payment.job.ro_number}`}</span>
|
||||||
<span className='imex-flex-row__margin-large'>{`${payment.job.memo}`}</span>
|
<span className="imex-flex-row__margin-large">{`${payment.job.memo}`}</span>
|
||||||
<span className='imex-flex-row__margin-large'>{`${payment.job.amount}`}</span>
|
<span className="imex-flex-row__margin-large">{`${payment.job.amount}`}</span>
|
||||||
<span className='imex-flex-row__margin-large'>{`${payment.job.transactionid}`}</span>
|
<span className="imex-flex-row__margin-large">{`${payment.job.transactionid}`}</span>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
),
|
),
|
||||||
@@ -133,16 +134,16 @@ export default function GlobalSearch() {
|
|||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
if (error) return <AlertComponent message={error.message} type='error' />;
|
if (error) return <AlertComponent message={error.message} type="error" />;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<AutoComplete
|
<AutoComplete
|
||||||
dropdownClassName='certain-category-search-dropdown'
|
|
||||||
dropdownMatchSelectWidth={false}
|
dropdownMatchSelectWidth={false}
|
||||||
style={{ width: 250 }}
|
style={{ width: 200 }}
|
||||||
options={options}>
|
options={options}
|
||||||
<Input.Search size='large' loading={loading} onSearch={handleSearch} />
|
>
|
||||||
|
<Input.Search loading={loading} onSearch={handleSearch} />
|
||||||
</AutoComplete>
|
</AutoComplete>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -43,8 +43,9 @@ const logoSpan = {
|
|||||||
xs: {
|
xs: {
|
||||||
span: 0,
|
span: 0,
|
||||||
},
|
},
|
||||||
|
sm: { span: 0 },
|
||||||
md: {
|
md: {
|
||||||
span: 1,
|
span: 0,
|
||||||
},
|
},
|
||||||
lg: {
|
lg: {
|
||||||
span: 2,
|
span: 2,
|
||||||
@@ -52,12 +53,9 @@ const logoSpan = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const menuSpan = {
|
const menuSpan = {
|
||||||
xs: {
|
|
||||||
span: 24,
|
|
||||||
},
|
|
||||||
md: {
|
md: {
|
||||||
span: 22,
|
span: 24,
|
||||||
offset: 1,
|
//offset: 1,
|
||||||
},
|
},
|
||||||
lg: {
|
lg: {
|
||||||
span: 21,
|
span: 21,
|
||||||
@@ -82,7 +80,7 @@ function Header({
|
|||||||
<Row>
|
<Row>
|
||||||
<Col {...logoSpan}>
|
<Col {...logoSpan}>
|
||||||
<img
|
<img
|
||||||
className='header-shop-logo'
|
className="header-shop-logo"
|
||||||
alt={bodyshop ? bodyshop.shopname : "ImEX Online Logo"}
|
alt={bodyshop ? bodyshop.shopname : "ImEX Online Logo"}
|
||||||
src={
|
src={
|
||||||
bodyshop && bodyshop.logo_img_path
|
bodyshop && bodyshop.logo_img_path
|
||||||
@@ -93,16 +91,14 @@ function Header({
|
|||||||
</Col>
|
</Col>
|
||||||
<Col {...menuSpan}>
|
<Col {...menuSpan}>
|
||||||
<Menu
|
<Menu
|
||||||
mode='horizontal'
|
mode="horizontal"
|
||||||
theme='dark'
|
theme="dark"
|
||||||
className='header-main-menu'
|
className="header-main-menu"
|
||||||
selectedKeys={["home"]}
|
selectedKeys={["home"]}
|
||||||
onClick={handleMenuClick}>
|
onClick={handleMenuClick}
|
||||||
<Menu.Item>
|
>
|
||||||
<GlobalSearch />
|
<Menu.Item key="home">
|
||||||
</Menu.Item>
|
<Link to="/manage">
|
||||||
<Menu.Item key='home'>
|
|
||||||
<Link to='/manage'>
|
|
||||||
<HomeFilled />
|
<HomeFilled />
|
||||||
{t("menus.header.home")}
|
{t("menus.header.home")}
|
||||||
</Link>
|
</Link>
|
||||||
@@ -113,50 +109,51 @@ 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'>
|
>
|
||||||
<Link to='/manage/schedule'>
|
<Menu.Item key="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='productionlist'>
|
<Menu.Item key="productionlist">
|
||||||
<Link to='/manage/production/list'>
|
<Link to="/manage/production/list">
|
||||||
<Icon component={FaCalendarAlt} />
|
<Icon component={FaCalendarAlt} />
|
||||||
{t("menus.header.productionlist")}
|
{t("menus.header.productionlist")}
|
||||||
</Link>
|
</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item key='productionboard'>
|
<Menu.Item key="productionboard">
|
||||||
<Link to='/manage/production/board'>
|
<Link to="/manage/production/board">
|
||||||
{t("menus.header.productionboard")}
|
{t("menus.header.productionboard")}
|
||||||
</Link>
|
</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item key='scoreboard'>
|
<Menu.Item key="scoreboard">
|
||||||
<Link to='/manage/scoreboard'>
|
<Link to="/manage/scoreboard">
|
||||||
{t("menus.header.scoreboard")}
|
{t("menus.header.scoreboard")}
|
||||||
</Link>
|
</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item key='activejobs'>
|
<Menu.Item key="activejobs">
|
||||||
<Link to='/manage/jobs'>{t("menus.header.activejobs")}</Link>
|
<Link to="/manage/jobs">{t("menus.header.activejobs")}</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item key='alljobs'>
|
<Menu.Item key="alljobs">
|
||||||
<Link to='/manage/jobs/all'>{t("menus.header.alljobs")}</Link>
|
<Link to="/manage/jobs/all">{t("menus.header.alljobs")}</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item key='availablejobs'>
|
<Menu.Item key="availablejobs">
|
||||||
<Link to='/manage/available'>
|
<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>
|
||||||
@@ -168,21 +165,22 @@ function Header({
|
|||||||
<CarFilled />
|
<CarFilled />
|
||||||
<span>{t("menus.header.courtesycars")}</span>
|
<span>{t("menus.header.courtesycars")}</span>
|
||||||
</span>
|
</span>
|
||||||
}>
|
}
|
||||||
<Menu.Item key='courtesycarsall'>
|
>
|
||||||
<Link to='/manage/courtesycars'>
|
<Menu.Item key="courtesycarsall">
|
||||||
|
<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>
|
||||||
@@ -194,90 +192,97 @@ function Header({
|
|||||||
<DollarCircleFilled />
|
<DollarCircleFilled />
|
||||||
<span>{t("menus.header.accounting")}</span>
|
<span>{t("menus.header.accounting")}</span>
|
||||||
</span>
|
</span>
|
||||||
}>
|
}
|
||||||
|
>
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
key='enterpayments'
|
key="enterpayments"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setPaymentContext({
|
setPaymentContext({
|
||||||
actions: {},
|
actions: {},
|
||||||
context: {},
|
context: {},
|
||||||
});
|
});
|
||||||
}}>
|
}}
|
||||||
|
>
|
||||||
<Icon component={FaCreditCard} />
|
<Icon component={FaCreditCard} />
|
||||||
{t("menus.header.enterpayment")}
|
{t("menus.header.enterpayment")}
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
|
|
||||||
<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 key='timetickets'>
|
<Menu.Item key="timetickets">
|
||||||
<Link to='/manage/timetickets'>
|
<Link to="/manage/timetickets">
|
||||||
{t("menus.header.timetickets")}
|
{t("menus.header.timetickets")}
|
||||||
</Link>
|
</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 title={t("menus.header.export")}>
|
<Menu.SubMenu title={t("menus.header.export")}>
|
||||||
<Menu.Item key='receivables'>
|
<Menu.Item key="receivables">
|
||||||
<Link to='/manage/accounting/receivables'>
|
<Link to="/manage/accounting/receivables">
|
||||||
{t("menus.header.accounting-receivables")}
|
{t("menus.header.accounting-receivables")}
|
||||||
</Link>
|
</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item key='payables'>
|
<Menu.Item key="payables">
|
||||||
<Link to='/manage/accounting/payables'>
|
<Link to="/manage/accounting/payables">
|
||||||
{t("menus.header.accounting-payables")}
|
{t("menus.header.accounting-payables")}
|
||||||
</Link>
|
</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item key='payments'>
|
<Menu.Item key="payments">
|
||||||
<Link to='/manage/accounting/payments'>
|
<Link to="/manage/accounting/payments">
|
||||||
{t("menus.header.accounting-payments")}
|
{t("menus.header.accounting-payments")}
|
||||||
</Link>
|
</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
</Menu.SubMenu>
|
</Menu.SubMenu>
|
||||||
|
|
||||||
<Menu.Item key='allpayments'>
|
<Menu.Item key="allpayments">
|
||||||
<Link to='/manage/payments'>
|
<Link to="/manage/payments">
|
||||||
{t("menus.header.allpayments")}
|
{t("menus.header.allpayments")}
|
||||||
</Link>
|
</Link>
|
||||||
</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-templates'>
|
<Menu.Item key="shop-templates">
|
||||||
<Link to='/manage/shop/templates'>
|
<Link to="/manage/shop/templates">
|
||||||
{t("menus.header.shop_templates")}
|
{t("menus.header.shop_templates")}
|
||||||
</Link>
|
</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>
|
||||||
<Menu.Item key='shop-csi'>
|
<Menu.Item key="shop-csi">
|
||||||
<Link to='/manage/shop/csi'>{t("menus.header.shop_csi")}</Link>
|
<Link to="/manage/shop/csi">{t("menus.header.shop_csi")}</Link>
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
</Menu.SubMenu>
|
</Menu.SubMenu>
|
||||||
|
<Menu.Item>
|
||||||
|
<GlobalSearch />
|
||||||
|
</Menu.Item>
|
||||||
<Menu.SubMenu
|
<Menu.SubMenu
|
||||||
title={
|
title={
|
||||||
<div>
|
<div>
|
||||||
@@ -300,17 +305,18 @@ function Header({
|
|||||||
|
|
||||||
{currentUser.displayName || t("general.labels.unknown")}
|
{currentUser.displayName || t("general.labels.unknown")}
|
||||||
</div>
|
</div>
|
||||||
}>
|
}
|
||||||
|
>
|
||||||
<Menu.Item danger onClick={() => signOutStart()}>
|
<Menu.Item danger onClick={() => signOutStart()}>
|
||||||
{t("user.actions.signout")}
|
{t("user.actions.signout")}
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item key='shiftclock'>
|
<Menu.Item key="shiftclock">
|
||||||
<Link to='/manage/shiftclock'>
|
<Link to="/manage/shiftclock">
|
||||||
{t("menus.header.shiftclock")}
|
{t("menus.header.shiftclock")}
|
||||||
</Link>
|
</Link>
|
||||||
</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>
|
||||||
@@ -320,14 +326,15 @@ 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>
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
import { DeleteFilled, PlusCircleFilled, SyncOutlined } from "@ant-design/icons";
|
import {
|
||||||
|
DeleteFilled,
|
||||||
|
PlusCircleFilled,
|
||||||
|
SyncOutlined,
|
||||||
|
} from "@ant-design/icons";
|
||||||
import { Button, notification, Table } from "antd";
|
import { Button, notification, Table } from "antd";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
@@ -20,13 +24,13 @@ export default function JobsAvailableComponent({
|
|||||||
selectedOwner,
|
selectedOwner,
|
||||||
setSelectedOwner,
|
setSelectedOwner,
|
||||||
loadEstData,
|
loadEstData,
|
||||||
estData
|
estData,
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const [state, setState] = useState({
|
const [state, setState] = useState({
|
||||||
sortedInfo: {},
|
sortedInfo: {},
|
||||||
filteredInfo: { text: "" }
|
filteredInfo: { text: "" },
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleTableChange = (pagination, filters, sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
@@ -43,7 +47,7 @@ export default function JobsAvailableComponent({
|
|||||||
// filteredValue: state.filteredInfo.text || null,
|
// filteredValue: state.filteredInfo.text || null,
|
||||||
sorter: (a, b) => alphaSort(a, b),
|
sorter: (a, b) => alphaSort(a, b),
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order
|
state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.owner"),
|
title: t("jobs.fields.owner"),
|
||||||
@@ -53,7 +57,7 @@ export default function JobsAvailableComponent({
|
|||||||
sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln),
|
sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln),
|
||||||
//width: "25%",
|
//width: "25%",
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order
|
state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.vehicle"),
|
title: t("jobs.fields.vehicle"),
|
||||||
@@ -61,7 +65,7 @@ export default function JobsAvailableComponent({
|
|||||||
key: "vehicle_info",
|
key: "vehicle_info",
|
||||||
sorter: (a, b) => alphaSort(a.vehicle_info, b.vehicle_info),
|
sorter: (a, b) => alphaSort(a.vehicle_info, b.vehicle_info),
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order
|
state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order,
|
||||||
//ellipsis: true
|
//ellipsis: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -70,7 +74,7 @@ export default function JobsAvailableComponent({
|
|||||||
key: "clm_no",
|
key: "clm_no",
|
||||||
sorter: (a, b) => alphaSort(a.clm_no, b.clm_no),
|
sorter: (a, b) => alphaSort(a.clm_no, b.clm_no),
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order
|
state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order,
|
||||||
//width: "12%",
|
//width: "12%",
|
||||||
//ellipsis: true
|
//ellipsis: true
|
||||||
},
|
},
|
||||||
@@ -83,7 +87,7 @@ export default function JobsAvailableComponent({
|
|||||||
state.sortedInfo.columnKey === "clm_amt" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "clm_amt" && state.sortedInfo.order,
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<CurrencyFormatter>{record.clm_amt}</CurrencyFormatter>
|
<CurrencyFormatter>{record.clm_amt}</CurrencyFormatter>
|
||||||
)
|
),
|
||||||
//width: "12%",
|
//width: "12%",
|
||||||
//ellipsis: true
|
//ellipsis: true
|
||||||
},
|
},
|
||||||
@@ -93,7 +97,7 @@ export default function JobsAvailableComponent({
|
|||||||
key: "uploaded_by",
|
key: "uploaded_by",
|
||||||
sorter: (a, b) => alphaSort(a.uploaded_by, b.uploaded_by),
|
sorter: (a, b) => alphaSort(a.uploaded_by, b.uploaded_by),
|
||||||
sortOrder:
|
sortOrder:
|
||||||
state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order
|
state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order,
|
||||||
//width: "12%",
|
//width: "12%",
|
||||||
//ellipsis: true
|
//ellipsis: true
|
||||||
},
|
},
|
||||||
@@ -106,7 +110,7 @@ export default function JobsAvailableComponent({
|
|||||||
state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order,
|
state.sortedInfo.columnKey === "updated_at" && state.sortedInfo.order,
|
||||||
render: (text, record) => (
|
render: (text, record) => (
|
||||||
<DateTimeFormatter>{record.updated_at}</DateTimeFormatter>
|
<DateTimeFormatter>{record.updated_at}</DateTimeFormatter>
|
||||||
)
|
),
|
||||||
//width: "12%",
|
//width: "12%",
|
||||||
//ellipsis: true
|
//ellipsis: true
|
||||||
},
|
},
|
||||||
@@ -117,9 +121,9 @@ export default function JobsAvailableComponent({
|
|||||||
<span>
|
<span>
|
||||||
<Button
|
<Button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
deleteJob({ variables: { id: record.id } }).then(r => {
|
deleteJob({ variables: { id: record.id } }).then((r) => {
|
||||||
notification["success"]({
|
notification["success"]({
|
||||||
message: t("jobs.successes.deleted")
|
message: t("jobs.successes.deleted"),
|
||||||
});
|
});
|
||||||
refetch();
|
refetch();
|
||||||
});
|
});
|
||||||
@@ -136,10 +140,10 @@ export default function JobsAvailableComponent({
|
|||||||
<PlusCircleFilled />
|
<PlusCircleFilled />
|
||||||
</Button>
|
</Button>
|
||||||
</span>
|
</span>
|
||||||
)
|
),
|
||||||
//width: "12%",
|
//width: "12%",
|
||||||
//ellipsis: true
|
//ellipsis: true
|
||||||
}
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const owner =
|
const owner =
|
||||||
@@ -169,9 +173,12 @@ export default function JobsAvailableComponent({
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
title={() => {
|
title={() => {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className="imex-flex-row">
|
||||||
<strong>{t("jobs.labels.availablenew")}</strong>
|
<strong className="imex-flex-row__margin">
|
||||||
|
{t("jobs.labels.availablenew")}
|
||||||
|
</strong>
|
||||||
<Button
|
<Button
|
||||||
|
className="imex-flex-row__margin"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
refetch();
|
refetch();
|
||||||
}}
|
}}
|
||||||
@@ -179,19 +186,20 @@ export default function JobsAvailableComponent({
|
|||||||
<SyncOutlined />
|
<SyncOutlined />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
|
className="imex-flex-row__margin"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
deleteAllNewJobs()
|
deleteAllNewJobs()
|
||||||
.then(r => {
|
.then((r) => {
|
||||||
notification["success"]({
|
notification["success"]({
|
||||||
message: t("jobs.successes.all_deleted", {
|
message: t("jobs.successes.all_deleted", {
|
||||||
count: r.data.delete_available_jobs.affected_rows
|
count: r.data.delete_available_jobs.affected_rows,
|
||||||
})
|
}),
|
||||||
});
|
});
|
||||||
refetch();
|
refetch();
|
||||||
})
|
})
|
||||||
.catch(r => {
|
.catch((r) => {
|
||||||
notification["error"]({
|
notification["error"]({
|
||||||
message: t("jobs.errors.deleted") + " " + r.message
|
message: t("jobs.errors.deleted") + " " + r.message,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
@@ -203,7 +211,7 @@ export default function JobsAvailableComponent({
|
|||||||
}}
|
}}
|
||||||
size="small"
|
size="small"
|
||||||
pagination={{ position: "top" }}
|
pagination={{ position: "top" }}
|
||||||
columns={columns.map(item => ({ ...item }))}
|
columns={columns.map((item) => ({ ...item }))}
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
dataSource={data && data.available_jobs}
|
dataSource={data && data.available_jobs}
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
|
|||||||
@@ -141,7 +141,8 @@ export default function JobsAvailableSupplementComponent({
|
|||||||
});
|
});
|
||||||
refetch();
|
refetch();
|
||||||
});
|
});
|
||||||
}}>
|
}}
|
||||||
|
>
|
||||||
<DeleteFilled />
|
<DeleteFilled />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
@@ -149,7 +150,8 @@ export default function JobsAvailableSupplementComponent({
|
|||||||
loadEstData({ variables: { id: record.id } });
|
loadEstData({ variables: { id: record.id } });
|
||||||
modalSearchState[1](record.clm_no);
|
modalSearchState[1](record.clm_no);
|
||||||
setModalVisible(true);
|
setModalVisible(true);
|
||||||
}}>
|
}}
|
||||||
|
>
|
||||||
<PlusCircleFilled />
|
<PlusCircleFilled />
|
||||||
</Button>
|
</Button>
|
||||||
</span>
|
</span>
|
||||||
@@ -191,22 +193,31 @@ export default function JobsAvailableSupplementComponent({
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
title={() => {
|
title={() => {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div className="imex-flex-row">
|
||||||
<strong>{t("jobs.labels.availablesupplements")}</strong>
|
<strong className="imex-flex-row__margin">
|
||||||
|
{t("jobs.labels.availablesupplements")}
|
||||||
|
</strong>
|
||||||
<Button
|
<Button
|
||||||
|
className="imex-flex-row__margin"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
refetch();
|
refetch();
|
||||||
}}>
|
}}
|
||||||
|
>
|
||||||
<SyncOutlined />
|
<SyncOutlined />
|
||||||
</Button>
|
</Button>
|
||||||
<Button onClick={handleDeleteAll}>Delete All</Button>
|
<Button
|
||||||
|
className="imex-flex-row__margin"
|
||||||
|
onClick={handleDeleteAll}
|
||||||
|
>
|
||||||
|
Delete All
|
||||||
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
size='small'
|
size="small"
|
||||||
pagination={{ position: "top" }}
|
pagination={{ position: "top" }}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowKey='id'
|
rowKey="id"
|
||||||
dataSource={data && data.available_jobs}
|
dataSource={data && data.available_jobs}
|
||||||
onChange={handleTableChange}
|
onChange={handleTableChange}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import ShopInfoROStatusComponent from "./shop-info.rostatus.component";
|
|||||||
import ShopInfoOrderStatusComponent from "./shop-info.orderstatus.component";
|
import ShopInfoOrderStatusComponent from "./shop-info.orderstatus.component";
|
||||||
import ShopInfoResponsibilityCenterComponent from "./shop-info.responsibilitycenters.component";
|
import ShopInfoResponsibilityCenterComponent from "./shop-info.responsibilitycenters.component";
|
||||||
import ShopInfoSchedulingComponent from "./shop-info.scheduling.component";
|
import ShopInfoSchedulingComponent from "./shop-info.scheduling.component";
|
||||||
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
|
|
||||||
export default function ShopInfoComponent({ form }) {
|
export default function ShopInfoComponent({ form }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -24,171 +25,191 @@ export default function ShopInfoComponent({ form }) {
|
|||||||
</Button>
|
</Button>
|
||||||
<Collapse defaultActiveKey="shopinfo">
|
<Collapse defaultActiveKey="shopinfo">
|
||||||
<Collapse.Panel key="shopinfo" header={t("bodyshop.labels.shopinfo")}>
|
<Collapse.Panel key="shopinfo" header={t("bodyshop.labels.shopinfo")}>
|
||||||
<Form.Item label={t("bodyshop.fields.shopname")} name="shopname">
|
<LayoutFormRow>
|
||||||
<Input />
|
<Form.Item label={t("bodyshop.fields.shopname")} name="shopname">
|
||||||
</Form.Item>
|
<Input />
|
||||||
<Form.Item label={t("bodyshop.fields.address1")} name="address1">
|
</Form.Item>
|
||||||
<Input />
|
<Form.Item label={t("bodyshop.fields.address1")} name="address1">
|
||||||
</Form.Item>
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item label={t("bodyshop.fields.address2")} name="address2">
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item label={t("bodyshop.fields.city")} name="city">
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item label={t("bodyshop.fields.state")} name="state">
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item label={t("bodyshop.fields.zip_post")} name="zip_post">
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
</LayoutFormRow>
|
||||||
|
<LayoutFormRow>
|
||||||
|
<Form.Item label={t("bodyshop.fields.country")} name="country">
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item label={t("bodyshop.fields.email")} name="email">
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.federal_tax_id")}
|
||||||
|
name="federal_tax_id"
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.insurance_vendor_id")}
|
||||||
|
name="insurance_vendor_id"
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.logo_img_path")}
|
||||||
|
name="logo_img_path"
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.state_tax_id")}
|
||||||
|
name="state_tax_id"
|
||||||
|
>
|
||||||
|
<Input />
|
||||||
|
</Form.Item>
|
||||||
|
</LayoutFormRow>
|
||||||
|
<LayoutFormRow>
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.invoice_federal_tax_rate")}
|
||||||
|
name={["invoice_tax_rates", "federal_tax_rate"]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.invoice_state_tax_rate")}
|
||||||
|
name={["invoice_tax_rates", "state_tax_rate"]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label={t("bodyshop.fields.invoice_local_tax_rate")}
|
||||||
|
name={["invoice_tax_rates", "local_tax_rate"]}
|
||||||
|
>
|
||||||
|
<InputNumber />
|
||||||
|
</Form.Item>
|
||||||
|
|
||||||
<Form.Item label={t("bodyshop.fields.address2")} name="address2">
|
<Form.Item
|
||||||
<Input />
|
label={t("bodyshop.fields.appt_length")}
|
||||||
</Form.Item>
|
name={"appt_length"}
|
||||||
<Form.Item label={t("bodyshop.fields.city")} name="city">
|
rules={[
|
||||||
<Input />
|
{
|
||||||
</Form.Item>
|
required: true,
|
||||||
<Form.Item label={t("bodyshop.fields.state")} name="state">
|
message: t("general.validation.required"),
|
||||||
<Input />
|
},
|
||||||
</Form.Item>
|
]}
|
||||||
<Form.Item label={t("bodyshop.fields.zip_post")} name="zip_post">
|
>
|
||||||
<Input />
|
<InputNumber min={15} precision={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item label={t("bodyshop.fields.country")} name="country">
|
</LayoutFormRow>
|
||||||
<Input />
|
<LayoutFormRow>
|
||||||
</Form.Item>
|
<Form.Item
|
||||||
<Form.Item label={t("bodyshop.fields.email")} name="email">
|
label={t("bodyshop.fields.dailypainttarget")}
|
||||||
<Input />
|
name={["scoreboard_target", "dailyPaintTarget"]}
|
||||||
</Form.Item>
|
rules={[
|
||||||
<Form.Item
|
{
|
||||||
label={t("bodyshop.fields.federal_tax_id")}
|
required: true,
|
||||||
name="federal_tax_id"
|
message: t("general.validation.required"),
|
||||||
>
|
},
|
||||||
<Input />
|
]}
|
||||||
</Form.Item>
|
>
|
||||||
<Form.Item
|
<InputNumber min={0} precision={0} />
|
||||||
label={t("bodyshop.fields.insurance_vendor_id")}
|
</Form.Item>
|
||||||
name="insurance_vendor_id"
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.logo_img_path")}
|
|
||||||
name="logo_img_path"
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.state_tax_id")}
|
|
||||||
name="state_tax_id"
|
|
||||||
>
|
|
||||||
<Input />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.invoice_federal_tax_rate")}
|
|
||||||
name={["invoice_tax_rates", "federal_tax_rate"]}
|
|
||||||
>
|
|
||||||
<InputNumber />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.invoice_state_tax_rate")}
|
|
||||||
name={["invoice_tax_rates", "state_tax_rate"]}
|
|
||||||
>
|
|
||||||
<InputNumber />
|
|
||||||
</Form.Item>
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.fields.invoice_local_tax_rate")}
|
|
||||||
name={["invoice_tax_rates", "local_tax_rate"]}
|
|
||||||
>
|
|
||||||
<InputNumber />
|
|
||||||
</Form.Item>
|
|
||||||
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.appt_length")}
|
label={t("bodyshop.fields.dailybodytarget")}
|
||||||
name={"appt_length"}
|
name={["scoreboard_target", "dailyBodyTarget"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: t("general.validation.required"),
|
message: t("general.validation.required"),
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<InputNumber min={15} precisio={0} />
|
<InputNumber min={0} precision={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.dailypainttarget")}
|
label={t("bodyshop.fields.lastnumberworkingdays")}
|
||||||
name={["scoreboard_target", "dailyPaintTarget"]}
|
name={["scoreboard_target", "lastNumberWorkingDays"]}
|
||||||
rules={[
|
rules={[
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
message: t("general.validation.required"),
|
message: t("general.validation.required"),
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<InputNumber min={0} precisio={0} />
|
<InputNumber min={0} max={12} precision={0} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
<Form.Item
|
name={["md_referral_sources"]}
|
||||||
label={t("bodyshop.fields.dailybodytarget")}
|
label={t("bodyshop.fields.md_referral_sources")}
|
||||||
name={["scoreboard_target", "dailyBodyTarget"]}
|
rules={[
|
||||||
rules={[
|
{
|
||||||
{
|
required: true,
|
||||||
required: true,
|
message: t("general.validation.required"),
|
||||||
message: t("general.validation.required"),
|
type: "array",
|
||||||
},
|
},
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
<InputNumber min={0} precisio={0} />
|
<Select mode="tags" />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
<Form.Item
|
label={t("bodyshop.labels.accountingtiers")}
|
||||||
label={t("bodyshop.fields.lastnumberworkingdays")}
|
rules={[
|
||||||
name={["scoreboard_target", "lastNumberWorkingDays"]}
|
{
|
||||||
rules={[
|
required: true,
|
||||||
{
|
message: t("general.validation.required"),
|
||||||
required: true,
|
},
|
||||||
message: t("general.validation.required"),
|
]}
|
||||||
},
|
name={["accountingconfig", "tiers"]}
|
||||||
]}
|
>
|
||||||
>
|
<Radio.Group>
|
||||||
<InputNumber min={0} max={12} precisio={0} />
|
<Radio value={2}>2</Radio>
|
||||||
</Form.Item>
|
<Radio value={3}>3</Radio>
|
||||||
|
</Radio.Group>
|
||||||
<Form.Item
|
</Form.Item>
|
||||||
label={t("bodyshop.labels.accountingtiers")}
|
<Form.Item shouldUpdate>
|
||||||
rules={[
|
{() => {
|
||||||
{
|
return (
|
||||||
required: true,
|
<Form.Item
|
||||||
message: t("general.validation.required"),
|
label={t("bodyshop.labels.2tiersetup")}
|
||||||
},
|
shouldUpdate
|
||||||
]}
|
rules={[
|
||||||
name={["accountingconfig", "tiers"]}
|
{
|
||||||
>
|
required:
|
||||||
<Radio.Group>
|
form.getFieldValue(["accountingconfig", "tiers"]) ===
|
||||||
<Radio value={2}>2</Radio>
|
2,
|
||||||
<Radio value={3}>3</Radio>
|
message: t("general.validation.required"),
|
||||||
</Radio.Group>
|
},
|
||||||
</Form.Item>
|
]}
|
||||||
<Form.Item shouldUpdate>
|
name={["accountingconfig", "twotierpref"]}
|
||||||
{() => {
|
|
||||||
return (
|
|
||||||
<Form.Item
|
|
||||||
label={t("bodyshop.labels.2tiersetup")}
|
|
||||||
shouldUpdate
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required:
|
|
||||||
form.getFieldValue(["accountingconfig", "tiers"]) === 2,
|
|
||||||
message: t("general.validation.required"),
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
name={["accountingconfig", "twotierpref"]}
|
|
||||||
>
|
|
||||||
<Radio.Group
|
|
||||||
disabled={
|
|
||||||
form.getFieldValue(["accountingconfig", "tiers"]) === 3
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
<Radio value="name">{t("bodyshop.labels.2tiername")}</Radio>
|
<Radio.Group
|
||||||
<Radio value="source">
|
disabled={
|
||||||
{t("bodyshop.labels.2tiersource")}
|
form.getFieldValue(["accountingconfig", "tiers"]) === 3
|
||||||
</Radio>
|
}
|
||||||
</Radio.Group>
|
>
|
||||||
</Form.Item>
|
<Radio value="name">
|
||||||
);
|
{t("bodyshop.labels.2tiername")}
|
||||||
}}
|
</Radio>
|
||||||
</Form.Item>
|
<Radio value="source">
|
||||||
|
{t("bodyshop.labels.2tiersource")}
|
||||||
|
</Radio>
|
||||||
|
</Radio.Group>
|
||||||
|
</Form.Item>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Form.Item>
|
||||||
|
</LayoutFormRow>
|
||||||
<Form.List name={["md_messaging_presets"]}>
|
<Form.List name={["md_messaging_presets"]}>
|
||||||
{(fields, { add, remove }) => {
|
{(fields, { add, remove }) => {
|
||||||
return (
|
return (
|
||||||
@@ -250,20 +271,6 @@ export default function ShopInfoComponent({ form }) {
|
|||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
</Form.List>
|
</Form.List>
|
||||||
|
|
||||||
<Form.Item
|
|
||||||
name={["md_referral_sources"]}
|
|
||||||
label={t("bodyshop.fields.md_referral_sources")}
|
|
||||||
rules={[
|
|
||||||
{
|
|
||||||
required: true,
|
|
||||||
message: t("general.validation.required"),
|
|
||||||
type: "array",
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
>
|
|
||||||
<Select mode="tags" />
|
|
||||||
</Form.Item>
|
|
||||||
</Collapse.Panel>
|
</Collapse.Panel>
|
||||||
<Collapse.Panel
|
<Collapse.Panel
|
||||||
key="roStatus"
|
key="roStatus"
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ export default function ShopInfoContainer() {
|
|||||||
return (
|
return (
|
||||||
<Form
|
<Form
|
||||||
form={form}
|
form={form}
|
||||||
|
layout='vertical'
|
||||||
|
autoComplete='new-password'
|
||||||
onFinish={handleFinish}
|
onFinish={handleFinish}
|
||||||
initialValues={data ? data.bodyshops[0] : null}
|
initialValues={data ? data.bodyshops[0] : null}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { Button, Form, Input, Select, InputNumber } from "antd";
|
|||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
|
import LayoutFormRow from "../layout-form-row/layout-form-row.component";
|
||||||
//TODO Fix up styles.
|
//TODO Fix up styles.
|
||||||
const SelectorDiv = styled.div`
|
const SelectorDiv = styled.div`
|
||||||
.ant-form-item .ant-select {
|
.ant-form-item .ant-select {
|
||||||
@@ -53,7 +54,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => (
|
{fields.map((field, index) => (
|
||||||
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
||||||
<div style={{ display: "flex" }}>
|
<LayoutFormRow>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
style={{ padding: 0, margin: 2 }}
|
style={{ padding: 0, margin: 2 }}
|
||||||
label={t("bodyshop.fields.responsibilitycenter")}
|
label={t("bodyshop.fields.responsibilitycenter")}
|
||||||
@@ -137,7 +138,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
remove(field.name);
|
remove(field.name);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</LayoutFormRow>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
))}
|
))}
|
||||||
<Form.Item>
|
<Form.Item>
|
||||||
@@ -164,7 +165,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
<div>
|
<div>
|
||||||
{fields.map((field, index) => (
|
{fields.map((field, index) => (
|
||||||
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
<Form.Item key={field.key} style={{ padding: 0, margin: 2 }}>
|
||||||
<div style={{ display: "flex" }}>
|
<LayoutFormRow>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
style={{ padding: 0, margin: 2 }}
|
style={{ padding: 0, margin: 2 }}
|
||||||
label={t("bodyshop.fields.responsibilitycenter")}
|
label={t("bodyshop.fields.responsibilitycenter")}
|
||||||
@@ -248,7 +249,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
remove(field.name);
|
remove(field.name);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</LayoutFormRow>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
))}
|
))}
|
||||||
<Form.Item>
|
<Form.Item>
|
||||||
@@ -1066,8 +1067,8 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
</Select>
|
</Select>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</SelectorDiv>
|
</SelectorDiv>
|
||||||
<div style={{ display: "flex", flexDirection: "column" }}>
|
<div>
|
||||||
<div style={{ display: "flex" }}>
|
<LayoutFormRow>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.responsibilitycenters.federal_tax")}
|
label={t("bodyshop.fields.responsibilitycenters.federal_tax")}
|
||||||
rules={[
|
rules={[
|
||||||
@@ -1160,8 +1161,8 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
>
|
>
|
||||||
<InputNumber precision={2} />
|
<InputNumber precision={2} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</div>
|
</LayoutFormRow>
|
||||||
<div style={{ display: "flex" }}>
|
<LayoutFormRow>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.responsibilitycenters.state_tax")}
|
label={t("bodyshop.fields.responsibilitycenters.state_tax")}
|
||||||
rules={[
|
rules={[
|
||||||
@@ -1254,8 +1255,8 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
>
|
>
|
||||||
<InputNumber precision={2} />
|
<InputNumber precision={2} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</div>
|
</LayoutFormRow>
|
||||||
<div style={{ display: "flex" }}>
|
<LayoutFormRow>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.responsibilitycenters.local_tax")}
|
label={t("bodyshop.fields.responsibilitycenters.local_tax")}
|
||||||
rules={[
|
rules={[
|
||||||
@@ -1348,9 +1349,9 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
>
|
>
|
||||||
<InputNumber precision={2} />
|
<InputNumber precision={2} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</div>
|
</LayoutFormRow>
|
||||||
|
|
||||||
<div style={{ display: "flex" }}>
|
<LayoutFormRow>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.responsibilitycenters.ar")}
|
label={t("bodyshop.fields.responsibilitycenters.ar")}
|
||||||
rules={[
|
rules={[
|
||||||
@@ -1411,8 +1412,8 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
>
|
>
|
||||||
<Input />
|
<Input />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</div>
|
</LayoutFormRow>
|
||||||
<div style={{ display: "flex" }}>
|
<LayoutFormRow>
|
||||||
<Form.Item
|
<Form.Item
|
||||||
label={t("bodyshop.fields.responsibilitycenters.ar")}
|
label={t("bodyshop.fields.responsibilitycenters.ar")}
|
||||||
rules={[
|
rules={[
|
||||||
@@ -1473,7 +1474,7 @@ export default function ShopInfoResponsibilityCenterComponent({ form }) {
|
|||||||
>
|
>
|
||||||
<Input />
|
<Input />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</div>
|
</LayoutFormRow>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -887,9 +887,9 @@ export const QUERY_ALL_JOB_FIELDS = gql`
|
|||||||
status
|
status
|
||||||
tax_part
|
tax_part
|
||||||
unq_seq
|
unq_seq
|
||||||
employee_body
|
|
||||||
employee_refinish
|
|
||||||
}
|
}
|
||||||
|
employee_body
|
||||||
|
employee_refinish
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ export function CourtesyCarCreateContainer({ bodyshop, setBreadcrumbs }) {
|
|||||||
}, [t, setBreadcrumbs]);
|
}, [t, setBreadcrumbs]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form form={form} autoComplete="no" onFinish={handleFinish}>
|
<Form form={form} autoComplete="new-password" onFinish={handleFinish}>
|
||||||
<CourtesyCarCreateComponent />
|
<CourtesyCarCreateComponent />
|
||||||
</Form>
|
</Form>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -151,10 +151,10 @@ export function Manage({ match, conflict }) {
|
|||||||
}, [t]);
|
}, [t]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout className='layout-container'>
|
<Layout className="layout-container">
|
||||||
<HeaderContainer />
|
<HeaderContainer />
|
||||||
<BreadCrumbs />
|
|
||||||
<Content className='content-container'>
|
<Content className="content-container">
|
||||||
<FcmNotification />
|
<FcmNotification />
|
||||||
<ErrorBoundary>
|
<ErrorBoundary>
|
||||||
{conflict ? (
|
{conflict ? (
|
||||||
@@ -163,7 +163,9 @@ export function Manage({ match, conflict }) {
|
|||||||
<Suspense
|
<Suspense
|
||||||
fallback={
|
fallback={
|
||||||
<LoadingSpinner message={t("general.labels.loadingapp")} />
|
<LoadingSpinner message={t("general.labels.loadingapp")} />
|
||||||
}>
|
}
|
||||||
|
>
|
||||||
|
<BreadCrumbs />
|
||||||
<EnterInvoiceModalContainer />
|
<EnterInvoiceModalContainer />
|
||||||
<JobCostingModal />
|
<JobCostingModal />
|
||||||
<EmailOverlayContainer />
|
<EmailOverlayContainer />
|
||||||
@@ -347,7 +349,6 @@ export function Manage({ match, conflict }) {
|
|||||||
</ErrorBoundary>
|
</ErrorBoundary>
|
||||||
<ChatAffixContainer />
|
<ChatAffixContainer />
|
||||||
<BackTop />
|
<BackTop />
|
||||||
<Layout.Footer> Some footer</Layout.Footer>
|
|
||||||
</Content>
|
</Content>
|
||||||
</Layout>
|
</Layout>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
.content-container {
|
.content-container {
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
margin: 0rem 1.5rem;
|
margin: 1rem 1rem 0rem 1rem;
|
||||||
padding: 0.5rem 1.5rem;
|
padding: 0.25rem 1rem 0rem 1rem;
|
||||||
border-radius: 12px;
|
border-radius: 4px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ export default async function RenderTemplate(templateObject, bodyshop) {
|
|||||||
console.log("templateToUse", templateToUse);
|
console.log("templateToUse", templateToUse);
|
||||||
} else {
|
} else {
|
||||||
//No template found.Uh oh.
|
//No template found.Uh oh.
|
||||||
alert("Template key does not exist.");
|
alert("Error: Template key does not exist.");
|
||||||
throw new Error("Template key does not exist.");
|
//throw new Error("Template key does not exist.");
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data: contextData } = await client.query({
|
const { data: contextData } = await client.query({
|
||||||
|
|||||||
Reference in New Issue
Block a user