Fixed searching on all jobs page BOD-81
This commit is contained in:
@@ -9,14 +9,8 @@ import PhoneFormatter from "../../utils/PhoneFormatter";
|
|||||||
import { alphaSort } from "../../utils/sorters";
|
import { alphaSort } from "../../utils/sorters";
|
||||||
import StartChatButton from "../chat-open-button/chat-open-button.component";
|
import StartChatButton from "../chat-open-button/chat-open-button.component";
|
||||||
import { useHistory } from "react-router-dom";
|
import { useHistory } from "react-router-dom";
|
||||||
export default function JobsList({
|
|
||||||
searchTextState,
|
|
||||||
|
|
||||||
refetch,
|
export default function JobsList({ refetch, loading, jobs, total }) {
|
||||||
loading,
|
|
||||||
jobs,
|
|
||||||
total,
|
|
||||||
}) {
|
|
||||||
const search = queryString.parse(useLocation().search);
|
const search = queryString.parse(useLocation().search);
|
||||||
const { page, sortcolumn, sortorder } = search;
|
const { page, sortcolumn, sortorder } = search;
|
||||||
const history = useHistory();
|
const history = useHistory();
|
||||||
@@ -26,8 +20,6 @@ export default function JobsList({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const setSearchText = searchTextState[1];
|
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
title: t("jobs.fields.ro_number"),
|
title: t("jobs.fields.ro_number"),
|
||||||
@@ -195,8 +187,9 @@ export default function JobsList({
|
|||||||
</Button>
|
</Button>
|
||||||
<Input.Search
|
<Input.Search
|
||||||
placeholder={t("general.labels.search")}
|
placeholder={t("general.labels.search")}
|
||||||
onChange={(e) => {
|
onSearch={(value) => {
|
||||||
setSearchText(e.target.value);
|
search.search = value;
|
||||||
|
history.push({ search: queryString.stringify(search) });
|
||||||
}}
|
}}
|
||||||
enterButton
|
enterButton
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -694,20 +694,21 @@ export const QUERY_ALL_JOB_FIELDS = gql`
|
|||||||
|
|
||||||
export const QUERY_ALL_JOBS_PAGINATED = gql`
|
export const QUERY_ALL_JOBS_PAGINATED = gql`
|
||||||
query QUERY_ALL_JOBS_PAGINATED(
|
query QUERY_ALL_JOBS_PAGINATED(
|
||||||
|
$search: String
|
||||||
$offset: Int
|
$offset: Int
|
||||||
$limit: Int
|
$limit: Int
|
||||||
$order: [jobs_order_by!]!
|
$order: [jobs_order_by!]!
|
||||||
) {
|
) {
|
||||||
jobs(offset: $offset, limit: $limit, order_by: $order) {
|
search_jobs(
|
||||||
|
args: { search: $search }
|
||||||
|
offset: $offset
|
||||||
|
limit: $limit
|
||||||
|
order_by: $order
|
||||||
|
) {
|
||||||
ownr_fn
|
ownr_fn
|
||||||
ownr_ln
|
ownr_ln
|
||||||
ownr_ph1
|
ownr_ph1
|
||||||
ownr_ea
|
ownr_ea
|
||||||
owner {
|
|
||||||
id
|
|
||||||
allow_text_message
|
|
||||||
preferred_contact
|
|
||||||
}
|
|
||||||
plate_no
|
plate_no
|
||||||
plate_st
|
plate_st
|
||||||
v_vin
|
v_vin
|
||||||
@@ -743,7 +744,7 @@ export const QUERY_ALL_JOBS_PAGINATED = gql`
|
|||||||
ded_amt
|
ded_amt
|
||||||
vehicleid
|
vehicleid
|
||||||
}
|
}
|
||||||
jobs_aggregate {
|
search_jobs_aggregate(args: { search: $search }) {
|
||||||
aggregate {
|
aggregate {
|
||||||
count(distinct: true)
|
count(distinct: true)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,11 +20,12 @@ const mapDispatchToProps = (dispatch) => ({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export function AllJobs({ bodyshop, setBreadcrumbs }) {
|
export function AllJobs({ bodyshop, setBreadcrumbs }) {
|
||||||
const search = queryString.parse(useLocation().search);
|
const searchParams = queryString.parse(useLocation().search);
|
||||||
const { page, sortcolumn, sortorder } = search;
|
const { page, sortcolumn, sortorder, search } = searchParams;
|
||||||
|
|
||||||
const { loading, error, data, refetch } = useQuery(QUERY_ALL_JOBS_PAGINATED, {
|
const { loading, error, data, refetch } = useQuery(QUERY_ALL_JOBS_PAGINATED, {
|
||||||
variables: {
|
variables: {
|
||||||
|
search: search || "",
|
||||||
offset: page ? (page - 1) * 25 : 0,
|
offset: page ? (page - 1) * 25 : 0,
|
||||||
limit: 25,
|
limit: 25,
|
||||||
order: [
|
order: [
|
||||||
@@ -45,48 +46,15 @@ export function AllJobs({ bodyshop, setBreadcrumbs }) {
|
|||||||
setBreadcrumbs([{ link: "/manage/jobs", label: t("titles.bc.jobs-all") }]);
|
setBreadcrumbs([{ link: "/manage/jobs", label: t("titles.bc.jobs-all") }]);
|
||||||
}, [t, setBreadcrumbs]);
|
}, [t, setBreadcrumbs]);
|
||||||
|
|
||||||
const searchTextState = useState("");
|
|
||||||
const searchText = searchTextState[0];
|
|
||||||
if (error) return <AlertComponent message={error.message} type='error' />;
|
if (error) return <AlertComponent message={error.message} type='error' />;
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<JobsListPaginated
|
<JobsListPaginated
|
||||||
searchTextState={searchTextState}
|
|
||||||
refetch={refetch}
|
refetch={refetch}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
searchParams={search}
|
searchParams={searchParams}
|
||||||
total={data ? data.jobs_aggregate.aggregate.count : 0}
|
total={data ? data.search_jobs_aggregate.aggregate.count : 0}
|
||||||
jobs={
|
jobs={data ? data.search_jobs : []}
|
||||||
data
|
|
||||||
? searchText === ""
|
|
||||||
? data.jobs
|
|
||||||
: data.jobs.filter(
|
|
||||||
(j) =>
|
|
||||||
(j.ro_number || "")
|
|
||||||
.toString()
|
|
||||||
.toLowerCase()
|
|
||||||
.includes(searchText.toLowerCase()) ||
|
|
||||||
(j.ownr_fn || "")
|
|
||||||
.toLowerCase()
|
|
||||||
.includes(searchText.toLowerCase()) ||
|
|
||||||
(j.ownr_ln || "")
|
|
||||||
.toLowerCase()
|
|
||||||
.includes(searchText.toLowerCase()) ||
|
|
||||||
(j.clm_no || "")
|
|
||||||
.toLowerCase()
|
|
||||||
.includes(searchText.toLowerCase()) ||
|
|
||||||
(j.plate_no || "")
|
|
||||||
.toLowerCase()
|
|
||||||
.includes(searchText.toLowerCase()) ||
|
|
||||||
(j.v_model_desc || "")
|
|
||||||
.toLowerCase()
|
|
||||||
.includes(searchText.toLowerCase()) ||
|
|
||||||
(j.v_make_desc || "")
|
|
||||||
.toLowerCase()
|
|
||||||
.includes(searchText.toLowerCase())
|
|
||||||
)
|
|
||||||
: null
|
|
||||||
}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
- args:
|
||||||
|
cascade: true
|
||||||
|
read_only: false
|
||||||
|
sql: "CREATE INDEX idx_job_search ON jobs USING GIN ((ownr_fn || ' ' || ownr_ln
|
||||||
|
|| ' ' || ownr_co_nm\r\n|| ' ' || ro_number \r\n|| ' ' || est_number \r\n||
|
||||||
|
' ' || clm_no \r\n|| ' ' || ownr_ph1 \r\n|| ' ' || ownr_ea \r\n|| ' ' || plate_no
|
||||||
|
)\r\n gin_trgm_ops);"
|
||||||
|
type: run_sql
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
12
hasura/migrations/1590765808875_run_sql_migration/up.yaml
Normal file
12
hasura/migrations/1590765808875_run_sql_migration/up.yaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
- args:
|
||||||
|
cascade: true
|
||||||
|
read_only: false
|
||||||
|
sql: "CREATE\r\nOR REPLACE FUNCTION public.search_jobs(search text) RETURNS SETOF
|
||||||
|
jobs LANGUAGE sql STABLE AS $function$\r\nSELECT\r\n *\r\nFROM\r\n jobs\r\nWHERE\r\n
|
||||||
|
\ search <% (ownr_fn || ' ' || ownr_ln || ' ' || ownr_co_nm\r\n|| ' ' || ro_number
|
||||||
|
\r\n|| ' ' || est_number \r\n|| ' ' || clm_no \r\n|| ' ' || ownr_ph1 \r\n||
|
||||||
|
' ' || ownr_ea \r\n|| ' ' || plate_no)\r\nORDER BY\r\n similarity(\r\n search,\r\n
|
||||||
|
\ (ownr_fn || ' ' || ownr_ln || ' ' || ownr_co_nm\r\n|| ' ' || ro_number
|
||||||
|
\r\n|| ' ' || est_number \r\n|| ' ' || clm_no \r\n|| ' ' || ownr_ph1 \r\n||
|
||||||
|
' ' || ownr_ea \r\n|| ' ' || plate_no)\r\n ) DESC\r\n$function$;"
|
||||||
|
type: run_sql
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
- args:
|
||||||
|
cascade: true
|
||||||
|
read_only: false
|
||||||
|
sql: drop index idx_job_search;
|
||||||
|
type: run_sql
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
12
hasura/migrations/1590766913775_run_sql_migration/up.yaml
Normal file
12
hasura/migrations/1590766913775_run_sql_migration/up.yaml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
- args:
|
||||||
|
cascade: true
|
||||||
|
read_only: false
|
||||||
|
sql: "CREATE INDEX idx_jobs_ownrfn ON jobs\r\nUSING GIN (ownr_fn gin_trgm_ops);\r\n\r\nCREATE
|
||||||
|
INDEX idx_jobs_ownrln ON jobs\r\nUSING GIN (ownr_ln gin_trgm_ops);\r\n\r\nCREATE
|
||||||
|
INDEX idx_jobs_estnumber ON jobs\r\nUSING GIN (cast (est_number as text) gin_trgm_ops);\r\n\r\nCREATE
|
||||||
|
INDEX idx_jobs_ronumber ON jobs\r\nUSING GIN (ro_number gin_trgm_ops);\r\n\r\nCREATE
|
||||||
|
INDEX idx_jobs_clmno ON jobs\r\nUSING GIN (clm_no gin_trgm_ops);\r\n\r\nCREATE
|
||||||
|
INDEX idx_jobs_plateno ON jobs\r\nUSING GIN (plate_no gin_trgm_ops);\r\n\r\nCREATE
|
||||||
|
INDEX idx_jobs_vmakedesc ON jobs\r\nUSING GIN (v_make_desc gin_trgm_ops);\r\n\r\nCREATE
|
||||||
|
INDEX idx_jobs_vmodeldesc ON jobs\r\nUSING GIN (v_model_desc gin_trgm_ops);"
|
||||||
|
type: run_sql
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
10
hasura/migrations/1590767016519_run_sql_migration/up.yaml
Normal file
10
hasura/migrations/1590767016519_run_sql_migration/up.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
- args:
|
||||||
|
cascade: true
|
||||||
|
read_only: false
|
||||||
|
sql: "CREATE OR REPLACE FUNCTION public.search_jobs(search text)\r\n RETURNS SETOF
|
||||||
|
jobs\r\n LANGUAGE sql\r\n STABLE\r\nAS $function$\r\nSELECT\r\n *\r\nFROM\r\n
|
||||||
|
\ jobs\r\nWHERE\r\n search <% (ownr_fn) OR\r\n search <% (ownr_ln) OR\r\n
|
||||||
|
\ search <% (cast(est_number as text)) OR\r\n search <% (ro_number) OR\r\n
|
||||||
|
\ search <% (clm_no) OR\r\n search <% (plate_no) OR\r\n search <% (v_make_desc)
|
||||||
|
OR\r\n search <% (v_model_desc) \r\n\r\n$function$;"
|
||||||
|
type: run_sql
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
11
hasura/migrations/1590768879487_run_sql_migration/up.yaml
Normal file
11
hasura/migrations/1590768879487_run_sql_migration/up.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
- args:
|
||||||
|
cascade: true
|
||||||
|
read_only: false
|
||||||
|
sql: "CREATE OR REPLACE FUNCTION public.search_jobs(search text)\r\n RETURNS SETOF
|
||||||
|
jobs\r\n LANGUAGE plpgsql\r\n STABLE\r\nAS $function$\r\n\r\nBEGIN\r\n if search
|
||||||
|
= '' then\r\n return query select * from jobs j ;\r\n else \r\n return
|
||||||
|
query SELECT\r\n *\r\nFROM\r\n jobs\r\nWHERE\r\n search <% (ownr_fn) OR\r\n
|
||||||
|
\ search <% (ownr_ln) OR\r\n search <% (cast(est_number as text)) OR\r\n search
|
||||||
|
<% (ro_number) OR\r\n search <% (clm_no) OR\r\n search <% (plate_no) OR\r\n
|
||||||
|
\ search <% (v_make_desc) OR\r\n search <% (v_model_desc) ;\r\n end if;\r\n\r\n\tEND\r\n\r\n\r\n$function$;"
|
||||||
|
type: run_sql
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
- args:
|
||||||
|
cascade: true
|
||||||
|
read_only: false
|
||||||
|
sql: "CREATE INDEX idx_owners_ownrfn ON owners\r\nUSING GIN (ownr_fn gin_trgm_ops);\r\n\r\nCREATE
|
||||||
|
INDEX idx_owners_ownrln ON owners\r\nUSING GIN (ownr_ln gin_trgm_ops);\r\n\r\nCREATE
|
||||||
|
INDEX idx_owners_estnumber ON owners\r\nUSING GIN (ownr_co_nm gin_trgm_ops);"
|
||||||
|
type: run_sql
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
- args:
|
||||||
|
cascade: true
|
||||||
|
read_only: false
|
||||||
|
sql: "CREATE OR REPLACE FUNCTION public.search_owner(search text)\r\n RETURNS
|
||||||
|
SETOF owners\r\n LANGUAGE plpgsql\r\n STABLE\r\nAS $function$\r\n\r\nBEGIN\r\n
|
||||||
|
\ if search = '' then\r\n return query select * from owners ;\r\n else \r\n
|
||||||
|
\ return query SELECT\r\n *\r\nFROM\r\n owners\r\nWHERE\r\n search <% (ownr_fn)
|
||||||
|
OR\r\n search <% (ownr_ln) OR\r\n search <% (ownr_co_nm) ;\r\n end if;\r\n\r\n\tEND\r\n$function$;"
|
||||||
|
type: run_sql
|
||||||
Reference in New Issue
Block a user