BOD-16 Added pages + routing for courtesy cars

This commit is contained in:
Patrick Fic
2020-03-30 15:32:39 -07:00
parent 1249fd5b2c
commit 791a6dd4f2
25 changed files with 1362 additions and 17 deletions

View File

@@ -1975,6 +1975,488 @@
</folder_node>
</children>
</folder_node>
<folder_node>
<name>courtesycars</name>
<children>
<folder_node>
<name>erorrs</name>
<children>
<concept_node>
<name>saving</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>
</folder_node>
<folder_node>
<name>fields</name>
<children>
<concept_node>
<name>color</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>dailycost</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>damage</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>fleetnumber</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>fuel</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>insuranceexpires</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>leaseenddate</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>make</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>model</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>nextservicedate</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>nextservicekm</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>notes</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>plate</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>purchasedate</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>registrationexpires</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>serviceenddate</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>servicestartdate</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>status</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>vin</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>year</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>
</folder_node>
<folder_node>
<name>successes</name>
<children>
<concept_node>
<name>saved</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>
</folder_node>
</children>
</folder_node>
<folder_node>
<name>documents</name>
<children>
@@ -7409,6 +7891,90 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>courtesycars</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>courtesycars-all</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>courtesycars-contracts</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>courtesycars-newcontract</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>customers</name>
<definition_loaded>false</definition_loaded>
@@ -8964,6 +9530,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>courtesycars-create</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>jobs</name>
<definition_loaded>false</definition_loaded>
@@ -8985,6 +9572,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>jobs-create</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>jobsavailable</name>
<definition_loaded>false</definition_loaded>

View File

@@ -0,0 +1,197 @@
import React from "react";
import { Form, Input, InputNumber, DatePicker, Button } from "antd";
import { useTranslation } from "react-i18next";
import CurrencyInput from "../form-items-formatted/currency-form-item.component";
export default function CourtesyCarCreateFormComponent() {
const { t } = useTranslation();
return (
<div>
<Button type="primary" htmlType="submit">
{t("general.actions.save")}
</Button>
<Form.Item
label={t("courtesycars.fields.make")}
name="make"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.model")}
name="model"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.year")}
name="year"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.plate")}
name="plate"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.color")}
name="color"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.vin")}
name="vin"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.fleetnumber")}
name="fleetnumber"
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.purchasedate")}
name="purchasedate"
>
<DatePicker />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.servicestartdate")}
name="servicestartdate"
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.serviceenddate")}
name="serviceenddate"
>
<DatePicker />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.leaseenddate")}
name="leaseenddate"
>
<DatePicker />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.status")}
name="status"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.nextservicekm")}
name="nextservicekm"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<InputNumber />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.nextservicedate")}
name="nextservicedate"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<DatePicker />
</Form.Item>
<Form.Item label={t("courtesycars.fields.damage")} name="damage">
<Input />
</Form.Item>
<Form.Item label={t("courtesycars.fields.notes")} name="notes">
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.fuel")}
name="fuel"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<Input />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.registrationexpires")}
name="registrationexpires"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<DatePicker />
</Form.Item>
<Form.Item
label={t("courtesycars.fields.insuranceexpires")}
name="insuranceexpires"
rules={[
{
required: true,
message: t("general.validation.required")
}
]}
>
<DatePicker />
</Form.Item>
<Form.Item label={t("courtesycars.fields.dailycost")} name="dailycost">
<CurrencyInput />
</Form.Item>
</div>
);
}

View File

