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.

210 lines (175 loc) 5.17 kB
import template from './templates/searchBar.hbs'; import LocalizationService from '../services/LocalizationService'; import keyCode from '../utils/keyCode'; import MobileService from '../services/MobileService'; const defaultOptions = () => ({ placeholder: LocalizationService.get('CORE.VIEWS.SEARCHBAR.PLACEHOLDER'), delay: 200 }); const classes = { defaultSearchClass: 'tr-search tr-search_mselect', compactSearchClass: 'tr-search tr-search_compact', open: 'open', closed: 'closed' }; export default Marionette.View.extend({ initialize(options = {}) { _.extend(this.options, defaultOptions(), options); this.__triggerSearch = _.debounce(this.__triggerSearch, this.options.delay); }, template: Handlebars.compile(template), attributes: { autocomplete: false }, templateContext() { return { placeholder: this.options.placeholder }; }, className() { return this.__getClassName(); }, regions: { compactButton: '.js-search-compact-button' }, ui: { input: '.js-search-input', clear: '.js-search-clear' }, events() { const events = { 'keyup @ui.input': '__onKeyup', 'pointerdown @ui.clear': '__clear', 'focus @ui.input': 'onFocus', 'blur @ui.input': 'onBlur' }; return events; }, onFocus() { this.el.classList.add('focused'); this.searchButtonIsShown = false; }, onBlur() { this.el.classList.remove('focused'); if (this.ui.input.val()) { return; } this.__hideSearchBar(); if (this.searchButtonIsShown) { return; } this.__triggerShowSearchButton(); }, onRender() { if (this.options.searchText) { this.ui.input.val(this.options.searchText); } if (this.options.isAutoHideable) { const compactBtn = new Core.layout.Button({ text: '', iconClass: 'search', customClass: 'toolbar-btn_withoutName', isSolid: false, handler: () => { this.__showSearchBar(); } }); this.showChildView('compactButton', compactBtn); } const value = this.__toggleClearIcon(); this.__updateInput(value); }, toggleSearchBar(searchButtonIsHidden: Boolean) { searchButtonIsHidden ? this.__showSearchBar() : this.__hideSearchBar(); }, toggleInputActivity(inputEnabled) { if (inputEnabled) { this.setReadonly(inputEnabled); this.focus(); } else { this.setReadonly(inputEnabled); this.blur(); } }, focus() { if (this.isRendered()) { this.ui.input.focus(); } }, blur() { if (this.isRendered()) { this.ui.input.blur(); } }, setReadonly(isEnabled: Boolean) { if (this.isRendered()) { if (isEnabled) { this.ui.input[0].removeAttribute('readonly'); } else { this.ui.input[0].setAttribute('readonly', true); } } }, clearInput(isClearingSilent: Boolean) { if (isClearingSilent) { const value = this.ui.input.val(''); this.blur(); this.__updateInput(); this.__toggleClearIcon(); } else { this.__clear(); } }, __getClassName() { if (this.options.isAutoHideable) { return classes.compactSearchClass; } return classes.defaultSearchClass; }, __onKeyup(event: KeyboardEvent) { this.__trySearching(event); this.__toggleClearIcon(); }, __trySearching(event: KeyboardEvent) { if (this.options.searchOnEnter === true) { if (event.keyCode === keyCode.ENTER || event.keyCode === keyCode.NUMPAD_ENTER) { this.__search(); } } else { this.__search(); } }, __toggleClearIcon() { const value = this.ui.input.val(); this.ui.clear.toggle(!!value); return value; }, __showSearchBar() { this.$el.addClass(classes.open); this.ui.clear.toggle(true); this.focus(); }, __hideSearchBar() { this.$el.removeClass(classes.open); this.ui.clear.toggle(false); this.ui.input.val(''); }, __search() { const value = this.ui.input.val(); this.__triggerSearch(value); }, __triggerSearch(value) { this.trigger('search', value, { model: this.model }); }, __triggerShowSearchButton() { this.searchButtonIsShown = true; this.trigger('show:search:button'); }, __clear() { this.ui.input.val(''); this.__toggleClearIcon(); this.__search(); this.ui.input.focus(); }, __updateInput(value) { this.ui.input.css('background', value ? 'none' : ''); } });