import {PolymerElement, html} from '@polymer/polymer/polymer-element.js'; import '@polymer/paper-toggle-button/paper-toggle-button.js'; import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js'; import {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js'; import '../rhodecode-unsafe-html/rhodecode-unsafe-html.js'; export class RhodecodeToast extends mixinBehaviors([IronA11yKeysBehavior], PolymerElement) { static get is() { return 'rhodecode-toast'; } static get template(){ return html` ` } static get properties() { return { toasts: { type: Array, value() { return [] } }, isFixed: { type: Boolean, value: false }, hasToasts: { type: Boolean, computed: '_computeHasToasts(toasts.*)' }, keyEventTarget: { type: Object, value() { return document.body; } } } } get keyBindings() { return { 'esc:keyup': '_hideOnEsc' } } static get observers() { return [ '_changedToasts(toasts.splices)' ] } _hideOnEsc(event) { return this.dismissNotifications(); } _computeHasToasts() { return this.toasts.length > 0; } _debouncedCalc() { // calculate once in a while this.debounce('debouncedCalc', this.toastInWindow, 25); } conditionalClass() { return this.isFixed ? 'fixed' : ''; } toastInWindow() { if (!this._headerNode) { return true } var headerHeight = this._headerNode.offsetHeight; var scrollPosition = window.scrollY; if (this.isFixed) { this.isFixed = 1 <= scrollPosition; } else { this.isFixed = headerHeight <= scrollPosition; } } connectedCallback() { super.connectedCallback(); this._headerNode = document.querySelector('.header', document); this.listen(window, 'scroll', '_debouncedCalc'); this.listen(window, 'resize', '_debouncedCalc'); this._debouncedCalc(); } _changedToasts(newValue, oldValue) { $.Topic('/favicon/update').publish({count: this.toasts.length}); } dismissNotification(e) { $.Topic('/favicon/update').publish({count: this.toasts.length - 1}); var idx = e.target.parentNode.indexPos this.splice('toasts', idx, 1); } dismissNotifications() { $.Topic('/favicon/update').publish({count: 0}); this.splice('toasts', 0); } handleNotification(data) { if (!templateContext.rhodecode_user.notification_status && !data.message.force) { // do not act if notifications are disabled return } this.push('toasts', { level: data.message.level, message: data.message.message }); } _gettext(x){ return _gettext(x) } } customElements.define(RhodecodeToast.is, RhodecodeToast);