@@ -0,0 +1,82 @@
import { Table } from "antd";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { Link } from "react-router-dom";
import { alphaSort } from "../../utils/sorters";
export default function JobsList({ loading, courtesycars }) {
const [state, setState] = useState({
sortedInfo: {},
filteredInfo: { text: "" }
});
console.log("courtesycars", courtesycars);
const { t } = useTranslation();
const columns = [
{
title: t("courtesycars.fields.fleetnumber"),
dataIndex: "fleetnumber",
key: "fleetnumber",
sorter: (a, b) => alphaSort(a.fleetnumber, b.fleetnumber),
sortOrder:
state.sortedInfo.columnKey === "fleetnumber" && state.sortedInfo.order
},
{
title: t("courtesycars.fields.vin"),
dataIndex: "vin",
key: "vin",
sorter: (a, b) => alphaSort(a.vin, b.vin),
sortOrder: state.sortedInfo.columnKey === "vin" && state.sortedInfo.order,
render: (text, record) => (
<Link to={`/manage/courtesycars/${record.id}`}>{record.vin}</Link>
)
},
{
title: t("courtesycars.fields.status"),
dataIndex: "status",
key: "status",
sorter: (a, b) => alphaSort(a.status, b.status),
sortOrder:
state.sortedInfo.columnKey === "status" && state.sortedInfo.order
},
{
title: t("courtesycars.fields.year"),
dataIndex: "year",
key: "year",
sorter: (a, b) => alphaSort(a.year, b.year),
sortOrder: state.sortedInfo.columnKey === "year" && state.sortedInfo.order
},
{
title: t("courtesycars.fields.make"),
dataIndex: "make",
key: "make",
sorter: (a, b) => alphaSort(a.make, b.make),
sortOrder: state.sortedInfo.columnKey === "make" && state.sortedInfo.order
},
{
title: t("courtesycars.fields.model"),
dataIndex: "model",
key: "model",
sorter: (a, b) => alphaSort(a.model, b.model),
sortOrder:
state.sortedInfo.columnKey === "model" && state.sortedInfo.order
}
];
const handleTableChange = (pagination, filters, sorter) => {
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
};
return (
<Table
loading={loading}
size="small"
pagination={{ position: "top" }}
columns={columns.map(item => ({ ...item }))}
rowKey="id"
dataSource={courtesycars}
onChange={handleTableChange}
/>
);
}

View File

