1
- import React , { useEffect , useState , useRef } from 'react'
1
+ import React , { useEffect , useState , useRef , useMemo } from 'react'
2
2
import {
3
3
CAlert ,
4
4
CButton ,
@@ -31,6 +31,7 @@ import { OnChange } from 'react-final-form-listeners'
31
31
import { cellGenericFormatter } from 'src/components/tables/CellGenericFormat'
32
32
import PropTypes from 'prop-types'
33
33
import { CippCodeOffCanvas , ModalService } from 'src/components/utilities'
34
+ import { debounce } from 'lodash-es'
34
35
35
36
const GraphExplorer = ( ) => {
36
37
const tenant = useSelector ( ( state ) => state . app . currentTenant )
@@ -39,6 +40,7 @@ const GraphExplorer = () => {
39
40
const [ alertVisible , setAlertVisible ] = useState ( )
40
41
const [ random , setRandom ] = useState ( '' )
41
42
const [ random2 , setRandom2 ] = useState ( '' )
43
+ const [ random3 , setRandom3 ] = useState ( '' )
42
44
const [ ocVisible , setOCVisible ] = useState ( false )
43
45
const [ searchNow , setSearchNow ] = useState ( false )
44
46
const [ visibleA , setVisibleA ] = useState ( true )
@@ -49,13 +51,30 @@ const GraphExplorer = () => {
49
51
}
50
52
const [ execGraphRequest , graphrequest ] = useLazyGenericGetRequestQuery ( )
51
53
const [ execPostRequest , postResults ] = useLazyGenericPostRequestQuery ( )
54
+ const [ execPropRequest , availableProperties ] = useLazyGenericGetRequestQuery ( )
52
55
const {
53
56
data : customPresets = [ ] ,
54
57
isFetching : presetsIsFetching ,
55
58
error : presetsError ,
56
59
} = useGenericGetRequestQuery ( { path : '/api/ListGraphExplorerPresets' , params : { random2 } } )
57
60
const QueryColumns = { set : false , data : [ ] }
58
61
62
+ function endpointChange ( value ) {
63
+ execPropRequest ( {
64
+ path : '/api/ListGraphRequest' ,
65
+ params : {
66
+ Endpoint : value ,
67
+ ListProperties : true ,
68
+ TenantFilter : tenant . defaultDomainName ,
69
+ IgnoreErrors : true ,
70
+ random : ( Math . random ( ) + 1 ) . toString ( 36 ) . substring ( 7 ) ,
71
+ } ,
72
+ } )
73
+ }
74
+ const debounceEndpointChange = useMemo ( ( ) => {
75
+ return debounce ( endpointChange , 1000 )
76
+ } , [ endpointChange ] )
77
+
59
78
if ( graphrequest . isSuccess ) {
60
79
if ( graphrequest . data ?. Results ?. length > 0 ) {
61
80
//set columns
@@ -217,10 +236,15 @@ const GraphExplorer = () => {
217
236
218
237
useEffect ( ( ) => {
219
238
if ( params ?. endpoint ) {
239
+ var select = ''
240
+ if ( params ?. $select ) {
241
+ select = params . $select . map ( ( p ) => p . value ) . join ( ',' )
242
+ }
220
243
execGraphRequest ( {
221
244
path : 'api/ListGraphRequest' ,
222
245
params : {
223
246
...params ,
247
+ $select : select ,
224
248
random : random ,
225
249
} ,
226
250
} )
@@ -237,15 +261,36 @@ const GraphExplorer = () => {
237
261
{ ( { form } ) => (
238
262
< OnChange name = { field } >
239
263
{ ( value ) => {
264
+ if ( field == 'endpoint' ) {
265
+ debounceEndpointChange ( value )
266
+ }
240
267
if ( value ?. value ) {
241
268
let preset = presets . filter ( function ( obj ) {
242
269
return obj . id === value . value
243
270
} )
244
271
if ( preset [ 0 ] ?. id !== '' ) {
245
- if ( preset [ 0 ] ?. params [ set ] ) {
246
- onChange ( preset [ 0 ] ?. params [ set ] )
272
+ if ( set == 'endpoint' ) {
273
+ debounceEndpointChange ( preset [ 0 ] ?. params [ set ] )
274
+ }
275
+ if ( set == '$select' ) {
276
+ if ( preset [ 0 ] ?. params [ set ] ) {
277
+ var properties = preset [ 0 ] . params [ set ] . split ( ',' )
278
+ var selectedProps = properties . map ( ( prop ) => {
279
+ return {
280
+ label : prop ,
281
+ value : prop ,
282
+ }
283
+ } )
284
+ onChange ( selectedProps )
285
+ } else {
286
+ onChange ( '' )
287
+ }
247
288
} else {
248
- onChange ( preset [ 0 ] [ set ] )
289
+ if ( preset [ 0 ] ?. params [ set ] ) {
290
+ onChange ( preset [ 0 ] ?. params [ set ] )
291
+ } else {
292
+ onChange ( preset [ 0 ] [ set ] )
293
+ }
249
294
}
250
295
}
251
296
}
@@ -263,6 +308,10 @@ const GraphExplorer = () => {
263
308
264
309
function getPresetProps ( values ) {
265
310
var newvals = Object . assign ( { } , values )
311
+ console . log ( newvals )
312
+ if ( newvals ?. $select !== undefined && Array . isArray ( newvals ?. $select ) ) {
313
+ newvals . $select = newvals ?. $select . map ( ( p ) => p . value ) . join ( ',' )
314
+ }
266
315
delete newvals [ 'reportTemplate' ]
267
316
delete newvals [ 'tenantFilter' ]
268
317
delete newvals [ 'IsShared' ]
@@ -454,19 +503,38 @@ const GraphExplorer = () => {
454
503
placeholder = "Enter the Graph Endpoint you'd like to run the custom report for."
455
504
/>
456
505
< WhenFieldChanges field = "reportTemplate" set = "endpoint" />
506
+ < WhenFieldChanges field = "endpoint" set = "endpoint" />
457
507
< RFFCFormInput
458
508
type = "text"
459
509
name = "$filter"
460
510
label = "Filter"
461
511
placeholder = "Enter the filter string for the Graph query"
462
512
/>
463
513
< WhenFieldChanges field = "reportTemplate" set = "$filter" />
464
- < RFFCFormInput
465
- type = "text"
466
- name = "$select"
467
- label = "Select"
468
- placeholder = "Select the columns to use for this query"
469
- />
514
+ < div className = "mb-3" >
515
+ < RFFSelectSearch
516
+ name = "$select"
517
+ label = "Select"
518
+ placeholder = "Select the columns to use for this query"
519
+ retainInput = { true }
520
+ multi = { true }
521
+ values = {
522
+ availableProperties ?. data ?. Results
523
+ ? availableProperties ?. data ?. Results . map ( ( prop ) => {
524
+ return {
525
+ name : prop ,
526
+ value : prop ,
527
+ }
528
+ } )
529
+ : [ ]
530
+ }
531
+ allowCreate = { true }
532
+ refreshFunction = { ( ) =>
533
+ setRandom3 ( ( Math . random ( ) + 1 ) . toString ( 36 ) . substring ( 7 ) )
534
+ }
535
+ isLoading = { availableProperties . isFetching }
536
+ />
537
+ </ div >
470
538
< WhenFieldChanges field = "reportTemplate" set = "$select" />
471
539
< RFFCFormInput
472
540
type = "text"
@@ -504,6 +572,11 @@ const GraphExplorer = () => {
504
572
< hr />
505
573
< CippPage title = "Report Results" tenantSelector = { false } >
506
574
{ ! searchNow && < span > Execute a search to get started.</ span > }
575
+ { graphrequest . isFetching && (
576
+ < div className = "my-2" >
577
+ < CSpinner className = "me-2" /> Loading Data
578
+ </ div >
579
+ ) }
507
580
{ graphrequest . isSuccess && QueryColumns . set && searchNow && (
508
581
< CCard className = "content-card" >
509
582
< CCardHeader className = "d-flex justify-content-between align-items-center" >
0 commit comments