11import React , { useEffect , useRef } from 'react'
2- import { AppEvents , PanelProps } from '@grafana/data'
2+ import { AppEvents , DataFrame , PanelProps } from '@grafana/data'
33import { getAppEvents } from '@grafana/runtime'
44import { Button , ContextMenu , Modal , Pagination , Tab , TabContent , Table , TabsBar } from '@grafana/ui'
55import { AlarmTableMenu } from './AlarmTableMenu'
6- import { AlarmTableModalContent } from './modal/AlarmTableModalContent'
76import { AlarmTableSelectionStyles } from './AlarmTableSelectionStyles'
87import { AlarmTableControlProps } from './AlarmTableTypes'
8+ import { useAlarm } from './hooks/useAlarm'
99import { useAlarmProperties } from './hooks/useAlarmProperties'
1010import { useAlarmTableMenuActions } from './hooks/useAlarmTableMenuActions'
1111import { useAlarmTableConfigDefaults } from './hooks/useAlarmTableConfigDefaults'
@@ -14,34 +14,36 @@ import { useAlarmTableRowHighlighter } from './hooks/useAlarmTableRowHighlighter
1414import { useAlarmTableSelection } from './hooks/useAlarmTableSelection'
1515import { useAlarmTableModalTabs } from './hooks/useAlarmTableModalTabs'
1616import { useOpenNMSClient } from '../../hooks/useOpenNMSClient'
17- import { useAlarm } from './hooks/useAlarm '
17+ import { AlarmTableModalContent } from './modal/AlarmTableModalContent '
1818import { capitalize } from 'lib/utils'
1919
2020export const AlarmTableControl : React . FC < PanelProps < AlarmTableControlProps > > = ( props ) => {
2121 const alarmIndexes = useRef < boolean [ ] > ( [ ] as boolean [ ] )
22-
23- const { state, setState, rowClicked, soloIndex } = useAlarmTableSelection ( ( ) => {
24- setDetailsModal ( true )
25- } )
22+ const selectedAlarmIds = useRef < Set < number > > ( new Set < number > ( ) )
23+ const filteredData = useRef < DataFrame > ( props ?. data ?. series [ 0 ] )
24+ const table = useRef < HTMLDivElement > ( null )
2625
2726 const { client } = useOpenNMSClient ( props . data ?. request ?. targets ?. [ 0 ] ?. datasource )
28- const { filteredProps, page, setPage, totalPages } = useAlarmProperties ( props ?. data ?. series [ 0 ] , props ?. options ?. alarmTable )
29- const { table, menu, menuOpen, setMenuOpen } = useAlarmTableMenu ( alarmIndexes , rowClicked , filteredProps , setState )
27+ const { page, setPage, totalPages } = useAlarmProperties ( filteredData , props ?. data ?. series [ 0 ] , props ?. options ?. alarmTable )
28+
29+ const { alarmControlState, setAlarmControlState, rowClicked, soloAlarmId } = useAlarmTableSelection ( ( ) => { setDetailsModal ( true ) } )
30+
31+ const { menu, menuOpen, setMenuOpen } = useAlarmTableMenu ( table , alarmIndexes , selectedAlarmIds , rowClicked , filteredData , setAlarmControlState )
3032
3133 const { actions, detailsModal, setDetailsModal } = useAlarmTableMenuActions (
32- state . indexes ,
33- props ?. data ?. series ?. [ 0 ] ?. fields || [ ] ,
34+ alarmControlState . selectedIndexes ,
35+ alarmControlState . selectedAlarmIds ,
3436 ( ) => setMenuOpen ( false ) ,
3537 ( actionName : string , results : any [ ] ) => displayActionNotice ( actionName , results ) ,
3638 props ?. options ?. alarmTable ?. alarmTableAdditional ?. useGrafanaUser ?? false ,
3739 client )
3840
3941 const { tabActive, tabClick, resetTabs } = useAlarmTableModalTabs ( )
40- const { alarm, goToAlarm, alarmQuery } = useAlarm ( props ?. data ?. series , soloIndex , client )
42+ const { alarm, goToAlarm, alarmQuery } = useAlarm ( filteredData , soloAlarmId , client )
4143
4244 const paginationRef = useRef < HTMLDivElement > ( null )
4345
44- useAlarmTableRowHighlighter ( state , table )
46+ useAlarmTableRowHighlighter ( alarmControlState , table , filteredData )
4547 useAlarmTableConfigDefaults ( props . fieldConfig , props . onFieldConfigChange , props . options )
4648
4749 /**
@@ -86,9 +88,10 @@ export const AlarmTableControl: React.FC<PanelProps<AlarmTableControlProps>> = (
8688 }
8789
8890 useEffect ( ( ) => {
89- alarmIndexes . current = state . indexes
91+ alarmIndexes . current = [ ...alarmControlState . selectedIndexes ]
92+ selectedAlarmIds . current = new Set ( alarmControlState . selectedAlarmIds )
9093 // eslint-disable-next-line react-hooks/exhaustive-deps
91- } , [ state ] )
94+ } , [ alarmControlState ] )
9295
9396 return (
9497 < div className = {
@@ -106,18 +109,19 @@ export const AlarmTableControl: React.FC<PanelProps<AlarmTableControlProps>> = (
106109 } >
107110 < AlarmTableSelectionStyles />
108111 < div className = 'alarm-table-wrapper' >
109- { alarmQuery ? < Table data = { filteredProps } width = { props . width } height = { props . height - calcPaginationHeight ( ) } /> :
110- < div > Select the Entity Datasource below, and choose an Alarm query to see results.</ div >
112+ { alarmQuery ?
113+ < Table data = { filteredData . current } width = { props . width } height = { props . height - calcPaginationHeight ( ) } /> :
114+ < div > Select the Entity Datasource below, and choose an Alarm query to see results.</ div >
111115 }
112116 </ div >
113117 { menuOpen && < ContextMenu
114118 x = { menu . x }
115119 y = { menu . y }
116120 onClose = { ( ) => {
117- resetTabs ( ) ;
118- setMenuOpen ( false ) ;
121+ resetTabs ( ) ;
122+ setMenuOpen ( false ) ;
119123 } }
120- renderMenuItems = { ( ) => < AlarmTableMenu state = { state } actions = { actions } /> }
124+ renderMenuItems = { ( ) => < AlarmTableMenu state = { alarmControlState } actions = { actions } /> }
121125 /> }
122126 < Modal isOpen = { detailsModal } title = 'Alarm Detail' onDismiss = { ( ) => setDetailsModal ( false ) } >
123127 < Button style = { { marginBottom : 12 } } onClick = { goToAlarm } > < i className = 'fa fa-external-link' > </ i > Full Details</ Button >
0 commit comments