Added job card functionality + new fields.

This commit is contained in:
Patrick Fic
2020-01-23 12:12:04 -08:00
parent f626966223
commit d1323bed7f
20 changed files with 390 additions and 86 deletions

View File

@@ -374,6 +374,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>convert</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>postInvoices</name>
<definition_loaded>false</definition_loaded>
@@ -720,6 +741,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>ownr_ea</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>phone1</name>
<definition_loaded>false</definition_loaded>
@@ -741,6 +783,27 @@
</translation>
</translations>
</concept_node>
<concept_node>
<name>phoneshort</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>ro_number</name>
<definition_loaded>false</definition_loaded>
@@ -1066,27 +1129,6 @@
</concept_node>
</children>
</folder_node>
<concept_node>
<name>convert</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>documents</name>
<definition_loaded>false</definition_loaded>

View File

@@ -13,16 +13,23 @@ export default function JobDetailCardsCustomerComponent({ loading, data }) {
extraLink={data?.owner ? `/manage/owners/${data?.owner?.id}` : null}>
{data ? (
<span>
<div>{`${data?.ownr_fn ??
""} ${data.ownr_ln ?? ""}`}</div>
<div>{`${data?.ownr_fn ?? ""} ${data.ownr_ln ?? ""}`}</div>
<div>
<PhoneFormatter>{`${data?.ownr_ph1 ?? ""}`}</PhoneFormatter>
{t("jobs.fields.phoneshort")}:
<PhoneFormatter>{`${data?.ownr_ph1 ??
t("general.labels.na")}`}</PhoneFormatter>
</div>
<div>
{t("jobs.fields.ownr_ea")}:
{data?.ownr_ea ? (
<a href={`mailto:${data.ownr_ea}`}>
<span>{`${data?.ownr_ea ?? ""}`}</span>
</a>
) : (
t("general.labels.na")
)}
</div>
{data?.ownr_ea ? (
<a href={`mailto:${data.ownr_ea}`}>
<div>{`${data?.ownr_ea ?? ""}`}</div>
</a>
) : null}
<div>{`${data?.owner?.preferred_contact ?? ""}`}</div>
</span>

View File

@@ -1,16 +1,32 @@
import React from "react";
import { useTranslation } from "react-i18next";
import CardTemplate from "./job-detail-cards.template.component";
import { Carousel } from "antd";
import "./job-detail-cards.styles.scss";
export default function JobDetailCardsDocumentsComponent({ loading, data }) {
const { t } = useTranslation();
if (!data)
return (
<CardTemplate loading={loading} title={t("jobs.labels.cards.documents")}>
null
</CardTemplate>
);
return (
<CardTemplate loading={loading} title={t("jobs.labels.cards.documents")}>
{data ? (
<span>
Documents stuff here.
</span>
<CardTemplate
loading={loading}
title={t("jobs.labels.cards.documents")}
extraLink={`/manage/jobs/${data.id}#documents`}>
{data.documents ? (
<Carousel autoplay>
{data.documents.map(item => (
<div key={item.id}>
<img src={item.thumb_url} />
</div>
))}
</Carousel>
) : null}
</CardTemplate>
);

View File

@@ -0,0 +1,11 @@
.ant-carousel .slick-slide {
text-align: center;
height: 160px;
line-height: 160px;
background: #364d79;
overflow: hidden;
}
.ant-carousel .slick-slide h3 {
color: #fff;
}

View File

@@ -124,7 +124,7 @@ function JobTombstone({ job, ...otherProps }) {
});
});
}}>
{t("jobs.labels.convert")}
{t("jobs.actions.convert")}
</Button>,
<Button type='primary' key='submit' htmlType='submit'>
{t("general.labels.save")}

View File

@@ -168,14 +168,6 @@ function JobsDocumentsComponent({ shopId, jobId, loading, data }) {
return (
<div className='clearfix'>
<Button
onClick={() => {
console.log("btn click");
console.log("data", data);
}}>
Test Request
</Button>
<img src={url} alt='test' />
<Upload.Dragger
customRequest={handleUpload}
accept='.pdf,.jpg,.jpeg'

View File

@@ -4,7 +4,7 @@ import { QUERY_SHOP_ID } from "../../graphql/bodyshop.queries";
import { GET_DOCUMENTS_BY_JOB } from "../../graphql/documents.queries";
import AlertComponent from "../alert/alert.component";
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
import JobDocuments from "./jobs-documents.page";
import JobDocuments from "./jobs-documents.component";
export default function JobsDocumentsContainer({ jobId }) {
const { loading, error, data } = useQuery(GET_DOCUMENTS_BY_JOB, {

View File

@@ -5,10 +5,10 @@ import { auth } from "../firebase/firebase.utils";
const errorLink = onError(
({ graphQLErrors, networkError, operation, forward }) => {
let access_token = window.localStorage.getItem("token");
console.log("graphQLErrors", graphQLErrors);
console.log("networkError", networkError);
console.log("operation", operation);
console.log("forward", forward);
// console.log("graphQLErrors", graphQLErrors);
// console.log("networkError", networkError);
// console.log("operation", operation);
// console.log("forward", forward);
let expired = false;
@@ -29,40 +29,45 @@ const errorLink = onError(
if (access_token && access_token !== "undefined") {
// Let's refresh token through async request
return new Observable(observer => {
auth.currentUser
.getIdToken(true)
.then(function(idToken) {
if (!idToken) {
window.localStorage.removeItem("token");
return console.log("Refresh token has expired");
}
console.log("Got a new token", idToken);
window.localStorage.setItem("token", idToken);
const unsubscribeFromAuth = auth.onAuthStateChanged(async user => {
console.log("Auth change in error handling.");
if (user) {
user
.getIdToken(true)
.then(function(idToken) {
if (!idToken) {
window.localStorage.removeItem("token");
return console.log("Refresh token has expired");
}
console.log("Got a new token", idToken);
window.localStorage.setItem("token", idToken);
// reset the headers
operation.setContext(({ headers = {} }) => ({
headers: {
// Re-add old headers
...headers,
// Switch out old access token for new one
authorization: idToken ? `Bearer ${idToken}` : ""
}
}));
// reset the headers
operation.setContext(({ headers = {} }) => ({
headers: {
// Re-add old headers
...headers,
// Switch out old access token for new one
authorization: idToken ? `Bearer ${idToken}` : ""
}
}));
const subscriber = {
next: observer.next.bind(observer),
error: observer.error.bind(observer),
complete: observer.complete.bind(observer)
};
console.log("About to resend the request.");
// Retry last failed request
forward(operation).subscribe(subscriber);
})
.catch(error => {
// No refresh or client token available, we force user to login
console.log("Hit an error.");
observer.error(error);
});
const subscriber = {
next: observer.next.bind(observer),
error: observer.error.bind(observer),
complete: observer.complete.bind(observer)
};
console.log("About to resend the request.");
// Retry last failed request
forward(operation).subscribe(subscriber);
})
.catch(error => {
// No refresh or client token available, we force user to login
console.log("Hit an error.");
observer.error(error);
});
}
});
});
}
}

View File

@@ -246,6 +246,10 @@ export const QUERY_JOB_CARD_DETAILS = gql`
updated_at
claim_total
ded_amt
documents(limit: 3, order_by: { created_at: desc }) {
id
thumb_url
}
vehicle {
id
plate_no

View File

@@ -31,6 +31,7 @@
"actions": {
"addDocuments": "Add Job Documents",
"addNote": "Add Note",
"convert": "Convert",
"postInvoices": "Post Invoices",
"printCenter": "Print Center"
},
@@ -51,7 +52,9 @@
"est_number": "Estimate Number",
"owner": "Owner",
"owner_owing": "Cust. Owes",
"ownr_ea": "Email",
"phone1": "Phone 1",
"phoneshort": "PH",
"ro_number": "RO #",
"status": "Job Status",
"vehicle": "Vehicle"
@@ -62,7 +65,7 @@
"customer": "Customer Information",
"damage": "Area of Damage",
"dates": "Dates",
"documents": "Documents",
"documents": "Recent Documents",
"estimator": "Estimator",
"filehandler": "File Handler",
"insurance": "Insurance Details",
@@ -71,7 +74,6 @@
"totals": "Totals",
"vehicle": "Vehicle"
},
"convert": "Convert",
"documents": "Documents",
"lines": "Estimate Lines",
"notes": "Notes",

View File

@@ -31,6 +31,7 @@
"actions": {
"addDocuments": "Agregar documentos de trabajo",
"addNote": "Añadir la nota",
"convert": "Convertir",
"postInvoices": "Contabilizar facturas",
"printCenter": "Centro de impresión"
},
@@ -51,7 +52,9 @@
"est_number": "Numero Estimado",
"owner": "Propietario",
"owner_owing": "Cust. Debe",
"ownr_ea": "Email",
"phone1": "Teléfono 1",
"phoneshort": "PH",
"ro_number": "RO #",
"status": "Estado del trabajo",
"vehicle": "Vehículo"
@@ -62,7 +65,7 @@
"customer": "Información al cliente",
"damage": "Área de Daño",
"dates": "fechas",
"documents": "documentos",
"documents": "Documentos recientes",
"estimator": "Estimador",
"filehandler": "File Handler",
"insurance": "detalles del seguro",
@@ -71,7 +74,6 @@
"totals": "Totales",
"vehicle": "Vehículo"
},
"convert": "Convertir",
"documents": "documentos",
"lines": "Líneas estimadas",
"notes": "Notas",

View File

@@ -31,6 +31,7 @@
"actions": {
"addDocuments": "Ajouter des documents de travail",
"addNote": "Ajouter une note",
"convert": "Convertir",
"postInvoices": "Poster des factures",
"printCenter": "Centre d'impression"
},
@@ -51,7 +52,9 @@
"est_number": "Numéro d'estimation",
"owner": "Propriétaire",
"owner_owing": "Cust. Owes",
"ownr_ea": "Email",
"phone1": "Téléphone 1",
"phoneshort": "PH",
"ro_number": "RO #",
"status": "Statut de l'emploi",
"vehicle": "Véhicule"
@@ -62,7 +65,7 @@
"customer": "Informations client",
"damage": "Zone de dommages",
"dates": "Rendez-vous",
"documents": "Les documents",
"documents": "Documents récents",
"estimator": "Estimateur",
"filehandler": "Gestionnaire de fichiers",
"insurance": "Détails de l'assurance",
@@ -71,7 +74,6 @@
"totals": "Totaux",
"vehicle": "Véhicule"
},
"convert": "Convertir",
"documents": "Les documents",
"lines": "Estimer les lignes",
"notes": "Remarques",

View File

@@ -0,0 +1,3 @@
- args:
sql: ALTER TABLE "public"."documents" DROP COLUMN "key";
type: run_sql

View File

@@ -0,0 +1,3 @@
- args:
sql: ALTER TABLE "public"."documents" ADD COLUMN "key" text NOT NULL DEFAULT '0';
type: run_sql

View File

@@ -0,0 +1,36 @@
- args:
role: user
table:
name: documents
schema: public
type: drop_insert_permission
- args:
permission:
check:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- name
- thumb_url
- uploaded_by
- url
- created_at
- updated_at
- id
- jobid
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: documents
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,37 @@
- args:
role: user
table:
name: documents
schema: public
type: drop_insert_permission
- args:
permission:
check:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- created_at
- id
- jobid
- key
- name
- thumb_url
- updated_at
- uploaded_by
- url
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: documents
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,34 @@
- args:
role: user
table:
name: documents
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- name
- thumb_url
- uploaded_by
- url
- created_at
- updated_at
- id
- jobid
computed_fields: []
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: documents
schema: public
type: create_select_permission

View File

@@ -0,0 +1,35 @@
- args:
role: user
table:
name: documents
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- created_at
- id
- jobid
- key
- name
- thumb_url
- updated_at
- uploaded_by
- url
computed_fields: []
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: documents
schema: public
type: create_select_permission

View File

@@ -0,0 +1,36 @@
- args:
role: user
table:
name: documents
schema: public
type: drop_update_permission
- args:
permission:
columns:
- name
- thumb_url
- uploaded_by
- url
- created_at
- updated_at
- id
- jobid
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: documents
schema: public
type: create_update_permission

View File

@@ -0,0 +1,37 @@
- args:
role: user
table:
name: documents
schema: public
type: drop_update_permission
- args:
permission:
columns:
- created_at
- id
- jobid
- key
- name
- thumb_url
- updated_at
- uploaded_by
- url
filter:
job:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: documents
schema: public
type: create_update_permission