import jQ from 'jquery';
import FilterTree from "../filter-tree";
import Settings from "../../../../helpers/settings";
import FilterTreeEnum from "../../../../enum/filter-tree-enum";
import Utils from "../../../../helpers/utils";
import Class from "../../../../helpers/class";
import Labels from "../../../../helpers/labels";
import Globals from "../../../../helpers/globals";
import FilterOptionEnum from "../../../../enum/filter-option-enum";
import Filter from "../../filter";
/**
* Filter tree style 2
* Applies to veritcal, on mobile only
* @extends FilterTree
*/
class FilterTreeStyle2 extends FilterTree {
constructor(id, filterTreeType) {
super(id, filterTreeType);
this.style = 'style2';
this.selector.clearAllButtonContainer = '.boost-pfs-filter-mobile-toolbar-right';
this.selector.backButton = '.boost-pfs-filter-back-btn';
this.selector.refineByOnTitle = '.boost-pfs-filter-selected-items-mobile';
this.selector.headerTitle = '.boost-pfs-filter-mobile-toolbar-middle';
this.style2ActiveFilterOption = null;
}
init() {
super.init();
if (jQ(this.idSelector).length > 0) {
jQ(this.idSelector).addClass('boost-pfs-filter-tree-mobile-style2').addClass('boost-pfs-filter-tree-mobile-sticky');
if(Settings.getSettingValue('general.filterTreeMobileStyleFullWidth')){
jQ(this.idSelector).addClass('boost-pfs-filter-tree-mobile-full-width-style')
}
}
}
getHeaderTemplate() {
return `
<div class="boost-pfs-filter-mobile-toolbar">
<div class="boost-pfs-filter-mobile-toolbar-top">
<a href="javascript:;" class="{{class.closeFilterButton}}"><span>{{label.close}}</span></a>
</div>
<div class="boost-pfs-filter-mobile-toolbar-items">
<div class="boost-pfs-filter-mobile-toolbar-left">
<a href="javascript:void(0)" class="boost-pfs-filter-back-btn" aria-label="{{label.back}}"></a>
</div>
<div class="boost-pfs-filter-mobile-toolbar-middle">{{label.refineMobile}}</div>
<div class="boost-pfs-filter-mobile-toolbar-right">
{{clearButton}}
</div>
</div>
</div>
`;
}
render() {
super.render();
if (this.$element && Utils.isMobile()) {
// Find the current active filter option (in case of switching collection/new filter tree)
var activeFilterOption = null;
this.filterOptions.forEach(filterOption => {
if (this.style2ActiveFilterOption
&& this.style2ActiveFilterOption.filterOptionId == filterOption.filterOptionId) {
activeFilterOption = filterOption;
}
})
this.style2ActiveFilterOption = activeFilterOption;
// Render filter tree header
this.renderFilterTreeHeader();
// Render filter tree footer
this.renderFilterTreeFooter();
// Render filter option collapse/not collapse
this.renderFilterOptionCollapse();
// Render filter option's clear button on header
this.renderFilterOptionClear();
// Render selected filter option on title
this.renderRefineByOnTitle();
}
}
bindEvents() {
super.bindEvents();
if (this.$element && Utils.isMobile()) {
// Bind back button event
this.$element.find(this.selector.backButton).on('click', this.closeFilterOption.bind(this));
this.filterOptions.forEach(filterOption => {
// Bind filter option title click event
if (filterOption.$filterOptionTitleElement) {
filterOption.$filterOptionTitleElement.off('click');
filterOption.$filterOptionTitleElement.on('click', this.openFilterOption.bind(this, filterOption));
}
})
// Fix issue scroll on iphone
// if (/\b(iPad|iPhone|iPod)\b/.test(navigator.userAgent)) {
// var temp_div = document.getElementById('temp_div');
// if (temp_div == null) {
// temp_div = document.createElement('div');
// temp_div.setAttribute('id', 'temp_div');
// temp_div.style.position = 'fixed';
// temp_div.style.height = '100vh';
// temp_div.style.width = 0;
// temp_div.style.top = 0;
// jQ('body').append(temp_div)
// }
//
// if(temp_div.offsetHeight > window.innerHeight) {
// jQ('.boost-pfs-filter-options-wrapper').addClass('boost-pfs-fitler-height-mobile')
// } else {
// jQ('.boost-pfs-filter-options-wrapper').removeClass('boost-pfs-fitler-height-mobile')
// }
// jQ(window).resize(function(){
// temp_div = document.getElementById('temp_div');
//
// if(temp_div.offsetHeight > window.innerHeight) {
// jQ('.boost-pfs-filter-options-wrapper').addClass('boost-pfs-fitler-height-mobile')
// } else {
// jQ('.boost-pfs-filter-options-wrapper').removeClass('boost-pfs-fitler-height-mobile')
// }
// })
// }
}
}
renderFilterTreeHeader() {
if (this.style2ActiveFilterOption) {
// Change header title to filter option's title
this.$element.find(this.selector.headerTitle).html(this.style2ActiveFilterOption.label);
// Show back button
this.$element.find(this.selector.backButton).show();
} else {
// Change header title to 'Refine by'
this.$element.find(this.selector.headerTitle).html(Labels.refineMobile);
// Hide back button
this.$element.find(this.selector.backButton).hide();
}
this.mathHeightToolbarHeader();
}
renderFilterTreeFooter() {
var numberResult = this.parent && this.parent.data ? ' ('+ this.parent.data.total_product +')' : '';
this.$element.find('.' + Class.showResultFilterButton).html(Labels.showResult + numberResult);
}
renderFilterOptionCollapse() {
// Set visible title and content
this.filterOptions.forEach(filterOption => {
if (filterOption.$filterOptionTitleElement && filterOption.$filterOptionContentElement && filterOption.collapse) {
filterOption.$element.removeClass('boost-pfs-filter-option-collapsed');
var $tiltle = filterOption.$element.find('.boost-pfs-filter-option-title');
var $content = filterOption.$filterOptionContentElement;
if (this.style2ActiveFilterOption) {
if (filterOption == this.style2ActiveFilterOption) {
$tiltle.hide();
$content.show();
} else {
$tiltle.hide();
$content.hide();
}
} else {
$tiltle.show();
$content.hide();
}
}
})
}
renderFilterOptionClear() {
var $clearAllButton = this.clearAllButton.$element;
var $clearContainer = this.$element.find(this.selector.clearAllButtonContainer);
if (!$clearContainer) return;
if ($clearAllButton) {
// Check if have active filter option
if (this.style2ActiveFilterOption != null || !Globals.hasFilterOptionParam) {
// Remove clear all button
$clearAllButton.detach();
} else {
// Append clear all button
$clearContainer.append($clearAllButton);
}
}
// Remove all filter option clear button
this.filterOptions.forEach(filterOption => {
if (filterOption.clearButton && filterOption.clearButton.$element) {
filterOption.clearButton.$element.detach();
}
})
// Append active filter option clear button
if (this.style2ActiveFilterOption && this.style2ActiveFilterOption.clearButton && this.style2ActiveFilterOption.clearButton.$element) {
$clearContainer.append(this.style2ActiveFilterOption.clearButton.$element);
}
}
renderRefineByOnTitle() {
// Render refine by label on each filter option
this.filterOptions.forEach(filterOption => {
if (filterOption.$element) {
var labelText = '';
// Multi level collection label
if (filterOption.filterOptionId.startsWith(Globals.prefix + '_c_')) {
var filterItems = filterOption.displayType == FilterOptionEnum.DisplayType.MULTI_LEVEL_COLLECTIONS ? filterOption.allNestedFilterItems : filterOption.filterItems;
if (filterItems && filterItems.size > 0) {
var collectionLabel = '';
var tagLabels = [];
filterItems.forEach((filterItem) => {
if (filterItem.isSelected) {
if (filterItem.level == 2 || filterItem.level == 3) {
tagLabels.push(filterItem.label);
} else {
collectionLabel = filterItem.label;
}
}
})
if (collectionLabel && tagLabels.length > 0) {
labelText = collectionLabel + ': ' + tagLabels.join(', ');
} else {
labelText = collectionLabel;
}
}
// Other filter option label
} else if (this.refineBy && this.refineBy.refineByItems) {
var refineByLabels = [];
this.refineBy.refineByItems.forEach(refineByItem => {
if (refineByItem.filterOptionId == filterOption.filterOptionId) {
var label = refineByItem.label;
if (label) {
refineByLabels.push(label);
}
}
})
labelText = refineByLabels.join(', ');
}
var labelHtml = labelText ? '<span>' + labelText + '</span>' : '';
filterOption.$element.find(this.selector.refineByOnTitle).html(labelHtml);
}
})
}
/**
* On clicking on one filter option, shows a new screen with the values
* @param {FilterOption} activeFilterOption - The clicked filter option component
*/
openFilterOption(activeFilterOption) {
// Render collapse state of all filter options
this.style2ActiveFilterOption = activeFilterOption;
this.renderFilterTreeHeader();
this.renderFilterOptionCollapse();
this.renderFilterOptionClear();
this.mathHeightToolbarHeader();
}
closeFilterOption() {
// Render collapse state of all filter options
this.style2ActiveFilterOption = null;
this.renderFilterTreeHeader();
this.renderFilterOptionCollapse();
this.renderFilterOptionClear();
}
/**
* On clicking on mobile button, open the filter tree
* This function is called by mobile button component
* @param {Object} event - The onclick event
*/
onClickMobileButton(event) {
if (event) {
event.stopImmediatePropagation();
event.stopPropagation();
}
// Clear the active filter option
this.style2ActiveFilterOption = null;
// Set state for mobile button & scroll body
var $filterTreeElement = jQ(this.idSelector);
if ($filterTreeElement) {
this.mobileButton.isCollapsed = !this.mobileButton.isCollapsed;
if (this.mobileButton.isCollapsed) {
$filterTreeElement.removeClass(Class.filterTreeMobileOpen);
jQ('body').removeClass('boost-pfs-body-no-scroll');
jQ('html').removeClass('boost-pfs-body-no-scroll');
} else {
$filterTreeElement.addClass(Class.filterTreeMobileOpen);
jQ('body').addClass('boost-pfs-body-no-scroll');
jQ('html').addClass('boost-pfs-body-no-scroll');
}
}
this.mobileButton.afterToggleFilterTree();
}
/**
* Checks condition to see if filter tree is active
* @param {FilterTreeEnum} filterTreeType - 'vertical' or 'horizontal'
* @returns {boolean}
*/
static isActive(filterTreeType) {
return filterTreeType == FilterTreeEnum.FilterTreeType.VERTICAL
&& Settings.getSettingValue('general.filterTreeMobileStyle') == 'style2';
}
// Math height for mobile toolbar
mathHeightToolbarHeader() {
var heightToolbarMobile = jQ('.boost-pfs-filter-mobile-toolbar').height();
jQ('.boost-pfs-filter-options-wrapper').css('top', heightToolbarMobile + 'px');
}
}
export default FilterTreeStyle2;