Utilize gr-error-dialog

Use an error dialog for change action failures and server errors.

Bug: Issue 8457
Change-Id: I021065ebfd286ed9a8ae8402799a6e4173065a28
This commit is contained in:
Kasper Nilsson
2018-08-23 13:18:11 -07:00
parent 4c9d5aca65
commit 2d9610cd2b
5 changed files with 58 additions and 8 deletions

View File

@@ -212,6 +212,12 @@
* @event show-alert * @event show-alert
*/ */
/**
* Fires when a change action fails.
*
* @event show-error
*/
properties: { properties: {
/** /**
* @type {{ * @type {{
@@ -1154,7 +1160,7 @@
_handleResponseError(response) { _handleResponseError(response) {
return response.text().then(errText => { return response.text().then(errText => {
this.fire('show-alert', this.fire('show-error',
{message: `Could not perform action: ${errText}`}); {message: `Could not perform action: ${errText}`});
if (!errText.startsWith('Change is already up to date')) { if (!errText.startsWith('Change is already up to date')) {
throw Error(errText); throw Error(errText);

View File

@@ -1370,6 +1370,7 @@ limitations under the License.
suite('_send', () => { suite('_send', () => {
let cleanup; let cleanup;
let payload; let payload;
let onShowError;
let onShowAlert; let onShowAlert;
setup(() => { setup(() => {
@@ -1378,6 +1379,8 @@ limitations under the License.
element.latestPatchNum = 12; element.latestPatchNum = 12;
payload = {foo: 'bar'}; payload = {foo: 'bar'};
onShowError = sinon.stub();
element.addEventListener('show-error', onShowError);
onShowAlert = sinon.stub(); onShowAlert = sinon.stub();
element.addEventListener('show-alert', onShowAlert); element.addEventListener('show-alert', onShowAlert);
}); });
@@ -1395,7 +1398,7 @@ limitations under the License.
test('change action', () => { test('change action', () => {
return element._send('DELETE', payload, '/endpoint', false, cleanup) return element._send('DELETE', payload, '/endpoint', false, cleanup)
.then(() => { .then(() => {
assert.isFalse(onShowAlert.called); assert.isFalse(onShowError.called);
assert.isTrue(cleanup.calledOnce); assert.isTrue(cleanup.calledOnce);
assert.isTrue(sendStub.calledWith(42, 'DELETE', '/endpoint', assert.isTrue(sendStub.calledWith(42, 'DELETE', '/endpoint',
null, payload)); null, payload));
@@ -1405,7 +1408,7 @@ limitations under the License.
test('revision action', () => { test('revision action', () => {
return element._send('DELETE', payload, '/endpoint', true, cleanup) return element._send('DELETE', payload, '/endpoint', true, cleanup)
.then(() => { .then(() => {
assert.isFalse(onShowAlert.called); assert.isFalse(onShowError.called);
assert.isTrue(cleanup.calledOnce); assert.isTrue(cleanup.calledOnce);
assert.isTrue(sendStub.calledWith(42, 'DELETE', '/endpoint', assert.isTrue(sendStub.calledWith(42, 'DELETE', '/endpoint',
12, payload)); 12, payload));
@@ -1423,6 +1426,7 @@ limitations under the License.
return element._send('DELETE', payload, '/endpoint', true, cleanup) return element._send('DELETE', payload, '/endpoint', true, cleanup)
.then(() => { .then(() => {
assert.isTrue(onShowAlert.calledOnce); assert.isTrue(onShowAlert.calledOnce);
assert.isFalse(onShowError.called);
assert.isTrue(cleanup.calledOnce); assert.isTrue(cleanup.calledOnce);
assert.isFalse(sendStub.called); assert.isFalse(sendStub.called);
}); });
@@ -1441,7 +1445,7 @@ limitations under the License.
return element._send('DELETE', payload, '/endpoint', true, cleanup) return element._send('DELETE', payload, '/endpoint', true, cleanup)
.then(() => { .then(() => {
assert.isFalse(onShowAlert.called); assert.isFalse(onShowError.called);
assert.isTrue(cleanup.called); assert.isTrue(cleanup.called);
assert.isTrue(sendStub.calledOnce); assert.isTrue(sendStub.calledOnce);
assert.isTrue(handleErrorStub.called); assert.isTrue(handleErrorStub.called);

View File

@@ -17,11 +17,20 @@ limitations under the License.
<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html"> <link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
<link rel="import" href="../../../bower_components/polymer/polymer.html"> <link rel="import" href="../../../bower_components/polymer/polymer.html">
<link rel="import" href="../../core/gr-error-dialog/gr-error-dialog.html">
<link rel="import" href="../../shared/gr-alert/gr-alert.html"> <link rel="import" href="../../shared/gr-alert/gr-alert.html">
<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html"> <link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
<dom-module id="gr-error-manager"> <dom-module id="gr-error-manager">
<template> <template>
<gr-overlay with-backdrop id="errorOverlay">
<gr-error-dialog
id="errorDialog"
on-dismiss="_handleDismissErrorDialog"
confirm-label="Dismiss"
confirm-on-enter></gr-error-dialog>
</gr-overlay>
<gr-rest-api-interface id="restAPI"></gr-rest-api-interface> <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
</template> </template>
<script src="gr-error-manager.js"></script> <script src="gr-error-manager.js"></script>

View File

@@ -62,6 +62,7 @@
this.listen(document, 'network-error', '_handleNetworkError'); this.listen(document, 'network-error', '_handleNetworkError');
this.listen(document, 'auth-error', '_handleAuthError'); this.listen(document, 'auth-error', '_handleAuthError');
this.listen(document, 'show-alert', '_handleShowAlert'); this.listen(document, 'show-alert', '_handleShowAlert');
this.listen(document, 'show-error', '_handleShowErrorDialog');
this.listen(document, 'visibilitychange', '_handleVisibilityChange'); this.listen(document, 'visibilitychange', '_handleVisibilityChange');
this.listen(document, 'show-auth-required', '_handleAuthRequired'); this.listen(document, 'show-auth-required', '_handleAuthRequired');
}, },
@@ -73,6 +74,7 @@
this.unlisten(document, 'auth-error', '_handleAuthError'); this.unlisten(document, 'auth-error', '_handleAuthError');
this.unlisten(document, 'show-auth-required', '_handleAuthRequired'); this.unlisten(document, 'show-auth-required', '_handleAuthRequired');
this.unlisten(document, 'visibilitychange', '_handleVisibilityChange'); this.unlisten(document, 'visibilitychange', '_handleVisibilityChange');
this.unlisten(document, 'show-error', '_handleShowErrorDialog');
}, },
_shouldSuppressError(msg) { _shouldSuppressError(msg) {
@@ -101,7 +103,7 @@
// This indicates the auth token is no longer valid. // This indicates the auth token is no longer valid.
this._handleAuthError(); this._handleAuthError();
} else if (!this._shouldSuppressError(text)) { } else if (!this._shouldSuppressError(text)) {
this._showAlert('Server error: ' + text); this._showErrorDialog('Server error: ' + text);
} }
console.error(text); console.error(text);
}); });
@@ -257,5 +259,18 @@
_handleWindowFocus() { _handleWindowFocus() {
this.flushDebouncer('checkLoggedIn'); this.flushDebouncer('checkLoggedIn');
}, },
_handleShowErrorDialog(e) {
this._showErrorDialog(e.detail.message);
},
_handleDismissErrorDialog() {
this.$.errorOverlay.close();
},
_showErrorDialog(message) {
this.$.errorDialog.text = message;
this.$.errorOverlay.open();
},
}); });
})(); })();

View File

@@ -87,7 +87,7 @@ limitations under the License.
}); });
test('show normal server error', done => { test('show normal server error', done => {
const showAlertStub = sandbox.stub(element, '_showAlert'); const showErrorStub = sandbox.stub(element, '_showErrorDialog');
const textSpy = sandbox.spy(() => { return Promise.resolve('ZOMG'); }); const textSpy = sandbox.spy(() => { return Promise.resolve('ZOMG'); });
element.fire('server-error', {response: {status: 500, text: textSpy}}); element.fire('server-error', {response: {status: 500, text: textSpy}});
@@ -96,8 +96,8 @@ limitations under the License.
element.$.restAPI.getLoggedIn.lastCall.returnValue, element.$.restAPI.getLoggedIn.lastCall.returnValue,
textSpy.lastCall.returnValue, textSpy.lastCall.returnValue,
]).then(() => { ]).then(() => {
assert.isTrue(showAlertStub.calledOnce); assert.isTrue(showErrorStub.calledOnce);
assert.isTrue(showAlertStub.lastCall.calledWithExactly( assert.isTrue(showErrorStub.lastCall.calledWithExactly(
'Server error: ZOMG')); 'Server error: ZOMG'));
done(); done();
}); });
@@ -279,5 +279,21 @@ limitations under the License.
element._showAlert(); element._showAlert();
assert.isTrue(hideStub.calledOnce); assert.isTrue(hideStub.calledOnce);
}); });
test('show-error', () => {
const openStub = sandbox.stub(element.$.errorOverlay, 'open');
const closeStub = sandbox.stub(element.$.errorOverlay, 'close');
const message = 'test message';
element.fire('show-error', {message});
flushAsynchronousOperations();
assert.isTrue(openStub.called);
assert.equal(element.$.errorDialog.text, message);
element.$.errorDialog.fire('dismiss');
flushAsynchronousOperations();
assert.isTrue(closeStub.called);
});
}); });
</script> </script>