11import { createColumn , FilterOperation , FilterPageSortArguments , FilterPageSortChangeReason , FilterPageSortLoadMode , ServerInfo } from "@euxdt/grid-core" ;
22import { createMultiSelectFilterOptions , createNumericRangeFilterOptions , createTextInputFilterOptions } from "@euxdt/grid-react" ;
3- import { useEffect , useMemo , useReducer , useState } from "react" ;
3+ import { useEffect , useMemo , useState } from "react" ;
44import { client } from "../graphql/client/apollo-client" ;
55import { BusinessQuery } from "../graphql/client/queries/business" ;
66import { DataGrid } from "./DataGrid" ;
77
88
99export const RestaurantsDataGrid = ( ) => {
1010 const [ loading , setLoading ] = useState < boolean > ( true ) ;
11- const [ filterPageSortArgs , setFilterPageSortArgs ] = useState < FilterPageSortArguments > ( ) ;
12- const [ serverInfo , dispatch ] = useReducer ( ( state : ServerInfo , action : { type : "SET_SERVER_INFO" ;
13- payload : Partial < ServerInfo > ;
14- } ) : ServerInfo => {
15- switch ( action . type ) {
16- case "SET_SERVER_INFO" :
17- return { ...state , ...action . payload } ;
18- default :
19- return state ;
20- }
21- } , { } ) ;
11+ const [ request , setRequest ] = useState < FilterPageSortArguments > ( ) ;
12+ const [ response , setResponse ] = useState < ServerInfo > ( { } ) ;
2213
2314 const uniqueIdentifierOptions = useMemo ( ( ) => ( {
2415 useField : "business_id" ,
2516 } ) , [ ] ) ;
26- const filterValueColumns = useMemo ( ( ) => [ "name" , "city" ] , [ ] ) ;
27- const footerValueColumns = useMemo ( ( ) => [ "inspection_count" , "violation_count" ] , [ ] ) ;
17+ const initialLoadDistinctValueColumns = useMemo ( ( ) => [ "name" , "city" , "TaxCode" ] , [ ] ) ;
2818 useEffect ( ( ) => {
29- setFilterPageSortArgs ( {
30- distinctValueColumns : filterValueColumns ,
31- footerValueColumns ,
19+ //Initial load
20+ setRequest ( {
21+ distinctValueColumns : initialLoadDistinctValueColumns ,
3222 filter : { children : [ ] } ,
3323 pagination : { pageSize : 100 , currentPage : 1 } ,
24+ reason : FilterPageSortChangeReason . InitialLoad ,
3425 } ) ;
35- } , [ filterValueColumns , footerValueColumns ] ) ;
26+ } , [ initialLoadDistinctValueColumns ] ) ;
3627 useEffect ( ( ) => {
37- if ( ! filterPageSortArgs ) return ;
28+ if ( ! request ) return ;
3829 const getServerData = async ( filterPageSortArgs : FilterPageSortArguments ) => {
39- const { pagination } = filterPageSortArgs ;
4030 setLoading ( true ) ;
4131 const response = await client . query ( {
4232 query : BusinessQuery ,
4333 variables : {
4434 args : filterPageSortArgs ,
4535 } ,
36+ } )
37+ const result = response . data . businesses ;
38+ const newResponse = { ...result } ;
39+ setResponse ( s => {
40+ //Merge the new response with the old response.
41+ if ( Object . keys ( result . filterDistinctValues || { } ) . length > 0 ) {
42+ newResponse . filterDistinctValues = { ...s . filterDistinctValues , ...result . filterDistinctValues } ;
43+ } else {
44+ delete newResponse . filterDistinctValues ;
45+ }
46+ return {
47+ ...s ,
48+ ...newResponse ,
49+ pagination : {
50+ ...s . pagination ,
51+ ...newResponse . pagination ,
52+ } ,
53+ } ;
4654 } ) ;
47- const newServerInfo : ServerInfo = {
48- currentPageData : response . data . businesses . rows ,
49- pagination : {
50- currentPage : pagination ?. currentPage || 1 ,
51- pageSize : pagination ?. pageSize || 100 ,
52- totalRecords : response . data . businesses . count || 0 ,
53- totalPages : Math . ceil ( response . data . businesses . count / ( pagination ?. pageSize || 100 ) ) ,
54- } ,
55- } ;
56- if ( Object . keys ( response . data . businesses . filterDistinctValues || { } ) . length > 0 ) {
57- newServerInfo . filterDistinctValues = response . data . businesses . filterDistinctValues ;
58- }
59- if ( Object . keys ( response . data . businesses . footerValues || { } ) . length > 0 ) {
60- newServerInfo . footerValues = response . data . businesses . footerValues ;
61- }
62- dispatch ( { type : "SET_SERVER_INFO" , payload : newServerInfo } ) ;
63-
6455 setLoading ( false ) ;
6556 } ;
66- getServerData ( filterPageSortArgs ) ;
67- } , [ filterPageSortArgs ] ) ;
57+ getServerData ( request ) ;
58+ } , [ request ] ) ;
6859
6960
7061 return (
7162 < DataGrid style = { { height :"100%" , } }
7263 gridOptions = { {
73- dataProvider : serverInfo ?. currentPageData ,
64+ dataProvider : response ?. currentPageData ,
7465 filterPageSortMode : FilterPageSortLoadMode . Server ,
7566 enablePaging : true ,
76- serverInfo,
67+ serverInfo : response ,
7768 toolbarOptions : {
7869 enableGlobalSearch : false ,
7970 enableExcel :true ,
8071 enablePdf :true ,
8172 } ,
8273 eventBus : {
8374 onFilterPageSortChanged : ( args : FilterPageSortArguments , reason : FilterPageSortChangeReason ) => {
84- setFilterPageSortArgs ( {
75+ setRequest ( {
8576 ...args ,
86- distinctValueColumns : [ ] , //don't need distinct values on subsequent calls, footers only need to be updated on filter change
87- footerValueColumns : reason === FilterPageSortChangeReason . FilterChanged ? footerValueColumns : [ ] ,
77+ reason ,
78+ distinctValueColumns : [ ] , //don't need distinct values on subsequent calls
8879 } ) ;
8980 } ,
9081 onExportPageRequested : async ( args ) => {
@@ -94,7 +85,7 @@ export const RestaurantsDataGrid = () => {
9485 args,
9586 } ,
9687 } ) ;
97- return response . data . businesses . rows ;
88+ return response . data . businesses . currentPageData ;
9889 } ,
9990 } ,
10091 isLoading : loading ,
@@ -111,6 +102,10 @@ export const RestaurantsDataGrid = () => {
111102 ...createColumn ( "name" , "string" , "Name" ) ,
112103 filterOptions : createMultiSelectFilterOptions ( )
113104 } ,
105+ {
106+ ...createColumn ( "TaxCode" , "string" , "Tax Code" ) ,
107+ filterOptions : createMultiSelectFilterOptions ( )
108+ } ,
114109 {
115110 ...createColumn ( "inspection_count" , "number" , "Inspection Count" ) ,
116111 width : 100 ,
@@ -145,10 +140,6 @@ export const RestaurantsDataGrid = () => {
145140 ...createColumn ( "longitude" , "number" , "Longitude" ) ,
146141 filterOptions : createNumericRangeFilterOptions ( ) ,
147142 } ,
148- {
149- ...createColumn ( "TaxCode" , "string" , "Tax Code" ) ,
150- filterOptions : createTextInputFilterOptions ( FilterOperation . Wildcard ) ,
151- } ,
152143 {
153144 ...createColumn ( "business_certificate" , "number" , "Business_certificate" ) ,
154145 filterOptions : createNumericRangeFilterOptions ( ) ,
0 commit comments