1515 * <http://www.mongodb.com/licensing/server-side-public-license>.
1616 */
1717
18- import PropTypes from 'prop-types' ;
19- import React from 'react' ;
20- import { injectIntl , FormattedMessage } from 'react-intl' ;
18+ import React , { useEffect , useState } from 'react' ;
19+ import { useIntl , FormattedMessage } from 'react-intl' ;
2120import { LinkContainer } from 'react-router-bootstrap' ;
2221import Reflux from 'reflux' ;
23- import { Button , Tooltip } from 'components/bootstrap' ;
22+ import { Button } from 'components/bootstrap' ;
2423import { toDateObject } from 'util/DateTime' ;
2524import { DataTable , IfPermitted , OverlayTrigger , Spinner , Timestamp } from 'components/common' ;
26- import PermissionsMixin from 'util/PermissionsMixin' ;
2725import Routes from 'routing/Routes' ;
28- import AlertListStore from 'wizard/stores/AlertListStore' ;
2926import AlertListActions from 'wizard/actions/AlertListActions' ;
27+ import AlertListStore from 'wizard/stores/AlertListStore' ;
3028import AlertListCloneForm from './AlertListCloneForm' ;
31- import { CurrentUserStore } from 'stores/users/CurrentUserStore' ;
32-
33-
34- class AlertListDisplay extends React . Component {
35-
36- mixins = [ Reflux . connect ( CurrentUserStore ) , Reflux . connect ( AlertListStore ) , PermissionsMixin ]
37-
38- static propTypes = {
39- config : PropTypes . object . isRequired ,
40- }
41-
42- constructor ( props ) {
43- super ( props ) ;
44-
45- const { intl } = this . props ;
46- const fieldsTitle = {
47- title : intl . formatMessage ( { id : "wizard.title" , defaultMessage : "Title" } ) ,
48- description : intl . formatMessage ( { id : "wizard.fieldDescription" , defaultMessage : "Description" } ) ,
49- created : intl . formatMessage ( { id : "wizard.created" , defaultMessage : "Created" } ) ,
50- lastModified : intl . formatMessage ( { id : "wizard.lastModified" , defaultMessage : "Last Modified" } ) ,
51- user : intl . formatMessage ( { id : "wizard.user" , defaultMessage : "User" } ) ,
52- usage : intl . formatMessage ( { id : "wizard.usage" , defaultMessage : "Usage" } ) ,
53- lists : intl . formatMessage ( { id : "wizard.lists" , defaultMessage : "Lists" } ) ,
54- actions : intl . formatMessage ( { id : "wizard.actions" , defaultMessage : "Actions" } ) ,
55- } ;
56- const messages = {
57- infoDelete : intl . formatMessage ( { id : "wizard.buttonInfoDeleteList" , defaultMessage : "Delete this alert list" } ) ,
58- infoNoDelete : intl . formatMessage ( { id : "wizard.buttonInfoNoDeleteList" , defaultMessage : "List used in alert rules" } ) ,
59- infoUpdate : intl . formatMessage ( { id : "wizard.buttonInfoUpdateList" , defaultMessage : "Edit this alert list" } ) ,
60- createAlertList : intl . formatMessage ( { id : "wizard.createAlertList" , defaultMessage : "Create alert list" } ) ,
61- importAlertList : intl . formatMessage ( { id : "wizard.importAlertList" , defaultMessage : "Import alert list" } ) ,
62- exportAlertList : intl . formatMessage ( { id : "wizard.exportAlertList" , defaultMessage :"Export alert list" } ) ,
63- confirmDeletion : intl . formatMessage ( { id : "wizard.confirmDeletionList" , defaultMessage :"Do you really want to delete the alert list" } ) ,
64- } ;
65-
66- this . state = {
67- fieldsTitle : fieldsTitle ,
68- messages : messages ,
69- lists : [ ]
70- } ;
71- }
72-
73- componentDidMount ( ) {
74- this . list ( ) ;
75- }
7629
77- list ( ) {
30+ const AlertListDisplay = ( { config} ) => {
31+ const intl = useIntl ( ) ;
32+
33+ const fieldsTitle = {
34+ title : intl . formatMessage ( { id : "wizard.title" , defaultMessage : "Title" } ) ,
35+ description : intl . formatMessage ( { id : "wizard.fieldDescription" , defaultMessage : "Description" } ) ,
36+ created : intl . formatMessage ( { id : "wizard.created" , defaultMessage : "Created" } ) ,
37+ lastModified : intl . formatMessage ( { id : "wizard.lastModified" , defaultMessage : "Last Modified" } ) ,
38+ user : intl . formatMessage ( { id : "wizard.user" , defaultMessage : "User" } ) ,
39+ usage : intl . formatMessage ( { id : "wizard.usage" , defaultMessage : "Usage" } ) ,
40+ lists : intl . formatMessage ( { id : "wizard.lists" , defaultMessage : "Lists" } ) ,
41+ actions : intl . formatMessage ( { id : "wizard.actions" , defaultMessage : "Actions" } ) ,
42+ } ;
43+
44+ const messages = {
45+ infoDelete : intl . formatMessage ( { id : "wizard.buttonInfoDeleteList" , defaultMessage : "Delete this alert list" } ) ,
46+ infoNoDelete : intl . formatMessage ( { id : "wizard.buttonInfoNoDeleteList" , defaultMessage : "List used in alert rules" } ) ,
47+ infoUpdate : intl . formatMessage ( { id : "wizard.buttonInfoUpdateList" , defaultMessage : "Edit this alert list" } ) ,
48+ createAlertList : intl . formatMessage ( { id : "wizard.createAlertList" , defaultMessage : "Create alert list" } ) ,
49+ importAlertList : intl . formatMessage ( { id : "wizard.importAlertList" , defaultMessage : "Import alert list" } ) ,
50+ exportAlertList : intl . formatMessage ( { id : "wizard.exportAlertList" , defaultMessage :"Export alert list" } ) ,
51+ confirmDeletion : intl . formatMessage ( { id : "wizard.confirmDeletionList" , defaultMessage :"Do you really want to delete the alert list" } ) ,
52+ } ;
53+
54+ const availableFieldName = [
55+ { value : 'Description' , label : fieldsTitle . description } ,
56+ { value : 'Created' , label : fieldsTitle . created } ,
57+ { value : 'Last Modified' , label : fieldsTitle . lastModified } ,
58+ { value : 'User' , label : fieldsTitle . user } ,
59+ { value : 'Usage' , label : fieldsTitle . usage } ,
60+ { value : 'Lists' , label : fieldsTitle . lists } ,
61+ ] ;
62+
63+ const [ lists , setLists ] = useState ( [ ] ) ;
64+
65+ useEffect ( ( ) => {
66+ Reflux . connect ( AlertListStore ) ;
67+ _loadList ( ) ;
68+ } , [ ] ) ;
69+
70+ const _loadList = ( ) => {
7871 AlertListActions . list ( ) . then ( lists => {
79- this . setState ( {
80- fieldsTitle : this . state . fieldsTitle ,
81- messages : this . state . messages ,
82- lists : lists
83- } ) ;
72+ setLists ( lists ) ;
8473 } ) ;
85- }
86-
87- deleteAlertList ( name ) {
88- AlertListActions . deleteByName ( name ) ;
89- }
74+ } ;
9075
91- _deleteAlertListFunction ( name ) {
76+ const _deleteAlertListFunction = ( name ) => {
9277 return ( ) => {
93- if ( window . confirm ( `${ this . state . messages . confirmDeletion } "${ name } " ?` ) ) {
94- this . deleteAlertList ( name ) ;
78+ if ( window . confirm ( `${ messages . confirmDeletion } "${ name } " ?` ) ) {
79+ AlertListActions . deleteByName ( name ) ;
9580 }
9681 } ;
97- }
82+ } ;
9883
99- _headerCellFormatter ( header ) {
84+ const _headerCellFormatter = ( header ) => {
10085 let formattedHeaderCell ;
10186
10287 switch ( header . toLocaleLowerCase ( ) ) {
10388 case 'actions' :
104- formattedHeaderCell = < th className = "actions" > { header } </ th > ;
89+ formattedHeaderCell = ( < th className = "actions" > { header } </ th > ) ;
10590 break ;
10691 default :
107- formattedHeaderCell = < th > { header } </ th > ;
92+ formattedHeaderCell = ( < th > { header } </ th > ) ;
10893 }
10994
11095 return formattedHeaderCell ;
111- }
96+ } ;
11297
113- _onCloneSubmit ( name , title , description ) {
98+ const _onCloneSubmit = ( name , title , description ) => {
11499 AlertListActions . get ( name ) . then ( list => {
115100 const newList = {
116101 title : title ,
117102 description : description ,
118103 lists : list . lists
119104 }
120- AlertListActions . create ( newList ) . finally ( ( ) => this . list ( ) ) ;
105+ AlertListActions . create ( newList ) . finally ( ( ) => _loadList ( ) ) ;
121106 } ) ;
122- }
107+ } ;
123108
124- _availableFieldName ( ) {
125- return [
126- { value : 'Description' , label : this . state . fieldsTitle . description } ,
127- { value : 'Created' , label : this . state . fieldsTitle . created } ,
128- { value : 'Last Modified' , label : this . state . fieldsTitle . lastModified } ,
129- { value : 'User' , label : this . state . fieldsTitle . user } ,
130- { value : 'Usage' , label : this . state . fieldsTitle . usage } ,
131- { value : 'Lists' , label : this . state . fieldsTitle . lists } ,
132- ] ;
133- }
109+ const _getFieldName = ( field ) => {
110+ return availableFieldName . filter ( ( t ) => t . value === field ) [ 0 ] . label ;
111+ } ;
134112
135- _getFieldName ( field ) {
136- return this . _availableFieldName ( ) . filter ( ( t ) => t . value === field ) [ 0 ] . label ;
137- }
138-
139- // TODO shouldn't it be Button instead of button here?
140- _listInfoFormatter ( list ) {
113+ const _listInfoFormatter = ( list ) => {
141114 const deleteAction = (
142115 < IfPermitted permissions = "wizard_alerts_rules:delete" >
143116 < button id = "delete-list" type = "button" className = "btn btn-primary" disabled = { list . usage > 0 }
144- title = { list . usage ? this . state . messages . infoNoDelete : this . state . messages . infoDelete }
145- onClick = { this . _deleteAlertListFunction ( list . title ) } >
117+ title = { list . usage ? messages . infoNoDelete : messages . infoDelete }
118+ onClick = { _deleteAlertListFunction ( list . title ) } >
146119 < FormattedMessage id = "wizard.delete" defaultMessage = "Delete" />
147120 </ button >
148121 </ IfPermitted >
@@ -151,14 +124,14 @@ class AlertListDisplay extends React.Component {
151124 const updateList = (
152125 < IfPermitted permissions = "wizard_alerts_rules:read" >
153126 < LinkContainer to = { Routes . pluginRoute ( 'WIZARD_UPDATELIST_ALERTLISTTITLE' ) ( list . title . replace ( / \/ / g, '%2F' ) ) } >
154- < Button bsStyle = "info" type = "submit" title = { this . state . messages . infoUpdate } >
127+ < Button bsStyle = "info" type = "submit" title = { messages . infoUpdate } >
155128 < FormattedMessage id = "wizard.edit" defaultMessage = "Edit" />
156129 </ Button >
157130 </ LinkContainer >
158131 </ IfPermitted >
159132 ) ;
160133
161- const cloneList = < AlertListCloneForm listTitle = { list . title } onSubmit = { this . _onCloneSubmit } />
134+ const cloneList = < AlertListCloneForm listTitle = { list . title } onSubmit = { _onCloneSubmit } />
162135
163136 const actions = (
164137 < div className = "pull-left" >
@@ -171,7 +144,7 @@ class AlertListDisplay extends React.Component {
171144 const tooltipUser = ( < FormattedMessage id = "wizard.tooltipUserList" defaultMessage = "The last user who modified the list" /> ) ;
172145
173146 let tabFields = [ < td className = "limited" > { list . title } </ td > ] ;
174- this . props . config . field_order . map ( ( field ) => {
147+ config . field_order . map ( ( field ) => {
175148 if ( field . enabled ) {
176149 switch ( field . name ) {
177150 case 'Description' :
@@ -209,56 +182,54 @@ class AlertListDisplay extends React.Component {
209182 < td style = { { whiteSpace : 'nowrap' } } > { actions } </ td >
210183 </ tr >
211184 ) ;
212- }
213-
214- render ( ) {
185+ } ;
215186
187+ if ( lists ) {
216188 const filterKeys = [ 'title' , 'created_at' , 'last_modified' , 'creator_user_id' , 'lists' ] ;
217- let headers = [ this . state . fieldsTitle . title ] ;
218- this . props . config . field_order . map ( ( field ) => {
189+ const headers = [ fieldsTitle . title ] ;
190+ config . field_order . map ( ( field ) => {
219191 if ( field . enabled ) {
220- headers . push ( this . _getFieldName ( field . name ) ) ;
192+ headers . push ( _getFieldName ( field . name ) ) ;
221193 }
222194 } ) ;
223- headers . push ( this . state . fieldsTitle . actions ) ;
195+ headers . push ( fieldsTitle . actions ) ;
224196
225- if ( this . state . lists ) {
226- return (
227- < div >
228- < div className = "pull-right has-bm" >
229- < LinkContainer to = { Routes . pluginRoute ( 'WIZARD_NEWLIST' ) } >
230- < Button bsStyle = "success" type = "submit" title = { this . state . messages . createAlertList } >
231- < FormattedMessage id = "wizard.create" defaultMessage = "Create" />
232- </ Button >
233- </ LinkContainer >
234- { ' ' }
235- < LinkContainer to = { Routes . pluginRoute ( 'WIZARD_IMPORTLIST' ) } >
236- < Button bsStyle = "success" type = "submit" title = { this . state . messages . importAlertList } >
237- < FormattedMessage id = "wizard.import" defaultMessage = "Import" />
238- </ Button >
239- </ LinkContainer >
240- { ' ' }
241- < LinkContainer to = { Routes . pluginRoute ( 'WIZARD_EXPORTLIST' ) } >
242- < Button bsStyle = "success" type = "submit" title = { this . state . messages . exportAlertList } >
243- < FormattedMessage id = "wizard.export" defaultMessage = "Export" />
244- </ Button >
245- </ LinkContainer >
246- </ div >
247- < DataTable id = "alert-list"
248- className = "table-hover"
249- headers = { headers }
250- headerCellFormatter = { this . _headerCellFormatter }
251- sortByKey = { "title" }
252- rows = { this . state . lists }
253- filterBy = "title"
254- dataRowFormatter = { this . _listInfoFormatter }
255- filterLabel = { < FormattedMessage id = "wizard.filterlists" defaultMessage = "Filter lists" /> }
256- filterKeys = { filterKeys } />
257- </ div >
258- ) ;
259- }
260- return < Spinner />
197+ return (
198+ < div >
199+ < div className = "pull-right has-bm" >
200+ < LinkContainer to = { Routes . pluginRoute ( 'WIZARD_NEWLIST' ) } >
201+ < Button bsStyle = "success" type = "submit" title = { messages . createAlertList } >
202+ < FormattedMessage id = "wizard.create" defaultMessage = "Create" />
203+ </ Button >
204+ </ LinkContainer >
205+ { ' ' }
206+ < LinkContainer to = { Routes . pluginRoute ( 'WIZARD_IMPORTLIST' ) } >
207+ < Button bsStyle = "success" type = "submit" title = { messages . importAlertList } >
208+ < FormattedMessage id = "wizard.import" defaultMessage = "Import" />
209+ </ Button >
210+ </ LinkContainer >
211+ { ' ' }
212+ < LinkContainer to = { Routes . pluginRoute ( 'WIZARD_EXPORTLIST' ) } >
213+ < Button bsStyle = "success" type = "submit" title = { messages . exportAlertList } >
214+ < FormattedMessage id = "wizard.export" defaultMessage = "Export" />
215+ </ Button >
216+ </ LinkContainer >
217+ </ div >
218+ < DataTable id = "alert-list"
219+ className = "table-hover"
220+ headers = { headers }
221+ headerCellFormatter = { _headerCellFormatter }
222+ sortByKey = { "title" }
223+ rows = { lists }
224+ filterBy = "title"
225+ dataRowFormatter = { _listInfoFormatter }
226+ filterLabel = { < FormattedMessage id = "wizard.filterlists" defaultMessage = "Filter lists" /> }
227+ filterKeys = { filterKeys } />
228+ </ div >
229+ ) ;
230+ } else {
231+ return < Spinner />
261232 }
262- }
233+ } ;
263234
264- export default injectIntl ( AlertListDisplay ) ;
235+ export default AlertListDisplay ;
0 commit comments