@@ -1,4 +1,12 @@
import { CalendarFilled, CarFilled, GlobalOutlined, HomeFilled, TeamOutlined } from "@ant-design/icons";
import {
CalendarFilled,
CarFilled,
GlobalOutlined,
HomeFilled,
TeamOutlined,
FileAddFilled,
FileFilled
} from "@ant-design/icons";
import { Avatar, Col, Menu, Row } from "antd";
import React from "react";
import { useTranslation } from "react-i18next";
@@ -122,6 +130,28 @@ export default ({
</Link>
</Menu.Item>
</Menu.SubMenu>
<Menu.SubMenu title={t("menus.header.courtesycars")}>
<Menu.Item key="courtesycarsall">
<Link to="/manage/courtesycars">
<CarFilled />
{t("menus.header.courtesycars-all")}
</Link>
</Menu.Item>
<Menu.Item key="contracts">
<Link to="/manage/courtesycars/contracts">
<FileFilled />
{t("menus.header.courtesycars-contracts")}
</Link>
</Menu.Item>
<Menu.Item key="newcontract">
<Link to="/manage/courtesycars/contracts/new">
<FileAddFilled />
{t("menus.header.courtesycars-newcontract")}
</Link>
</Menu.Item>
</Menu.SubMenu>
<Menu.SubMenu title={t("menus.header.shop")}>
<Menu.Item key="shop">
<Link to="/manage/shop">{t("menus.header.shop_config")}</Link>

View File

@@ -0,0 +1,82 @@
import { gql } from "apollo-boost";
export const INSERT_NEW_COURTESY_CAR = gql`
mutation INSERT_NEW_COURTESY_CAR(
$courtesycar: [courtesycars_insert_input!]!
) {
insert_courtesycars(objects: $courtesycar) {
returning {
id
}
}
}
`;
export const QUERY_ALL_CC = gql`
query QUERY_ALL_CC {
courtesycars {
color
created_at
dailycost
damage
fleetnumber
fuel
id
insuranceexpires
leaseenddate
make
model
nextservicedate
nextservicekm
notes
plate
purchasedate
registrationexpires
serviceenddate
servicestartdate
status
vin
year
}
}
`;
export const QUERY_CC_BY_PK = gql`
query QUERY_CC_BY_PK($id: uuid!) {
courtesycars_by_pk(id: $id) {
bodyshopid
color
created_at
dailycost
damage
fleetnumber
fuel
id
insuranceexpires
leaseenddate
make
model
nextservicedate
nextservicekm
notes
plate
purchasedate
registrationexpires
serviceenddate
servicestartdate
status
vin
year
}
}
`;
export const UPDATE_CC = gql`
mutation UPDATE_CC($ccId: uuid!, $cc: courtesycars_set_input!) {
update_courtesycars(where: { id: { _eq: $ccId } }, _set: $cc) {
returning {
id
}
}
}
`;

View File

@@ -1,8 +0,0 @@
export default {
__typename: "State",
currentUser: null,
selectedNavItem: "Home",
recentItems: [],
bodyShopData: null,
language: "en_us"
};

View File

@@ -0,0 +1,6 @@
import React from "react";
import CourtesyCarCreateFormComponent from "../../components/courtesy-car-form/courtesy-car-form.component"
export default function CourtesyCarCreateComponent() {
return <CourtesyCarCreateFormComponent />;
}

View File

@@ -0,0 +1,40 @@
import { useMutation } from "@apollo/react-hooks";
import { Form, notification } from "antd";
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import { INSERT_NEW_COURTESY_CAR } from "../../graphql/courtesy-car.queries";
import { selectBodyshop } from "../../redux/user/user.selectors";
import CourtesyCarCreateComponent from "./courtesy-car-create.page.component";
const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop
});
export function CourtesyCarCreateContainer({ bodyshop }) {
const [form] = Form.useForm();
const [insertCourtesyCar] = useMutation(INSERT_NEW_COURTESY_CAR);
const { t } = useTranslation();
const handleFinish = values => {
insertCourtesyCar({
variables: { courtesycar: { ...values, bodyshopid: bodyshop.id } }
})
.then(response => {
notification["success"]({ message: t("courtesycars.successes.saved") });
})
.catch(error => console.log("error", error));
};
useEffect(() => {
document.title = t("titles.courtesycars-create");
}, [t]);
return (
<Form form={form} autoComplete="no" onFinish={handleFinish}>
<CourtesyCarCreateComponent />
</Form>
);
}
export default connect(mapStateToProps, null)(CourtesyCarCreateContainer);

View File

@@ -0,0 +1,6 @@
import React from "react";
import CourtesyCarCreateFormComponent from "../../components/courtesy-car-form/courtesy-car-form.component";
export default function CourtesyCarDetailPageComponent() {
return <CourtesyCarCreateFormComponent />;
}

View File

