1616 * along with this program. If not, see <https://www.gnu.org/licenses/>.
1717 */
1818
19- import { Component } from 'react' ;
19+ import { useState } from 'react' ;
2020import { translate } from '../../helpers/language' ;
2121
2222import AlertItem from './AlertItem' ;
2323import QuietFor from './QuietFor' ;
2424
2525import { Alert } from 'types/hostAndServiceTypes' ;
2626import { ClientSettings } from 'types/settings' ;
27+ import { useAtomValue } from 'jotai' ;
28+ import { alertSearchTextAtom } from '../../atoms/alertAtom' ;
2729// CSS
2830import '../animation.css' ;
2931import '../services/ServiceItems.css' ;
@@ -35,92 +37,90 @@ interface AlertItemsProps {
3537 isDemoMode : boolean ;
3638}
3739
38- class AlertItems extends Component < AlertItemsProps > {
40+ const AlertItems = ( { items , settings , isDemoMode } : AlertItemsProps ) = > {
3941
40- constructor ( props : AlertItemsProps ) {
41- super ( props ) ;
42+ const alertSearchText = useAtomValue ( alertSearchTextAtom ) ;
4243
43- this . showMore = this . showMore . bind ( this ) ;
44- this . showLess = this . showLess . bind ( this ) ;
45- }
44+ const [ howManyToRender , setHowManyToRender ] = useState ( 100 ) ;
45+ const pageSize = 100 ;
4646
47- state = {
48- howManyToRender : 100 , // This value is updated when user clicks showMore or showLess.
49- pageSize : 100 // This stays const
47+ const showMore = ( ) => {
48+ setHowManyToRender ( prev => prev + pageSize ) ;
5049 } ;
5150
52- showMore ( ) {
53- this . setState ( {
54- howManyToRender : this . state . howManyToRender + this . state . pageSize
55- } ) ;
56- }
57-
58- showLess ( ) {
59- this . setState ( {
60- howManyToRender : this . state . howManyToRender - this . state . pageSize
61- } ) ;
62- }
63-
64- render ( ) {
51+ const showLess = ( ) => {
52+ setHowManyToRender ( prev => prev - pageSize ) ;
53+ } ;
6554
66- const filteredHistoryArray = this . props . items . filter ( item => {
67- if ( this . props . settings . hideAlertSoft ) {
68- if ( item . state_type === 2 ) { return false ; }
55+ const filteredHistoryArray = items . filter ( item => {
56+ if ( settings . hideAlertSoft ) {
57+ if ( item . state_type === 2 ) { return false ; }
58+ }
59+ // search filter
60+ if ( alertSearchText ) {
61+ const searchLower = alertSearchText . toLowerCase ( ) ;
62+ const matchesSearch =
63+ ( item . name && item . name . toLowerCase ( ) . includes ( searchLower ) ) ||
64+ ( item . host_name && item . host_name . toLowerCase ( ) . includes ( searchLower ) ) ||
65+ ( item . description && item . description . toLowerCase ( ) . includes ( searchLower ) ) ||
66+ ( item . plugin_output && item . plugin_output . toLowerCase ( ) . includes ( searchLower ) ) ;
67+ if ( ! matchesSearch ) {
68+ return false ;
6969 }
70- return true ;
71- } ) ;
70+ }
71+ return true ;
72+ } ) ;
7273
73- let trimmedItems = [ ...filteredHistoryArray ] ;
74- trimmedItems . length = this . state . howManyToRender ;
75- const { language, locale, dateFormat } = this . props . settings ;
74+ let trimmedItems = [ ...filteredHistoryArray ] ;
75+ trimmedItems . length = howManyToRender ;
76+ const { language, locale, dateFormat } = settings ;
7677
77- return (
78+ return (
7879 < div className = "AlertItems" >
7980 { /* always show one quiet for (if we have at least 1 item) */ }
80- { this . props . items . length > 1 &&
81+ { items . length > 1 &&
8182 < QuietFor
8283 nowtime = { new Date ( ) . getTime ( ) }
83- prevtime = { this . props . items [ 0 ] . timestamp }
84- //showEmoji={this.props. settings.showEmoji}
84+ prevtime = { items [ 0 ] . timestamp }
85+ //showEmoji={settings.showEmoji}
8586 language = { language }
8687 />
8788 }
8889
8990 { /* loop through the trimmed items */ }
9091 { trimmedItems . map ( ( e , i ) => {
9192 const host = ( e . object_type === 1 ? e . name : e . host_name ) ;
92- const prevtime = ( i > 0 ? this . props . items [ i - 1 ] . timestamp : 0 ) ;
93+ const prevtime = ( i > 0 ? items [ i - 1 ] . timestamp : 0 ) ;
9394 return (
9495 < AlertItem
9596 key = { 'alert-' + host + '-' + e . object_type + '-' + e . timestamp + '-' + i }
9697 e = { e }
9798 i = { i }
9899 prevtime = { prevtime }
99- //showEmoji={this.props. showEmoji}
100+ //showEmoji={showEmoji}
100101 language = { language }
101102 locale = { locale }
102103 dateFormat = { dateFormat }
103- settings = { this . props . settings }
104- isDemoMode = { this . props . isDemoMode }
104+ settings = { settings }
105+ isDemoMode = { isDemoMode }
105106 />
106107 ) ;
107108 } ) }
108109
109110 < div className = "ShowMoreArea" >
110- { this . state . howManyToRender > this . state . pageSize &&
111+ { howManyToRender > pageSize &&
111112 < span >
112- < button className = "uppercase-first" onClick = { this . showLess } > { translate ( 'show less' , language ) } </ button >
113+ < button className = "uppercase-first" onClick = { showLess } > { translate ( 'show less' , language ) } </ button >
113114 </ span >
114115 }
115- { this . props . items . length > this . state . howManyToRender &&
116+ { items . length > howManyToRender &&
116117 < span >
117- < button className = "uppercase-first" onClick = { this . showMore } > { translate ( 'show more' , language ) } </ button >
118+ < button className = "uppercase-first" onClick = { showMore } > { translate ( 'show more' , language ) } </ button >
118119 </ span >
119120 }
120121 </ div >
121122 </ div >
122- ) ;
123- }
124- }
123+ ) ;
124+ } ;
125125
126126export default AlertItems ;
0 commit comments