Skip to content

Commit 0a6689a

Browse files
committed
FIX Wizard list create
1 parent e555355 commit 0a6689a

File tree

4 files changed

+139
-151
lines changed

4 files changed

+139
-151
lines changed

src/web/wizard/components/lists/AlertListDisplay.jsx

Lines changed: 110 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -15,134 +15,107 @@
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';
2120
import { LinkContainer } from 'react-router-bootstrap';
2221
import Reflux from 'reflux';
23-
import { Button, Tooltip } from 'components/bootstrap';
22+
import { Button } from 'components/bootstrap';
2423
import { toDateObject } from 'util/DateTime';
2524
import { DataTable, IfPermitted, OverlayTrigger, Spinner, Timestamp } from 'components/common';
26-
import PermissionsMixin from 'util/PermissionsMixin';
2725
import Routes from 'routing/Routes';
28-
import AlertListStore from 'wizard/stores/AlertListStore';
2926
import AlertListActions from 'wizard/actions/AlertListActions';
27+
import AlertListStore from 'wizard/stores/AlertListStore';
3028
import 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;

src/web/wizard/components/lists/CreateListFormInput.jsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,11 @@ class CreateListFormInput extends React.Component {
6969
);
7070

7171
const buttonSave = (
72-
<LinkContainer to={Routes.pluginRoute('WIZARD_LISTS')}>
73-
<Button onClick={() => this.props.onSave(this.state.list)}
74-
disabled={this.state.list.title === '' || this.state.list.lists === ''}
75-
className="btn btn-primary">
76-
<FormattedMessage id="wizard.save" defaultMessage="Save"/>
77-
</Button>
78-
</LinkContainer>
72+
<Button onClick={() => this.props.onSave(this.state.list)}
73+
disabled={this.state.list.title === '' || this.state.list.lists === ''}
74+
bsStyle="primary" className="btn btn-primary">
75+
<FormattedMessage id="wizard.save" defaultMessage="Save" />
76+
</Button>
7977
);
8078

8179
const actions = (

src/web/wizard/pages/NewAlertListPage.jsx

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,34 @@
2121
// * pages/NodesPage.jsx
2222
import React from 'react';
2323
import { Button, Col, Row } from 'components/bootstrap';
24+
import useHistory from 'routing/useHistory';
2425
import { LinkContainer } from 'react-router-bootstrap';
2526
import { DocumentTitle, PageHeader } from 'components/common';
2627
import Routes from 'routing/Routes';
2728
import { IntlProvider, FormattedMessage } from 'react-intl';
2829
import messages_fr from 'translations/fr.json';
2930
import CreateListFormInput from 'wizard/components/lists/CreateListFormInput';
3031
import AlertListActions from 'wizard/actions/AlertListActions';
32+
import Navigation from "../routing/Navigation";
3133

3234
const language = navigator.language.split(/[-_]/)[0];
3335

3436
const messages = {
3537
'fr': messages_fr
3638
};
3739

38-
function _save(list) {
39-
AlertListActions.create(list);
40-
}
41-
4240
const NewAlertListPage = () => {
41+
const history = useHistory();
42+
43+
const _save = (list) => {
44+
AlertListActions.create(list).then(response => {
45+
if (response !== true) {
46+
return;
47+
}
48+
history.push(Navigation.getWizardListRoute());
49+
});
50+
};
51+
4352
return (
4453
<IntlProvider locale={language} messages={messages[language]}>
4554
<DocumentTitle title="New list">

0 commit comments

Comments
 (0)