Skip to content

Commit 8ead57c

Browse files
jstoffanmergify[bot]
authored andcommitted
feat(versions): Add client-side error messages for version actions (#1404)
1 parent 9a527f2 commit 8ead57c

File tree

7 files changed

+76
-25
lines changed

7 files changed

+76
-25
lines changed

i18n/en-US.properties

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,22 +424,34 @@ be.sidebarSkillsTitle = Skills
424424
be.sidebarVersions.current = Current Version
425425
# Label for the version delete action.
426426
be.sidebarVersions.delete = Delete
427+
# Error message for the version delete action.
428+
be.sidebarVersions.deleteError = File version could not be deleted.
427429
# Message displayed for a deleted version. {name} is the user who performed the action.
428430
be.sidebarVersions.deletedBy = Deleted by {name}
429431
# Label for the version download action.
430432
be.sidebarVersions.download = Download
433+
# Error message for the version download action.
434+
be.sidebarVersions.downloadError = File version could not be downloaded.
431435
# Message to display when no versions are available
432436
be.sidebarVersions.empty = No prior versions are available for this file.
437+
# Error message for the versions fetch call.
438+
be.sidebarVersions.fetchError = File versions could not be retrieved.
433439
# Label for the version preview action.
434440
be.sidebarVersions.preview = Preview
435441
# Header to display for group of versions created in the prior week
436442
be.sidebarVersions.priorWeek = Last Week
437443
# Label for the version promote action.
438444
be.sidebarVersions.promote = Make Current
445+
# Error message for the version promote action.
446+
be.sidebarVersions.promoteError = File version could not be made current.
439447
# Label for the version restore action.
440448
be.sidebarVersions.restore = Restore
449+
# Error message for the version restored action.
450+
be.sidebarVersions.restoreError = File version could not be restored.
441451
# Message displayed for a restored version. {name} is the user who performed the action.
442452
be.sidebarVersions.restoredBy = Restored by {name}
453+
# Heading for inline error messages displayed due to a remote server issue.
454+
be.sidebarVersions.serverError = Server Error
443455
# Header to display for group of versions created in the current month
444456
be.sidebarVersions.thisMonth = This Month
445457
# Title for the preview versions sidebar

src/elements/content-sidebar/versions/VersionsSidebar.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,18 @@
44
* @author Box
55
*/
66

7-
import React from 'react';
7+
import * as React from 'react';
88
import { FormattedMessage } from 'react-intl';
99
import InlineError from '../../../components/inline-error';
1010
import messages from './messages';
11-
import messagesCommon from '../../common/messages';
1211
import SidebarContent from '../SidebarContent';
1312
import VersionsMenu from './VersionsMenu';
1413
import { BackButton } from '../../common/nav-button';
1514
import { LoadingIndicatorWrapper } from '../../../components/loading-indicator';
1615
import './VersionsSidebar.scss';
1716

1817
type Props = {
19-
error?: string,
18+
error?: MessageDescriptor,
2019
fileId: string,
2120
isLoading: boolean,
2221
parentName: string,
@@ -28,6 +27,7 @@ type Props = {
2827
const VersionsSidebar = ({ error, isLoading, parentName, versions, ...rest }: Props) => {
2928
const showVersions = !!versions.length;
3029
const showEmpty = !isLoading && !showVersions;
30+
const showError = !!error;
3131

3232
return (
3333
<SidebarContent
@@ -42,7 +42,11 @@ const VersionsSidebar = ({ error, isLoading, parentName, versions, ...rest }: Pr
4242
}
4343
>
4444
<LoadingIndicatorWrapper className="bcs-Versions-content" crawlerPosition="top" isLoading={isLoading}>
45-
{error && <InlineError title={<FormattedMessage {...messagesCommon.error} />}>{error}</InlineError>}
45+
{showError && (
46+
<InlineError title={<FormattedMessage {...messages.versionServerError} />}>
47+
<FormattedMessage {...error} />
48+
</InlineError>
49+
)}
4650

4751
{showEmpty && (
4852
<div className="bcs-Versions-empty">

src/elements/content-sidebar/versions/VersionsSidebarContainer.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import getProp from 'lodash/get';
1010
import noop from 'lodash/noop';
1111
import { generatePath, withRouter } from 'react-router-dom';
1212
import type { Match, RouterHistory } from 'react-router-dom';
13+
import type { MessageDescriptor } from 'react-intl';
1314
import API from '../../../api';
15+
import messages from './messages';
1416
import openUrlInsideIframe from '../../../utils/iframe';
1517
import VersionsSidebar from './VersionsSidebar';
1618
import { FILE_VERSION_FIELDS_TO_FETCH } from '../../../utils/fields';
@@ -27,7 +29,7 @@ type Props = {
2729
};
2830

2931
type State = {
30-
error?: string,
32+
error?: MessageDescriptor,
3133
isLoading: boolean,
3234
isWatermarked: boolean,
3335
versionCount: number,
@@ -54,7 +56,7 @@ class VersionsSidebarContainer extends React.Component<Props, State> {
5456
window: any = window;
5557

5658
componentDidMount() {
57-
this.fetchData();
59+
this.fetchData().catch(this.handleFetchError);
5860
}
5961

6062
componentDidUpdate({ versionId: prevVersionId }: Props) {
@@ -75,17 +77,17 @@ class VersionsSidebarContainer extends React.Component<Props, State> {
7577
this.deleteVersion(versionId)
7678
.then(this.fetchData)
7779
.then(() => this.handleDeleteSuccess(versionId))
78-
.catch(this.handleActionError);
80+
.catch(() => this.handleActionError(messages.versionActionDeleteError));
7981
});
8082
};
8183

8284
handleActionDownload = (versionId: string): void => {
8385
this.fetchDownloadUrl(versionId)
8486
.then(openUrlInsideIframe)
85-
.catch(this.handleActionError);
87+
.catch(() => this.handleActionError(messages.versionActionDownloadError));
8688
};
8789

88-
handleActionError = ({ message }: ElementsXhrError): void => {
90+
handleActionError = (message: MessageDescriptor): void => {
8991
this.setState({
9092
error: message,
9193
isLoading: false,
@@ -101,15 +103,15 @@ class VersionsSidebarContainer extends React.Component<Props, State> {
101103
this.promoteVersion(versionId)
102104
.then(this.fetchData)
103105
.then(this.handlePromoteSuccess)
104-
.catch(this.handleActionError);
106+
.catch(() => this.handleActionError(messages.versionActionPromoteError));
105107
});
106108
};
107109

108110
handleActionRestore = (versionId: string): void => {
109111
this.setState({ isLoading: true }, () => {
110112
this.restoreVersion(versionId)
111113
.then(this.fetchData)
112-
.catch(this.handleActionError);
114+
.catch(() => this.handleActionError(messages.versionActionRestoreError));
113115
});
114116
};
115117

@@ -122,9 +124,9 @@ class VersionsSidebarContainer extends React.Component<Props, State> {
122124
}
123125
};
124126

125-
handleFetchError = ({ message }: ElementsXhrError): void => {
127+
handleFetchError = (): void => {
126128
this.setState({
127-
error: message,
129+
error: messages.versionFetchError,
128130
isLoading: false,
129131
isWatermarked: false,
130132
versionCount: 0,
@@ -172,8 +174,7 @@ class VersionsSidebarContainer extends React.Component<Props, State> {
172174
fetchData = (): Promise<any> => {
173175
return Promise.all([this.fetchFile(), this.fetchVersions()])
174176
.then(this.fetchVersionCurrent)
175-
.then(this.handleFetchSuccess)
176-
.catch(this.handleFetchError);
177+
.then(this.handleFetchSuccess);
177178
};
178179

179180
fetchDownloadUrl = (versionId: string): Promise<string> => {

src/elements/content-sidebar/versions/__tests__/VersionsSidebar-test.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as React from 'react';
22
import { shallow } from 'enzyme/build';
33
import InlineError from '../../../../components/inline-error';
4+
import messages from '../messages';
45
import VersionsMenu from '../VersionsMenu';
56
import VersionsSidebar from '../VersionsSidebar';
67

@@ -15,15 +16,15 @@ describe('elements/content-sidebar/versions/VersionsSidebar', () => {
1516
test('should show the versions list if no error prop is provided', () => {
1617
const wrapper = getWrapper({ versions: [{ id: '12345' }] });
1718

18-
expect(wrapper.find(InlineError).length).toEqual(0);
19-
expect(wrapper.find(VersionsMenu).length).toEqual(1);
19+
expect(wrapper.exists(InlineError)).toBe(false);
20+
expect(wrapper.exists(VersionsMenu)).toBe(true);
2021
expect(wrapper).toMatchSnapshot();
2122
});
2223

2324
test('should show an inline error if the prop is provided', () => {
24-
const wrapper = getWrapper({ error: 'This is an error', versions: [] });
25+
const wrapper = getWrapper({ error: messages.versionFetchError, versions: [] });
2526

26-
expect(wrapper.find(InlineError).length).toEqual(1);
27+
expect(wrapper.exists(InlineError)).toBe(true);
2728
expect(wrapper).toMatchSnapshot();
2829
});
2930
});

src/elements/content-sidebar/versions/__tests__/VersionsSidebarContainer-test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as React from 'react';
22
import { shallow } from 'enzyme/build';
3+
import messages from '../messages';
34
import openUrlInsideIframe from '../../../../utils/iframe';
45
import VersionsSidebar from '../VersionsSidebarContainer';
56
import { FILE_VERSION_FIELDS_TO_FETCH } from '../../../../utils/fields';
@@ -151,12 +152,11 @@ describe('elements/content-sidebar/versions/VersionsSidebarContainer', () => {
151152
describe('handleFetchError', () => {
152153
test('should set state to default values with error message', () => {
153154
const wrapper = getWrapper();
154-
const message = 'This is an error!';
155155

156-
wrapper.instance().handleFetchError({ message });
156+
wrapper.instance().handleFetchError();
157157

158158
expect(wrapper.state()).toEqual({
159-
error: message,
159+
error: messages.versionFetchError,
160160
isLoading: false,
161161
isWatermarked: false,
162162
versionCount: 0,

src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsSidebar-test.js.snap

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,15 @@ exports[`elements/content-sidebar/versions/VersionsSidebar render should show an
2525
<InlineError
2626
title={
2727
<FormattedMessage
28-
defaultMessage="Error"
29-
id="be.error"
28+
defaultMessage="Server Error"
29+
id="be.sidebarVersions.serverError"
3030
/>
3131
}
3232
>
33-
This is an error
33+
<FormattedMessage
34+
defaultMessage="File versions could not be retrieved."
35+
id="be.sidebarVersions.fetchError"
36+
/>
3437
</InlineError>
3538
<div
3639
className="bcs-Versions-empty"

src/elements/content-sidebar/versions/messages.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,21 @@ const messages = defineMessages({
4141
defaultMessage: 'Delete',
4242
description: 'Label for the version delete action.',
4343
},
44+
versionActionDeleteError: {
45+
id: 'be.sidebarVersions.deleteError',
46+
defaultMessage: 'File version could not be deleted.',
47+
description: 'Error message for the version delete action.',
48+
},
4449
versionActionDownload: {
4550
id: 'be.sidebarVersions.download',
4651
defaultMessage: 'Download',
4752
description: 'Label for the version download action.',
4853
},
54+
versionActionDownloadError: {
55+
id: 'be.sidebarVersions.downloadError',
56+
defaultMessage: 'File version could not be downloaded.',
57+
description: 'Error message for the version download action.',
58+
},
4959
versionActionPreview: {
5060
id: 'be.sidebarVersions.preview',
5161
defaultMessage: 'Preview',
@@ -56,11 +66,21 @@ const messages = defineMessages({
5666
defaultMessage: 'Make Current',
5767
description: 'Label for the version promote action.',
5868
},
69+
versionActionPromoteError: {
70+
id: 'be.sidebarVersions.promoteError',
71+
defaultMessage: 'File version could not be made current.',
72+
description: 'Error message for the version promote action.',
73+
},
5974
versionActionRestore: {
6075
id: 'be.sidebarVersions.restore',
6176
defaultMessage: 'Restore',
6277
description: 'Label for the version restore action.',
6378
},
79+
versionActionRestoreError: {
80+
id: 'be.sidebarVersions.restoreError',
81+
defaultMessage: 'File version could not be restored.',
82+
description: 'Error message for the version restored action.',
83+
},
6484
versionActionToggle: {
6585
id: 'be.sidebarVersions.toggle',
6686
defaultMessage: 'Toggle Actions Menu',
@@ -71,6 +91,11 @@ const messages = defineMessages({
7191
defaultMessage: 'Deleted by { name }',
7292
description: 'Message displayed for a deleted version. {name} is the user who performed the action.',
7393
},
94+
versionFetchError: {
95+
id: 'be.sidebarVersions.fetchError',
96+
defaultMessage: 'File versions could not be retrieved.',
97+
description: 'Error message for the versions fetch call.',
98+
},
7499
versionLimitExceeded: {
75100
id: 'be.sidebarVersions.versionLimitExceeded',
76101
defaultMessage:
@@ -92,6 +117,11 @@ const messages = defineMessages({
92117
defaultMessage: 'Restored by { name }',
93118
description: 'Message displayed for a restored version. {name} is the user who performed the action.',
94119
},
120+
versionServerError: {
121+
id: 'be.sidebarVersions.serverError',
122+
defaultMessage: 'Server Error',
123+
description: 'Heading for inline error messages displayed due to a remote server issue.',
124+
},
95125
versionUploadedBy: {
96126
id: 'be.sidebarVersions.uploadedBy',
97127
defaultMessage: 'Uploaded by { name }',

0 commit comments

Comments
 (0)