11import  {  ConfigDB ,  ViewAPI  }  from  "../axios" ; 
22import  {  resolvePostGrestRequestWithPagination  }  from  "../resolve" ; 
3- import  {  ViewResult  }  from  "../../pages/audit-report/types" ; 
3+ import  {  ViewResult ,  ViewColumnDef  }  from  "../../pages/audit-report/types" ; 
4+ import  {  tristateOutputToQueryFilterParam  }  from  "../../ui/Dropdowns/TristateReactSelect" ; 
45
56export  type  View  =  { 
67  id : string ; 
@@ -64,8 +65,26 @@ export const getAllViews = (
6465    } ) 
6566  ) ; 
6667} ; 
68+ export  const  getViewDataById  =  async  ( 
69+   viewId : string , 
70+   headers ?: Record < string ,  string > 
71+ ) : Promise < ViewResult >  =>  { 
72+   const  response  =  await  fetch ( `/api/view/${ viewId }  ` ,  { 
73+     credentials : "include" , 
74+     headers
75+   } ) ; 
76+ 
77+   if  ( ! response . ok )  { 
78+     const  errorData  =  await  response . json ( ) ; 
79+     throw  new  Error ( 
80+       errorData . error  ||  `HTTP ${ response . status }  : ${ response . statusText }  ` 
81+     ) ; 
82+   } 
83+ 
84+   return  response . json ( ) ; 
85+ } ; 
6786
68- export  const  getViewById  =  ( id : string )  => 
87+ export  const  getViewSummary  =  ( id : string )  => 
6988  resolvePostGrestRequestWithPagination < ViewSummary [ ] > ( 
7089    ConfigDB . get ( `/views_summary?id=eq.${ id }  &select=*` ) 
7190  ) ; 
@@ -85,30 +104,70 @@ export const deleteView = async (id: string) => {
85104  return  response ; 
86105} ; 
87106
88- export  const  getViewData  =  async  ( 
107+ export  const  queryViewTable  =  async  ( 
89108  namespace : string , 
90109  name : string , 
91-   headers ?: Record < string ,  string > , 
92-   filter ?: string 
93- ) : Promise < ViewResult >  =>  { 
94-   let  url  =  `/api/view/${ namespace }  /${ name }  ` ; 
95-   if  ( filter  &&  filter . trim ( ) )  { 
96-     url  +=  `?filter=${ encodeURIComponent ( filter ) }  ` ; 
110+   columns : ViewColumnDef [ ] , 
111+   searchParams : URLSearchParams 
112+ )  =>  { 
113+   const  cleanNamespace  =  namespace . replaceAll ( "-" ,  "_" ) ; 
114+   const  cleanName  =  name . replaceAll ( "-" ,  "_" ) ; 
115+   const  tableName  =  `view_${ cleanNamespace }  _${ cleanName }  ` ; 
116+ 
117+   // Build query string like job history does 
118+   let  queryString  =  `?select=*` ; 
119+ 
120+   // Get pagination parameters from URL like job history does 
121+   const  pageIndex  =  parseInt ( searchParams . get ( "pageIndex" )  ??  "0" ) ; 
122+   const  pageSize  =  parseInt ( searchParams . get ( "pageSize" )  ??  "50" ) ; 
123+   queryString  +=  `&limit=${ pageSize }  &offset=${ pageIndex  *  pageSize }  ` ; 
124+ 
125+   // Add filters from URL parameters 
126+   for  ( const  [ key ,  value ]  of  searchParams . entries ( ) )  { 
127+     if  ( 
128+       key  !==  "filter"  && 
129+       key  !==  "pageIndex"  && 
130+       key  !==  "pageSize"  && 
131+       value  && 
132+       value . trim ( ) 
133+     )  { 
134+       const  filterParam  =  tristateOutputToQueryFilterParam ( value ,  key ) ; 
135+       if  ( filterParam )  { 
136+         queryString  +=  filterParam ; 
137+       } 
138+     } 
97139  } 
98140
99-   const  response  =  await  fetch ( url ,  { 
100-     credentials : "include" , 
101-     headers
102-   } ) ; 
141+   const  response  =  await  resolvePostGrestRequestWithPagination ( 
142+     ConfigDB . get ( `/${ tableName } ${ queryString }  ` ,  { 
143+       headers : { 
144+         Prefer : "count=exact" 
145+       } 
146+     } ) 
147+   ) ; 
103148
104-   if  ( ! response . ok )  { 
105-     const  errorData  =  await  response . json ( ) ; 
106-     throw  new  Error ( 
107-       errorData . error  ||  `HTTP ${ response . status }  : ${ response . statusText }  ` 
108-     ) ; 
149+   if  ( response . error )  { 
150+     throw  response . error ; 
109151  } 
110152
111-   return  response . json ( ) ; 
153+   const  data  =  response . data ; 
154+ 
155+   // Convert PostgREST object rows to array rows based on column order 
156+   // Example: 
157+   // data = [{"name": "John", "age": 30, "city": "New York"}] 
158+   // columns = [{name: "name"}, {name: "age"}, {name: "city"}] 
159+   // convertedRows = [["John", 30, "New York"]] 
160+   const  convertedRows  = 
161+     Array . isArray ( data )  &&  data . length  >  0 
162+       ? data . map ( ( rowObj )  =>  { 
163+           return  columns . map ( ( column )  =>  rowObj [ column . name ] ) ; 
164+         } ) 
165+       : data  ||  [ ] ; 
166+ 
167+   return  { 
168+     data : convertedRows , 
169+     totalEntries : response . totalEntries 
170+   } ; 
112171} ; 
113172
114173export  const  getViewsForSidebar  =  async  ( )  =>  { 
0 commit comments