/**
* Entity Selector - Utilities Module
* Helper functions: escape, validation, icons, search history
* @partial _utils.js (must be loaded first)
*
* EXTRACTION SOURCE: assets/js/admin/entity-selector.js
* Lines: 7552-7570 (escapeHtml, escapeAttr)
* 7577-7590 (getEntityTypeLabel)
* 6289-6350 (validate, showValidationError, clearValidationError)
* 7115-7137 (showRangeInputError)
* 7728-7745 (getBlockMode, isBlockSingleMode)
* 7707-7723 (getCurrentSingleSelection)
* 5411-5467 (search history methods)
*/
(function($) {
'use strict';
// Create mixin namespace
window._EntitySelectorMixins = window._EntitySelectorMixins || {};
// Utility functions mixin
window._EntitySelectorMixins.utils = {
/**
* Debounce function - delays execution until after wait milliseconds
* @param {Function} func - Function to debounce
* @param {number} wait - Milliseconds to wait
* @returns {Function} Debounced function
*/
debounce: function(func, wait) {
var timeout;
return function() {
var context = this;
var args = arguments;
clearTimeout(timeout);
timeout = setTimeout(function() {
func.apply(context, args);
}, wait);
};
},
escapeHtml: function(str) {
if (str === null || str === undefined) return '';
return String(str)
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
},
escapeAttr: function(str) {
if (str === null || str === undefined) return '';
return String(str)
.replace(/&/g, '&')
.replace(//g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
},
getEntityTypeIcon: function(entityType) {
var icons = {
'products': 'icon-shopping-cart',
'categories': 'icon-folder-open',
'manufacturers': 'icon-building',
'suppliers': 'icon-truck',
'attributes': 'icon-list-alt',
'features': 'icon-tags',
'cms': 'icon-file-text',
'cms_categories': 'icon-folder'
};
return icons[entityType] || 'icon-cube';
},
getEntityTypeLabel: function(entityType) {
var trans = this.config.trans || {};
var labels = {
'products': trans.product || 'Product',
'categories': trans.category || 'Category',
'manufacturers': trans.manufacturer || 'Manufacturer',
'suppliers': trans.supplier || 'Supplier',
'attributes': trans.attribute || 'Attribute',
'features': trans.feature || 'Feature',
'cms': trans.cms_page || 'CMS Page',
'cms_categories': trans.cms_category || 'CMS Category'
};
return labels[entityType] || entityType;
},
validate: function() {
var isRequired = this.$wrapper.data('required') === 1 || this.$wrapper.data('required') === '1';
if (!isRequired) return true;
var hasData = false;
this.$wrapper.find('.target-block').each(function() {
if ($(this).find('.selection-group').length > 0) {
hasData = true;
return false;
}
});
if (!hasData) {
this.showValidationError();
return false;
}
this.clearValidationError();
return true;
},
showValidationError: function() {
this.$wrapper.addClass('has-validation-error');
var message = this.$wrapper.data('required-message') || 'Please select at least one item';
this.$wrapper.find('.trait-validation-error').remove();
var $error = $('
', {
class: 'trait-validation-error',
html: '
' + message
});
this.$wrapper.find('.condition-trait-header').after($error);
$('html, body').animate({ scrollTop: this.$wrapper.offset().top - 100 }, 300);
if (!this.$wrapper.find('.condition-trait-body').is(':visible')) {
this.$wrapper.find('.condition-trait-body').slideDown(200);
this.$wrapper.removeClass('collapsed');
}
},
clearValidationError: function() {
this.$wrapper.removeClass('has-validation-error');
this.$wrapper.find('.trait-validation-error').remove();
},
getBlockMode: function(blockType) {
var blockDef = this.config.blocks[blockType];
return (blockDef && blockDef.mode) ? blockDef.mode : 'multi';
},
isBlockSingleMode: function(blockType) {
return this.getBlockMode(blockType) === 'single';
},
getCurrentSingleSelection: function() {
if ((this.config.mode || 'multi') !== 'single') return null;
var $chip = this.$wrapper.find('.entity-chips .entity-chip').first();
if ($chip.length) {
var $block = $chip.closest('.target-block');
return {
name: $chip.find('.chip-name').text() || $chip.data('id'),
entityType: $block.data('block-type') || 'item'
};
}
return null;
},
/**
* Check if entity type supports tree browsing
*/
supportsTreeBrowsing: function(entityType) {
return entityType === 'categories' || entityType === 'cms_categories';
}
};
})(jQuery);
/**
* Entity Selector - Events Module
* All event binding and handlers
* @partial _events.js
*
* Contains event handlers for:
* - Tab switching
* - Block/group collapse toggle
* - Dropdown open/close
* - Search input handling
* - Item selection/deselection
* - Group add/remove
* - Exclude row add/remove
* - Method select changes
* - Filter panel toggles
* - Keyboard shortcuts (Ctrl+A, Ctrl+D, Esc, Enter)
* - Load more pagination
* - Sort controls
* - View mode switching
* - Tree view events
* - Preview badge clicks
* - Pattern tag interactions
* - Combination picker events
* - Group modifier events
*/
(function($) {
'use strict';
window._EntitySelectorMixins = window._EntitySelectorMixins || {};
window._EntitySelectorMixins.events = {
bindEvents: function() {
var self = this;
// Tab switching
this.$wrapper.on('click', '.target-block-tab', function(e) {
e.preventDefault();
var blockType = $(this).data('blockType');
self.switchToBlock(blockType);
});
// Tab badge click for preview popover (toggle)
this.$wrapper.on('click', '.target-block-tab .tab-badge', function(e) {
e.stopPropagation();
e.preventDefault();
var $tab = $(this).closest('.target-block-tab');
var $badge = $(this);
if ($badge.hasClass('popover-open')) {
self.hidePreviewPopover();
} else {
self.showPreviewPopover($tab);
}
});
// Condition count badge click for preview popover
this.$wrapper.on('click', '.condition-match-count.clickable', function(e) {
e.stopPropagation();
e.preventDefault();
var $badge = $(this);
if ($badge.hasClass('popover-open')) {
self.hidePreviewPopover();
} else {
self.showConditionPreviewPopover($badge);
}
});
// Group count badge click for preview popover
this.$wrapper.on('click', '.group-count-badge.clickable', function(e) {
e.stopPropagation();
e.preventDefault();
var $badge = $(this);
if ($badge.hasClass('popover-open')) {
self.hidePreviewPopover();
} else {
self.showGroupPreviewPopover($badge);
}
});
// Total count badge click for summary popover
this.$wrapper.on('click', '.trait-total-count', function(e) {
e.stopPropagation();
e.preventDefault();
var $badge = $(this);
if ($badge.hasClass('popover-open')) {
self.hidePreviewPopover();
} else {
self.showTotalPreviewPopover($badge);
}
});
// Close popover when clicking outside
$(document).on('click', function(e) {
if (!$(e.target).closest('.target-preview-popover').length &&
!$(e.target).closest('.tab-badge').length &&
!$(e.target).closest('.condition-match-count').length &&
!$(e.target).closest('.group-count-badge').length &&
!$(e.target).closest('.group-modifiers').length &&
!$(e.target).closest('.group-preview-badge').length &&
!$(e.target).closest('.toggle-count.clickable').length &&
!$(e.target).closest('.trait-total-count').length) {
self.hidePreviewPopover();
}
});
// Block-level collapse toggle (click on header)
this.$wrapper.on('click', '.condition-trait-header', function(e) {
if ($(e.target).closest('.target-block-tabs').length ||
$(e.target).closest('.trait-header-actions').length ||
$(e.target).closest('.prestashop-switch').length ||
$(e.target).closest('.trait-total-count').length) {
return;
}
var $body = self.$wrapper.find('.condition-trait-body');
$body.stop(true, true);
if ($body.is(':visible')) {
$body.slideUp(200);
self.$wrapper.addClass('collapsed');
} else {
$body.slideDown(200);
self.$wrapper.removeClass('collapsed');
}
});
// Group-level collapse toggle (click on group header or toggle icon)
this.$wrapper.on('click', '.group-header', function(e) {
if ($(e.target).closest('.btn-remove-group, .group-name-input').length) {
return;
}
if (self.$wrapper.data('mode') === 'single') {
return;
}
var $group = $(this).closest('.selection-group');
$group.toggleClass('collapsed');
});
// Toggle all groups (single button that switches between expand/collapse)
this.$wrapper.on('click', '.trait-header-actions .btn-toggle-groups', function(e) {
e.preventDefault();
e.stopPropagation();
var $btn = $(this);
var currentState = $btn.attr('data-state') || 'collapsed';
var trans = self.config.trans || {};
if (currentState === 'collapsed') {
self.$wrapper.find('.selection-group').removeClass('collapsed');
$btn.attr('data-state', 'expanded');
$btn.attr('title', trans.collapse_all || 'Collapse all groups');
$btn.find('i').removeClass('icon-expand').addClass('icon-compress');
} else {
self.$wrapper.find('.selection-group').addClass('collapsed');
$btn.attr('data-state', 'collapsed');
$btn.attr('title', trans.expand_all || 'Expand all groups');
$btn.find('i').removeClass('icon-compress').addClass('icon-expand');
}
});
// Show all toggle change (legacy checkbox)
this.$wrapper.on('change', '.trait-show-all-toggle .show-all-checkbox', function(e) {
e.stopPropagation();
var isChecked = $(this).prop('checked');
if (isChecked) {
self.clearAllConditions();
}
});
// Target switch change (PrestaShop native switch)
this.$wrapper.on('change', '.target-switch-toggle', function(e) {
e.stopPropagation();
var value = $(this).val();
if (value === '1') {
self.clearAllConditions();
self.$wrapper.find('.condition-trait-body').slideUp(200);
self.$wrapper.addClass('collapsed');
} else {
self.$wrapper.find('.condition-trait-body').slideDown(200);
self.$wrapper.removeClass('collapsed');
}
});
// Add group
this.$wrapper.on('click', '.btn-add-group', function(e) {
e.preventDefault();
var $block = $(this).closest('.target-block');
var blockType = $block.data('blockType');
self.addGroup($block, blockType);
});
// Remove group
this.$wrapper.on('click', '.btn-remove-group', function(e) {
e.preventDefault();
var $group = $(this).closest('.selection-group');
var $block = $(this).closest('.target-block');
self.removeGroup($group, $block);
});
// Group name input - stop propagation to prevent collapse
this.$wrapper.on('click focus', '.group-name-input', function(e) {
e.stopPropagation();
});
// Group name change
this.$wrapper.on('change blur', '.group-name-input', function() {
var $input = $(this);
var $group = $input.closest('.selection-group');
var name = $.trim($input.val());
$group.attr('data-group-name', name);
self.serializeAllBlocks();
});
// Add exceptions (first exclude row)
this.$wrapper.on('click', '.btn-add-exclude', function(e) {
e.preventDefault();
var $group = $(this).closest('.selection-group');
var $block = $(this).closest('.target-block');
self.addFirstExcludeRow($group, $block);
});
// Add another exclude row
this.$wrapper.on('click', '.btn-add-another-exclude', function(e) {
e.preventDefault();
var $group = $(this).closest('.selection-group');
var $block = $(this).closest('.target-block');
self.addExcludeRow($group, $block);
});
// Remove individual exclude row
this.$wrapper.on('click', '.btn-remove-exclude-row', function(e) {
e.preventDefault();
var $excludeRow = $(this).closest('.exclude-row');
var $group = $(this).closest('.selection-group');
var $block = $(this).closest('.target-block');
self.removeExcludeRow($excludeRow, $group, $block);
});
// Include method change
this.$wrapper.on('change', '.include-method-select', function() {
self.hideDropdown();
var $group = $(this).closest('.selection-group');
var $block = $(this).closest('.target-block');
var $row = $group.find('.group-include');
var blockType = $block.data('blockType');
var blockDef = self.config.blocks[blockType] || {};
var methods = blockDef.selection_methods || {};
var $option = $(this).find('option:selected');
var valueType = $option.data('valueType') || 'none';
var searchEntity = $option.data('searchEntity') || '';
var methodOptions = $option.data('options') || null;
var $oldPicker = $group.find('.include-picker');
var newPickerHtml = self.buildValuePickerHtml('include', valueType, searchEntity, methods);
$oldPicker.replaceWith(newPickerHtml);
if (valueType === 'select' && methodOptions) {
var $newPicker = $group.find('.include-picker');
var $select = $newPicker.find('.select-value-input');
$select.empty();
$.each(methodOptions, function(key, label) {
$select.append('
');
});
}
if (valueType === 'multi_select_tiles' && methodOptions) {
var $newPicker = $group.find('.include-picker');
var isExclusive = $option.data('exclusive') === true;
self.populateTiles($newPicker, methodOptions, isExclusive);
}
if (valueType === 'multi_numeric_range') {
var $newPicker = $group.find('.include-picker');
var step = $option.data('step');
var min = $option.data('min');
self.applyRangeInputConstraints($newPicker, step, min);
}
if (valueType === 'combination_attributes') {
var $newPicker = $group.find('.include-picker');
self.loadCombinationAttributeGroups($newPicker);
}
var selectedMethod = $(this).val();
self.updateMethodInfoPlaceholder($group.find('.method-selector-wrapper'), selectedMethod, blockType);
self.updateBlockStatus($block);
self.serializeAllBlocks($row);
});
// Exclude method change (within an exclude row)
this.$wrapper.on('change', '.exclude-method-select', function() {
self.hideDropdown();
var $excludeRow = $(this).closest('.exclude-row');
var $group = $(this).closest('.selection-group');
var $block = $(this).closest('.target-block');
var blockType = $block.data('blockType');
var blockDef = self.config.blocks[blockType] || {};
var methods = blockDef.selection_methods || {};
var $option = $(this).find('option:selected');
var valueType = $option.data('valueType') || 'entity_search';
var searchEntity = $option.data('searchEntity') || blockType;
var methodOptions = $option.data('options') || null;
var $oldPicker = $excludeRow.find('.exclude-picker');
var newPickerHtml = self.buildValuePickerHtml('exclude', valueType, searchEntity, methods);
$oldPicker.replaceWith(newPickerHtml);
if (valueType === 'select' && methodOptions) {
var $newPicker = $excludeRow.find('.exclude-picker');
var $select = $newPicker.find('.select-value-input');
$select.empty();
$.each(methodOptions, function(key, label) {
$select.append('
');
});
}
if (valueType === 'multi_select_tiles' && methodOptions) {
var $newPicker = $excludeRow.find('.exclude-picker');
var isExclusive = $option.data('exclusive') === true;
self.populateTiles($newPicker, methodOptions, isExclusive);
}
if (valueType === 'multi_numeric_range') {
var $newPicker = $excludeRow.find('.exclude-picker');
var step = $option.data('step');
var min = $option.data('min');
self.applyRangeInputConstraints($newPicker, step, min);
}
if (valueType === 'combination_attributes') {
var $newPicker = $excludeRow.find('.exclude-picker');
self.loadCombinationAttributeGroups($newPicker);
}
var selectedMethod = $(this).val();
self.updateMethodInfoPlaceholder($excludeRow.find('.exclude-header-row'), selectedMethod, blockType);
self.serializeAllBlocks($excludeRow);
});
// Handle pattern input Enter key - adds pattern as tag
this.$wrapper.on('keydown', '.pattern-input', function(e) {
if (e.keyCode === 13) {
e.preventDefault();
var $btn = $(this).closest('.draft-tag').find('.btn-add-pattern');
$btn.click();
}
});
// Handle add pattern button click (in draft tag)
this.$wrapper.on('click', '.draft-tag .btn-add-pattern', function(e) {
e.preventDefault();
e.stopPropagation();
var $draftTag = $(this).closest('.draft-tag');
var $picker = $draftTag.closest('.value-picker');
var $row = $draftTag.closest('.group-include, .exclude-row');
var $input = $draftTag.find('.pattern-input');
var pattern = $.trim($input.val());
if (pattern) {
var caseSensitive = $draftTag.attr('data-case-sensitive') === '1';
self.addPatternTag($picker, pattern, caseSensitive);
$input.val('').focus();
$draftTag.find('.pattern-match-count').removeClass('count-found count-zero').hide();
$draftTag.find('.pattern-match-count .count-value').text('');
self.serializeAllBlocks($row);
}
});
// Handle pattern input live typing - update match count in draft tag
this.$wrapper.on('input', '.pattern-input', function() {
var $input = $(this);
var $draftTag = $input.closest('.draft-tag');
if (!$draftTag.length) return;
var pattern = $.trim($input.val());
if ($input.data('countTimeout')) {
clearTimeout($input.data('countTimeout'));
}
var $matchCount = $draftTag.find('.pattern-match-count');
if (!pattern) {
$matchCount.removeClass('count-found count-zero').hide();
$matchCount.find('.count-value').text('');
var $group = $draftTag.closest('.selection-group');
if ($group.length) {
self.updateGroupTotalCount($group);
}
return;
}
var timeout = setTimeout(function() {
var caseSensitive = $draftTag.attr('data-case-sensitive') === '1';
self.updateDraftTagCount($draftTag, pattern, caseSensitive);
}, 300);
$input.data('countTimeout', timeout);
});
// Handle pattern tag remove
this.$wrapper.on('click', '.pattern-tag .btn-remove-pattern', function(e) {
e.preventDefault();
e.stopPropagation();
var $row = $(this).closest('.group-include, .exclude-row');
$(this).closest('.pattern-tag').remove();
self.serializeAllBlocks($row);
});
// Handle pattern tag case-sensitivity toggle
this.$wrapper.on('click', '.pattern-tag .btn-toggle-case', function(e) {
e.preventDefault();
e.stopPropagation();
var $tag = $(this).closest('.pattern-tag');
var $btn = $(this);
var trans = self.config.trans || {};
var isDraftTag = $tag.hasClass('draft-tag');
var isCaseSensitive = $tag.data('caseSensitive') === 1 || $tag.data('caseSensitive') === '1' || $tag.attr('data-case-sensitive') === '1';
var newCaseSensitive = !isCaseSensitive;
$tag.data('caseSensitive', newCaseSensitive ? 1 : 0);
$tag.attr('data-case-sensitive', newCaseSensitive ? '1' : '0');
$tag.toggleClass('case-sensitive', newCaseSensitive);
$btn.find('.case-icon').text(newCaseSensitive ? 'Aa' : 'aa');
var caseTitle = newCaseSensitive
? (trans.case_sensitive || 'Case sensitive - click to toggle')
: (trans.case_insensitive || 'Case insensitive - click to toggle');
$btn.attr('title', caseTitle);
if (isDraftTag) {
var pattern = $.trim($tag.find('.pattern-input').val());
if (pattern) {
self.updateDraftTagCount($tag, pattern, newCaseSensitive);
}
} else {
var $row = $tag.closest('.group-include, .exclude-row');
self.serializeAllBlocks($row);
}
});
// Handle pattern match count click - show preview modal
this.$wrapper.on('click', '.pattern-match-count', function(e) {
e.preventDefault();
e.stopPropagation();
var $matchCount = $(this);
var count = $matchCount.data('count');
var pattern = $matchCount.data('pattern');
var entityType = $matchCount.data('entityType');
var caseSensitive = $matchCount.data('caseSensitive');
if (!count || count <= 0 || !pattern) {
return;
}
self.showPatternPreviewModal(pattern, entityType, caseSensitive, count);
});
// Handle pattern tag edit (click on tag text)
this.$wrapper.on('click', '.pattern-tag .pattern-tag-text', function(e) {
e.preventDefault();
var $tag = $(this).closest('.pattern-tag');
if ($tag.hasClass('editing')) return;
var currentPattern = $tag.data('pattern');
var $editInput = $('
').val(currentPattern);
var $saveBtn = $('
');
var $cancelBtn = $('
');
var $editActions = $('
').append($saveBtn, $cancelBtn);
$tag.addClass('editing').find('.pattern-tag-text').hide();
$tag.find('.btn-remove-pattern').hide();
$tag.prepend($editActions).prepend($editInput);
$editInput.focus().select();
$editInput.on('keydown', function(ev) {
if (ev.keyCode === 13) {
ev.preventDefault();
$saveBtn.click();
} else if (ev.keyCode === 27) {
ev.preventDefault();
$cancelBtn.click();
}
});
});
// Pattern edit - Save button
this.$wrapper.on('click', '.pattern-tag .btn-pattern-save', function(e) {
e.preventDefault();
e.stopPropagation();
var $tag = $(this).closest('.pattern-tag');
var $editInput = $tag.find('.pattern-tag-edit');
var currentPattern = $tag.data('pattern');
var newPattern = $.trim($editInput.val());
if (newPattern && newPattern !== currentPattern) {
$tag.data('pattern', newPattern);
$tag.find('.pattern-tag-text').text(newPattern);
}
$editInput.remove();
$tag.find('.pattern-edit-actions').remove();
$tag.removeClass('editing').find('.pattern-tag-text, .btn-remove-pattern').show();
var $row = $tag.closest('.group-include, .exclude-row');
self.serializeAllBlocks($row);
});
// Pattern edit - Cancel button
this.$wrapper.on('click', '.pattern-tag .btn-pattern-cancel', function(e) {
e.preventDefault();
e.stopPropagation();
var $tag = $(this).closest('.pattern-tag');
$tag.find('.pattern-tag-edit').remove();
$tag.find('.pattern-edit-actions').remove();
$tag.removeClass('editing').find('.pattern-tag-text, .btn-remove-pattern').show();
});
// Handle mpr-info-wrapper tooltip with fixed positioning
this.$wrapper.on('mouseenter', '.mpr-info-wrapper[data-details]', function() {
var $wrapper = $(this);
if ($wrapper.data('tooltip-active')) return;
var content = $wrapper.attr('data-details');
var tooltipClass = $wrapper.attr('data-tooltip-class') || '';
var $tooltip = $('
', { class: 'mpr-tooltip mpr-tooltip-fixed ' + tooltipClass, html: content });
$('body').append($tooltip);
$wrapper.data('tooltip-active', true);
var offset = $wrapper.offset();
var triggerWidth = $wrapper.outerWidth();
var tooltipWidth = $tooltip.outerWidth();
var tooltipHeight = $tooltip.outerHeight();
var left = offset.left + (triggerWidth / 2) - (tooltipWidth / 2);
var top = offset.top - tooltipHeight - 10;
if (left < 10) left = 10;
if (left + tooltipWidth > $(window).width() - 10) {
left = $(window).width() - tooltipWidth - 10;
}
$tooltip.css({
position: 'fixed',
left: left + 'px',
top: (top - $(window).scrollTop()) + 'px'
});
$wrapper.data('tooltip-el', $tooltip);
});
this.$wrapper.on('mouseleave', '.mpr-info-wrapper[data-details]', function() {
var $wrapper = $(this);
var $tooltip = $wrapper.data('tooltip-el');
if ($tooltip) {
$tooltip.remove();
}
$wrapper.data('tooltip-active', false);
$wrapper.data('tooltip-el', null);
});
// Handle numeric range input changes
this.$wrapper.on('change', '.range-min-input, .range-max-input', function() {
var $row = $(this).closest('.group-include, .exclude-row');
self.serializeAllBlocks($row);
});
// Handle date range input changes
this.$wrapper.on('change', '.date-from-input, .date-to-input', function() {
var $row = $(this).closest('.group-include, .exclude-row');
self.serializeAllBlocks($row);
});
// Handle select value changes
this.$wrapper.on('change', '.select-value-input', function() {
var $row = $(this).closest('.group-include, .exclude-row');
self.serializeAllBlocks($row);
});
// Handle multi-range add button click
this.$wrapper.on('click', '.btn-add-range', function(e) {
e.preventDefault();
var $picker = $(this).closest('.value-picker');
var $row = $(this).closest('.group-include, .exclude-row');
var $container = $picker.find('.multi-range-container');
var $chipsContainer = $container.find('.multi-range-chips');
var $minInput = $container.find('.range-min-input');
var $maxInput = $container.find('.range-max-input');
var minVal = $minInput.val().trim();
var maxVal = $maxInput.val().trim();
if (minVal === '' && maxVal === '') {
return;
}
var step = parseFloat($minInput.attr('step')) || 0.01;
var minAllowed = $minInput.attr('min');
var hasMinConstraint = typeof minAllowed !== 'undefined' && minAllowed !== '';
minAllowed = hasMinConstraint ? parseFloat(minAllowed) : null;
var minNum = minVal !== '' ? parseFloat(minVal) : null;
var maxNum = maxVal !== '' ? parseFloat(maxVal) : null;
if (hasMinConstraint) {
if (minNum !== null && minNum < minAllowed) {
self.showRangeInputError($minInput, self.config.trans.min_value_error || 'Minimum value is ' + minAllowed);
return;
}
if (maxNum !== null && maxNum < minAllowed) {
self.showRangeInputError($maxInput, self.config.trans.min_value_error || 'Minimum value is ' + minAllowed);
return;
}
}
if (minNum !== null && maxNum !== null && minNum > maxNum) {
self.showRangeInputError($minInput, self.config.trans.min_greater_than_max || 'Min cannot be greater than max');
return;
}
var decimals = step < 1 ? String(step).split('.')[1].length : 0;
if (minNum !== null) {
if (step >= 1) {
minNum = Math.round(minNum);
} else {
minNum = parseFloat(minNum.toFixed(decimals));
}
minVal = String(minNum);
}
if (maxNum !== null) {
if (step >= 1) {
maxNum = Math.round(maxNum);
} else {
maxNum = parseFloat(maxNum.toFixed(decimals));
}
maxVal = String(maxNum);
}
var chipText = '';
if (minVal !== '' && maxVal !== '') {
chipText = minVal + ' - ' + maxVal;
} else if (minVal !== '') {
chipText = '≥ ' + minVal;
} else {
chipText = '≤ ' + maxVal;
}
var $chip = $('
', {
class: 'range-chip',
'data-min': minVal,
'data-max': maxVal
});
$chip.append($('', { class: 'range-chip-text', text: chipText }));
$chip.append($('