add http interceptor for alerts

This commit is contained in:
Felix Hamann 2019-05-09 21:55:52 +02:00
parent 373c8d213d
commit e0d6512339
2 changed files with 63 additions and 4 deletions

View File

@ -34,6 +34,10 @@
} }
} }
.alerts--elevated {
z-index: 1000;
}
.alerts__toggler--visible { .alerts__toggler--visible {
top: -40px; top: -40px;
opacity: 1; opacity: 1;

View File

@ -30,7 +30,7 @@
* Example usage: * Example usage:
* <div .alerts uw-alerts> * <div .alerts uw-alerts>
* <div .alerts__toggler> * <div .alerts__toggler>
* <div .alert.alert-info> * <div .alert.alert-info>
* <div .alert__closer> * <div .alert__closer>
* <div .alert__icon> * <div .alert__icon>
* <div .alert__content> * <div .alert__content>
@ -42,6 +42,7 @@
var ALERTS_UTIL_SELECTOR = '[uw-alerts]'; var ALERTS_UTIL_SELECTOR = '[uw-alerts]';
var ALERTS_INITIALIZED_CLASS = 'alerts--initialized'; var ALERTS_INITIALIZED_CLASS = 'alerts--initialized';
var ALERTS_ELEVATED_CLASS = 'alerts--elevated';
var ALERTS_TOGGLER_CLASS = 'alerts__toggler'; var ALERTS_TOGGLER_CLASS = 'alerts__toggler';
var ALERTS_TOGGLER_VISIBLE_CLASS = 'alerts__toggler--visible'; var ALERTS_TOGGLER_VISIBLE_CLASS = 'alerts__toggler--visible';
var ALERTS_TOGGLER_APPEAR_DELAY = 120; var ALERTS_TOGGLER_APPEAR_DELAY = 120;
@ -49,6 +50,8 @@
var ALERT_CLASS = 'alert'; var ALERT_CLASS = 'alert';
var ALERT_INITIALIZED_CLASS = 'alert--initialized'; var ALERT_INITIALIZED_CLASS = 'alert--initialized';
var ALERT_CLOSER_CLASS = 'alert__closer'; var ALERT_CLOSER_CLASS = 'alert__closer';
var ALERT_ICON_CLASS = 'alert__icon';
var ALERT_CONTENT_CLASS = 'alert__content';
var ALERT_INVISIBLE_CLASS = 'alert--invisible'; var ALERT_INVISIBLE_CLASS = 'alert--invisible';
var ALERT_AUTO_HIDE_DELAY = 10; var ALERT_AUTO_HIDE_DELAY = 10;
var ALERT_AUTOCLOSING_MATCHER = '.alert-info, .alert-success'; var ALERT_AUTOCLOSING_MATCHER = '.alert-info, .alert-success';
@ -73,6 +76,9 @@
initToggler(); initToggler();
initAlerts(); initAlerts();
// register http client interceptor to filter out Alerts Header
setupHttpInterceptor();
// mark initialized // mark initialized
element.classList.add(ALERTS_INITIALIZED_CLASS); element.classList.add(ALERTS_INITIALIZED_CLASS);
@ -96,7 +102,6 @@
}); });
togglerElement.classList.remove(ALERTS_TOGGLER_VISIBLE_CLASS); togglerElement.classList.remove(ALERTS_TOGGLER_VISIBLE_CLASS);
}); });
element.classList.add(ALERTS_INITIALIZED_CLASS);
} }
function initAlerts() { function initAlerts() {
@ -119,8 +124,6 @@
toggleAlert(alertElement); toggleAlert(alertElement);
}, autoHideDelay * 1000); }, autoHideDelay * 1000);
} }
alertElement.classList.add(ALERTS_INITIALIZED_CLASS);
} }
function toggleAlert(alertEl, visible) { function toggleAlert(alertEl, visible) {
@ -143,6 +146,58 @@
}, ALERTS_TOGGLER_APPEAR_DELAY); }, ALERTS_TOGGLER_APPEAR_DELAY);
} }
function setupHttpInterceptor() {
if (HttpClient) {
HttpClient.addResponseInterceptor(responseInterceptor.bind(this));
}
}
function elevateAlerts() {
element.classList.add(ALERTS_ELEVATED_CLASS);
}
function responseInterceptor(response) {
var alerts;
for (var header of response.headers) {
if (header[0] === 'alerts') {
alerts = JSON.parse(header[1]);
break;
}
}
if (alerts) {
alerts.forEach(function(alert) {
var alertElement = createAlertElement(alert.status, alert.content);
element.appendChild(alertElement);
alertElements.push(alertElement);
initAlert(alertElement);
});
elevateAlerts();
}
}
function createAlertElement(type, content) {
var alertElement = document.createElement('div');
alertElement.classList.add(ALERT_CLASS, 'alert-' + type);
var alertCloser = document.createElement('div');
alertCloser.classList.add(ALERT_CLOSER_CLASS);
var alertIcon = document.createElement('div');
alertIcon.classList.add(ALERT_ICON_CLASS);
var alertContent = document.createElement('div');
alertContent.classList.add(ALERT_CONTENT_CLASS);
alertContent.innerHTML = content;
alertElement.appendChild(alertCloser);
alertElement.appendChild(alertIcon);
alertElement.appendChild(alertContent);
return alertElement;
}
return init(); return init();
}; };