import { AutoComplete, Divider, Input, Space } from "antd"; import axios from "axios"; import _ from "lodash"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import PhoneNumberFormatter from "../../utils/PhoneFormatter"; import OwnerNameDisplay, { OwnerNameDisplayFunction } from "../owner-name-display/owner-name-display.component"; import VehicleVinDisplay from "../vehicle-vin-display/vehicle-vin-display.component"; export default function GlobalSearchOs() { const { t } = useTranslation(); const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [data, setData] = useState(false); const executeSearch = async (v) => { if (v && v && v !== "" && v.length >= 3) { try { setLoading(true); const searchData = await axios.post("/search", { search: v }); const resultsByType = { payments: [], jobs: [], bills: [], owners: [], vehicles: [] }; searchData.data.hits.hits.forEach((hit) => { resultsByType[hit._index].push(hit._source); }); setData([ { label: renderTitle(t("menus.header.search.jobs")), options: resultsByType.jobs.map((job) => { return { key: job.id, value: job.ro_number || "N/A", label: ( }> {job.ro_number || t("general.labels.na")} {`${job.status || ""}`} {`${job.v_model_yr || ""} ${job.v_make_desc || ""} ${job.v_model_desc || ""}`} {`${job.clm_no || ""}`} {`${job.plate_no || ""}`} ) }; }) }, { label: renderTitle(t("menus.header.search.owners")), options: resultsByType.owners.map((owner) => { return { key: owner.id, value: OwnerNameDisplayFunction(owner), label: ( } wrap> {owner.ownr_ph1} {owner.ownr_ph2} ) }; }) }, { label: renderTitle(t("menus.header.search.vehicles")), options: resultsByType.vehicles.map((vehicle) => { return { key: vehicle.id, value: `${vehicle.v_model_yr || ""} ${vehicle.v_make_desc || ""} ${vehicle.v_model_desc || ""}`, label: ( }> {`${vehicle.v_model_yr || ""} ${vehicle.v_make_desc || ""} ${vehicle.v_model_desc || ""}`} {vehicle.plate_no || ""} {vehicle.v_vin || ""} ) }; }) }, { label: renderTitle(t("menus.header.search.payments")), options: resultsByType.payments.map((payment) => { return { key: payment.id, value: `${payment.job?.ro_number} ${payment.amount}`, label: ( }> {payment.paymentnum} {payment.job?.ro_number} {payment.memo || ""} {payment.amount || ""} {payment.transactionid || ""} ) }; }) }, { label: renderTitle(t("menus.header.search.bills")), options: resultsByType.bills.map((bill) => { return { key: bill.id, value: `${bill.invoice_number} - ${bill.vendor.name}`, label: ( }> {bill.invoice_number} {bill.vendor.name} {bill.date} ) }; }) } // { // label: renderTitle(t("menus.header.search.phonebook")), // options: resultsByType.search_phonebook.map((pb) => { // return { // key: pb.id, // value: `${pb.firstname || ""} ${pb.lastname || ""} ${ // pb.company || "" // }`, // label: ( // // }> // {`${pb.firstname || ""} ${pb.lastname || ""} ${ // pb.company || "" // }`} // {pb.phone1} // {pb.email} // // // ), // }; // }), // }, ]); } catch (error) { console.log("Error while fetching search results", error); } finally { setLoading(false); } } }; const debouncedExecuteSearch = _.debounce(executeSearch, 750); const handleSearch = (value) => { debouncedExecuteSearch(value); }; const renderTitle = (title) => { return {title}; }; return ( { if (e.key !== "Enter") return; const firstUrlForSearch = data?.[0]?.options?.[0]?.label?.props?.to; if (!firstUrlForSearch) return; navigate(firstUrlForSearch); }} defaultActiveFirstOption onClear={() => setData([])} > ); }