1+ import React , { useState , useEffect } from 'react'
2+ import { extractDocuments } from './hookUtility'
3+
4+ export function useGraphqlTDBTable ( apolloClient , graphqlQuery , documentType , queryLimit , queryStart , order , filter , tableConfigObj , hiddenColumnsStart ) {
5+ const [ limit , setLimit ] = useState ( queryLimit || 10 )
6+ const [ start , setStart ] = useState ( queryStart || 0 )
7+ const [ error , setError ] = useState ( false )
8+ const [ loading , setLoading ] = useState ( false )
9+ const [ rowCount , setRowCount ] = useState ( 0 )
10+ // const [hasNextPage, setHasNextPage] = useState(true)
11+ const [ controlledRefresh , setControlledRefresh ] = useState ( 0 )
12+ const [ data , setData ] = useState ( null )
13+ const [ extractedData , setExtractedData ] = useState ( null )
14+
15+ const [ hiddenColumnsArr , setHiddenColumnsArr ] = useState ( [ '_id' ] )
16+
17+ //filter is the filter formatted for the query
18+ let filterTable = [ ]
19+
20+ // the original orderBy from the table and the object for the query
21+ const [ orderBy , setOrderBy ] = useState ( [ ] )
22+ const [ queryOrderBy , setQueryOrderBy ] = useState ( false )
23+
24+ const [ filterBy , setFilters ] = useState ( filterTable )
25+ const [ queryFilters , setQueryFilters ] = useState ( false )
26+
27+
28+ function formatFilterForTable ( ) {
29+ if ( filter ) {
30+ const keys = Object . keys ( filter )
31+ keys . forEach ( propN => {
32+
33+ const operator = Object . keys ( filter [ propN ] ) [ 0 ]
34+
35+ filterTable . push ( { id :propN , value :{ value :filter [ propN ] [ operator ] , operator :operator } } )
36+ } )
37+ setFilters ( filterTable )
38+ }
39+ }
40+
41+ const callFetchMore = async ( currentlimit , currentpage , currentOrderBy , currentFilter ) => {
42+ setLoading ( true )
43+ setError ( false )
44+ try {
45+ const result = await apolloClient . query ( { query :graphqlQuery ,
46+ variables :{ "offset" :currentpage , "limit" :currentlimit + 1 ,
47+ "orderBy" :currentOrderBy || { } , "filter" :currentFilter || { } } } )
48+
49+ if ( result . errors ) {
50+ setRowCount ( 0 )
51+ setData ( [ ] )
52+ setError ( "Graphql Error" )
53+ } else {
54+ const data = result . data
55+ if ( ! Array . isArray ( data [ documentType ] ) ) return [ ]
56+ //current page is the startoffset
57+ const rowCountTmp = currentpage + data [ documentType ] . length
58+ if ( data [ documentType ] . length === ( currentlimit + 1 ) ) {
59+ //setHasNextPage(false)
60+ data [ documentType ] . pop ( )
61+ }
62+ setRowCount ( rowCountTmp )
63+ const extractedData = extractDocuments ( data [ documentType ] )
64+ setData ( data )
65+ setExtractedData ( extractedData )
66+ }
67+ } catch ( err ) {
68+ console . log ( "ERRORRRRR" , err )
69+ } finally {
70+ setLoading ( false )
71+ }
72+ }
73+
74+
75+ const changeLimits = ( currentlimit , currentpage , fetchMore = false ) => {
76+ setStart ( currentpage )
77+ setLimit ( currentlimit )
78+ console . log ( "changeLimits" , queryFilters )
79+ callFetchMore ( currentlimit , currentpage , queryOrderBy , queryFilters )
80+ }
81+
82+ /*
83+ * the advanced filter is already formatted for the query
84+ */
85+ const setAdvancedFilters = ( advfilter , fetchMore = false ) => {
86+ setFilters ( [ ] )
87+ setQueryFilters ( advfilter )
88+ console . log ( "setAdvancedFilters" , advfilter , queryFilters )
89+ callFetchMore ( limit , start , queryOrderBy , advfilter )
90+ }
91+
92+ /*
93+ * the table filter need to be transformed
94+ */
95+ const changeFilters = ( filtersArr ) => {
96+ const filtersTmp = { }
97+ if ( Array . isArray ( filtersArr ) ) {
98+ filtersArr . forEach ( item => {
99+ // value has operator:value {"eq":"myvalue"}
100+ if ( item . value ) {
101+ let elementValue = item . value . value
102+ if ( item . value . operator === "regex" ) {
103+ elementValue = `(?i)${ elementValue } `
104+ }
105+
106+ let value = { [ item . value . operator ] : elementValue }
107+
108+ if ( item . value . mode === "ARRAY" ) {
109+ value = { "someHave" : { [ item . value . operator ] : elementValue } }
110+ }
111+
112+ //max 2 level
113+ if ( item . value . varPath ) {
114+ try {
115+ const level01 = Object . keys ( item . value . varPath ) [ 0 ]
116+ if ( ! filtersTmp [ level01 ] ) filtersTmp [ level01 ] = { }
117+
118+ const level02 = Object . keys ( item . value . varPath [ level01 ] ) [ 0 ]
119+ filtersTmp [ level01 ] [ level02 ] = value
120+ } catch ( err ) {
121+ console . log ( err . message )
122+ filtersTmp [ item . id ] = value
123+ }
124+ } else {
125+ filtersTmp [ item . id ] = value
126+ }
127+ }
128+ } )
129+ }
130+ setFilters ( filtersArr )
131+ setStart ( 0 )
132+ setQueryFilters ( filtersTmp )
133+
134+ console . log ( "changeFilters" , filtersArr , filtersTmp )
135+ callFetchMore ( limit , 0 , queryOrderBy , filtersTmp )
136+ }
137+
138+ const changeOrder = ( orderByArr ) => {
139+ const orderByObj = { }
140+ if ( Array . isArray ( orderByArr ) ) {
141+ orderByArr . forEach ( item => {
142+ orderByObj [ item . id ] = item . desc === true ? "DESC" : "ASC"
143+ } )
144+ }
145+ setOrderBy ( orderByArr )
146+ setStart ( 0 )
147+ setQueryOrderBy ( orderByObj )
148+ callFetchMore ( limit , 0 , orderByObj , queryFilters )
149+ }
150+
151+ const onRefresh = ( ) => {
152+ setRefresh ( controlledRefresh + 1 )
153+ }
154+
155+ const setHiddenColumns = ( id , checked ) => {
156+ const indexof = hiddenColumnsArr . indexOf ( id )
157+ if ( id === "__ALL__" ) {
158+ if ( checked ) {
159+ setHiddenColumnsArr ( [ ] )
160+ } else {
161+ //columns name
162+ if ( Array . isArray ( tableConfigObj ) ) {
163+ tableConfigObj . forEach ( item => {
164+ if ( hiddenColumnsArr . indexOf ( item . id ) === - 1 )
165+ hiddenColumnsArr . push ( item . id )
166+ } )
167+ }
168+ }
169+ } else {
170+ if ( indexof > - 1 && checked === true ) {
171+ // we remove the item if it is in the array
172+ const x = hiddenColumnsArr . splice ( indexof , 1 ) ;
173+ } else if ( checked === false && indexof === - 1 ) {
174+ hiddenColumnsArr . push ( id )
175+ }
176+ }
177+
178+ }
179+
180+ return {
181+ callFetchMore,
182+ documentError :error ,
183+ // updateDocument,
184+ changeOrder,
185+ changeLimits,
186+ changeFilters,
187+ setAdvancedFilters,
188+ orderBy,
189+ filterBy,
190+ queryFilters,
191+ queryOrderBy,
192+ // controlledDocument,
193+ limit,
194+ start,
195+ loading,
196+ rowCount,
197+ onRefresh,
198+ documentResults :data ,
199+ extractedData,
200+ hiddenColumnsArr,
201+ setHiddenColumns,
202+ // maybe we need to set from outside
203+ // setDocumentResults,
204+ // setControlledRefresh,
205+ controlledRefresh
206+ }
207+ }
0 commit comments