Skip to content

Commit c6b8c77

Browse files
author
Martin Krulis
committed
Fixing bugs, minor ux issues, refactoring, cleanups, and removing ugly hacks.
1 parent b8ae00c commit c6b8c77

File tree

13 files changed

+129
-187
lines changed

13 files changed

+129
-187
lines changed

src/components/SystemMessages/MessagesList/MessagesList.js

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,25 @@ import { defaultMemoize } from 'reselect';
77
import SortableTable, { SortableTableColumnDescriptor } from '../../widgets/SortableTable';
88
import { getLocalizedText } from '../../../helpers/localizedData';
99
import DateTime from '../../widgets/DateTime';
10-
import { roleLabels } from '../../helpers/usersRoles';
10+
import { roleLabels, rolePriorities } from '../../helpers/usersRoles';
1111
import UsersNameContainer from '../../../containers/UsersNameContainer';
1212
import FilterSystemMessagesForm from '../../forms/FilterSystemMessagesForm/FilterSystemMessagesForm';
1313

1414
import styles from './MessagesList.less';
1515

16-
const getVisibleMessages = (systemMessages, showAll) =>
17-
showAll ? systemMessages : systemMessages.filter(msg => msg.visibleTo * 1000 >= Date.now());
16+
const prepareData = defaultMemoize((systemMessages, showAll, renderActions) => {
17+
const filteredMessages = showAll ? systemMessages : systemMessages.filter(msg => msg.visibleTo * 1000 >= Date.now());
18+
19+
return filteredMessages.map(message => ({
20+
...message,
21+
text: { localizedTexts: message.localizedTexts },
22+
buttons: renderActions && renderActions(message),
23+
}));
24+
});
1825

