UNPKG

comindware.core.ui

Version:

Comindware Core UI provides the basic components like editors, lists, dropdowns, popups that we so desperately need while creating Marionette-based single-page applications.

87 lines (69 loc) 2.96 kB
import template from './templates/wizardHeaderItem.hbs'; export default Marionette.View.extend({ tagName: 'li', className() { return `layout__wizard__header-view-item ${this.model.get('stepClass') || ''}`; }, template: Handlebars.compile(template), ui: { name: '.js-name', stepNumber: '.js-number' }, modelEvents: { 'change:selected change:error change:isVisible change:completed': '__applyClasses', 'change:selected': '__onSelectedChange', 'change:name': '__onChangeName', 'change:stepNumber': '__onChangeStepNumber', 'change:completed': '__onChangeCompleted' }, onRender() { this.__applyClasses(); this.el.setAttribute('id', this.model.id); }, __onChangeName(model: Backbone.Model, name: string) { this.ui.name.html(name); }, __onChangeStepNumber(model: Backbone.Model) { this.ui.stepNumber.text(model.get('stepNumber')); }, __onChangeCompleted(model: Backbone.Model) { if (model.get('completed')) { this.ui.stepNumber.html(`<i class="${Handlebars.helpers.iconPrefixer('check')} layout__wizard__header-check-icon"></i>`); } else { this.__onChangeStepNumber(model); } }, __applyClasses() { this.$el.toggleClass('layout__wizard__header-view-item_selected', Boolean(this.model.get('selected'))); this.$el.toggleClass('layout__wizard__header-view-item_error', Boolean(this.model.get('error'))); this.$el.toggleClass('layout__wizard__header-view-item_completed', this.model.get('completed')); this.$el.toggleClass('layout__wizard__header-view-item_hidden', !this.model.get('isVisible')); }, __onSelectedChange(model: Backbone.Model, selected: boolean) { if (selected) { this.__scrollIntoViewIfNeeded(); } }, // native scrollIntoView causing the whole page to move, // to prevent that behaviour we need to use scrollIntoViewOptions, // but Edge, IE, and Safari doesn't support scrollIntoViewOptions. __scrollIntoViewIfNeeded() { if (!this.__isUiReady() || this.__isIntoView()) { return; } const offsetLeft = this.el.offsetLeft; this.$el.offsetParent().animate({ scrollLeft: offsetLeft }, 300); }, __isIntoView(): boolean { const parentScrollLeft = this.el.parentElement.scrollLeft; const parentOffsetWidth = this.el.parentElement.offsetWidth; const parentScrollRight = parentScrollLeft + parentOffsetWidth; const elOffsetLeft = this.el.offsetLeft; const elOffsetWidth = this.el.offsetWidth; const elOffsetRight = elOffsetLeft + elOffsetWidth; return elOffsetLeft > parentScrollLeft && elOffsetRight < parentScrollRight; }, __isUiReady(): boolean { return this.isRendered() && !this.isDestroyed() && this.isAttached(); } });