microservices/adp_ui/src/components/SearchApplicantTable.js (267 lines of code) (raw):

/** * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ /*** This is the common file for both Upload.js and Reassign.js files. Where a user can search for * an applicant to assign an registration id in upload and reasssign.js files. A user has to select a row * then the associated caseid is tagged to that application */ import { Button, Card } from 'react-bootstrap'; import React, { useState } from 'react'; import axios from 'axios'; import { baseURL } from '../configs/firebase.config'; import { Ripple } from 'primereact/ripple'; import { Link } from 'react-router-dom'; import { classNames } from 'primereact/utils'; import { DataTable } from 'primereact/datatable'; import moment from 'moment'; import { Column } from 'primereact/column'; import 'primeicons/primeicons.css'; import 'primereact/resources/themes/lara-light-indigo/theme.css'; import 'primereact/resources/primereact.css'; import 'primeflex/primeflex.css'; import '../css/SearchApplicant.css' function SearchForApplicantTable(props) { console.log("PROPS PASSED IN REASSIGN", props) const [dataTableBody, setDataTableBody] = useState([]); const [isLoading, setIsLoading] = useState(false); const [filter, setFilter] = useState(''); const [tableLength, setTableLength] = useState('0 documents found'); const [searchTerm, setSearchTerm] = useState('') const [currentPage, setCurrentPage] = useState(1); const [selectedProduct1, setSelectedProduct1] = useState(null); const [first1, setFirst1] = useState(0); const [rows1, setRows1] = useState(20); // To se the table data on page onload const tableAPICall = (searchTerms, status) => { return new Promise((resolve, reject) => { console.log("^^^^^^^^^^^^^", searchTerms, status); let sendObj = { term: searchTerms } //This call is for the AllQ as the API is different from other Queues if (status === 'all') { axios.get(`${baseURL}/hitl_service/v1/report_data`).then((statusAll) => { let apiData = statusAll.data.data; console.log("tableData Accepted", apiData); if (props.page === 'reaasignpage') { let supportingDocRecords = apiData var index = supportingDocRecords.filter(function (o) { return o.document_type === 'application_form'; }) formattingTableData(index).then((formattedResponse) => { console.log("TABLE BODY", formattedResponse) setTableLength(formattedResponse.length + ' documents found') setDataTableBody(formattedResponse) setIsLoading(false); }) } else if (props.page === 'uploadpage') { formattingTableData(apiData).then((formattedResponse) => { console.log("TABLE BODY", formattedResponse) setTableLength(formattedResponse.length + ' documents found') setDataTableBody(formattedResponse) setIsLoading(false); }) } }).catch(err => { setIsLoading(false); console.log("errorssssss", err, err.message); }) } else { console.log("sendObj", sendObj) axios.post(`${baseURL}/hitl_service/v1/search`, sendObj).then((searchFilterText) => { let apiData = searchFilterText.data.data; if (apiData.length === 0) { setIsLoading(false); } else { if (props.page === 'reaasignpage') { let supportingDocRecords = apiData var index = supportingDocRecords.filter(function (o) { return o.document_type === 'application_form'; }) formattingTableData(index).then((formattedData) => { console.log("Formatted DATA", formattedData); console.log("TABLE BODY", formattedData) setTableLength(formattedData.length + ' documents found') setDataTableBody(formattedData); setIsLoading(false); }) } else if (props.page === 'uploadpage') { formattingTableData(apiData).then((formattedData) => { console.log("Formatted DATA", formattedData); console.log("TABLE BODY", formattedData) setTableLength(formattedData.length + ' documents found') setDataTableBody(formattedData); setIsLoading(false); }) } } }).catch(error => { setIsLoading(false); console.log("error in", error) }) } }) } // when a row is selected, the associated id is sent to the parent component function handleTableData(e) { setSelectedProduct1(e.value) props.onSelectTableData(e.value); } const buttonClicked = () => { setIsLoading(true) console.log("Searching...", searchTerm) if (searchTerm) { console.log("SEARCH TERM", searchTerm); setDataTableBody([]) tableAPICall(searchTerm) // tableAPICall(searchTerm,'all').then((responseData) => { // console.log("Search term response", responseData) // setTableLength(responseData[0].length + ' documents found'); // setIsLoading(false) // setDataTableBody(responseData[0]); // }) } else { tableAPICall(searchTerm, 'all'); } } // This function is to format all the data that needs to be displayed in the UI in the form of table const formattingTableData = (apiTableResponse) => { const tableBodyArr = []; return new Promise((resolve, reject) => { apiTableResponse.forEach((element) => { const tableBody = { "caseid": `${element.case_id}`, "documenttype": `${element.document_type === null ? 'N/A' : (element.document_type).split('_').join(" ")}`, "documentclass": `${element.document_class === null ? 'N/A' : (element.document_class).split('_').join(" ")}`, "uploaddate": `${(element.upload_timestamp)}`, "applicantname": `${element.applicant_name}`, "matchscore": `${element.matching_score === null ? 'N/A' : parseFloat(element.matching_score * 100).toFixed(1) + '%'}`, "extractionscore": `${element.extraction_score === null ? 'N/A' : parseFloat(element.extraction_score * 100).toFixed(1) + '%'}`, "validationscore": `${element.validation_score === null ? 'N/A' : parseFloat(element.validation_score * 100).toFixed(1) + '%'}`, 'process_status': `${element.process_status}`, "current_status": `${element.current_status}`, "statuslastupdate": `${element.status_last_updated_by}`, "uid": `${element.uid}`, //navigations to other pages "actions": ( <Link to={{ pathname: `/documentreview/${element.uid}/${element.case_id}`, }} className="saActionButton">Review</Link> ) } tableBodyArr.push(tableBody) resolve(tableBodyArr) }) }) } const template1 = { layout: 'PrevPageLink PageLinks NextPageLink RowsPerPageDropdown CurrentPageReport', 'PrevPageLink': (options) => { return ( <button type="button" className={options.className} onClick={options.onClick} disabled={options.disabled}> <span className="p-3"> {'<'}</span> <Ripple /> </button> ) }, 'NextPageLink': (options) => { return ( <button type="button" className={options.className} onClick={options.onClick} disabled={options.disabled}> <span className="p-3">{'>'}</span> <Ripple /> </button> ) }, 'PageLinks': (options) => { if ((options.view.startPage === options.page && options.view.startPage !== 0) || (options.view.endPage === options.page && options.page + 1 !== options.totalPages)) { const className = classNames(options.className, { 'p-disabled': true }); return <span className={className} style={{ userSelect: 'none' }}>...</span>; } return ( <button type="button" className={options.className} onClick={options.onClick}> {options.page + 1} <Ripple /> </button> ) }, }; const statusBodyTemplate = (rowData) => { const stockClassName = classNames({ 'approved': rowData.current_status === 'Approved' || rowData.current_status === 'approved', 'rejected': rowData.current_status === 'Rejected' || rowData.current_status === 'rejected' || rowData.current_status === 'Failed', 'pending': rowData.current_status === 'Pending' || rowData.current_status === 'pending' || rowData.current_status === 'In Progress' || rowData.current_status === 'Review' || rowData.current_status === 'review', }); return ( <div className={stockClassName}> {rowData.current_status} </div> ); } const dateBodyTemplate = (rowData) => { return <span>{moment.utc(rowData.uploaddate).local().format('YYYY-MM-DD HH:mm:ss')}</span> } const doctypeBodyTemplate = (rowData) => { return <span className={`docCaptalize`}>{rowData.documenttype}</span>; } const docclassBodyTemplate = (rowData) => { return <span className={`docCaptalize`}>{rowData.documentclass}</span>; } const onCustomPage1 = (event) => { setFirst1(event.first); setRows1(event.rows); setCurrentPage(event.page + 1); } const onFilter = (e) => { console.log("text", e.target.value) setFilter(e.target.value); setSearchTerm(e.target.value) }; const onRowSelect = (event) => { console.log("onRowSelect", event) props.onSelectTableData(event.data); } const onRowUnselect = (event) => { console.log("onRowUnselect", event) } const enterKeyPressed = (e) => { console.log("Enter key pressed") var code = e.keyCode || e.which; if (code === 13) { buttonClicked() } } return ( <div> <input type="text" onChange={onFilter} onKeyPress={enterKeyPressed} value={searchTerm} id='searchterm' name="searchterm" style={{ borderRadius: '13px', padding: '5px 15px', width: '300px' }} placeholder="Search for Applicants" />{' '} {isLoading ? <Button variant="secondary" className="searchInputButton" style={{ backgroundColor: '#2196F3', color: 'white', }}> Searching... </Button> : <Button variant="secondary" className="searchInputButton" style={{ backgroundColor: '#2196F3', color: 'white', }} onClick={buttonClicked}> Search </Button>} {dataTableBody.length === 0 ? '' : TableDisplay()} </div> ) function TableDisplay() { return ( <div className="saContainer"> <div className="datatable-style-demo "> <label></label> <DataTable value={dataTableBody} sortMode="multiple" header={tableLength} size="small" responsiveLayout="scroll" paginator paginatorTemplate={template1} first={first1} rows={rows1} onPage={onCustomPage1} selectionMode="single" selection={selectedProduct1} onSelectionChange={e => handleTableData(e)} onRowSelect={onRowSelect} onRowUnselect={onRowUnselect} paginatorPosition="both" paginatorClassName="justify-content-end"> {/* <DataTable value={dataTableBody} selection={selectedproducts} onSelectionChange={e => setSelectedProducts(e.value)} dataKey="id" responsiveLayout="scroll"> */} <Column selectionMode="single" headerStyle={{ width: '3em' }}></Column> <Column field="applicantname" header="Applicant Name" sortable></Column> <Column field="caseid" header="App Reg ID" sortable></Column> <Column field="current_status" header="Approval Status" body={statusBodyTemplate} sortable></Column> <Column field="process_status" header="Doc Processing Status" sortable></Column> <Column field="statuslastupdate" header="Updated By" sortable></Column> <Column field="documenttype" header="Document Type" body={doctypeBodyTemplate} sortable></Column> <Column field="documentclass" header="Document Class" body={docclassBodyTemplate} sortable></Column> <Column field="uploaddate" header="Upload Date" body={dateBodyTemplate} sortable></Column> <Column field="extractionscore" header="Extraction" sortable></Column> <Column field="matchscore" header="Matching" sortable></Column> <Column field="validationscore" header="Validation Score" sortable></Column> <Column field="actions" header="Actions"></Column> </DataTable> </div> </div> ) } } export default SearchForApplicantTable