1
1
import React , { useRef , useMemo , useState , useCallback , useEffect } from 'react'
2
- import { useSelector } from 'react-redux'
2
+ import { useDispatch , useSelector } from 'react-redux'
3
3
import { ExportCsvButton , ExportPDFButton } from 'src/components/buttons'
4
4
import {
5
5
CSpinner ,
@@ -10,9 +10,6 @@ import {
10
10
CDropdownMenu ,
11
11
CDropdownItem ,
12
12
CButton ,
13
- CModal ,
14
- CModalBody ,
15
- CModalTitle ,
16
13
CCallout ,
17
14
CFormSelect ,
18
15
CAccordion ,
@@ -32,15 +29,15 @@ import {
32
29
faFilePdf ,
33
30
faSearch ,
34
31
faSync ,
35
- faTasks ,
36
32
} from '@fortawesome/free-solid-svg-icons'
37
33
import { cellGenericFormatter } from './CellGenericFormat'
38
34
import { ModalService } from '../utilities'
39
35
import { useLazyGenericGetRequestQuery , useLazyGenericPostRequestQuery } from 'src/store/api/app'
40
- import { ConfirmModal } from '../utilities/SharedModal'
41
- import { debounce } from 'lodash-es'
36
+ import { debounce , update } from 'lodash-es'
42
37
import { useSearchParams } from 'react-router-dom'
43
38
import CopyToClipboard from 'react-copy-to-clipboard'
39
+ import { setDefaultColumns } from 'src/store/features/app'
40
+ import { end } from '@popperjs/core'
44
41
45
42
const FilterComponent = ( { filterText, onFilter, onClear, filterlist, onFilterPreset } ) => (
46
43
< >
@@ -126,6 +123,7 @@ export default function CippTable({
126
123
exportFiltered = false ,
127
124
filterlist,
128
125
showFilter = true ,
126
+ endpointName,
129
127
tableProps : {
130
128
keyField = 'id' ,
131
129
theme = 'cyberdrain' ,
@@ -150,10 +148,43 @@ export default function CippTable({
150
148
} ) {
151
149
const inputRef = useRef ( '' )
152
150
const [ loopRunning , setLoopRunning ] = React . useState ( false )
151
+ const defaultColumns = useSelector ( ( state ) => state . app . defaultColumns [ endpointName ] )
152
+ const [ defaultColumnsSet , setDefaultColumnsSet ] = React . useState ( false )
153
153
const [ massResults , setMassResults ] = React . useState ( [ ] )
154
154
const [ filterText , setFilterText ] = React . useState ( defaultFilterText )
155
155
const [ filterviaURL , setFilterviaURL ] = React . useState ( false )
156
+ const [ originalColumns , setOrginalColumns ] = React . useState ( columns )
156
157
const [ updatedColumns , setUpdatedColumns ] = React . useState ( columns )
158
+ if ( defaultColumns && defaultColumnsSet === false ) {
159
+ const defaultColumnsArray = defaultColumns . split ( ',' ) . filter ( ( item ) => item )
160
+
161
+ const actionsColumn = columns . length > 0 ? columns [ columns . length - 1 ] : null
162
+
163
+ let tempColumns = actionsColumn ? columns . slice ( 0 , - 1 ) : [ ...columns ]
164
+
165
+ defaultColumnsArray . forEach ( ( columnName ) => {
166
+ if ( ! tempColumns . find ( ( c ) => c . exportSelector === columnName && c ?. omit !== true ) ) {
167
+ tempColumns . push ( {
168
+ name : columnName ,
169
+ selector : ( row ) => row [ columnName ] ,
170
+ sortable : true ,
171
+ exportSelector : columnName ,
172
+ cell : cellGenericFormatter ( ) ,
173
+ } )
174
+ }
175
+ } )
176
+
177
+ if ( actionsColumn ) {
178
+ tempColumns . push ( actionsColumn )
179
+ }
180
+ let newColumns = tempColumns . filter (
181
+ ( column ) => defaultColumnsArray . includes ( column . exportSelector ) || column === actionsColumn ,
182
+ )
183
+
184
+ setUpdatedColumns ( newColumns )
185
+ setDefaultColumnsSet ( true )
186
+ }
187
+
157
188
const [ selectedRows , setSelectedRows ] = React . useState ( false )
158
189
const [ genericGetRequest , getResults ] = useLazyGenericGetRequestQuery ( )
159
190
const [ genericPostRequest , postResults ] = useLazyGenericPostRequestQuery ( )
@@ -171,6 +202,32 @@ export default function CippTable({
171
202
searchParams . delete ( 'updateTableFilter' )
172
203
}
173
204
205
+ // eslint-disable-next-line react-hooks/exhaustive-deps
206
+ const addColumn = ( columnname ) => {
207
+ let alreadyInArray = updatedColumns . some (
208
+ ( o ) => o . exportSelector === columnname && o ?. omit !== true ,
209
+ )
210
+ let newColumns = [ ...updatedColumns ]
211
+ const actionsColumn = newColumns . length > 0 ? newColumns . pop ( ) : null
212
+
213
+ if ( ! alreadyInArray ) {
214
+ const newColumn = {
215
+ name : columnname ,
216
+ selector : ( row ) => row [ columnname ] ,
217
+ sortable : true ,
218
+ exportSelector : columnname ,
219
+ cell : cellGenericFormatter ( ) ,
220
+ }
221
+ newColumns . push ( newColumn )
222
+ } else {
223
+ newColumns = newColumns . filter ( ( o ) => o . exportSelector !== columnname )
224
+ }
225
+ if ( actionsColumn ) {
226
+ newColumns . push ( actionsColumn )
227
+ }
228
+ setUpdatedColumns ( newColumns )
229
+ }
230
+
174
231
const handleSelectedChange = ( { selectedRows } ) => {
175
232
setSelectedRows ( selectedRows )
176
233
if ( selectedRows . length < 1 ) {
@@ -272,12 +329,34 @@ export default function CippTable({
272
329
const applyFilter = ( e ) => {
273
330
setFilterText ( e . target . value )
274
331
}
332
+ // eslint-disable-next-line react-hooks/exhaustive-deps
333
+ const setColumnDefaultLayout = ( endpoint , columns ) => {
334
+ dispatch ( setDefaultColumns ( { endpoint, columns } ) )
335
+ }
275
336
337
+ const resetDropdown = ( ) => {
338
+ setUpdatedColumns ( originalColumns )
339
+ setColumnDefaultLayout ( endpointName , null )
340
+ }
341
+ const dispatch = useDispatch ( )
276
342
useEffect ( ( ) => {
277
- if ( columns !== updatedColumns ) {
278
- setUpdatedColumns ( columns )
343
+ if ( columns . length !== updatedColumns . length ) {
344
+ setUpdatedColumns ( updatedColumns )
345
+ setColumnDefaultLayout (
346
+ endpointName ,
347
+ updatedColumns . map ( ( column ) => column . exportSelector ) . join ( ',' ) ,
348
+ )
279
349
}
280
- } , [ columns , updatedColumns ] )
350
+ } , [
351
+ columns ,
352
+ defaultColumns ,
353
+ dispatch ,
354
+ dynamicColumns ,
355
+ originalColumns ,
356
+ endpointName ,
357
+ setColumnDefaultLayout ,
358
+ updatedColumns ,
359
+ ] )
281
360
282
361
createTheme (
283
362
'cyberdrain' ,
@@ -495,7 +574,7 @@ export default function CippTable({
495
574
}
496
575
497
576
const executeselectedAction = ( item ) => {
498
- console . log ( item )
577
+ // console.log(item)
499
578
setModalContent ( {
500
579
item,
501
580
} )
@@ -617,24 +696,6 @@ export default function CippTable({
617
696
618
697
if ( ! disablePDFExport ) {
619
698
if ( dynamicColumns === true ) {
620
- const addColumn = ( columnname ) => {
621
- var index = columns . length - 1
622
- let alreadyInArray = columns . find ( ( o ) => o . exportSelector === columnname )
623
- if ( ! alreadyInArray ) {
624
- columns . splice ( index , 0 , {
625
- name : columnname ,
626
- selector : ( row ) => row [ columnname ] ,
627
- sortable : true ,
628
- exportSelector : columnname ,
629
- cell : cellGenericFormatter ( ) ,
630
- } )
631
- } else {
632
- let indexOfExisting = columns . findIndex ( ( o ) => o . exportSelector === columnname )
633
- columns = columns . splice ( indexOfExisting , 1 )
634
- }
635
- setUpdatedColumns ( Date ( ) )
636
- }
637
-
638
699
defaultActions . push ( [
639
700
< CDropdown key = { 'column-selector' } className = "me-2" variant = "input-group" >
640
701
< CDropdownToggle
@@ -647,13 +708,14 @@ export default function CippTable({
647
708
< FontAwesomeIcon icon = { faColumns } />
648
709
</ CDropdownToggle >
649
710
< CDropdownMenu >
711
+ < CDropdownItem onClick = { ( ) => resetDropdown ( ) } > Reset to default</ CDropdownItem >
650
712
{ dataKeys ( ) &&
651
713
dataKeys ( ) . map ( ( item , idx ) => {
652
714
return (
653
715
< CDropdownItem key = { idx } onClick = { ( ) => addColumn ( item ) } >
654
- { columns . find ( ( o ) => o . exportSelector === item ) && (
655
- < FontAwesomeIcon icon = { faCheck } />
656
- ) } { ' ' }
716
+ { updatedColumns . find (
717
+ ( o ) => o . exportSelector === item && o ?. omit !== true ,
718
+ ) && < FontAwesomeIcon icon = { faCheck } /> } { ' ' }
657
719
{ item }
658
720
</ CDropdownItem >
659
721
)
@@ -778,18 +840,27 @@ export default function CippTable({
778
840
</ >
779
841
)
780
842
} , [
843
+ refreshFunction ,
781
844
actions ,
782
- selectedRows ,
783
845
disablePDFExport ,
784
846
disableCSVExport ,
847
+ selectedRows ,
848
+ actionsList ,
849
+ showFilter ,
785
850
filterText ,
786
851
filterlist ,
787
852
resetPaginationToggle ,
788
- data ,
853
+ handleModal ,
854
+ getDrowndownInfo ,
855
+ filteredItems ,
789
856
columns ,
857
+ data ,
858
+ dynamicColumns ,
790
859
reportName ,
791
- selectedRows ,
792
- filteredItems ,
860
+ resetDropdown ,
861
+ updatedColumns ,
862
+ addColumn ,
863
+ setGraphFilter ,
793
864
] )
794
865
const tablePageSize = useSelector ( ( state ) => state . app . tablePageSize )
795
866
const [ codeCopied , setCodeCopied ] = useState ( false )
@@ -803,7 +874,7 @@ export default function CippTable({
803
874
< div className = "ms-n3 me-n3 cipp-tablewrapper" >
804
875
{ ! isFetching && error && < CCallout color = "info" > Error loading data</ CCallout > }
805
876
< div >
806
- { ( columns . length === updatedColumns . length || ! dynamicColumns ) && (
877
+ { ( updatedColumns || ! dynamicColumns ) && (
807
878
< >
808
879
{ ( massResults . length >= 1 || loopRunning ) && (
809
880
< CCallout color = "info" >
@@ -900,7 +971,7 @@ export default function CippTable({
900
971
responsive = { responsive }
901
972
dense = { dense }
902
973
striped = { striped }
903
- columns = { columns }
974
+ columns = { updatedColumns }
904
975
data = { filteredItems }
905
976
expandableRows = { expandableRows }
906
977
expandableRowsComponent = { expandableRowsComponent }
0 commit comments