@@ -0,0 +1,87 @@
import { useMutation, useQuery } from "@apollo/react-hooks";
import { Form, notification } from "antd";
import moment from "moment";
import React, { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { useParams } from "react-router-dom";
import AlertComponent from "../../components/alert/alert.component";
import { QUERY_CC_BY_PK, UPDATE_CC } from "../../graphql/courtesy-car.queries";
import CourtesyCarDetailPageComponent from "./courtesy-car-detail.page.component";
export default function CourtesyCarDetailPageContainer() {
const { t } = useTranslation();
const [insertCourtesyCar] = useMutation(UPDATE_CC);
const [form] = Form.useForm();
const { ccId } = useParams();
const { loading, error, data } = useQuery(QUERY_CC_BY_PK, {
variables: { id: ccId }
});
useEffect(() => {
document.title = loading
? t("titles.app")
: error
? t("titles.app")
: t("titles.courtesycars-detail", {
id: (data && data.courtesycars_by_pk.vin) || ""
});
}, [t, data, error, loading]);
const handleFinish = values => {
insertCourtesyCar({
variables: { cc: { ...values }, ccId: ccId }
})
.then(response => {
notification["success"]({ message: t("courtesycars.successes.saved") });
})
.catch(error =>
notification["error"]({
message: t("courtesycars.errors.saving", { error: error })
})
);
};
useEffect(() => {
if (data) form.resetFields();
}, [data, form]);
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<Form
form={form}
autoComplete="no"
onFinish={handleFinish}
initialValues={
data
? {
...data.courtesycars_by_pk,
purchasedate: data.courtesycars_by_pk.purchasedate
? moment(data.courtesycars_by_pk.purchasedate)
: null,
servicestartdate: data.courtesycars_by_pk.servicestartdate
? moment(data.courtesycars_by_pk.servicestartdate)
: null,
serviceenddate: data.courtesycars_by_pk.serviceenddate
? moment(data.courtesycars_by_pk.serviceenddate)
: null,
leaseenddate: data.courtesycars_by_pk.leaseenddate
? moment(data.courtesycars_by_pk.leaseenddate)
: null,
nextservicedate: data.courtesycars_by_pk.nextservicedate
? moment(data.courtesycars_by_pk.nextservicedate)
: null,
registrationexpires: data.courtesycars_by_pk.registrationexpires
? moment(data.courtesycars_by_pk.registrationexpires)
: null,
insuranceexpires: data.courtesycars_by_pk.insuranceexpires
? moment(data.courtesycars_by_pk.insuranceexpires)
: null
}
: {}
}
>
<CourtesyCarDetailPageComponent />
</Form>
);
}

View File

@@ -0,0 +1,6 @@
import React from "react";
import CourtesyCarsListComponent from "../../components/courtesy-cars-list/courtesy-cars-list.component";
export default function CourtesyCarsPageComponent({ loading, data }) {
return <CourtesyCarsListComponent loading={loading} courtesycars={data} />;
}

View File

@@ -0,0 +1,17 @@
import React from "react";
import CourtesyCarsPageComponent from "./courtesy-cars.page.component";
import { useQuery } from "@apollo/react-hooks";
import AlertComponent from "../../components/alert/alert.component";
import { QUERY_ALL_CC } from "../../graphql/courtesy-car.queries";
export default function CourtesyCarsPageContainer() {
const { loading, error, data } = useQuery(QUERY_ALL_CC);
if (error) return <AlertComponent message={error.message} type="error" />;
return (
<CourtesyCarsPageComponent
loading={loading}
data={(data && data.courtesycars) || []}
/>
);
}

View File