1926
class MessagesList extends Component {
2027
state = { showAll: false, visibleMessages: [] };
2128

22-
componentDidMount() {
23-
this.setState({
24-
visibleMessages: getVisibleMessages(this.props.systemMessages, this.state.showAll),
25-
});
26-
}
27-
2829
prepareColumnDescriptors = defaultMemoize(locale => {
2930
const columns = [
3031
new SortableTableColumnDescriptor(
@@ -44,6 +45,7 @@ class MessagesList extends Component {
4445
{
4546
comparator: ({ visibleFrom: f1 }, { visibleFrom: f2 }) => f2 - f1,
4647
cellRenderer: visibleFrom => visibleFrom && <DateTime unixts={visibleFrom} />,
48+
className: 'valign-middle',
4749
}
4850
),
4951

@@ -53,19 +55,22 @@ class MessagesList extends Component {
5355
{
5456
comparator: ({ visibleTo: t1 }, { visibleTo: t2 }) => t2 - t1,
5557
cellRenderer: visibleTo => visibleTo && <DateTime unixts={visibleTo} />,
58+
className: 'valign-middle',
5659
}
5760
),
5861

5962
new SortableTableColumnDescriptor('authorId', <FormattedMessage id="generic.author" defaultMessage="Author" />, {
60-
cellRenderer: authorId => authorId && <UsersNameContainer userId={authorId} />,
63+
cellRenderer: authorId => authorId && <UsersNameContainer userId={authorId} size={8} />,
64+
className: 'valign-middle',
6165
}),
6266

6367
new SortableTableColumnDescriptor(
6468
'role',
6569
<FormattedMessage id="app.systemMessagesList.role" defaultMessage="Role" />,
6670
{
67-
comparator: ({ role: r1 }, { role: r2 }) => r1.localeCompare(r2, locale),
71+
comparator: ({ role: r1 }, { role: r2 }) => Number(rolePriorities[r2]) - Number(rolePriorities[r1]),
6872
cellRenderer: role => role && roleLabels[role],
73+
className: 'valign-middle',
6974
}
7075
),
7176

@@ -75,37 +80,22 @@ class MessagesList extends Component {
7580
{
7681
comparator: ({ type: t1 }, { type: t2 }) => t1.localeCompare(t2, locale),
7782
cellRenderer: type => type && <Alert bsStyle={type} className={styles.alertType} />,
83+
className: 'text-center valign-middle',
7884
}
7985
),
8086

8187
new SortableTableColumnDescriptor('buttons', '', {
82-
className: 'text-right',
88+
className: 'text-right valign-middle',
8389
}),
8490
];
8591

8692
return columns;
8793
});
8894

89-
prepareData = defaultMemoize(systemMessages => {
90-
const { renderActions } = this.props;
91-
92-
return systemMessages.map(message => {
93-
const data = {
94-
text: { localizedTexts: message.localizedTexts },
95-
visibleFrom: message.visibleFrom,
96-
visibleTo: message.visibleTo,
97-
authorId: message.authorId,
98-
role: message.role,
99-
type: message.type,
100-
buttons: renderActions && renderActions(message),
101-
};
102-
return data;
103-
});
104-
});
105-
10695
render() {
10796
const {
10897
systemMessages,
98+
renderActions,
10999
intl: { locale },
110100
} = this.props;
111101

@@ -115,17 +105,17 @@ class MessagesList extends Component {
115105
onSubmit={({ showAll }) => {
116106
this.setState({
117107
showAll: showAll,
118-
visibleMessages: getVisibleMessages(systemMessages, showAll),
119108
});
120109
return Promise.resolve();
121110
}}
122111
initialValues={{ showAll: this.state.showAll }}
123112
/>
113+
<hr className="no-margin" />
124114
<SortableTable
125115
hover
126116
columns={this.prepareColumnDescriptors(locale)}
127117
defaultOrder="visibleTo"
128-
data={this.prepareData(this.state.visibleMessages)}
118+
data={prepareData(systemMessages, this.state.showAll, renderActions)}
129119
empty={
130120
<div className="text-center text-muted">
131121
<FormattedMessage
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
.alertType {
2-
margin-bottom: 0px;
3-
padding: 10px;
4-
height: 10px;
5-
width: 10px;
2+
margin: 0px;
3+
padding: 0px;
4+
height: 16px;
5+
width: 16px;
6+
display: inline-block;
67
}
78

89
.textPreview {
910
overflow: hidden;
1011
text-overflow: ellipsis;
1112
white-space: nowrap;
12-
max-width: 20vw;
13+
max-width: 20vw;
14+
vertical-align: middle !important;
1315
}

src/components/forms/EditSystemMessageForm/EditSystemMessageForm.js

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
33
import { reduxForm, Field, FieldArray } from 'redux-form';
44
import { FormattedMessage, injectIntl, intlShape } from 'react-intl';
55
import { Alert, Modal } from 'react-bootstrap';
6-
import moment from 'moment';
6+
import { defaultMemoize } from 'reselect';
77

88
import { SelectField, DatetimeField } from '../Fields';
99
import SubmitButton from '../SubmitButton';
@@ -21,24 +21,34 @@ const typeOptions = [
2121
{ key: 'danger', name: 'Danger' },
2222
];
2323

24+
const getRoleOptions = defaultMemoize(formatMessage =>
25+
Object.keys(roleLabelsSimpleMessages).map(role => ({
26+
key: role,
27+
name: formatMessage(roleLabelsSimpleMessages[role]),
28+
}))
29+
);
30+
2431
const EditSystemMessageForm = ({
25-
initialValues,
2632
error,
2733
dirty,
2834
submitting,
2935
handleSubmit,
3036
submitFailed,
3137
submitSucceeded,
3238
invalid,
33-
asyncValidating,
3439
isOpen,
3540
onClose,
36-
intl: { formatMessage },
41+
createNew = false,
42+
intl: { locale, formatMessage },
3743
}) => (
3844
<Modal show={isOpen} backdrop="static" size="lg" onHide={onClose}>
3945
<Modal.Header closeButton>
4046
<Modal.Title>
41-
<FormattedMessage id="app.editSystemMessageForm.title" defaultMessage="Edit System Message" />
47+
{createNew ? (
48+
<FormattedMessage id="app.editSystemMessageForm.title" defaultMessage="Edit System Message" />
49+
) : (
50+
<FormattedMessage id="app.editSystemMessageForm.title" defaultMessage="Edit System Message" />
51+
)}
4252
</Modal.Title>
4353
</Modal.Header>
4454
<Modal.Body>
@@ -54,18 +64,13 @@ const EditSystemMessageForm = ({
5464
name="type"
5565
component={SelectField}
5666
options={typeOptions}
57-
addEmptyOption
5867
label={<FormattedMessage id="app.editSystemMessageForm.type" defaultMessage="Type of the notification." />}
5968
/>
6069

6170
<Field
6271
name="role"
6372
component={SelectField}
64-
options={Object.keys(roleLabelsSimpleMessages).map(role => ({
65-
key: role,
66-
name: formatMessage(roleLabelsSimpleMessages[role]),
67-
}))}
68-
addEmptyOption
73+
options={getRoleOptions(formatMessage)}
6974
label={
7075
<FormattedMessage
7176
id="app.editSystemMessageForm.role"
@@ -108,7 +113,6 @@ const EditSystemMessageForm = ({
108113
hasSucceeded={submitSucceeded}
109114
hasFailed={submitFailed}
110115
handleSubmit={handleSubmit}
111-
asyncValidating={asyncValidating}
112116
messages={{
113117
submit: <FormattedMessage id="generic.save" defaultMessage="Save" />,
114118
submitting: <FormattedMessage id="generic.saving" defaultMessage="Saving..." />,
@@ -128,18 +132,16 @@ const EditSystemMessageForm = ({
128132

129133
EditSystemMessageForm.propTypes = {
130134
error: PropTypes.any,
131-
initialValues: PropTypes.object.isRequired,
132-
values: PropTypes.object,
133135
handleSubmit: PropTypes.func.isRequired,
134136
dirty: PropTypes.bool,
135137
submitting: PropTypes.bool,
136138
submitFailed: PropTypes.bool,
137139
submitSucceeded: PropTypes.bool,
138140
invalid: PropTypes.bool,
139-
asyncValidating: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
140141
links: PropTypes.object,
141142
isOpen: PropTypes.bool.isRequired,
142143
onClose: PropTypes.func.isRequired,
144+
createNew: PropTypes.bool,
143145
intl: intlShape.isRequired,
144146
};
145147

@@ -160,7 +162,7 @@ const validate = ({ localizedTexts, type, role, visibleFrom, visibleTo }) => {
160162
});
161163

162164
if (!visibleFrom) {
163-
errors['visibleFrom'] = (
165+
errors.visibleFrom = (
164166
<FormattedMessage
165167
id="app.editSystemMessageForm.validation.visibleFromEmpty"
166168
defaultMessage="The visible from date must be set."
@@ -169,25 +171,16 @@ const validate = ({ localizedTexts, type, role, visibleFrom, visibleTo }) => {
169171
}
170172

171173
if (!visibleTo) {
172-
errors['visibleTo'] = (
174+
errors.visibleTo = (
173175
<FormattedMessage
174176
id="app.editSystemMessageForm.validation.visibleToEmpty"
175177
defaultMessage="The visible to date must be set."
176178
/>
177179
);
178180
}
179181

180-
if (visibleTo.isBefore(moment.unix(Date.now() / 1000))) {
181-
errors['visibleTo'] = (
182-
<FormattedMessage
183-
id="app.editSystemMessageForm.validation.visibleToInHistory"
184-
defaultMessage="The visible to date cannot be in the past."
185-
/>
186-
);
187-
}
188-
189182
if (visibleTo.isBefore(visibleFrom)) {
190-
errors['visibleFrom'] = (
183+
errors.visibleFrom = (
191184
<FormattedMessage
192185
id="app.editSystemMessageForm.validation.visibleFromBeforeTo"
193186
defaultMessage="The visible from date cannot be after visible to date."
@@ -196,7 +189,7 @@ const validate = ({ localizedTexts, type, role, visibleFrom, visibleTo }) => {
196189
}
197190

198191
if (!type) {
199-
errors['type'] = (
192+
errors.type = (
200193
<FormattedMessage
201194
id="app.editSystemMessageForm.validation.typeEmpty"
202195
defaultMessage="Type of the notification must be set."
@@ -205,7 +198,7 @@ const validate = ({ localizedTexts, type, role, visibleFrom, visibleTo }) => {
205198
}
206199

207200
if (!role) {
208-
errors['role'] = (
201+
errors.role = (
209202
<FormattedMessage
210203
id="app.editSystemMessageForm.validation.roleEmpty"
211204
defaultMessage="Base user role of the notification muset be set."

src/components/forms/FilterSystemMessagesForm/FilterSystemMessagesForm.js

Lines changed: 33 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import { FormattedMessage, injectIntl, intlShape } from 'react-intl';
44
import { reduxForm, Field } from 'redux-form';
5-
import { Alert, Well, Grid, Row, Col, Form } from 'react-bootstrap';
5+
import { Grid, Row, Col, Form } from 'react-bootstrap';
66

77
import SubmitButton from '../SubmitButton';
88
import { CheckboxField } from '../Fields';
@@ -17,50 +17,40 @@ const FilterSystemMessagesForm = ({
1717
intl: { locale },
1818
}) => (
1919
<Form method="POST" onSubmit={onSubmit}>
20-
<Well bsSize="sm">
21-
{submitFailed && (
22-
<Alert bsStyle="danger">
23-
<FormattedMessage id="generic.operationFailed" defaultMessage="Operation failed. Please try again later." />
24-
</Alert>
25-
)}
26-
27-
<Grid fluid>
28-
<Row>
29-
<Col sm={9} md={10}>
30-
<span className="text-nowrap pull-left em-padding-right">
31-
<Field
32-
name="showAll"
33-
component={CheckboxField}
34-
onOff
35-
label={
36-
<FormattedMessage
37-
id="app.systemMessagesList.showAll"
38-
defaultMessage="Show all messages (including expired)"
39-
/>
40-
}
20+
<Grid fluid>
21+
<Row>
22+
<Col sm={9} md={10}>
23+
<Field
24+
name="showAll"
25+
component={CheckboxField}
26+
onOff
27+
label={
28+
<FormattedMessage
29+
id="app.systemMessagesList.showAll"
30+
defaultMessage="Show all messages (including expired)"
4131
/>
42-
</span>
43-
</Col>
32+
}
33+
/>
34+
</Col>
4435

45-
<Col sm={3} md={2}>
46-
<div className="text-right">
47-
<SubmitButton
48-
id="setFilters"
49-
handleSubmit={handleSubmit}
50-
hasSucceeded={submitSucceeded}
51-
hasFailed={submitFailed}
52-
invalid={invalid}
53-
disabled={onSubmit === null}
54-
messages={{
55-
submit: <FormattedMessage id="generic.setFilters" defaultMessage="Set Filters" />,
56-
success: <FormattedMessage id="generic.filtersSet" defaultMessage="Filters Set" />,
57-
}}
58-
/>
59-
</div>
60-
</Col>
61-
</Row>
62-
</Grid>
63-
</Well>
36+
<Col sm={3} md={2}>
37+
<div className="text-right">
38+
<SubmitButton
39+
id="setFilters"
40+
handleSubmit={handleSubmit}
41+
hasSucceeded={submitSucceeded}
42+
hasFailed={submitFailed}
43+
invalid={invalid}
44+
disabled={onSubmit === null}
45+
messages={{
46+
submit: <FormattedMessage id="generic.setFilters" defaultMessage="Set Filters" />,
47+
success: <FormattedMessage id="generic.filtersSet" defaultMessage="Filters Set" />,
48+
}}
49+
/>
50+
</div>
51+
</Col>
52+
</Row>
53+
</Grid>
6454
</Form>
6555
);
6656

0 commit comments

Comments
 (0)