discourse/app/assets/javascripts/discourse/controllers/exception.js.es6
2015-09-21 11:38:37 -07:00

105 lines
3 KiB
JavaScript

var ButtonBackBright = {
classes: "btn-primary",
action: "back",
key: "errors.buttons.back"
},
ButtonBackDim = {
classes: "",
action: "back",
key: "errors.buttons.back"
},
ButtonTryAgain = {
classes: "btn-primary",
action: "tryLoading",
key: "errors.buttons.again"
},
ButtonLoadPage = {
classes: "btn-primary",
action: "tryLoading",
key: "errors.buttons.fixed"
};
// The controller for the nice error page
export default Ember.Controller.extend({
thrown: null,
lastTransition: null,
isNetwork: function() {
// never made it on the wire
if (this.get('thrown.readyState') === 0) return true;
// timed out
if (this.get('thrown.jqTextStatus') === "timeout") return true;
return false;
}.property(),
isNotFound: Em.computed.equal('thrown.status', 404),
isForbidden: Em.computed.equal('thrown.status', 403),
isServer: Em.computed.gte('thrown.status', 500),
isUnknown: Em.computed.none('isNetwork', 'isServer'),
// TODO
// make ajax requests to /srv/status with exponential backoff
// if one succeeds, set networkFixed to true, which puts a "Fixed!" message on the page
networkFixed: false,
loading: false,
_init: function() {
this.set('loading', false);
}.on('init'),
reason: function() {
if (this.get('isNetwork')) {
return I18n.t('errors.reasons.network');
} else if (this.get('isServer')) {
return I18n.t('errors.reasons.server');
} else if (this.get('isNotFound')) {
return I18n.t('errors.reasons.not_found');
} else if (this.get('isForbidden')) {
return I18n.t('errors.reasons.forbidden');
} else {
// TODO
return I18n.t('errors.reasons.unknown');
}
}.property('isNetwork', 'isServer', 'isUnknown'),
requestUrl: Em.computed.alias('thrown.requestedUrl'),
desc: function() {
if (this.get('networkFixed')) {
return I18n.t('errors.desc.network_fixed');
} else if (this.get('isNetwork')) {
return I18n.t('errors.desc.network');
} else if (this.get('isNotFound')) {
return I18n.t('errors.desc.not_found');
} else if (this.get('isServer')) {
return I18n.t('errors.desc.server', { status: this.get('thrown.status') + " " + this.get('thrown.statusText') });
} else {
// TODO
return I18n.t('errors.desc.unknown');
}
}.property('networkFixed', 'isNetwork', 'isServer', 'isUnknown'),
enabledButtons: function() {
if (this.get('networkFixed')) {
return [ButtonLoadPage];
} else if (this.get('isNetwork')) {
return [ButtonBackDim, ButtonTryAgain];
} else {
return [ButtonBackBright, ButtonTryAgain];
}
}.property('networkFixed', 'isNetwork', 'isServer', 'isUnknown'),
actions: {
back: function() {
window.history.back();
},
tryLoading: function() {
this.set('loading', true);
var self = this;
Em.run.schedule('afterRender', function() {
self.get('lastTransition').retry();
self.set('loading', false);
});
}
}
});