@@ -35,15 +35,17 @@ function JobsCreateContainer({ bodyshop }) {
useEffect(() => {
if (!!state.owner.selectedid) {
console.log("Loading Selected Owner ID");
loadOwner({
variables: { id: state.owner.selectedid }
});
}
}, [state.owner.selectedid, loadOwner]);
useEffect(() => {
document.title = t("titles.jobs-create");
}, [t]);
const runInsertJob = job => {
console.log("Job To Save", job);
insertJob({ variables: { job: job } })
.then(resp => {
setState({
@@ -63,8 +65,6 @@ function JobsCreateContainer({ bodyshop }) {
};
const handleFinish = values => {
console.log("Form Values", values);
console.log("Progress State", state);
let job = Object.assign(
{},
values,

View File

@@ -43,10 +43,18 @@ const ShopVendorPageContainer = lazy(() =>
const EmailOverlayContainer = lazy(() =>
import("../../components/email-overlay/email-overlay.container.jsx")
);
const JobsCreateContainerPage = lazy(() =>
import("../jobs-create/jobs-create.container")
);
const CourtesyCarCreateContainer = lazy(() =>
import("../courtesy-car-create/courtesy-car-create.page.container")
);
const CourtesyCarDetailContainer = lazy(() =>
import("../courtesy-car-detail/courtesy-car-detail.page.container")
);
const CourtesyCarsPage = lazy(() =>
import("../courtesy-cars/courtesy-cars.page.container")
);
const { Header, Content, Footer } = Layout;
@@ -64,13 +72,15 @@ export default function Manage({ match }) {
</Header>
<Layout>
<Content
className='content-container'
style={{ padding: "0em 4em 4em" }}>
className="content-container"
style={{ padding: "0em 4em 4em" }}
>
<ErrorBoundary>
<Suspense
fallback={
<LoadingSpinner message={t("general.labels.loadingapp")} />
}>
}
>
<EmailOverlayContainer />
<Route exact path={`${match.path}`} component={ManageRootPage} />
<Route exact path={`${match.path}/jobs`} component={JobsPage} />
@@ -86,7 +96,41 @@ export default function Manage({ match }) {
component={JobsDetailPage}
/>
</Switch>
<Route
exact
path={`${match.path}/courtesycars/`}
component={CourtesyCarsPage}
/>
<Switch>
<Route
exact
path={`${match.path}/courtesycars/create`}
component={CourtesyCarCreateContainer}
/>
<Route
exact
path={`${match.path}/courtesycars/contracts`}
component={() => <div>HOLD</div>}
/>
<Route
exact
path={`${match.path}/courtesycars/contracts/new`}
component={() => <div>new cc contract</div>}
/>
<Route
exact
path={`${match.path}/courtesycars/contracts/:contractId`}
component={() => <div>cc contract id</div>}
/>
<Route
exact
path={`${match.path}/courtesycars/:ccId`}
component={CourtesyCarDetailContainer}
/>
</Switch>
<Route
exact
path={`${match.path}/profile`}

View File

@@ -139,6 +139,36 @@
"save": "Bodyshop saved successfully. "
}
},
"courtesycars": {
"erorrs": {
"saving": "Error saving courtesy card. {{error}}"
},
"fields": {
"color": "Color",
"dailycost": "Daily Cost to Rent",
"damage": "Damage",
"fleetnumber": "Fleet Number",
"fuel": "Fuel Level",
"insuranceexpires": "Insurance Expires On",
"leaseenddate": "Lease Ends On",
"make": "Make",
"model": "Model",
"nextservicedate": "Next Service Date",
"nextservicekm": "Next Service KMs",
"notes": "Notes",
"plate": "Plate Number",
"purchasedate": "Purchase Date",
"registrationexpires": "Registration Expires On",
"serviceenddate": "Service End Date",
"servicestartdate": "Service Start Date",
"status": "Status",
"vin": "VIN",
"year": "Year"
},
"successes": {
"saved": "Courtesy Car saved successfully."
}
},
"documents": {
"errors": {
"deletes3": "Error deleting document from storage. ",
@@ -477,6 +507,10 @@
"header": {
"activejobs": "Active Jobs",
"availablejobs": "Available Jobs",
"courtesycars": "Courtesy Cars",
"courtesycars-all": "All Courtesy Cars",
"courtesycars-contracts": "Contracts",
"courtesycars-newcontract": "New Contract",
"customers": "Customers",
"home": "Home",
"jobs": "Jobs",
@@ -596,7 +630,9 @@
},
"titles": {
"app": "Bodyshop by ImEX Systems",
"courtesycars-create": "New Courtesy Car | $t(titles.app)",
"jobs": "All Jobs | $t(titles.app)",
"jobs-create": "Create a New Job | $t(titles.app)",
"jobsavailable": "Available Jobs | $t(titles.app)",
"jobsdetail": "Job {{ro_number}} | $t(titles.app)",
"jobsdocuments": "Job Documents {{ro_number}} | $t(titles.app)",

View File

@@ -139,6 +139,36 @@
"save": ""
}
},
"courtesycars": {
"erorrs": {
"saving": ""
},
"fields": {
"color": "",
"dailycost": "",
"damage": "",
"fleetnumber": "",
"fuel": "",
"insuranceexpires": "",
"leaseenddate": "",
"make": "",
"model": "",
"nextservicedate": "",
"nextservicekm": "",
"notes": "",
"plate": "",
"purchasedate": "",
"registrationexpires": "",
"serviceenddate": "",
"servicestartdate": "",
"status": "",
"vin": "",
"year": ""
},
"successes": {
"saved": ""
}
},
"documents": {
"errors": {
"deletes3": "Error al eliminar el documento del almacenamiento.",
@@ -477,6 +507,10 @@
"header": {
"activejobs": "Empleos activos",
"availablejobs": "Trabajos disponibles",
"courtesycars": "",
"courtesycars-all": "",
"courtesycars-contracts": "",
"courtesycars-newcontract": "",
"customers": "Clientes",
"home": "Casa",
"jobs": "Trabajos",
@@ -596,7 +630,9 @@
},
"titles": {
"app": "Carrocería de ImEX Systems",
"courtesycars-create": "",
"jobs": "Todos los trabajos | $t(titles.app)",
"jobs-create": "",
"jobsavailable": "Empleos disponibles | $t(titles.app)",
"jobsdetail": "Trabajo {{ro_number}} | $t(titles.app)",
"jobsdocuments": "Documentos de trabajo {{ro_number}} | $ t (títulos.app)",

View File

@@ -139,6 +139,36 @@
"save": ""
}
},
"courtesycars": {
"erorrs": {
"saving": ""
},
"fields": {
"color": "",
"dailycost": "",
"damage": "",
"fleetnumber": "",
"fuel": "",
"insuranceexpires": "",
"leaseenddate": "",
"make": "",
"model": "",
"nextservicedate": "",
"nextservicekm": "",
"notes": "",
"plate": "",
"purchasedate": "",
"registrationexpires": "",
"serviceenddate": "",
"servicestartdate": "",
"status": "",
"vin": "",
"year": ""
},
"successes": {
"saved": ""
}
},
"documents": {
"errors": {
"deletes3": "Erreur lors de la suppression du document du stockage.",
@@ -477,6 +507,10 @@
"header": {
"activejobs": "Emplois actifs",
"availablejobs": "Emplois disponibles",
"courtesycars": "",
"courtesycars-all": "",
"courtesycars-contracts": "",
"courtesycars-newcontract": "",
"customers": "Les clients",
"home": "Accueil",
"jobs": "Emplois",
@@ -596,7 +630,9 @@
},
"titles": {
"app": "Carrosserie par ImEX Systems",
"courtesycars-create": "",
"jobs": "Tous les emplois | $t(titles.app)",
"jobs-create": "",
"jobsavailable": "Emplois disponibles | $t(titles.app)",
"jobsdetail": "Travail {{ro_number}} | $t(titles.app)",
"jobsdocuments": "Documents de travail {{ro_number}} | $ t (titres.app)",

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: alter table "public"."courtesycars" rename column "nextservicekm" to "NextServiceKm";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: alter table "public"."courtesycars" rename column "NextServiceKm" to "nextservicekm";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: alter table "public"."courtesycars" rename column "damage" to "Damage";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: alter table "public"."courtesycars" rename column "Damage" to "damage";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: alter table "public"."courtesycars" rename column "notes" to "Notes";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: alter table "public"."courtesycars" rename column "Notes" to "notes";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: alter table "public"."courtesycars" rename column "nextservicedate" to "NextServiceDate";
type: run_sql

View File

@@ -0,0 +1,5 @@
- args:
cascade: false
read_only: false
sql: alter table "public"."courtesycars" rename column "NextServiceDate" to "nextservicedate";
type: run_sql