Added find owner modal and basic searching logic.

This commit is contained in:
Patrick Fic
2020-01-29 12:00:50 -08:00
parent 7d6969b186
commit d7e195ff7f
21 changed files with 711 additions and 34 deletions

View File

@@ -3361,6 +3361,168 @@
</folder_node>
</children>
</folder_node>
<folder_node>
<name>owners</name>
<children>
<folder_node>
<name>fields</name>
<children>
<concept_node>
<name>ownr_addr1</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>ownr_city</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>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>ownr_fn</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>ownr_ln</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>ownr_ph1</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>labels</name>
<children>
<concept_node>
<name>existing_owners</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>profile</name>
<children>

View File

@@ -1,8 +1,8 @@
import { Input, Table, Button, Icon, notification, Modal } from "antd";
import { Button, Icon, Input, notification, Table } from "antd";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
import { alphaSort } from "../../utils/sorters";
import { DateTimeFormatter } from "../../utils/DateFormatter";
import { alphaSort } from "../../utils/sorters";
import OwnerFindModalContainer from "../owner-find-modal/owner-find-modal.container";
export default function JobsAvailableComponent({
loading,
@@ -10,9 +10,12 @@ export default function JobsAvailableComponent({
refetch,
deleteJob,
deleteAllNewJobs,
insertNewJob,
setJobId,
estDataLazyLoad
estDataLazyLoad,
onModalOk,
onModalCancel,
modalVisible,
setModalVisible,
selectedOwner, setSelectedOwner
}) {
const { t } = useTranslation();
const [loadEstData, estData] = estDataLazyLoad;
@@ -22,7 +25,7 @@ export default function JobsAvailableComponent({
filteredInfo: { text: "" }
});
const [modalVisible, setModalVisible] = useState(false);
const handleTableChange = (pagination, filters, sorter) => {
setState({ ...state, filteredInfo: filters, sortedInfo: sorter });
@@ -121,8 +124,6 @@ export default function JobsAvailableComponent({
</Button>
<Button
onClick={() => {
console.log("record.id", record.id);
loadEstData({ variables: { id: record.id } });
setModalVisible(true);
}}
@@ -136,8 +137,6 @@ export default function JobsAvailableComponent({
}
];
console.log("estData", estData);
const owner =
estData.data &&
estData.data.available_jobs_by_pk &&
@@ -146,27 +145,18 @@ export default function JobsAvailableComponent({
estData.data.available_jobs_by_pk.est_data.owner.data
? estData.data.available_jobs_by_pk.est_data.owner.data
: null;
return (
<div>
<OwnerFindModalContainer
loading={estData.loading}
error={estData.error}
owner={owner}
selectedOwner={selectedOwner}
setSelectedOwner={setSelectedOwner}
visible={modalVisible}
onOk={() => {
setModalVisible(false);
// insertNewJob({
// variables: {
// job: record.est_data
// }
// }).then(r => {
// notification["success"]({
// message: t("jobs.successes.created")
// });
// refetch();
// });
}}
onCancel={() => setModalVisible(false)}
onOk={onModalOk}
onCancel={onModalCancel}
/>
<Table

View File

@@ -1,4 +1,4 @@
import React from "react";
import React, { useState } from "react";
import { useMutation, useQuery } from "react-apollo";
import {
DELETE_ALL_AVAILABLE_NEW_JOBS,
@@ -13,9 +13,28 @@ export default function JobsAvailableContainer({ deleteJob, estDataLazyLoad }) {
fetchPolicy: "network-only"
});
const [modalVisible, setModalVisible] = useState(false);
const [selectedOwner, setSelectedOwner] = useState(null);
const [deleteAllNewJobs] = useMutation(DELETE_ALL_AVAILABLE_NEW_JOBS);
const [insertNewJob] = useMutation(INSERT_NEW_JOB);
const onModalOk = () => {
setModalVisible(false);
console.log("selectedOwner", selectedOwner);
// insertNewJob({
// variables: {
// job: record.est_data
// }
// }).then(r => {
// notification["success"]({
// message: t("jobs.successes.created")
// });
// refetch();
// });
};
const onModalCancel = () => setModalVisible(false);
if (error) return <AlertComponent type="error" message={error.message} />;
return (
<JobsAvailableComponent
@@ -26,6 +45,12 @@ export default function JobsAvailableContainer({ deleteJob, estDataLazyLoad }) {
deleteAllNewJobs={deleteAllNewJobs}
insertNewJob={insertNewJob}
estDataLazyLoad={estDataLazyLoad}
onModalCancel={onModalCancel}
onModalOk={onModalOk}
modalVisible={modalVisible}
setModalVisible={setModalVisible}
selectedOwner={selectedOwner}
setSelectedOwner={setSelectedOwner}
/>
);
}

View File

@@ -1,4 +1,124 @@
import { Table, Checkbox, Divider } from "antd";
import React from "react";
export default function OwnerFindModalComponent() {
return <div>Modal Componnentasdasd</div>;
import { useTranslation } from "react-i18next";
import PhoneFormatter from "../../utils/PhoneFormatter";
export default function OwnerFindModalComponent({
selectedOwner,
setSelectedOwner,
ownersListLoading,
ownersList
}) {
//setSelectedOwner is used to set the record id of the owner to use for adding the job.
const { t } = useTranslation();
const columns = [
{
title: t("owners.fields.ownr_ln"),
dataIndex: "ownr_ln",
key: "ownr_ln"
//width: "8%",
// onFilter: (value, record) => record.ro_number.includes(value),
// // filteredValue: state.filteredInfo.text || null,
// sorter: (a, b) => alphaSort(a, b),
// sortOrder:
// state.sortedInfo.columnKey === "cieca_id" && state.sortedInfo.order
},
{
title: t("owners.fields.ownr_fn"),
dataIndex: "ownr_fn",
key: "ownr_fn"
// ellipsis: true,
// sorter: (a, b) => alphaSort(a.ownr_ln, b.ownr_ln),
// //width: "25%",
// sortOrder:
// state.sortedInfo.columnKey === "ownr_name" && state.sortedInfo.order
},
{
title: t("owners.fields.ownr_addr1"),
dataIndex: "ownr_addr1",
key: "ownr_addr1"
// sorter: (a, b) => alphaSort(a.vehicle_info, b.vehicle_info),
// sortOrder:
// state.sortedInfo.columnKey === "vehicle_info" && state.sortedInfo.order
//ellipsis: true
},
{
title: t("owners.fields.ownr_city"),
dataIndex: "ownr_city",
key: "ownr_city"
// sorter: (a, b) => alphaSort(a.clm_no, b.clm_no),
// sortOrder:
// state.sortedInfo.columnKey === "clm_no" && state.sortedInfo.order
//width: "12%",
//ellipsis: true
},
{
title: t("owners.fields.ownr_ea"),
dataIndex: "ownr_ea",
key: "ownr_ea"
// sorter: (a, b) => a.clm_amt - b.clm_amt,
// sortOrder:
// state.sortedInfo.columnKey === "clm_amt" && state.sortedInfo.order
//width: "12%",
//ellipsis: true
},
{
title: t("owners.fields.ownr_ph1"),
dataIndex: "ownr_ph1",
key: "ownr_ph1",
render: (text, record) => (
<PhoneFormatter>{record.ownr_ph1}</PhoneFormatter>
)
// sorter: (a, b) => alphaSort(a.uploaded_by, b.uploaded_by),
// sortOrder:
// state.sortedInfo.columnKey === "uploaded_by" && state.sortedInfo.order
//width: "12%",
//ellipsis: true
}
];
const handleOnRowClick = record => {
if (record) {
if (record.id) {
setSelectedOwner(record.id);
return;
}
}
setSelectedOwner(null);
};
return (
<div>
<Table
title={() => t("owners.labels.existing_owners")}
size="small"
pagination={{ position: "bottom" }}
columns={columns.map(item => ({ ...item }))}
rowKey="id"
loading={ownersListLoading}
dataSource={ownersList}
//onChange={handleTableChange}
rowSelection={{ selectedRowKeys: [selectedOwner] }}
onRow={(record, rowIndex) => {
return {
onClick: event => {
handleOnRowClick(record);
}, // click row
onDoubleClick: event => {}, // double click row
onContextMenu: event => {}, // right button click row
onMouseEnter: event => {}, // mouse enter row
onMouseLeave: event => {} // mouse leave row
};
}}
/>
<Divider />
<Checkbox
checked={selectedOwner ? false : true}
onClick={() => setSelectedOwner(null)}
>
Create a new Owner record for this job.
</Checkbox>
</div>
);
}

View File

@@ -1,23 +1,53 @@
import React from "react";
import { Modal } from "antd";
import OwnerFindModalComponent from "./owner-find-modal.component";
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
import React from "react";
import AlertComponent from "../alert/alert.component";
import { json } from "body-parser";
import LoadingSpinner from "../loading-spinner/loading-spinner.component";
import OwnerFindModalComponent from "./owner-find-modal.component";
import { useQuery } from "react-apollo";
import { QUERY_SEARCH_OWNER_BY_IDX } from "../../graphql/owners.queries";
import { useTranslation } from "react-i18next";
export default function OwnerFindModalContainer({
loading,
error,
owner,
selectedOwner,
setSelectedOwner,
...modalProps
}) {
//use owner object to run query and find what possible owners there are.
const { t } = useTranslation();
const ownersList = useQuery(QUERY_SEARCH_OWNER_BY_IDX, {
variables: {
search: owner
? `${owner.ownr_fn} ${owner.ownr_ln} ${owner.ownr_addr1} ${owner.ownr_city} ${owner.ownr_zip} ${owner.ownr_ea} ${owner.ownr_ph1} ${owner.ownr_ph2}`
: null
},
skip: !owner,
fetchPolicy: "network-only"
});
return (
<Modal {...modalProps}>
<Modal
title={t("owners.labels.existing_owners")}
width={"80%"}
{...modalProps}
>
{loading ? <LoadingSpinner /> : null}
{error ? <AlertComponent message={error.message} type="error" /> : null}
{owner ? <OwnerFindModalComponent /> : null}
{owner ? JSON.stringify(owner) : null}
{owner ? (
<OwnerFindModalComponent
selectedOwner={selectedOwner}
setSelectedOwner={setSelectedOwner}
ownersListLoading={ownersList.loading}
ownersList={
ownersList.data && ownersList.data.search_owners
? ownersList.data.search_owners
: null
}
/>
) : null}
</Modal>
);
}

View File

@@ -0,0 +1,20 @@
import { gql } from "apollo-boost";
export const QUERY_SEARCH_OWNER_BY_IDX = gql`
query QUERY_SEARCH_OWNER_BY_IDX($search: String!) {
search_owners(args: { search: $search }) {
ownr_fn
ownr_ln
ownr_ph1
ownr_ph2
ownr_addr1
ownr_addr2
ownr_city
ownr_ctry
ownr_ea
ownr_st
ownr_zip
id
}
}
`;

View File

@@ -205,6 +205,19 @@
"updated": "Note updated successfully."
}
},
"owners": {
"fields": {
"ownr_addr1": "Address",
"ownr_city": "City",
"ownr_ea": "Email",
"ownr_fn": "First Name",
"ownr_ln": "Last Name",
"ownr_ph1": "Phone 1"
},
"labels": {
"existing_owners": "Existing Owners"
}
},
"profile": {
"errors": {
"state": "Error reading page state. Please refresh."

View File

@@ -205,6 +205,19 @@
"updated": "Nota actualizada con éxito."
}
},
"owners": {
"fields": {
"ownr_addr1": "Dirección",
"ownr_city": "ciudad",
"ownr_ea": "Email",
"ownr_fn": "Nombre de pila",
"ownr_ln": "Apellido",
"ownr_ph1": ""
},
"labels": {
"existing_owners": "Propietarios existentes"
}
},
"profile": {
"errors": {
"state": "Error al leer el estado de la página. Porfavor refresca."

View File

@@ -205,6 +205,19 @@
"updated": "Remarque mise à jour avec succès."
}
},
"owners": {
"fields": {
"ownr_addr1": "Adresse",
"ownr_city": "Ville",
"ownr_ea": "Email",
"ownr_fn": "Prénom",
"ownr_ln": "Nom de famille",
"ownr_ph1": ""
},
"labels": {
"existing_owners": "Propriétaires existants"
}
},
"profile": {
"errors": {
"state": "Erreur lors de la lecture de l'état de la page. Rafraichissez, s'il vous plait."

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,6 @@
- args:
cascade: true
sql: "\r\nCREATE INDEX owner_gin_idx ON owners\r\nUSING GIN ((ownr_fn || ' '
|| ownr_ln || ' ' || ownr_addr1 || ' ' || ownr_city || ' ' || ownr_zip ||
' ' || ownr_ea || ' ' || ownr_ph1 || ' ' || ownr_ph2 ) gin_trgm_ops);\r\n"
type: run_sql

View File

@@ -0,0 +1 @@
[]

View File

@@ -0,0 +1,14 @@
- args:
cascade: true
sql: "CREATE FUNCTION search_owners(search text)\r\nRETURNS SETOF owners AS $$\r\n
\ SELECT *\r\n FROM owners\r\n WHERE\r\n search <% (ownr_fn ||
' ' || ownr_ln || ' ' || ownr_addr1 || ' ' || ownr_city || ' ' || ownr_zip
\ || ' ' || ownr_ea || ' ' || ownr_ph1 || ' ' || ownr_ph2)\r\n ORDER BY\r\n
\ similarity(search, (ownr_fn || ' ' || ownr_ln || ' ' || ownr_addr1 ||
' ' || ownr_city || ' ' || ownr_zip || ' ' || ownr_ea || ' ' || ownr_ph1 ||
' ' || ownr_ph2)) DESC\r\n LIMIT 20;\r\n$$ LANGUAGE sql STABLE;"
type: run_sql
- args:
name: search_owners
schema: public
type: track_function

View File

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

View File

@@ -0,0 +1,3 @@
- args:
sql: ALTER TABLE "public"."owners" ADD COLUMN "ownr_co_nm" text NULL;
type: run_sql

View File

@@ -0,0 +1,44 @@
- args:
role: user
table:
name: owners
schema: public
type: drop_insert_permission
- args:
permission:
check:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- id
- created_at
- updated_at
- ownr_fn
- ownr_ln
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_st
- ownr_zip
- ownr_ctry
- ownr_ea
- ownr_ph1
- preferred_contact
- allow_text_message
- shopid
- ownr_ph2
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: owners
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,45 @@
- args:
role: user
table:
name: owners
schema: public
type: drop_insert_permission
- args:
permission:
check:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
columns:
- id
- created_at
- updated_at
- ownr_fn
- ownr_ln
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_st
- ownr_zip
- ownr_ctry
- ownr_ea
- ownr_ph1
- preferred_contact
- allow_text_message
- shopid
- ownr_ph2
- ownr_co_nm
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: owners
schema: public
type: create_insert_permission

View File

@@ -0,0 +1,42 @@
- args:
role: user
table:
name: owners
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- allow_text_message
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_ctry
- ownr_ea
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph2
- ownr_st
- ownr_zip
- preferred_contact
- created_at
- updated_at
- id
- shopid
computed_fields: []
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: owners
schema: public
type: create_select_permission

View File

@@ -0,0 +1,43 @@
- args:
role: user
table:
name: owners
schema: public
type: drop_select_permission
- args:
permission:
allow_aggregations: false
columns:
- allow_text_message
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph2
- ownr_st
- ownr_zip
- preferred_contact
- created_at
- updated_at
- id
- shopid
computed_fields: []
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
role: user
table:
name: owners
schema: public
type: create_select_permission

View File

@@ -0,0 +1,44 @@
- args:
role: user
table:
name: owners
schema: public
type: drop_update_permission
- args:
permission:
columns:
- allow_text_message
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_ctry
- ownr_ea
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph2
- ownr_st
- ownr_zip
- preferred_contact
- created_at
- updated_at
- id
- shopid
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: owners
schema: public
type: create_update_permission

View File

@@ -0,0 +1,45 @@
- args:
role: user
table:
name: owners
schema: public
type: drop_update_permission
- args:
permission:
columns:
- allow_text_message
- ownr_addr1
- ownr_addr2
- ownr_city
- ownr_co_nm
- ownr_ctry
- ownr_ea
- ownr_fn
- ownr_ln
- ownr_ph1
- ownr_ph2
- ownr_st
- ownr_zip
- preferred_contact
- created_at
- updated_at
- id
- shopid
filter:
bodyshop:
associations:
_and:
- user:
authid:
_eq: X-Hasura-User-Id
- active:
_eq: true
localPresets:
- key: ""
value: ""
set: {}
role: user
table:
name: owners
schema: public
type: create_update_permission