{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/1.2.0/controls/base/groups/base-controls-group.js","webpack:///./src/1.2.0/controls/base/controls/base.control.js","webpack:///./src/1.2.0/controls/base/groups/sort/base-sort-controls-group.js","webpack:///./src/1.2.0/controls/base/groups/filter/base-path-filter-controls-group.js","webpack:///./src/1.2.0/controls/base/controls/filter/base-path-filter.control.js","webpack:///./src/1.2.0/controls/base/groups/filter/base-text-filter-controls-group.js","webpack:///./src/1.2.0/controls/base/controls/dropdown/base-dropdown.control.js","webpack:///./src/1.2.0/controls/base/groups/mixins/buttons.mixin.js","webpack:///./src/1.2.0/controls/base/controls/sort/base-sort.control.js","webpack:///./src/1.2.0/controls/base/controls/filter/base-range-filter.control.js","webpack:///./src/1.2.0/controls/base/groups/filter/base-range-filter-controls-group.js","webpack:///./src/1.2.0/controls/base/groups/mixins/radio-buttons.mixin.js","webpack:///./src/1.2.0/controls/base/groups/mixins/checkbox.mixin.js","webpack:///./src/1.2.0/controls/base/controls/filter/base-text-filter.control.js","webpack:///./src/1.2.0/actions/filter/filter.action.js","webpack:///./src/1.2.0/controls/counter/counter.control.js","webpack:///./src/1.2.0/controls/reset/reset.control.js","webpack:///./src/1.2.0/controls/layout/layout.control.js","webpack:///./src/1.2.0/controls/no-results/no-results.control.js","webpack:///./src/1.2.0/controls/base/controls/slider/base-slider.control.js","webpack:///./src/1.2.0/controls/filter/range-filters/slider-range-filter/slider-range-filter.control.js","webpack:///./src/1.2.0/controls/filter/range-filters/buttons-range-filter/buttons-range-filter.control.js","webpack:///./src/1.2.0/controls/filter/path-filters/dropdown-filter/dropdown-filter.control.js","webpack:///./src/1.2.0/controls/filter/path-filters/buttons-path-filter/buttons-path-filter.control.js","webpack:///./src/1.2.0/controls/filter/path-filters/radio-buttons-path-filter/radio-buttons-path-filter.control.js","webpack:///./src/1.2.0/controls/filter/path-filters/checkbox-path-filter/checkbox-path-filter.control.js","webpack:///./src/1.2.0/controls/filter/path-filters/select-filter/select-filter.control.js","webpack:///./src/1.2.0/controls/filter/text-filters/buttons-text-filter/buttons-text-filter.control.js","webpack:///./src/1.2.0/controls/filter/text-filters/radio-buttons-text-filter/radio-buttons-text-filter.control.js","webpack:///./src/1.2.0/controls/filter/text-filters/checkbox-text-filter/checkbox-text-filter.control.js","webpack:///./src/1.2.0/controls/filter/text-filters/textbox-filter/textbox-filter.control.js","webpack:///./src/1.2.0/controls/base/controls/pagination/base-pagination.control.js","webpack:///./src/1.2.0/controls/base/groups/pagination/base-pagination-controls-group.js","webpack:///./src/1.2.0/controls/pagination/pagination.control.js","webpack:///./src/1.2.0/controls/sort/dropdown-sort/dropdown-sort.control.js","webpack:///./src/1.2.0/controls/sort/select-sort/select-sort.control.js","webpack:///./src/1.2.0/controls/sort/checkbox-sort/checkbox-sort.control.js","webpack:///./src/1.2.0/controls/sort/radio-buttons-sort/radio-buttons-sort.control.js","webpack:///./src/1.2.0/controls/sort/buttons-sort/buttons-sort.control.js","webpack:///./src/1.2.0/controls/sort/hidden-sort/hidden-sort.control.js","webpack:///./src/1.2.0/services/storage.service.js","webpack:///./src/1.2.0/services/deep-links.service.js","webpack:///./src/1.2.0/actions/pagination/pagination.action.js","webpack:///./src/1.2.0/actions/sort/sort.action.js","webpack:///./src/1.2.0/content/content-manager.js","webpack:///./src/1.2.0/jplist.js","webpack:///./src/1.2.0/index.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","r","value","n","__esModule","object","property","prototype","hasOwnProperty","p","s","BaseControlsGroup","group","controls","deepLinkParams","arguments","length","undefined","_classCallCheck","this","trim","toLowerCase","has","control","push","BaseControl","element","initialHTML","outerHTML","type","getAttribute","id","jump","BaseSortControlsGroup","sortOptions","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","concat","getSortOptions","err","return","baseSortControl","_baseSort2","default","BasePathFilterControlsGroup","basePathFilterControl","_basePathFilter2","options","getPathFilterOptions","_base","BasePathFilterControl","_this","_possibleConstructorReturn","__proto__","getPrototypeOf","path","isInverted","or","BaseTextFilterControlsGroup","getTextFilterOptions","baseTextFilterControl","_baseTextFilter2","dl","map","text","filter","str","Array","from","Set","join","BaseDropdownControl","panels","querySelectorAll","openedClass","panel","initialContent","innerHTML","contents","handlePanelsClick","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_loop","addEventListener","e","atLeastOnePanelIsOpened","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","dropdownContent","classList","toggle","contains","add","remove","_iterator2","document","target","close","content","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_step5","_iterator5","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_step6","_iterator6","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_step7","_iterator7","superclass","_superclass","_class","checkboxes","radios","_inherits","_createClass","key","_this2","baseButtonControl","selected","mode","deepLinkParam","find","param","handleRadios","handleCheckboxes","preventDefault","forEach","cb","isEqualTo","window","jplist","refresh","checked","latestSelectedRadio","radio","getLastSelectedRadio","cbArr","radioArr","combined","BaseSortControl","dataType","order","regex","dateTimeFormat","multipleSortsNumber","getMultipleSortsNumber","index","pathsNumber","attributes","attr","match","exec","nodeName","propIndex","Number","isInteger","ignoreRegex","isEqual","props","k","BaseRangeFilterControl","Infinity","isNaN","to","min","max","BaseRangeFilterControlsGroup","baseRangeFilterControl","_baseRangeFilter2","getRangeFilterOptions","baseControl","BaseTextFilterControl","initialText","_text","includeValue","FilterAction","items","filtered","formattedText","replace","RegExp","item","elements","shouldBeAdded","elText","textContent","startsWith","endsWith","indexOf","el","querySelector","parseFloat","isFinite","Math","itemElements","numbers","num","maxNumber","apply","minNumber","isNumeric","CounterControl","countValue","format","_get","filterType","baseFilterControl","jplistState","count","groups","getStaticCounterValue","getDynamicCounterValue","render","getFilteredItems","_filter2","textFilter","pathFilter","rangeFilter","_baseControlsGroup","ResetControl","resetControls","LayoutControl","classNames","selectedClassName","groupClassName","handleSelectedControls","handleClasses","resetAllGroups","getLatestSelectedControl","addClassToGroups","cn","selectedGroupClassName","arr","NoResultsControl","itemsNumber","style","display","BaseSliderControl","isVertical","value1","value2","callback","handler1","createElement","appendChild","range","left","top","handler2","dragging","start","bind","resize","stop","body","setValues","sendCallback","pos1","getInnerValue","pos2","update","x","y","newStart","newEnd","getBoundingClientRect","position","getHandlerPos","abs","handler1ZIndex","getComputedStyle","defaultView","getPropertyValue","handler2ZIndex","stopPropagation","setZIndex","handler","rect","size","xy","lefttop","getPreviewValue","rangeHeight","point","touches","pageX","clientX","pageY","clientY","vector","sub","v1","v2","SliderRangeFilter","rangeSliderFilterControl","sliderEl","val1Elements","val2Elements","minElements","maxElements","orientation","parts","split","slider","_baseSlider2","round","controlOptions","ButtonsRangeFilter","_buttons2","_baseRangeFilterControlsGroup2","checkbox","DropdownFilterControl","dropdown","_baseDropdown2","buttons","button","setAttribute","btnPathFilterControl","setSelectedButton","getSelectedButton","deepLinkBtn","btn","btnValue","_this3","dropdownBtn","setPanelsContent","ButtonsPathFilterControl","_basePathFilterControlsGroup2","RadioButtonsPathFilterControl","_radioButtons2","CheckboxPathFilterControl","_checkbox2","SelectFilterControl","selectFilterControl","option","opt","_this4","ButtonsTextFilterControl","_baseTextFilterControlsGroup2","RadioButtonsTextFilterControl","CheckboxTextFilterControl","_baseTextFilterControlsGroup","TextboxFilterControl","textChanged","clearButtonID","clearBtn","getElementById","BasePaginationControl","itemsPerPage","currentPage","disabledClass","selectedClass","BasePaginationControlsGroup","getPaginationOptions","paginationOptions","basePaginationControl","_basePagination2","PaginationControl","restoreFromDeepLink","pageButtonsHolder","btnTemplate","firstButtons","lastButtons","prevButtons","nextButtons","bindEventHandler","pageButtonClick","itemsPerPageSelects","updateItemsPerPageSelect","itemsPerPageDD","initCustomDropdowns","selectChange","labels","label","template","selects","select","toString","dd","_loop2","selectedButton","_this5","_loop3","firstChild","removeChild","_loop4","div","pageButton","rangeStart","rangeEnd","setPageAttr","pagesNumber","prevPage","nextPage","infos","end","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_step8","_iterator8","html","_iteratorNormalCompletion9","_didIteratorError9","_iteratorError9","_step9","_iterator9","info","classesToRemove","className","_iteratorNormalCompletion10","_didIteratorError10","_iteratorError10","_step10","_iterator10","pageNumber","_iteratorNormalCompletion11","_didIteratorError11","_iteratorError11","_step11","_iterator11","page","isEnabled","_iteratorNormalCompletion12","_didIteratorError12","_iteratorError12","_step12","_iterator12","eventName","func","_iteratorNormalCompletion13","_didIteratorError13","_iteratorError13","_step13","_loop5","_iterator13","DropdownSortControl","btnSortControl","SelectSortControl","_baseSortControlsGroup","CheckboxSortControl","atLeastOneNotSelectedCheckbox","RadioButtonsSortControl","ButtonsSortControl","HiddenSortControl","StorageService","storage","deepLink","expiration","cValue","encodeURIComponent","exdate","Date","cookie","setMinutes","getMinutes","toUTCString","isSupported","cookies","substr","decodeURIComponent","DeepLinksService","hash","hashStart","paramsMap","Map","formattedHash","params","currentGroupName","pair","getParam","set","groupValues","PaginationAction","ceil","halfRange","SortAction","sort","item1","item2","sortByIndex","sortHelper","optionsIndex","result","sortNumbers","sortDateTime","sortText","el1","el2","text1","text2","regexExpr","localeCompare","number1","number2","jplistIndex","datetime1","datetime2","date1","date2","getDateFromString","parse","getTime","dateTimeString","year","getDateWildcardValue","day","month","getMonthByWildcard","hour","minute","second","wildcard","datetimeString","regexValue","monthNumberOrName","monthIndex","months","findIndex","monthAliasesArray","monthAlias","ContentManager","settings","groupName","filters","_step$value","_slicedToArray","cGroupName","groupValueArr","baseControlsGroups","collectControlsOptions","itemsBlock","fragment","getItemsFragment","_sort2","filterName","splitted","splitByLogic","orOptionsGroupName","handleFilter","and","paginationAction","_pagination2","bcg","setPaginationOptions","paginatedItems","slice","root","sendStateEvent","deepLinking","updateDeepLink","getDeepLink","_storage2","storageName","cookiesExpiration","logic","performFilter","orFiltered","temp","_toConsumableArray","orName","jumpEl","jumpElRect","width","height","getClientRects","clientTop","pageYOffset","scroll","stateEvent","CustomEvent","baseControlsGroup","dispatchEvent","textFilterOptions","pathFilterOptions","rangeFilterOptions","createDocumentFragment","hashStr","location","href","substring","history","replaceState","deeplink","keys","deepLinkParts","groupsMap","groupElements","_iteratorNormalCompletion14","_didIteratorError14","_iteratorError14","_step14","_iterator14","groupElement","groupValue","_iteratorNormalCompletion15","_didIteratorError15","_iteratorError15","_step15","_iterator15","controlInstance","_base2","_iteratorNormalCompletion16","_didIteratorError16","_iteratorError16","_step16","_iterator16","_deepLinks2","getUrlParams","deepLinkSavedInStorage","_iteratorNormalCompletion17","_didIteratorError17","_iteratorError17","_step17","_iterator17","controlTypes","controlClass","controlGroup","addControl","res","findControls","controlsByGroupNames","findControlGroups","_iteratorNormalCompletion18","_didIteratorError18","_iteratorError18","_step18","_iterator18","_step18$value","groupControls","sameNameControls","findSameNameControls","_iteratorNormalCompletion19","_didIteratorError19","_iteratorError19","_step19","_iterator19","values","jPList","assign","_contentManager2","splitByGroupAndName","findGroups","controlIndex","oldElement","newElement","parentNode","replaceChild","splice","_step3$value","updateContentFunc","_step6$value","event","bubbles","cancelable","detail","evt","createEvent","initCustomEvent","Event","_hiddenSort2","_buttonsSort2","_radioButtonsSort2","_checkboxSort2","_selectSort2","_dropdownSort2","_textboxFilter2","_checkboxTextFilter2","_radioButtonsTextFilter2","_buttonsTextFilter2","_selectFilter2","_dropdownFilter2","_checkboxPathFilter2","_radioButtonsPathFilter2","_buttonsPathFilter2","_buttonsRangeFilter2","_sliderRangeFilter2","_noResults2","_layout2","_reset2","_counter2","_jplist2","init","resetControl","resetContent"],"mappings":"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","file":"jplist.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 46);\n","/**\n * represents a group of controls with the same data-name and data-group attributes\n */\nclass BaseControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls, deepLinkParams = null){\n\n this.group = (group || '').trim().toLowerCase();\n this.name = (name || 'default').trim();\n this.controls = controls || [];\n\n this.deepLinkParams = [];\n\n if(deepLinkParams && deepLinkParams.has(this.group)){\n\n this.deepLinkParams = deepLinkParams.get(this.group) || [];\n }\n }\n\n /**\n * add control to the group\n * @param {BaseControl} control\n */\n addControl(control){\n if(!control || control.name !== this.name || control.group !== this.group) return;\n\n this.controls.push(control);\n }\n\n /**\n * by default control's deep link is empty\n * @returns {string}\n */\n getDeepLink(){\n return '';\n }\n\n}\n\nexport default BaseControlsGroup;","/**\n * jPList Base Control\n * Each jPList control should extend this base control.\n */\nclass BaseControl{\n\n /**\n * control type defined in data-jplist-control attribute;\n * for example, data-jplist-control=\"hidden-sort\" has type='hidden-sort'\n * @param {HTMLElement} element\n */\n constructor(element){\n\n if(element) {\n\n this.element = element;\n\n /**\n * element initial html\n * @type {string}\n */\n this.element.initialHTML = element.outerHTML;\n\n /**\n * used to define appropriate class for the control\n * @type {string} required\n */\n this.type = (element.getAttribute('data-jplist-control') || '').trim().toLowerCase();\n\n /**\n * used to define the elements group that is influenced by this control\n * @type {string=} optional\n */\n this.group = (element.getAttribute('data-group') || '').trim().toLowerCase();\n\n /**\n * control name\n * @type {string} optional\n */\n this.name = (element.getAttribute('data-name') || element.getAttribute('name') || 'default').trim();\n\n /**\n * deep link parameter name\n * @type {string} optional\n */\n this.id = (element.getAttribute('data-id') || '').trim().toLowerCase();\n\n /**\n * jump to an element after the action;\n * and CSS selector or \"top\" keyword\n * @type {string} optional\n */\n this.jump = (element.getAttribute('data-jump') || '').trim();\n }\n }\n}\n\nexport default BaseControl;","import BaseControlsGroup from '../base-controls-group';\nimport BaseSortControl from '../../controls/sort/base-sort.control';\n\n/**\n * represents a group of sort controls with the same data-name and data-group attributes\n */\nclass BaseSortControlsGroup extends BaseControlsGroup{\n\n /**\n * get sort options from all controls in the group\n * @return {Array.} sortOptions\n */\n getSortOptions(){\n\n let sortOptions = [];\n\n for(let control of this.controls){\n sortOptions = sortOptions.concat(control.getSortOptions());\n }\n\n return sortOptions;\n }\n\n /**\n * add control to the group\n * @param {BaseControl} control\n * @return {BaseSortControl|null}\n */\n addControl(control){\n\n if(control.name !== this.name || control.group !== this.group){\n return null;\n }\n\n const baseSortControl = new BaseSortControl(control.element);\n\n this.controls.push(baseSortControl);\n\n return baseSortControl;\n }\n}\n\nexport default BaseSortControlsGroup;\n","import BaseControlsGroup from '../base-controls-group';\nimport BasePathFilterControl from '../../controls/filter/base-path-filter.control';\n\n/**\n * represents a group of path filter controls with the same data-name and data-group attributes\n */\nclass BasePathFilterControlsGroup extends BaseControlsGroup{\n\n /**\n * add control to the group\n * @param {BaseControl} control\n * @return {BasePathFilterControl|null}\n */\n addControl(control){\n\n if(control.name !== this.name || control.group !== this.group){\n return null;\n }\n\n const basePathFilterControl = new BasePathFilterControl(control.element);\n\n this.controls.push(basePathFilterControl);\n\n return basePathFilterControl;\n }\n\n /**\n * get path filter options from all controls in the group\n * @return {Array.} path filer options\n */\n getPathFilterOptions(){\n\n let options = [];\n\n for(let control of this.controls){\n options = options.concat(control.getPathFilterOptions());\n }\n\n return options;\n }\n\n}\n\nexport default BasePathFilterControlsGroup;\n","import BaseControl from '../base.control';\n\n/**\n * base path filter control\n */\nclass BasePathFilterControl extends BaseControl{\n\n /**\n * constructor\n * @param {HTMLElement} element\n */\n constructor(element){\n super(element);\n\n if(element){\n\n /**\n * css selector or 'default' for the browser default order (no sort); if path is empty -> the whole element\n * @type {string}\n */\n this.path = (element.getAttribute('data-path') || '').trim();\n\n /**\n * defines if path is inverted; if true, the path filter returns all items that DON'T contain the specified path\n * @type {string}\n */\n this.isInverted = (element.getAttribute('data-inverted') || '').toLowerCase().trim() === 'true';\n\n /**\n * optional \"OR\" logic property, used to combine different filter controls with \"OR\" logic instead of \"AND\"\n * @type {string|null}\n */\n this.or = element.getAttribute('data-or') || null;\n }\n }\n\n /**\n * get path filter options used in FilterAction.pathFilter method\n * @return {Array.<{object}>} options\n */\n getPathFilterOptions(){\n\n return {\n path: this.path,\n isInverted: this.isInverted,\n or: this.or\n };\n }\n\n /**\n * check if current control has the same properties like the specified control\n * @param {BasePathFilterControl} control\n * @return {boolean}\n */\n isEqualTo(control){\n return this.path === control.path && this.isInverted === control.isInverted;\n }\n}\n\nexport default BasePathFilterControl;","import BaseControlsGroup from '../base-controls-group';\nimport BaseTextFilterControl from '../../controls/filter/base-text-filter.control';\n\n/**\n * represents a group of text filter controls with the same data-name and data-group attributes\n */\nclass BaseTextFilterControlsGroup extends BaseControlsGroup{\n\n /**\n * get text filter options from all controls in the group\n * @return {Array.} text filter options\n */\n getTextFilterOptions(){\n\n let options = [];\n\n for(let control of this.controls){\n options = options.concat(control.getTextFilterOptions());\n }\n\n return options;\n }\n\n /**\n * add control to the group\n * @param {BaseControl} control\n * @return {BaseTextFilterControl|null}\n */\n addControl(control){\n\n if(control.name !== this.name || control.group !== this.group){\n return null;\n }\n\n const baseTextFilterControl = new BaseTextFilterControl(control.element);\n\n this.controls.push(baseTextFilterControl);\n\n return baseTextFilterControl;\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n\n const dl = this.controls.map(control => control.id && control.text.trim() !== '' ? (control.id + '=' + control.text.trim()) : '').filter(str => str !== '');\n\n const unique = Array.from(new Set(dl));\n return unique.join('&');\n }\n}\n\nexport default BaseTextFilterControlsGroup;\n","import './base-dropdown.control.css';\n\n/**\n * base dropdown control\n */\nclass BaseDropdownControl{\n\n\n /**\n * control type defined in data-jplist-control attribute;\n * for example, data-jplist-control=\"hidden-sort\" has type='hidden-sort'\n * @param {HTMLElement} element\n */\n constructor(element){\n\n if(element) {\n\n this.element = element;\n\n if(!this.element) return;\n\n //dropdown panel elements defined by data-type=\"panel\" data attribute; can be multiple;\n this.panels = this.element.querySelectorAll('[data-type=\"panel\"]');\n this.element.openedClass = (this.element.getAttribute('data-opened-class') || 'jplist-dd-opened').trim();\n\n //keep panels initial html\n for(let panel of this.panels){\n panel.initialContent = panel.innerHTML;\n panel.element = element;\n }\n\n //dropdown content elements defined by data-type=\"content\" data attribute; can be multiple;\n this.contents = this.element.querySelectorAll('[data-type=\"content\"]');\n\n //handle panels onclick event\n this.handlePanelsClick();\n }\n }\n\n /**\n * handle panels onclick event\n */\n handlePanelsClick(){\n\n if(!this.panels || this.panels.length <= 0) return;\n\n for(let panel of this.panels){\n\n /**\n * on panel click\n */\n panel.addEventListener('click', e => {\n\n //e.stopPropagation();\n\n let atLeastOnePanelIsOpened = false;\n\n for(let dropdownContent of this.contents){\n\n dropdownContent.classList.toggle(panel.element.openedClass);\n\n if(dropdownContent.classList.contains(panel.element.openedClass)){\n atLeastOnePanelIsOpened = true;\n }\n }\n\n if(atLeastOnePanelIsOpened){\n panel.classList.add(panel.element.openedClass);\n panel.element.classList.add(panel.element.openedClass);\n }\n else{\n panel.classList.remove(panel.element.openedClass);\n panel.element.classList.remove(panel.element.openedClass);\n }\n });\n }\n\n /**\n * close dropdowns on body click\n */\n document.addEventListener('click', e => {\n\n if (!this.element.contains(e.target)) { // or use: event.target.closest(selector) === null\n\n this.close();\n }\n });\n }\n\n /**\n * set panels content\n * @param {string} content\n */\n setPanelsContent(content){\n\n for(let panel of this.panels){\n panel.innerHTML = content;\n }\n }\n\n /**\n * restore panels content\n */\n restorePanelsContent(){\n\n for(let panel of this.panels){\n\n if(panel.initialContent) {\n panel.innerHTML = panel.initialContent;\n }\n }\n }\n\n /**\n * close dropdown\n */\n close(){\n for(let dropdownContent of this.contents){\n\n dropdownContent.classList.remove(this.panels[0].element.openedClass);\n }\n\n for(let panel of this.panels){\n panel.classList.remove(panel.element.openedClass);\n panel.element.classList.remove(panel.element.openedClass);\n }\n }\n}\n\nexport default BaseDropdownControl;","const SELECTED_CLASS = 'jplist-selected';\n\n/**\n * buttons mixin\n * used for multiple inheritance\n * usage example:\n * class ButtonsTextFilterControl extends ButtonsMixin(BaseTextFilterControlsGroup)\n * @param {class} superclass\n * @return {class}\n */\nconst ButtonsMixin = superclass => class extends superclass {\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n\n this.checkboxes = [];\n this.radios = [];\n }\n\n /**\n * add control to the group\n * @param {BasePathFilterControl} control\n */\n addControl(control){\n\n const baseButtonControl = super.addControl(control);\n\n //get additional control properties\n baseButtonControl.selected = baseButtonControl.element.getAttribute('data-selected') === 'true';\n baseButtonControl.mode = baseButtonControl.element.getAttribute('data-mode') || 'radio';\n\n //check if control contains a link and it is in the deep links parameters\n if(baseButtonControl.id){\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === baseButtonControl.id);\n\n if(deepLinkParam){\n baseButtonControl.selected = deepLinkParam.value === '1';\n }\n }\n\n if(baseButtonControl.mode === 'radio'){\n\n this.radios.push(baseButtonControl);\n this.handleRadios();\n }\n\n if(baseButtonControl.mode === 'checkbox'){\n\n this.checkboxes.push(baseButtonControl);\n this.handleCheckboxes();\n }\n\n /**\n * on control click -> change the selected control\n */\n baseButtonControl.element.addEventListener('click', e => {\n\n e.preventDefault();\n\n if(baseButtonControl.mode === 'checkbox'){\n\n baseButtonControl.selected = !baseButtonControl.selected;\n\n this.checkboxes.forEach(cb => {\n\n if(cb.isEqualTo(baseButtonControl)){\n cb.selected = baseButtonControl.selected;\n }\n });\n\n this.handleCheckboxes();\n }\n\n if(baseButtonControl.mode === 'radio'){\n\n for (let radio of this.radios) {\n radio.selected = false;\n }\n\n baseButtonControl.selected = true;\n\n this.handleRadios();\n }\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, baseButtonControl);\n }\n });\n }\n\n /**\n * handle checkbox mode controls\n */\n handleCheckboxes(){\n\n for(let cb of this.checkboxes){\n\n if(cb.selected){\n cb.element.classList.add(SELECTED_CLASS);\n }\n else{\n cb.element.classList.remove(SELECTED_CLASS);\n }\n\n cb.element.checked = cb.selected;\n }\n }\n\n /**\n * get the latest selected radio\n * @return {BasePathFilterControl} latestSelectedRadio\n */\n getLastSelectedRadio(){\n\n let latestSelectedRadio = null;\n\n //find the latest selected radio\n for (let radio of this.radios) {\n\n if (radio.selected) {\n latestSelectedRadio = radio;\n }\n }\n\n return latestSelectedRadio;\n }\n\n /**\n * handle radio buttons\n */\n handleRadios(){\n\n if(this.radios.length > 0) {\n\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n //remove selected from all radios\n for (let radio of this.radios) {\n\n radio.selected = false;\n radio.element.classList.remove(SELECTED_CLASS);\n }\n\n if(latestSelectedRadio) {\n\n this.radios.forEach(radio => {\n\n if(radio.isEqualTo(latestSelectedRadio)){\n radio.selected = true;\n radio.element.checked = true;\n radio.element.classList.add(SELECTED_CLASS);\n }\n });\n }\n }\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n const cbArr = this.checkboxes.map(cb => {\n\n if(cb.id){\n return cb.selected ? cb.id + '=1' : cb.id + '=0';\n }\n else{\n return '';\n }\n\n }).filter(str => str !== '');\n\n const radioArr = this.radios.map(radio => radio.id && radio.selected ? radio.id + '=1' : '').filter(str => str !== '');\n\n const combined = cbArr.concat(radioArr);\n const unique = Array.from(new Set(combined));\n return unique.join('&');\n }\n};\n\nexport default ButtonsMixin;","import BaseControl from '../base.control';\n\n/**\n * base sort control\n */\nclass BaseSortControl extends BaseControl{\n\n /**\n * constructor\n * @param {HTMLElement} element\n */\n constructor(element){\n super(element);\n\n if(element){\n\n /**\n * css selector or 'default' for the browser default order (no sort); if path is empty -> the whole element\n * @type {string}\n */\n this.path = (element.getAttribute('data-path') || '').trim();\n\n /**\n * optional text (default), number or datetime\n * @type {string}\n */\n this.dataType = (element.getAttribute('data-type') || 'text').trim().toLowerCase();\n\n /**\n * optional sort order: asc (default) or desc\n * @type {string}\n */\n this.order = (element.getAttribute('data-order') || 'asc').trim().toLowerCase();\n\n /**\n * optional ignore regex - used to ignore characters before sort\n * @type {string}\n */\n this.regex = element.getAttribute('data-regex') || '';\n\n /**\n * optional datetime format - datetime structure using wilcards {year}|{month}|{day}|{hour}|{min}|{sec}, for example: {month}/{day}/{year}\n * @type {string}\n */\n this.dateTimeFormat = (element.getAttribute('data-date-format') || '').trim().toLowerCase();\n\n /**\n * this property indicates the number of data attribute groups [{data-path, data-order, ...}, {data-path-1, data-order-1,...}, ...]\n * only data-path attribute is required;\n * if multipleSortsNum > 0 => multiple sort\n * @type {number}\n */\n this.multipleSortsNumber = this.getMultipleSortsNumber(element);\n\n for(let index=1; index <= this.multipleSortsNumber; index++){\n this['path' + index] = (element.getAttribute('data-path-' + index) || '').trim();\n this['dataType' + index] = (element.getAttribute('data-type-' + index) || 'text').trim().toLowerCase();\n this['order' + index] = (element.getAttribute('data-order-' + index) || 'asc').trim().toLowerCase();\n this['regex' + index] = element.getAttribute('data-regex-' + index) || '';\n this['dateTimeFormat' + index] = (element.getAttribute('data-date-format-' + index) || '').trim().toLowerCase();\n }\n\n }\n }\n\n /**\n * multiple sort is defined by another sets of data attributes like {data-path-1, data-order-1,...}, {data-path-2, data-order-2,...} etc\n * this method counts the number of such sets (= the number of attributes data-path-1, data-path-2, ...)\n * @param {HTMLElement} element\n * @return {number}\n */\n getMultipleSortsNumber(element){\n\n let pathsNumber = 0;\n\n for(let attr of element.attributes){\n\n let match = null;\n const regex = /^data-path-([0-9]+)$/g;\n\n while (match = regex.exec(attr.nodeName)) {\n\n const propIndex = Number(match[1]);\n\n if(!Number.isInteger(propIndex)) continue;\n pathsNumber++;\n }\n }\n\n return pathsNumber;\n }\n\n /**\n * get sort options used in SortAction.sort method\n * @return {Array.<{path: string, dataType: text|number|datetime, order: asc|desc, ignoreRegex: string, dateTimeFormat: string}>} options\n */\n getSortOptions(){\n\n const options = [];\n\n //initial path is required\n if(this.path){\n\n options.push({\n path: this.path,\n dataType: this.dataType,\n order: this.order,\n ignoreRegex: this.ignoreRegex,\n dateTimeFormat: this.dateTimeFormat\n });\n\n for(let index = 1; index <= this.multipleSortsNumber; index++){\n\n options.push({\n path: this['path' + index],\n dataType: this['dataType' + index],\n order: this['order' + index],\n ignoreRegex: this['ignoreRegex' + index],\n dateTimeFormat: this['dateTimeFormat' + index]\n });\n }\n }\n\n return options;\n }\n\n /**\n * check if current base sort control has the same properties like the specified base sort control\n * @param {BaseSortControl} baseSortControl\n * @return {boolean}\n */\n isEqualTo(baseSortControl){\n\n let isEqual = true;\n\n const props = ['path', 'dataType', 'order', 'regex', 'dateTimeFormat'];\n\n for(let i=0; i the whole element\n * @type {string}\n */\n this.path = (element.getAttribute('data-path') || '').trim();\n\n const from = element.getAttribute('data-from');\n\n /**\n * min <= from <= (all numbers in the element) <= to <= max\n * @type {number}\n */\n this.from = from === null ? -Infinity : Number(from);\n\n if(isNaN(this.from)){\n this.from = -Infinity;\n }\n\n const to = element.getAttribute('data-to');\n\n /**\n * min <= from <= (all numbers in the element) <= to <= max\n * @type {number}\n */\n this.to = to === null ? Infinity : Number(to);\n\n if(isNaN(this.to)){\n this.to = Infinity;\n }\n\n const min = element.getAttribute('data-min');\n\n /**\n * min <= from <= (all numbers in the element) <= to <= max\n * @type {number}\n */\n this.min = min === null ? this.from : Number(min);\n\n if(isNaN(this.min)){\n this.min = this.from;\n }\n\n const max = element.getAttribute('data-max');\n\n /**\n * min <= from <= (all numbers in the element) <= to <= max\n * @type {number}\n */\n this.max = max === null ? this.to : Number(max);\n\n if(isNaN(this.max)){\n this.max = this.to;\n }\n\n /**\n * optional \"OR\" logic property, used to combine different filter controls with \"OR\" logic instead of \"AND\"\n * @type {string|null}\n */\n this.or = element.getAttribute('data-or') || null;\n }\n }\n\n /**\n * get range filter options used in FilterAction.rangeFilter method\n * @return {Array.<{object}>} options\n */\n getRangeFilterOptions(){\n\n return {\n path: this.path,\n min: this.min,\n from: this.from,\n to: this.to,\n max: this.max,\n or: this.or\n };\n }\n\n /**\n * check if current control has the same properties like the specified control\n * @param {BaseRangeFilterControl} control\n * @return {boolean}\n */\n isEqualTo(control){\n return this.path === control.path &&\n this.from === control.from &&\n this.to === control.to &&\n this.min === control.min &&\n this.max === control.max;\n }\n}\n\nexport default BaseRangeFilterControl;","import BaseControlsGroup from '../base-controls-group';\nimport BaseRangeFilterControl from '../../controls/filter/base-range-filter.control';\n\n/**\n * represents a group of range filter controls with the same data-name and data-group attributes\n */\nclass BaseRangeFilterControlsGroup extends BaseControlsGroup{\n\n /**\n * add control to the group\n * @param {BaseControl} control\n * @return {BaseRangeFilterControl|null}\n */\n addControl(control){\n\n if(control.name !== this.name || control.group !== this.group){\n return null;\n }\n\n const baseRangeFilterControl = new BaseRangeFilterControl(control.element);\n\n this.controls.push(baseRangeFilterControl);\n\n return baseRangeFilterControl;\n }\n\n /**\n * get range filter options from all controls in the group\n * @return {Array.} range filer options\n */\n getRangeFilterOptions(){\n\n let options = [];\n\n for(let control of this.controls){\n options = options.concat(control.getRangeFilterOptions());\n }\n\n return options;\n }\n\n}\n\nexport default BaseRangeFilterControlsGroup;\n","const SELECTED_CLASS = 'jplist-selected';\n\n/**\n * radio buttons mixin\n * used for multiple inheritance\n * usage example:\n * class CheckboxTextFilterControl extends CheckboxMixin(BaseTextFilterControlsGroup)\n * @param {class} superclass\n * @return {class}\n */\nconst RadioButtonsMixin = superclass => class extends superclass {\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n\n this.radios = [];\n }\n\n /**\n * add control to the group\n * @param {BasePathFilterControl} control\n */\n addControl(control){\n\n const baseControl = super.addControl(control);\n\n //get additional control properties\n baseControl.selected = baseControl.element.checked;\n\n //check if control contains a link and it is in the deep links parameters\n if(baseControl.id){\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === baseControl.id);\n\n if(deepLinkParam){\n baseControl.selected = deepLinkParam.value === '1';\n }\n }\n\n this.radios.push(baseControl);\n this.handleRadios();\n\n /**\n * on control change -> update the selected control\n */\n baseControl.element.addEventListener('change', e => {\n\n e.preventDefault();\n\n for (let radio of this.radios) {\n radio.selected = false;\n }\n\n baseControl.selected = true;\n\n this.handleRadios();\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, baseControl);\n }\n });\n }\n\n /**\n * get the latest selected radio\n * @return {BasePathFilterControl} latestSelectedRadio\n */\n getLastSelectedRadio(){\n\n let latestSelectedRadio = null;\n\n //find the latest selected radio\n for (let radio of this.radios) {\n\n if (radio.selected) {\n latestSelectedRadio = radio;\n }\n }\n\n return latestSelectedRadio;\n }\n\n /**\n * handle radio buttons\n */\n handleRadios(){\n\n if(this.radios.length > 0) {\n\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n //remove selected from all radios\n for (let radio of this.radios) {\n\n radio.selected = false;\n radio.element.classList.remove(SELECTED_CLASS);\n }\n\n if(latestSelectedRadio) {\n\n this.radios.forEach(radio => {\n\n if(radio.isEqualTo(latestSelectedRadio)){\n radio.selected = true;\n radio.element.checked = true;\n radio.element.classList.add(SELECTED_CLASS);\n }\n });\n }\n }\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n const radioArr = this.radios.map(radio => radio.id && radio.selected ? radio.id + '=1' : '').filter(str => str !== '');\n const unique = Array.from(new Set(radioArr));\n return unique.join('&');\n }\n};\n\nexport default RadioButtonsMixin;","const SELECTED_CLASS = 'jplist-selected';\n\n/**\n * checkbox mixin\n * used for multiple inheritance\n * usage example:\n * class CheckboxTextFilterControl extends CheckboxMixin(BaseTextFilterControlsGroup)\n * @param {class} superclass\n * @return {class}\n */\nconst CheckboxMixin = superclass => class extends superclass {\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n\n this.checkboxes = [];\n }\n\n /**\n * add control to the group\n * @param {BasePathFilterControl} control\n */\n addControl(control){\n\n const baseControl = super.addControl(control);\n\n //get additional control properties\n baseControl.selected = baseControl.element.checked;\n\n //check if control contains a link and it is in the deep links parameters\n if(baseControl.id){\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === baseControl.id);\n\n if(deepLinkParam){\n baseControl.selected = deepLinkParam.value === '1';\n }\n }\n\n this.checkboxes.push(baseControl);\n this.handleCheckboxes();\n\n /**\n * on control change -> update the selected control\n */\n baseControl.element.addEventListener('change', e => {\n\n e.preventDefault();\n\n baseControl.selected = !baseControl.selected;\n\n this.checkboxes.forEach(cb => {\n\n if(cb.isEqualTo(baseControl)){\n cb.selected = baseControl.selected;\n }\n });\n\n this.handleCheckboxes();\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, baseControl);\n }\n });\n }\n\n /**\n * handle checkbox mode controls\n */\n handleCheckboxes(){\n\n for(let cb of this.checkboxes){\n\n if(cb.selected){\n cb.element.classList.add(SELECTED_CLASS);\n }\n else{\n cb.element.classList.remove(SELECTED_CLASS);\n }\n\n cb.element.checked = cb.selected;\n }\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n const cbArr = this.checkboxes.map(cb => {\n\n if(cb.id){\n return cb.selected ? cb.id + '=1' : cb.id + '=0';\n }\n else{\n return '';\n }\n\n }).filter(str => str !== '');\n const unique = Array.from(new Set(cbArr));\n return unique.join('&');\n }\n};\n\nexport default CheckboxMixin;","import BaseControl from '../base.control';\n\n/**\n * base text filter control\n */\nclass BaseTextFilterControl extends BaseControl{\n\n /**\n * constructor\n * @param {HTMLElement} element\n */\n constructor(element){\n super(element);\n\n if(element){\n\n /**\n * css selector or 'default' for the browser default order (no sort); if path is empty -> the whole element\n * @type {string}\n */\n this.path = (element.getAttribute('data-path') || '').trim();\n\n /**\n * initial text value is used to handle multiple same control in different panels\n * @type {string}\n */\n this.initialText = element.getAttribute('data-text') || element.value || '';\n\n /**\n * trimmed text value items filter by\n * @type {string}\n */\n this._text = (element.getAttribute('data-text') || element.value || '').trim();\n\n /**\n * filter mode - contains (default), startsWith, endsWith, equal\n * @type {string}\n */\n this.mode = (element.getAttribute('data-mode') || 'contains').trim();\n\n /**\n * optional ignore regex - used to ignore characters before sort\n * @type {string}\n */\n this.regex = element.getAttribute('data-regex') || '';\n\n /**\n * optional \"OR\" logic property, used to combine different filter controls with \"OR\" logic instead of \"AND\"\n * @type {string|null}\n */\n this.or = element.getAttribute('data-or') || null;\n }\n }\n\n /**\n * text setter\n * @param {string} value\n */\n set text(value){\n\n this.initialText = value || '';\n this._text = (value || '').trim();\n }\n\n /**\n * text getter\n * @return {string}\n */\n get text(){\n\n return this._text;\n }\n\n\n /**\n * get text filter options used in FilterAction.textFilter method\n * @return {Array.<{object}>} options\n */\n getTextFilterOptions(){\n\n return {\n path: this.path,\n text: this.text,\n mode: this.mode,\n ignoreRegex: this.regex,\n or: this.or\n };\n }\n\n /**\n * check if current control has the same properties like the specified control;\n * the values could be different\n * @param {BaseTextFilterControl} control\n * @param {boolean} includeValue\n * @return {boolean}\n */\n isEqualTo(control, includeValue = true){\n\n let isEqual = this.path === control.path &&\n this.mode === control.mode &&\n this.regex === control.regex;\n\n if(includeValue){\n isEqual = isEqual && this.text === control.text;\n }\n\n return isEqual;\n }\n}\n\nexport default BaseTextFilterControl;","/**\n * filter action\n */\nclass FilterAction{\n\n /**\n * text filter\n * this filter returns all items that contains the specified text in the given path\n * @param {Array.} items\n * @param {string} text\n * @param {string=} path - any CSS selector or empty value meaning the whole element\n * @param {string=} mode - contains (default), startsWith, endsWith, equal\n * @param {string=} ignoreRegex - optional regex that defines what characters should be ignored\n * @return {Array.} filtered items\n */\n static textFilter(items, text, path='', mode = 'contains', ignoreRegex = ''){\n\n const filtered = [];\n\n if(!items) return [];\n\n if(path === 'default') return items;\n\n const formattedText = text.replace(new RegExp(ignoreRegex, 'ig'), '').toLowerCase().trim();\n\n for(let item of items){\n\n const elements = path ? item.querySelectorAll(path) : [item];\n\n if(!elements) continue;\n\n let shouldBeAdded = false;\n\n for(let el of elements){\n\n const elText = el.textContent.replace(new RegExp(ignoreRegex, 'ig'), '').toLowerCase().trim();\n\n switch(mode){\n\n case 'startsWith':{\n\n if(elText.startsWith(formattedText)){\n shouldBeAdded = true;\n }\n\n break;\n }\n\n case 'endsWith':{\n\n if(elText.endsWith(formattedText)){\n shouldBeAdded = true;\n }\n\n break;\n }\n\n case 'equal':{\n\n if(elText === formattedText){\n shouldBeAdded = true;\n }\n break;\n }\n\n default:{\n\n //contains\n if(elText.indexOf(formattedText) !== -1){\n shouldBeAdded = true;\n }\n\n break;\n }\n }\n\n if(shouldBeAdded) break;\n }\n\n if(shouldBeAdded){\n filtered.push(item);\n }\n }\n\n return filtered;\n }\n\n /**\n * path filter\n * only items with the given path are returned\n * @param {Array.} items\n * @param {string=} path - any CSS selector or empty value meaning the whole element\n * @param {boolean} isInverted - if true, return all items that DON'T contain the specified path\n * @return {Array.} filtered items\n */\n static pathFilter(items, path='', isInverted = false){\n\n const filtered = [];\n\n if(!items) return [];\n\n if(path === 'default' || !path) return items;\n\n for(let item of items){\n\n const el = item.querySelector(path);\n\n if(el && !isInverted || !el && isInverted){\n filtered.push(item);\n }\n }\n\n return filtered;\n }\n\n /**\n * check if n is a number\n * @param {*} n\n * @returns {boolean}\n */\n static isNumeric(n)\n {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n /**\n * range filter\n * return only elements that satisfy the following condition:\n * all numbers in the element's content are in the following range: min <= from <= (all numbers in the element) <= to <= max\n * @param {Array.} items\n * @param {string=} path - any CSS selector or empty value meaning the whole element\n * @param {number} from\n * @param {number} to\n * @param {number=} min\n * @param {number=} max\n * @return {Array.} filtered items\n */\n static rangeFilter(items, path='', from, to, min = from, max = to){\n\n const filtered = [];\n\n if(!items) return [];\n\n if(path === 'default') return items;\n\n from = Math.max(from, min);\n to = Math.min(to, max);\n\n for(let item of items){\n\n const itemElements = path ? item.querySelectorAll(path) : [item];\n\n if(!itemElements) continue;\n\n //find all numbers within the element\n const numbers = [];\n\n for(let el of itemElements){\n\n const num = Number(el.textContent.trim().replace(/[^-0-9.]+/g,''));\n\n if(!isNaN(num)){\n numbers.push(num);\n }\n }\n\n if(numbers.length > 0){\n\n //find max and min number of all found within the element numbers\n const maxNumber = Math.max.apply(Math, numbers);\n const minNumber = Math.min.apply(Math, numbers);\n\n let shouldBeAdded = true;\n\n if(FilterAction.isNumeric(from) && from > minNumber){\n shouldBeAdded = false;\n }\n\n if(FilterAction.isNumeric(to) && maxNumber > to){\n shouldBeAdded = false;\n }\n\n if(shouldBeAdded){\n filtered.push(item);\n }\n }\n }\n\n return filtered;\n }\n}\n\nexport default FilterAction;","import BaseControlsGroup from '../base/groups/base-controls-group';\nimport FilterAction from \"../../actions/filter/filter.action\";\nimport BasePathFilterControl from \"../base/controls/filter/base-path-filter.control\";\nimport BaseTextFilterControl from \"../base/controls/filter/base-text-filter.control\";\nimport BaseRangeFilterControl from \"../base/controls/filter/base-range-filter.control\";\n\n/**\n * counter control\n * Example:\n * \n */\nclass CounterControl extends BaseControlsGroup{\n\n /**\n * get dynamic counter value\n * @param {Array.} filtered\n * @param {BaseControl} baseFilterControl\n * @param {string} filterType - text, path or range\n * @return {number} count\n */\n static getDynamicCounterValue(baseFilterControl, filterType, filtered){\n\n let count = 0;\n\n filtered = CounterControl.getFilteredItems(baseFilterControl, filterType, filtered);\n\n return filtered.length;\n }\n\n /**\n * get static counter value\n * @param {BaseControl} baseFilterControl\n * @param {string} filterType - text, path or range\n * @param {Array.} group\n * @return {number} count\n */\n static getStaticCounterValue(baseFilterControl, filterType, group){\n\n let count = 0;\n\n //there can be more than one block of items with the same group name\n //each itemsBlock has structure: {root: HTMLElement, items: Array.}\n for(let itemsBlock of group){\n\n let filtered = itemsBlock.items;\n\n filtered = CounterControl.getFilteredItems(baseFilterControl, filterType, filtered);\n\n count += filtered.length;\n }\n\n return count;\n }\n\n /**\n * get filtered items\n * @param {BaseControl} baseFilterControl\n * @param {string} filterType - text, path or range\n * @param {Array.} filtered\n * @return {Array.}\n */\n static getFilteredItems(baseFilterControl, filterType, filtered){\n\n switch(filterType){\n case 'text' : {\n filtered = FilterAction.textFilter(\n filtered,\n baseFilterControl.text,\n baseFilterControl.path,\n baseFilterControl.mode,\n baseFilterControl.regex);\n break;\n }\n\n case 'path' : {\n filtered = FilterAction.pathFilter(filtered,\n baseFilterControl.path,\n baseFilterControl.isInverted);\n break;\n }\n\n case 'range' : {\n filtered = FilterAction.rangeFilter(filtered,\n baseFilterControl.path,\n baseFilterControl.from,\n baseFilterControl.to,\n baseFilterControl.min,\n baseFilterControl.max);\n break;\n }\n }\n\n return filtered;\n }\n\n /**\n * render control HTML\n * @param {number} countValue\n */\n render(countValue){\n\n for(let control of this.controls){\n\n control.element.innerHTML = control.format.replace('{count}', countValue);\n }\n }\n\n /**\n * add control to the group\n * @param {BaseControl} control\n * @return {BaseControl|null}\n */\n addControl(control){\n\n super.addControl(control);\n\n control.filterType = control.element.getAttribute('data-filter-type') || 'path'; //text, path or range\n control.format = control.element.getAttribute('data-format') || '{count}';\n control.mode = control.element.getAttribute('data-mode') || 'dynamic'; //static or dynamic\n\n let baseFilterControl = null;\n\n switch(control.filterType){\n\n case 'text' : {\n\n baseFilterControl = new BaseTextFilterControl(control.element);\n break;\n }\n\n case 'path' : {\n\n baseFilterControl = new BasePathFilterControl(control.element);\n break;\n }\n\n case 'range' : {\n\n baseFilterControl = new BaseRangeFilterControl(control.element);\n break;\n }\n }\n\n control.element.addEventListener('jplist.state', (e) => {\n\n if(!baseFilterControl || !e.jplistState) return;\n\n let count = 0;\n\n if(control.mode === 'static' && e.jplistState.groups && e.jplistState.groups.has(control.group)){\n\n //find group by name\n const group = e.jplistState.groups.get(control.group);\n\n count = CounterControl.getStaticCounterValue(baseFilterControl, control.filterType, group);\n }\n\n if(control.mode === 'dynamic' && e.jplistState.filtered && e.jplistState.filtered.length > 0){\n\n count = CounterControl.getDynamicCounterValue(baseFilterControl, control.filterType, e.jplistState.filtered);\n }\n\n //render counter HTML\n this.render(count);\n\n }, false);\n }\n}\n\nexport default CounterControl;","import BaseControlsGroup from '../base/groups/base-controls-group';\n\n/**\n * reset control\n */\nclass ResetControl extends BaseControlsGroup{\n\n /**\n * add control to the group\n * @param {BaseControl} control\n * @return {BaseControl|null}\n */\n addControl(control){\n\n super.addControl(control);\n\n /**\n * on button click\n */\n control.element.addEventListener('click', (e) => {\n\n e.preventDefault();\n\n if(window.jplist) {\n\n window.jplist.resetControls(this.group, control);\n }\n\n }, false);\n }\n\n}\n\nexport default ResetControl;","import BaseControlsGroup from '../base/groups/base-controls-group';\n\nconst SELECTED_CLASS = 'jplist-selected';\n\n/**\n * layout control\n */\nclass LayoutControl extends BaseControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n\n this.classNames = new Set();\n this.selectedClassName = '';\n }\n\n /**\n * add control to the group\n * @param {BaseControl} control\n * @return {BaseControl|null}\n */\n addControl(control){\n\n super.addControl(control);\n\n control.groupClassName = control.element.getAttribute('data-class') || '';\n control.selected = control.element.getAttribute('data-selected') === 'true';\n\n //check if control contains a link and it is in the deep links parameters\n if(control.id){\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === control.id);\n\n if(deepLinkParam){\n control.selected = deepLinkParam.value === '1';\n }\n //else{\n //control.selected = false;\n //}\n }\n\n this.classNames.add(control.groupClassName);\n\n /**\n * on button click\n */\n control.element.addEventListener('click', (e) => {\n\n e.preventDefault();\n\n this.handleSelectedControls(control.groupClassName);\n\n this.handleClasses();\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, control);\n }\n\n }, false);\n\n this.handleClasses();\n }\n\n /**\n * add / remove buttons classes\n */\n handleClasses(){\n\n const groups = document.querySelectorAll('[data-jplist-group=\"' + this.group + '\"]');\n\n //remove classes from all groups\n this.resetAllGroups(groups);\n\n let selected = this.getLatestSelectedControl();\n\n if(!selected) return;\n\n this.handleSelectedControls(selected.groupClassName);\n\n //add specified class name to each group\n LayoutControl.addClassToGroups(selected.groupClassName, groups);\n }\n\n /**\n * get the latest selected control\n * @return {BaseControl} selected control\n */\n getLatestSelectedControl(){\n\n let selected = null;\n\n for(let control of this.controls){\n\n if(control.selected){\n selected = control;\n }\n }\n\n if(!selected && this.controls.length > 0){\n selected = this.controls[0];\n }\n\n return selected;\n }\n\n /**\n * remove classes from all groups\n * @param {NodeList} groups\n */\n resetAllGroups(groups){\n\n for(let group of groups){\n\n //remove all classes\n for(let cn of this.classNames){\n group.classList.remove(cn);\n }\n }\n }\n\n /**\n * handle selected controls\n * @param {string} selectedGroupClassName\n */\n handleSelectedControls(selectedGroupClassName){\n\n for(let control of this.controls){\n\n if(control.groupClassName === selectedGroupClassName){\n control.selected = true;\n control.element.classList.add(SELECTED_CLASS);\n }\n else{\n control.selected = false;\n control.element.classList.remove(SELECTED_CLASS);\n }\n }\n }\n\n /**\n * add specified class name to each group\n * @param {string} groupClassName\n * @param {NodeList} groups\n */\n static addClassToGroups(groupClassName, groups){\n\n for(let group of groups){\n\n //add class if needed\n group.classList.add(groupClassName);\n }\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n const arr = this.controls.map(control => {\n\n if(control.id){\n return control.selected ? control.id + '=1' : control.id + '=0';\n }\n else{\n return '';\n }\n\n }).filter(str => str !== '');\n const unique = Array.from(new Set(arr));\n return unique.join('&');\n }\n}\n\nexport default LayoutControl;","import BaseControlsGroup from '../base/groups/base-controls-group';\n\n/**\n * no results control\n * Example:\n *
No Results Found
\n */\nclass NoResultsControl extends BaseControlsGroup{\n\n /**\n * add control to the group\n * @param {BaseControl} control\n * @return {BaseControl|null}\n */\n addControl(control){\n\n super.addControl(control);\n\n control.element.addEventListener('jplist.state', (e) => {\n\n if(!e.jplistState) return;\n\n const itemsNumber = Number(e.jplistState.itemsNumber) || 0;\n control.element.style.display = itemsNumber === 0 ? '' : 'none';\n\n }, false);\n\n }\n}\n\nexport default NoResultsControl;","import './base-slider.control.css';\n\n/**\n * base slider control\n */\nclass BaseSliderControl{\n\n /**\n * control type defined in data-jplist-control attribute;\n * for example, data-jplist-control=\"hidden-sort\" has type='hidden-sort'\n * @param {HTMLElement} element\n * @param {boolean} isVertical\n * @param {number} min\n * @param {number} value1 - initial value 1\n * @param {number} value2 - initial value2\n * @param {number} max\n * @param {Function} callback\n */\n constructor(element, isVertical = false, min = 0, value1 = 0, value2 = 0, max = 0, callback = (value1, value2) => {}){\n\n if(element) {\n\n this.element = element;\n this.element.classList.add('jplist-slider');\n\n if(!this.element) return;\n\n this.isVertical = isVertical;\n this.callback = callback;\n this.min = min;\n this.max = max;\n\n if(isVertical){\n this.element.classList.add('jplist-slider-vertical');\n }\n\n //create and append the first holder\n this.handler1 = document.createElement('span');\n this.handler1.classList.add('jplist-slider-holder-1');\n this.element.appendChild(this.handler1);\n\n //create and append the range element\n this.range = document.createElement('span');\n this.range.classList.add('jplist-slider-range');\n this.element.appendChild(this.range);\n\n //initial value\n this.handler1.left = 0;\n this.handler1.top = 0;\n //this.handler1.value = this.getPreviewValue(0, min, max); //0\n\n //create and append the second holder\n this.handler2 = document.createElement('span');\n this.handler2.classList.add('jplist-slider-holder-2');\n this.element.appendChild(this.handler2);\n\n //initial value\n this.handler2.left = 0;\n this.handler2.top = 0;\n //this.handler2.value = this.getPreviewValue(0, min, max); //0\n\n this.dragging = null;\n\n this.handler1.addEventListener('mousedown', this.start.bind(this));\n this.handler2.addEventListener('mousedown', this.start.bind(this));\n this.handler1.addEventListener('touchstart', this.start.bind(this));\n this.handler2.addEventListener('touchstart', this.start.bind(this));\n\n document.addEventListener('mousemove', this.render.bind(this));\n document.addEventListener('touchmove', this.render.bind(this));\n window.addEventListener('resize', this.resize.bind(this));\n\n document.addEventListener('mouseup', this.stop.bind(this));\n document.addEventListener('touchend', this.stop.bind(this));\n document.body.addEventListener('mouseleave', this.stop.bind(this));\n\n this.element.addEventListener('mousedown', this.jump.bind(this));\n\n //set initial values\n this.setValues(value1, value2);\n }\n }\n\n /**\n * set slider values from outside\n * @param {number} value1\n * @param {number} value2\n * @param {boolean} sendCallback\n */\n setValues(value1, value2, sendCallback = true){\n\n if(value2 < value1){\n value2 = value1;\n }\n\n const pos1 = this.getInnerValue(value1, this.min, this.max);\n const pos2 = this.getInnerValue(value2, this.min, this.max);\n\n this.update({\n x: pos2,\n y: pos2\n }, this.handler2, sendCallback);\n\n this.update({\n x: pos1,\n y: pos1\n }, this.handler1, sendCallback);\n }\n\n /**\n * convert [0, slider-width] range to [min, max] range for the specified value\n * @param {number} value\n * @param {number} min\n * @param {number} max\n * @return {number} mappedValue\n */\n getPreviewValue(value, min, max){\n\n const rect = this.element.getBoundingClientRect();\n const size = this.isVertical? 'height': 'width';\n\n const newStart = min;\n const newEnd = max;\n const originalStart = 0;\n const originalEnd = rect[size];\n\n //return Math.round((newEnd - newStart) * ((value - originalStart) / (originalEnd - originalStart)) + newStart);\n return (newEnd - newStart) * ((value - originalStart) / (originalEnd - originalStart)) + newStart;\n }\n\n /**\n * convert [min, max] range to [0, slider-width] range for the specified value\n * @param {number} value\n * @param {number} min\n * @param {number} max\n * @return {number} mappedValue\n */\n getInnerValue(value, min, max){\n\n const rect = this.element.getBoundingClientRect();\n const size = this.isVertical? 'height': 'width';\n\n const newStart = 0;\n const newEnd = rect[size];\n const originalStart = min;\n const originalEnd = max;\n\n //return Math.round((newEnd - newStart) * ((value - originalStart) / (originalEnd - originalStart)) + newStart);\n return (newEnd - newStart) * ((value - originalStart) / (originalEnd - originalStart)) + newStart;\n }\n\n /**\n * jump to the specified point on the slider\n * @param {Object} e\n */\n jump(e){\n e.preventDefault();\n\n let position = this.getHandlerPos(e);\n\n if(this.isVertical){\n this.dragging = Math.abs(position.y - this.handler1.top) < Math.abs(position.y - this.handler2.top) ? this.handler1 : this.handler2;\n }\n else{\n this.dragging = Math.abs(position.x - this.handler1.left) < Math.abs(position.x - this.handler2.left) ? this.handler1 : this.handler2;\n }\n\n //render the updated state\n this.render(e);\n }\n\n /**\n * update z-index of the active handler\n */\n setZIndex(){\n\n const handler1ZIndex = window.getComputedStyle ? Number(document.defaultView.getComputedStyle(this.handler1, null).getPropertyValue('z-index')) || 200 : 200;\n const handler2ZIndex = window.getComputedStyle ? Number(document.defaultView.getComputedStyle(this.handler2, null).getPropertyValue('z-index')) || 200 : 200;\n\n if(handler1ZIndex === handler2ZIndex){\n this.dragging.style['z-index'] = handler1ZIndex + 1;\n }\n else{\n const max = Math.max(handler1ZIndex, handler2ZIndex);\n const min = Math.min(handler1ZIndex, handler2ZIndex);\n\n this.handler1.style['z-index'] = min;\n this.handler2.style['z-index'] = min;\n this.dragging.style['z-index'] = max;\n }\n }\n\n /**\n * start dragging\n * @param {Object} e\n */\n start(e){\n e.preventDefault();\n e.stopPropagation();\n\n this.dragging = e.target;\n\n //update z-index of the active handler\n this.setZIndex();\n\n //render the updated state\n this.render();\n }\n\n /**\n * stop dragging\n * @param {Object} e\n */\n stop(e){\n //e.preventDefault();\n\n this.dragging = null;\n }\n\n /**\n * on window resize\n * @param {Object} e\n */\n resize(e){\n\n if(this.handler1 && this.handler2){\n\n this.setValues(this.handler1.value, this.handler2.value);\n }\n }\n\n /**\n * render the updated state\n */\n render(e){\n if(e && this.dragging){\n\n this.update(this.getHandlerPos(e), this.dragging);\n }\n }\n\n /**\n * update position and styles\n * @param {object} position\n * @param {element} handler\n * @param {boolean} sendCallback\n */\n update(position, handler, sendCallback = true){\n\n if(handler){\n\n const rect = this.element.getBoundingClientRect();\n\n const size = this.isVertical? 'height': 'width';\n const xy = this.isVertical? 'y': 'x';\n const lefttop = this.isVertical? 'top': 'left';\n\n if(position[xy] < 0){\n position[xy] = 0;\n }\n\n if(position[xy] > rect[size]){\n position[xy] = rect[size];\n }\n\n if(handler === this.handler1 && position[xy] >= this.handler2[lefttop]){\n position[xy] = this.handler2[lefttop];\n }\n\n if(handler === this.handler2 && position[xy] <= this.handler1[lefttop]){\n position[xy] = this.handler1[lefttop];\n }\n\n //save current value\n handler[lefttop] = position[xy];\n //const value = Math.round(position[xy] * 100 / rect[size]); //value in %\n handler.value = this.getPreviewValue(position[xy], this.min, this.max);\n\n handler.style[lefttop] = (position[xy]) + 'px';\n\n //update range element\n this.range.style[lefttop] = this.handler1[lefttop] + 'px';\n\n const rangeHeight = this.handler2[lefttop] - this.handler1[lefttop];\n this.range.style[size] = (rangeHeight >= 0 ? rangeHeight : 0) + 'px';\n\n //call callback function\n if(this.callback && sendCallback){\n\n this.callback(this.handler1.value, this.handler2.value);\n }\n }\n }\n\n /**\n * subtraction of 2 vectors\n * @param {Object} v1 - vector #1\n * @param {Object} v2 - vector #2\n */\n static sub(v1, v2){\n\n return {\n x: v1.x - v2.x,\n y: v1.y - v2.y\n };\n }\n\n /**\n * get handler position from mouse / tap position\n * @param {object} e\n * @return {object} handler position\n */\n getHandlerPos(e){\n\n const rect = this.element.getBoundingClientRect();\n\n const point = {\n x: e.touches && e.touches.length > 0 ? e.touches[0].pageX : e.clientX,\n y: e.touches && e.touches.length > 0 ? e.touches[0].pageY : e.clientY\n };\n\n const vector = {\n x: rect.left,\n y: rect.top\n };\n\n return BaseSliderControl.sub(point, vector);\n }\n\n}\n\nexport default BaseSliderControl;","import BaseRangeFilterControlsGroup from '../../../base/groups/filter/base-range-filter-controls-group';\nimport BaseSliderControl from '../../../base/controls/slider/base-slider.control';\n\n/**\n * range slider filter\n */\nclass SliderRangeFilter extends BaseRangeFilterControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n }\n\n /**\n * add control to the group\n * @param {BaseControl} control\n */\n addControl(control){\n\n const rangeSliderFilterControl = super.addControl(control);\n\n const sliderEl = control.element.querySelector('[data-type=\"slider\"]');\n rangeSliderFilterControl.val1Elements = control.element.querySelectorAll('[data-type=\"value-1\"]');\n rangeSliderFilterControl.val2Elements = control.element.querySelectorAll('[data-type=\"value-2\"]');\n rangeSliderFilterControl.minElements = control.element.querySelectorAll('[data-type=\"min\"]');\n rangeSliderFilterControl.maxElements = control.element.querySelectorAll('[data-type=\"max\"]');\n\n if(!sliderEl) return;\n\n //control properties\n const orientation = control.element.getAttribute('data-orientation') || 'horizontal'; //'vertical'\n\n for(let el of rangeSliderFilterControl.minElements){\n el.textContent = rangeSliderFilterControl.min;\n }\n\n for(let el of rangeSliderFilterControl.maxElements){\n el.textContent = rangeSliderFilterControl.max;\n }\n\n //check if control contains a link and it is in the deep links parameters\n if(rangeSliderFilterControl.id){\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === rangeSliderFilterControl.id);\n\n if(deepLinkParam && deepLinkParam.value){\n const parts = deepLinkParam.value.split('_');\n\n if(parts.length === 2){\n\n rangeSliderFilterControl.from = Number(parts[0]) || 0;\n rangeSliderFilterControl.to = Number(parts[1]) || 0;\n }\n }\n }\n\n rangeSliderFilterControl.slider = new BaseSliderControl(\n sliderEl,\n orientation === 'vertical',\n rangeSliderFilterControl.min,\n rangeSliderFilterControl.from,\n rangeSliderFilterControl.to,\n rangeSliderFilterControl.max,\n (value1, value2) => {\n\n for(let el of rangeSliderFilterControl.val1Elements){\n el.textContent = Math.round(value1);\n }\n\n for(let el of rangeSliderFilterControl.val2Elements){\n el.textContent = Math.round(value2);\n }\n\n for(let control of this.controls){\n\n if(!control.slider) continue;\n\n control.slider.setValues(value1, value2, false);\n }\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, rangeSliderFilterControl);\n }\n });\n }\n\n /**\n * get range filter options from all controls in the group\n * @return {Array.} path filter options\n */\n getRangeFilterOptions(){\n\n let options = [];\n\n for(let control of this.controls){\n\n if(!control.slider || !control.slider.handler1 || !control.slider.handler2) continue;\n\n const controlOptions = control.getRangeFilterOptions();\n controlOptions.from = control.slider.handler1.value;\n controlOptions.to = control.slider.handler2.value;\n\n options = options.concat(controlOptions);\n }\n\n return options;\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n\n const arr = this.controls.map(control => {\n\n if(!control.id || !control.slider || !control.slider.handler1 || !control.slider.handler2) return '';\n\n return control.id + '=' + control.slider.handler1.value + '_' + control.slider.handler2.value;\n }).filter(str => str !== '');\n\n const unique = Array.from(new Set(arr));\n\n return unique.join('&');\n\n }\n}\n\nexport default SliderRangeFilter;","import BaseRangeFilterControlsGroup from '../../../base/groups/filter/base-range-filter-controls-group';\nimport ButtonsMixin from '../../../base/groups/mixins/buttons.mixin';\n\n/**\n * buttons range filter\n */\nclass ButtonsRangeFilter extends ButtonsMixin(BaseRangeFilterControlsGroup){\n\n /**\n * get range filter options from all controls in the group\n * @return {Array.} path filter options\n */\n getRangeFilterOptions(){\n\n let options = [];\n\n //get options from the latest selected radio if exists\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n if(latestSelectedRadio){\n options = options.concat(latestSelectedRadio.getRangeFilterOptions());\n }\n\n //add all selected checkboxes\n for(let checkbox of this.checkboxes){\n\n if(checkbox.selected) {\n options = options.concat(checkbox.getRangeFilterOptions());\n }\n }\n\n return options;\n }\n}\n\nexport default ButtonsRangeFilter;","import BasePathFilterControlsGroup from '../../../base/groups/filter/base-path-filter-controls-group';\nimport BasePathFilterControl from '../../../base/controls/filter/base-path-filter.control';\nimport BaseDropdownControl from '../../../base/controls/dropdown/base-dropdown.control';\n\n/**\n * dropdown filter control\n */\nclass DropdownFilterControl extends BasePathFilterControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n this.selected = '';\n this.id = '';\n }\n\n /**\n * add control to the group\n * @param {BasePathFilterControl} control\n */\n addControl(control){\n\n //a dropdown has the following custom properties:\n // -- dropdown - custom dropdown behaviour, styles, classes\n // -- buttons - the list of dropdown buttons, each of them is BaseSortControl\n const basePathFilterControl = super.addControl(control);\n\n //generate dropdown instance for the given control;\n //this instance adds dropdown classes, styles and behaviour\n basePathFilterControl.dropdown = new BaseDropdownControl(control.element);\n basePathFilterControl.buttons = [];\n\n //each button inside dropdown is a separate path filter control that defined by data-path attribute;\n //they are stored in basePathFilterControl.buttons array\n let buttons = basePathFilterControl.element.querySelectorAll('[data-path]');\n\n for(let button of buttons){\n\n button.setAttribute('data-name', this.name);\n button.setAttribute('data-group', this.group);\n button.setAttribute('data-jump', basePathFilterControl.jump);\n\n let btnPathFilterControl = new BasePathFilterControl(button);\n\n //save newly created button in the basePathFilterControl.buttons array\n basePathFilterControl.buttons.push(btnPathFilterControl);\n\n /**\n * on control button click -> update the selected control\n */\n btnPathFilterControl.element.addEventListener('click', e => {\n\n e.preventDefault();\n\n //clicked button should be the selected one\n this.selected = btnPathFilterControl;\n\n this.setSelectedButton(basePathFilterControl);\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, btnPathFilterControl);\n }\n });\n }\n\n this.selected = DropdownFilterControl.getSelectedButton(basePathFilterControl.buttons);\n this.setSelectedButton(basePathFilterControl);\n\n //check if control contains a link and it is in the deep links parameters\n if(basePathFilterControl.id){\n\n this.id = basePathFilterControl.id;\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === basePathFilterControl.id);\n\n if(deepLinkParam){\n\n const deepLinkBtn = basePathFilterControl.buttons.find(btn => {\n\n const btnValue = btn.element.getAttribute('data-value');\n return (deepLinkParam.value === btnValue) ? btn : null;\n });\n\n if(deepLinkBtn) {\n this.selected = deepLinkBtn;\n this.setSelectedButton(basePathFilterControl);\n }\n }\n }\n }\n\n /**\n * get path filter options from all controls in the group\n * @return {Array.} pathFilterOptions\n */\n getPathFilterOptions(){\n\n if(this.selected){\n return [this.selected.getPathFilterOptions()];\n }\n\n return [];\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n\n if(this.id && this.selected){\n return this.id + '=' + this.selected.element.getAttribute('data-value') || '';\n }\n\n return '';\n }\n\n /**\n * get selected button that has data-selected=\"true\" data attribute;\n * if there is no data-selected attribute -> take the first button\n * @param {Array.} buttons\n * @return {BasePathFilterControl|null}\n */\n static getSelectedButton(buttons){\n\n if(buttons.length <= 0) return null;\n\n for(let button of buttons){\n if(button.element.getAttribute('data-selected') === 'true'){\n return button;\n }\n }\n\n return buttons[0];\n }\n\n /**\n * set selected button\n * @param {BasePathFilterControl} basePathFilterControl\n */\n setSelectedButton(basePathFilterControl){\n\n for(let control of this.controls){\n\n if(!control.dropdown) continue;\n\n //verify that dropdown has such button\n const dropdownBtn = basePathFilterControl.buttons.find(btn => this.selected.isEqualTo(btn));\n\n if(dropdownBtn){\n\n //update dropdown panels value\n control.dropdown.setPanelsContent(dropdownBtn.element.textContent);\n }\n\n control.dropdown.close();\n }\n }\n\n}\n\nexport default DropdownFilterControl;","import BasePathFilterControlsGroup from '../../../base/groups/filter/base-path-filter-controls-group';\nimport ButtonsMixin from '../../../base/groups/mixins/buttons.mixin';\n\n/**\n * buttons path filter control\n */\nclass ButtonsPathFilterControl extends ButtonsMixin(BasePathFilterControlsGroup){\n\n /**\n * get path filter options from all controls in the group\n * @return {Array.} path filter options\n */\n getPathFilterOptions(){\n\n let options = [];\n\n //get options from the latest selected radio if exists\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n if(latestSelectedRadio){\n options = options.concat(latestSelectedRadio.getPathFilterOptions());\n }\n\n //add all selected checkboxes\n for(let checkbox of this.checkboxes){\n\n if(checkbox.selected) {\n options = options.concat(checkbox.getPathFilterOptions());\n }\n }\n\n return options;\n }\n}\n\nexport default ButtonsPathFilterControl;","import BasePathFilterControlsGroup from '../../../base/groups/filter/base-path-filter-controls-group';\nimport RadioButtonsMixin from '../../../base/groups/mixins/radio-buttons.mixin';\n\n/**\n * radio buttons path filter control\n */\nclass RadioButtonsPathFilterControl extends RadioButtonsMixin(BasePathFilterControlsGroup){\n\n /**\n * get path filter options from all controls in the group\n * @return {Array.} path filter options\n */\n getPathFilterOptions(){\n\n let options = [];\n\n //get options from the latest selected radio if exists\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n if(latestSelectedRadio){\n options = options.concat(latestSelectedRadio.getPathFilterOptions());\n }\n\n return options;\n }\n}\n\nexport default RadioButtonsPathFilterControl;","import BasePathFilterControlsGroup from '../../../base/groups/filter/base-path-filter-controls-group';\nimport CheckboxMixin from '../../../base/groups/mixins/checkbox.mixin';\n\n/**\n * checkbox path filter control\n */\nclass CheckboxPathFilterControl extends CheckboxMixin(BasePathFilterControlsGroup){\n\n /**\n * get path filter options from all controls in the group\n * @return {Array.} path filter options\n */\n getPathFilterOptions(){\n\n let options = [];\n\n //add all selected checkboxes\n for(let checkbox of this.checkboxes){\n\n if(checkbox.selected) {\n options = options.concat(checkbox.getPathFilterOptions());\n }\n }\n\n return options;\n }\n}\n\nexport default CheckboxPathFilterControl;","import BasePathFilterControlsGroup from '../../../base/groups/filter/base-path-filter-controls-group';\nimport BasePathFilterControl from '../../../base/controls/filter/base-path-filter.control';\n\n/**\n * select filter control\n */\nclass SelectFilterControl extends BasePathFilterControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n\n this.options = [];\n this.selected = '';\n this.id = '';\n }\n\n /**\n * add control to the group\n * @param {BasePathFilterControl} control\n */\n addControl(control){\n\n const selectFilterControl = super.addControl(control);\n\n let options = selectFilterControl.element.querySelectorAll('option');\n\n for(let option of options){\n\n option.setAttribute('data-name', this.name);\n option.setAttribute('data-group', this.group);\n\n if(!this.options.find(opt => opt.element.value === option.value)){\n this.options.push(new BasePathFilterControl(option));\n }\n }\n\n this.selected = selectFilterControl.element.value;\n\n //check if control contains a link and it is in the deep links parameters\n if(selectFilterControl.id){\n\n this.id = selectFilterControl.id;\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === selectFilterControl.id);\n\n if(deepLinkParam){\n selectFilterControl.element.value = deepLinkParam.value;\n this.selected = deepLinkParam.value;\n }\n }\n\n /**\n * on control event\n */\n selectFilterControl.element.addEventListener('change', e => {\n\n e.preventDefault();\n\n this.selected = e.target.value;\n\n for(let select of this.controls){\n select.element.value = this.selected;\n }\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, selectFilterControl);\n }\n });\n }\n\n /**\n * get path filter options from all controls in the group\n * @return {Array.} sortOptions\n */\n getPathFilterOptions(){\n\n let selected = this.options.find(opt => opt.element.value === this.selected);\n\n if(selected){\n return [selected.getPathFilterOptions()];\n }\n\n return [];\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n\n let selected = this.options.find(opt => opt.element.value === this.selected);\n\n if(this.id){\n return this.id + '=' + selected.element.value;\n }\n\n return '';\n }\n\n}\n\nexport default SelectFilterControl;","import BaseTextFilterControlsGroup from '../../../base/groups/filter/base-text-filter-controls-group';\nimport ButtonsMixin from '../../../base/groups/mixins/buttons.mixin';\n\n/**\n * buttons text filter control\n */\nclass ButtonsTextFilterControl extends ButtonsMixin(BaseTextFilterControlsGroup){\n\n /**\n * get text filter options from all controls in the group\n * @return {Array.} text filter options\n */\n getTextFilterOptions(){\n\n let options = [];\n\n //get options from the latest selected radio if exists\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n if(latestSelectedRadio){\n options = options.concat(latestSelectedRadio.getTextFilterOptions());\n }\n\n //add all selected checkboxes\n for(let checkbox of this.checkboxes){\n\n if(checkbox.selected) {\n options = options.concat(checkbox.getTextFilterOptions());\n }\n }\n\n return options;\n }\n\n}\n\nexport default ButtonsTextFilterControl;","import BaseTextFilterControlsGroup from '../../../base/groups/filter/base-text-filter-controls-group';\nimport RadioButtonsMixin from '../../../base/groups/mixins/radio-buttons.mixin';\n\n/**\n * radio buttons text filter control\n */\nclass RadioButtonsTextFilterControl extends RadioButtonsMixin(BaseTextFilterControlsGroup){\n\n /**\n * get text filter options from all controls in the group\n * @return {Array.} path filter options\n */\n getTextFilterOptions(){\n\n let options = [];\n\n //get options from the latest selected radio if exists\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n if(latestSelectedRadio){\n options = options.concat(latestSelectedRadio.getTextFilterOptions());\n }\n\n return options;\n }\n}\n\nexport default RadioButtonsTextFilterControl;","import BaseTextFilterControlsGroup from '../../../base/groups/filter/base-text-filter-controls-group';\nimport CheckboxMixin from '../../../base/groups/mixins/checkbox.mixin';\n\n/**\n * checkbox text filter control\n */\nclass CheckboxTextFilterControl extends CheckboxMixin(BaseTextFilterControlsGroup){\n\n /**\n * get text filter options from all controls in the group\n * @return {Array.} path filter options\n */\n getTextFilterOptions(){\n\n let options = [];\n\n //add all selected checkboxes\n for(let checkbox of this.checkboxes){\n\n if(checkbox.selected) {\n options = options.concat(checkbox.getTextFilterOptions());\n }\n }\n\n return options;\n }\n}\n\nexport default CheckboxTextFilterControl;","import BaseTextFilterControlsGroup from '../../../base/groups/filter/base-text-filter-controls-group';\n\n/**\n * text box filter control\n */\nclass TextboxFilterControl extends BaseTextFilterControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n }\n\n /**\n * add control to the group\n * @param {BaseTextFilterControl} control\n */\n addControl(control){\n\n const baseTextFilterControl = super.addControl(control);\n\n //check if control contains a link and it is in the deep links parameters\n if(baseTextFilterControl.id){\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === baseTextFilterControl.id);\n\n if(deepLinkParam){\n baseTextFilterControl.text = deepLinkParam.value;\n baseTextFilterControl.element.value = deepLinkParam.value;\n }\n }\n\n /**\n * on control event\n */\n baseTextFilterControl.element.addEventListener('keyup', e => {\n\n e.preventDefault();\n\n baseTextFilterControl.text = e.target.value;\n\n this.textChanged(baseTextFilterControl);\n });\n\n //handle clear button\n baseTextFilterControl.clearButtonID = (baseTextFilterControl.element.getAttribute('data-clear-btn-id') || '').trim();\n\n if(baseTextFilterControl.clearButtonID){\n\n const clearBtn = document.getElementById(baseTextFilterControl.clearButtonID);\n\n if(clearBtn){\n\n /**\n * on clear button click\n */\n clearBtn.addEventListener('click', e => {\n\n e.preventDefault();\n\n baseTextFilterControl.text = '';\n\n this.textChanged(baseTextFilterControl);\n });\n }\n }\n }\n\n /**\n * on text change\n */\n textChanged(baseTextFilterControl){\n\n this.controls.forEach(control => {\n\n if(control.isEqualTo(baseTextFilterControl, false)){\n\n control.element.value = baseTextFilterControl.initialText;\n control.text = baseTextFilterControl.initialText;\n }\n });\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, baseTextFilterControl);\n }\n }\n\n}\n\nexport default TextboxFilterControl;","import BaseControl from '../base.control';\n\n/**\n * base pagination control\n */\nclass BasePaginationControl extends BaseControl{\n\n /**\n * constructor\n * @param {HTMLElement} element\n */\n constructor(element){\n super(element);\n\n if(element){\n\n /**\n * optional, 10 by default\n * the max number of items per page\n */\n this.itemsPerPage = Number(element.getAttribute('data-items-per-page')) || 10;\n\n /**\n * optional, 0 by default\n * the initial page\n */\n this.currentPage = Number(element.getAttribute('data-current-page')) || 0;\n\n /**\n * optional, 10 by default\n * max number of visible pagination button\n */\n this.range = Number(element.getAttribute('data-range')) || 10;\n\n /**\n * CSS class that is used on disabled pagination buttons\n * @type {string|string}\n */\n this.disabledClass = (element.getAttribute('data-disabled-class') || 'jplist-disabled').trim();\n\n /**\n * CSS class that is used on selected pagination buttons\n * @type {string|string}\n */\n this.selectedClass = (element.getAttribute('data-selected-class') || 'jplist-selected').trim();\n }\n }\n\n /**\n * get pagination options\n * @return {object} options\n */\n getPaginationOptions(){\n\n return {\n itemsPerPage: this.itemsPerPage,\n currentPage: this.currentPage,\n range: this.range\n };\n }\n}\n\nexport default BasePaginationControl;\n","import BaseControlsGroup from '../base-controls-group';\nimport BasePaginationControl from '../../controls/pagination/base-pagination.control';\n\n/**\n * represents a group of pagination controls with the same data-name and data-group attributes\n */\nclass BasePaginationControlsGroup extends BaseControlsGroup{\n\n /**\n * there can be only 1 pagination options object;\n * in case of multiple -> get the latest\n * @return {object|null} pagination options\n */\n getPaginationOptions(){\n\n if(this.controls.length > 0){\n return this.controls[this.controls.length - 1].getPaginationOptions();\n }\n\n return null;\n }\n\n /**\n * update controls according to the pagination options calculated using PaginationAction class;\n * @param {PaginationAction} paginationOptions\n */\n setPaginationOptions(paginationOptions){}\n\n /**\n * add control to the group\n * @param {BaseControl} control\n * @return {BasePaginationControl|null}\n */\n addControl(control){\n\n if(control.name !== this.name || control.group !== this.group){\n return null;\n }\n\n const basePaginationControl = new BasePaginationControl(control.element);\n\n this.controls.push(basePaginationControl);\n\n return basePaginationControl;\n }\n}\n\nexport default BasePaginationControlsGroup;\n","import BasePaginationControlsGroup from '../base/groups/pagination/base-pagination-controls-group';\nimport BaseDropdownControl from '../base/controls/dropdown/base-dropdown.control';\n\n/**\n * pagination control\n */\nclass PaginationControl extends BasePaginationControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.currentPage = 0;\n this.itemsPerPage = 0;\n this.range = 0;\n this.id = '';\n }\n\n /**\n * add control to the group\n * @param {BasePaginationControl} control\n */\n addControl(control){\n\n const basePaginationControl = super.addControl(control);\n\n //update properties - we take them from the latest pagination control in the group\n this.currentPage = basePaginationControl.currentPage;\n this.itemsPerPage = Number(basePaginationControl.itemsPerPage) || 0;\n this.range = basePaginationControl.range;\n\n //restore control state from the deep link value if needed\n this.restoreFromDeepLink(basePaginationControl);\n\n //this template is used for generating pagination buttons\n basePaginationControl.pageButtonsHolder = basePaginationControl.element.querySelector('[data-type=\"pages\"]');\n\n if(basePaginationControl.pageButtonsHolder){\n basePaginationControl.btnTemplate = basePaginationControl.pageButtonsHolder.innerHTML;\n }\n\n //first, last, next and prev button\n basePaginationControl.firstButtons = basePaginationControl.element.querySelectorAll('[data-type=\"first\"]');\n basePaginationControl.lastButtons = basePaginationControl.element.querySelectorAll('[data-type=\"last\"]');\n basePaginationControl.prevButtons = basePaginationControl.element.querySelectorAll('[data-type=\"prev\"]');\n basePaginationControl.nextButtons = basePaginationControl.element.querySelectorAll('[data-type=\"next\"]');\n\n //event handlers\n PaginationControl.bindEventHandler(basePaginationControl.firstButtons, 'click', this.pageButtonClick.bind(this), basePaginationControl);\n PaginationControl.bindEventHandler(basePaginationControl.lastButtons, 'click', this.pageButtonClick.bind(this), basePaginationControl);\n PaginationControl.bindEventHandler(basePaginationControl.prevButtons, 'click', this.pageButtonClick.bind(this), basePaginationControl);\n PaginationControl.bindEventHandler(basePaginationControl.nextButtons, 'click', this.pageButtonClick.bind(this), basePaginationControl);\n\n //items per page select\n basePaginationControl.itemsPerPageSelects = Array.from(basePaginationControl.element.querySelectorAll('[data-type=\"items-per-page\"]'));\n this.updateItemsPerPageSelect(basePaginationControl.itemsPerPageSelects);\n\n //items per page custom drop downs\n basePaginationControl.itemsPerPageDD = Array.from(basePaginationControl.element.querySelectorAll('[data-type=\"items-per-page-dd\"]'));\n this.initCustomDropdowns(basePaginationControl);\n\n PaginationControl.bindEventHandler(basePaginationControl.itemsPerPageSelects, 'change', this.selectChange.bind(this), basePaginationControl);\n\n //information labels\n basePaginationControl.labels = basePaginationControl.element.querySelectorAll('[data-type=\"info\"]');\n\n if(basePaginationControl.labels) {\n for (let label of basePaginationControl.labels) {\n label.template = label.innerHTML;\n }\n }\n }\n\n /**\n * update items per page value of select group\n * @param {Array.} selects\n */\n updateItemsPerPageSelect(selects){\n\n for(let select of selects){\n\n const option = Array.from(select.options).find(option => option.value === this.itemsPerPage.toString());\n\n if(option) {\n select.value = Number(this.itemsPerPage) || 0;\n }\n else{\n select.value = 0;\n }\n }\n }\n\n /**\n * init custom dropdowns\n * @param {BasePaginationControl} basePaginationControl\n */\n initCustomDropdowns(basePaginationControl){\n\n //@param {HTMLCollection} itemsPerPageDD\n const itemsPerPageDD = basePaginationControl.itemsPerPageDD;\n\n if(!itemsPerPageDD || itemsPerPageDD.length <=0) return;\n\n for(let dd of itemsPerPageDD){\n\n //create dropdown instance for each dd HTML structure;\n //this instance adds dropdown classes, styles and behaviour\n dd.dropdown = new BaseDropdownControl(dd);\n\n //all dropdown buttons are keeps as buttons property\n dd.buttons = Array.from(dd.querySelectorAll('[data-value]'));\n\n for(let button of dd.buttons){\n\n button.addEventListener('click', (e) => {\n\n e.preventDefault();\n\n this.itemsPerPage = Number(button.getAttribute('data-value')) || 0;\n\n //set selected button in all dropdowns for the current this.itemsPerPage value\n this.setSelectedButton();\n\n dd.dropdown.close();\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, basePaginationControl);\n }\n });\n }\n }\n\n //set selected button in all dropdowns for the current this.itemsPerPage value\n this.setSelectedButton();\n }\n\n // --------------------- BUTTONS ---------------------\n\n /**\n * set selected button in all dropdowns for the current this.itemsPerPage value\n */\n setSelectedButton(){\n\n for(let control of this.controls){\n\n if(!control.itemsPerPageDD) continue;\n\n for(let dd of control.itemsPerPageDD){\n\n if(!dd.buttons) continue;\n\n let selectedButton = dd.buttons.find(button => {\n\n const btnValue = Number(button.getAttribute('data-value')) || 0;\n return btnValue === this.itemsPerPage;\n });\n\n if(!selectedButton){\n\n selectedButton = dd.buttons.find(button => {\n const btnValue = Number(button.getAttribute('data-value')) || 0;\n return btnValue === 0;\n });\n }\n\n if(selectedButton){\n\n dd.dropdown.setPanelsContent(selectedButton.textContent);\n }\n }\n }\n }\n\n // --------------------- OPTIONS ---------------------\n\n /**\n * there can be only 1 pagination options object;\n * in case of multiple -> get the latest\n * @return {object} pagination options\n */\n getPaginationOptions(){\n\n return {\n itemsPerPage: this.itemsPerPage,\n currentPage: this.currentPage,\n range: this.range\n };\n }\n\n /**\n * update controls according to the pagination options calculated using PaginationAction class;\n * @param {PaginationAction} paginationOptions\n */\n setPaginationOptions(paginationOptions){\n\n if(!paginationOptions) return;\n\n //update properties\n this.currentPage = paginationOptions.currentPage;\n this.itemsPerPage = paginationOptions.itemsPerPage;\n\n for(let control of this.controls){\n\n if(!control.btnTemplate || !control.pageButtonsHolder) continue;\n\n //remove all old buttons\n while (control.pageButtonsHolder.firstChild) {\n control.pageButtonsHolder.removeChild(control.pageButtonsHolder.firstChild);\n }\n\n //generate new buttons\n for (let i = paginationOptions.rangeStart; i <= paginationOptions.rangeEnd; i++) {\n\n //update button text macros and button attributes\n const div = document.createElement('div');\n div.innerHTML = control.btnTemplate.replace(new RegExp('{pageNumber}', 'g'), (i+1)).trim();\n const pageButton = div.firstChild;\n\n let btn = pageButton.querySelector('[data-type=\"page\"]');\n if(!btn){\n btn = pageButton;\n }\n\n btn.setAttribute('data-page', i.toString());\n\n if(i === this.currentPage){\n\n btn.classList.add(control.selectedClass);\n btn.setAttribute('data-selected', 'true');\n }\n\n //on page button click event handler\n btn.addEventListener('click', (e) => { this.pageButtonClick(e, btn, control); });\n\n //add button to the buttons holder\n control.pageButtonsHolder.appendChild(pageButton);\n }\n\n //update data-page attribute of first, last, prev and next buttons\n PaginationControl.setPageAttr(control.firstButtons, 0, this.currentPage !== 0, control.disabledClass);\n\n PaginationControl.setPageAttr(control.lastButtons,\n paginationOptions.pagesNumber - 1,\n this.currentPage !== paginationOptions.pagesNumber - 1,\n control.disabledClass);\n\n PaginationControl.setPageAttr(control.prevButtons,\n paginationOptions.prevPage,\n this.currentPage !== 0,\n control.disabledClass);\n\n PaginationControl.setPageAttr(control.nextButtons,\n paginationOptions.nextPage,\n this.currentPage !== paginationOptions.pagesNumber - 1,\n control.disabledClass);\n\n const infos = [\n {key: '{pageNumber}', value: paginationOptions.currentPage + 1},\n {key: '{pagesNumber}', value: paginationOptions.pagesNumber},\n {key: '{startItem}', value: paginationOptions.start + 1},\n {key: '{endItem}', value: paginationOptions.end},\n {key: '{itemsNumber}', value: paginationOptions.itemsNumber}\n ];\n\n //update information labels\n if(control.labels) {\n for (let label of control.labels) {\n\n if(!label.template) continue;\n\n let html = label.template;\n\n for(let info of infos){\n html = html.replace(new RegExp(info.key, 'g'), info.value);\n }\n\n label.innerHTML = html;\n }\n }\n\n //update whole control classes\n const classesToRemove = (Array.from(control.element.classList)).filter(className => className.startsWith('jplist-pages-number-') || className.startsWith('jplist-items-number-'));\n\n for(let className of classesToRemove){\n control.element.classList.remove(className);\n }\n\n control.element.classList.add('jplist-pages-number-' + paginationOptions.pagesNumber);\n control.element.classList.add('jplist-items-number-' + paginationOptions.itemsNumber);\n }\n }\n\n // --------------------- EVENT HANDLERS ---------------------\n\n /**\n * page, first, last, prev and next button onclick handler\n * @param {HTMLElement} btn\n * @param {BasePaginationControl} control\n */\n pageButtonClick(e, btn, control){\n\n if(e) {\n e.preventDefault();\n }\n\n const pageNumber = btn ? btn.getAttribute('data-page') : e.target.getAttribute('data-page');\n this.currentPage = Number(pageNumber) || 0;\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, control);\n }\n }\n\n /**\n * on items per page select change\n * @param {object} e\n * @param {HTMLElement} select\n * @param {BasePaginationControl} basePaginationControl\n */\n selectChange(e, select, basePaginationControl){\n\n e.preventDefault();\n\n const itemsPerPage = Number(e.target.value);\n\n if(!isNaN(itemsPerPage)){\n\n this.itemsPerPage = itemsPerPage;\n\n //update the selected values of all controls\n for(let control of this.controls){\n this.updateItemsPerPageSelect(control.itemsPerPageSelects);\n }\n }\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, basePaginationControl);\n }\n }\n\n // --------------------- DEEP LINK ---------------------\n\n /**\n * restore control state from the deep link value\n * @param {BasePaginationControl} basePaginationControl\n */\n restoreFromDeepLink(basePaginationControl){\n\n if(basePaginationControl.id){\n\n this.id = basePaginationControl.id;\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === basePaginationControl.id);\n\n if(deepLinkParam){\n\n const parts = deepLinkParam.value.split('-');\n\n if(parts.length !== 2) return;\n\n const currentPage = Number(parts[0]);\n const itemsPerPage = Number(parts[1]);\n\n if(isNaN(currentPage) || isNaN(itemsPerPage)) return;\n\n this.currentPage = currentPage;\n this.itemsPerPage = itemsPerPage;\n }\n }\n }\n\n /**\n * by default control's deep link is empty\n * @returns {string}\n */\n getDeepLink(){\n\n if(this.id){\n return this.id + '=' + this.currentPage + '-' + this.itemsPerPage;\n }\n\n return '';\n }\n\n // --------------------- HELPERS ---------------------\n\n /**\n * update page button attributes and styles of the elements collection\n * @param {HTMLCollection} items\n * @param {number} page\n * @param {boolean} isEnabled\n * @param {string} disabledClass\n */\n static setPageAttr(items, page, isEnabled, disabledClass){\n\n if(!items) return;\n\n for(let item of items){\n item.setAttribute('data-page', page);\n\n if(isEnabled){\n item.classList.remove(disabledClass);\n }\n else{\n item.classList.add(disabledClass);\n }\n }\n }\n\n /**\n * bind event handler to the items collection\n * @param {HTMLCollection} items\n * @param {string} eventName\n * @param {Function} func\n * @param {BasePaginationControl} basePaginationControl\n */\n static bindEventHandler(items, eventName, func, basePaginationControl){\n\n if(!items) return;\n\n for(let item of items){\n item.addEventListener(eventName, (e) => {func(e, item, basePaginationControl); });\n }\n }\n}\n\nexport default PaginationControl;","import BaseSortControlsGroup from '../../base/groups/sort/base-sort-controls-group';\nimport BaseSortControl from '../../base/controls/sort/base-sort.control';\nimport BaseDropdownControl from '../../base/controls/dropdown/base-dropdown.control';\n\n/**\n * dropdown sort control\n */\nclass DropdownSortControl extends BaseSortControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n this.selected = null;\n this.id = '';\n }\n\n /**\n * add control to the group\n * @param {BaseSortControl} control\n */\n addControl(control){\n\n //a dropdown has the following custom properties:\n // -- dropdown - custom dropdown behaviour, styles, classes\n // -- buttons - the list of dropdown buttons, each of them is BaseSortControl\n const baseSortControl = super.addControl(control);\n\n //generate dropdown instance for the given control;\n //this instance adds dropdown classes, styles and behaviour\n baseSortControl.dropdown = new BaseDropdownControl(control.element);\n baseSortControl.buttons = [];\n\n //each button inside dropdown is a separate sort control that defined by data-path attribute;\n //they are stored in baseSortControl.buttons array\n let buttons = baseSortControl.element.querySelectorAll('[data-path]');\n\n for(let button of buttons){\n\n //all buttons inherits data-name and data-group attributes of the root dropdown\n button.setAttribute('data-name', this.name);\n button.setAttribute('data-group', this.group);\n button.setAttribute('data-jump', baseSortControl.jump);\n\n let btnSortControl = new BaseSortControl(button);\n\n //save newly created button in the baseSortControl.buttons array\n baseSortControl.buttons.push(btnSortControl);\n\n /**\n * on control button click -> update the selected control\n */\n btnSortControl.element.addEventListener('click', e => {\n\n e.preventDefault();\n\n //clicked button should be the selected one\n this.selected = btnSortControl;\n\n this.setSelectedButton(baseSortControl);\n\n for(let control of this.controls){\n if(control.dropdown){\n control.dropdown.close();\n }\n }\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, btnSortControl);\n }\n });\n }\n\n this.selected = DropdownSortControl.getSelectedButton(baseSortControl.buttons);\n this.setSelectedButton(baseSortControl);\n\n //check if control contains a link and it is in the deep links parameters\n if(baseSortControl.id){\n\n this.id = baseSortControl.id;\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === baseSortControl.id);\n\n if(deepLinkParam){\n\n const deepLinkBtn = baseSortControl.buttons.find(btn => {\n\n const btnValue = btn.element.getAttribute('data-value');\n return (deepLinkParam.value === btnValue) ? btn : null;\n });\n\n if(deepLinkBtn) {\n this.selected = deepLinkBtn;\n this.setSelectedButton(baseSortControl);\n }\n }\n }\n }\n\n /**\n * get sort options from all controls in the group\n * @return {Array.} sortOptions\n */\n getSortOptions(){\n\n if(this.selected){\n return this.selected.getSortOptions();\n }\n\n return [];\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n\n if(this.id && this.selected){\n return this.id + '=' + this.selected.element.getAttribute('data-value') || '';\n }\n\n return '';\n }\n\n /**\n * get selected button that has data-selected=\"true\" data attribute;\n * if there is no data-selected attribute -> take the first button\n * @param {Array.} buttons\n * @return {BaseSortControl|null}\n */\n static getSelectedButton(buttons){\n\n if(buttons.length <= 0) return null;\n\n for(let button of buttons){\n if(button.element.getAttribute('data-selected') === 'true'){\n return button;\n }\n }\n\n return buttons[0];\n }\n\n /**\n * set selected button\n * @param {BaseSortControl} baseSortControl\n */\n setSelectedButton(baseSortControl){\n\n for(let control of this.controls){\n\n if(!control.dropdown) continue;\n\n //verify that dropdown has such button\n const dropdownBtn = baseSortControl.buttons.find(btn => this.selected.isEqualTo(btn));\n\n if(dropdownBtn){\n\n //update dropdown panels value\n control.dropdown.setPanelsContent(dropdownBtn.element.textContent);\n }\n }\n }\n}\n\nexport default DropdownSortControl;","import BaseSortControlsGroup from '../../base/groups/sort/base-sort-controls-group';\nimport BaseSortControl from '../../base/controls/sort/base-sort.control';\n\n/**\n * select sort control\n * \n *\n * Sort by\n *\n * Title A-Z\n *\n * Title Z-A\n * \n *\n * option may have the following attributes:\n * ------------------------------------------\n * data-path - required CSS path selector\n * data-order - optional, asc (default) / desc\n * data-type=\"text\" - optional, text (default) / number / datetime\n * data-datetime-format=\"{month}/{day}/{year}\" - optional datetime format\n * data-regex - optional ignore regex\n */\nclass SelectSortControl extends BaseSortControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n\n this.options = [];\n this.selected = '';\n this.id = '';\n }\n\n /**\n * add control to the group\n * @param {BaseSortControl} control\n */\n addControl(control){\n\n const baseSortControl = super.addControl(control);\n\n let options = baseSortControl.element.querySelectorAll('option');\n\n for(let option of options){\n\n option.setAttribute('data-name', this.name);\n option.setAttribute('data-group', this.group);\n\n if(!this.options.find(opt => opt.element.value === option.value)){\n this.options.push(new BaseSortControl(option));\n }\n }\n\n this.selected = baseSortControl.element.value;\n\n //check if control contains a link and it is in the deep links parameters\n if(baseSortControl.id){\n\n this.id = baseSortControl.id;\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === baseSortControl.id);\n\n if(deepLinkParam){\n baseSortControl.element.value = deepLinkParam.value;\n this.selected = deepLinkParam.value;\n }\n }\n\n /**\n * on control change -> update the selected control\n */\n baseSortControl.element.addEventListener('change', e => {\n\n e.preventDefault();\n\n this.selected = e.target.value;\n\n for(let select of this.controls){\n select.element.value = this.selected;\n }\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, baseSortControl);\n }\n });\n }\n\n /**\n * get sort options from all controls in the group\n * @return {Array.} sortOptions\n */\n getSortOptions(){\n\n let selected = this.options.find(opt => opt.element.value === this.selected);\n\n if(selected){\n return selected.getSortOptions();\n }\n\n return [];\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n\n let selected = this.options.find(opt => opt.element.value === this.selected);\n\n if(this.id){\n return this.id + '=' + selected.element.value;\n }\n\n return '';\n }\n}\n\nexport default SelectSortControl;","import BaseSortControlsGroup from '../../base/groups/sort/base-sort-controls-group';\n\nconst SELECTED_CLASS = 'jplist-selected';\n\n/**\n * checkbox sort control\n *\n * Usage:\n * \n * Optional deep link: #deepLinkName1=1\n * selected value - 1\n * non selected - 0\n */\nclass CheckboxSortControl extends BaseSortControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n\n this.checkboxes = [];\n }\n\n /**\n * add control to the group\n * @param {BaseSortControl} control\n */\n addControl(control){\n\n const baseSortControl = super.addControl(control);\n\n //get additional control properties\n baseSortControl.selected = baseSortControl.element.checked;\n\n //check if control contains a link and it is in the deep links parameters\n if(baseSortControl.id){\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === baseSortControl.id);\n\n if(deepLinkParam){\n baseSortControl.selected = deepLinkParam.value === '1';\n }\n }\n\n this.checkboxes.push(baseSortControl);\n this.handleCheckboxes();\n\n /**\n * on control change -> update the selected control\n */\n baseSortControl.element.addEventListener('change', e => {\n\n e.preventDefault();\n\n baseSortControl.selected = !baseSortControl.selected;\n\n this.checkboxes.forEach(cb => {\n\n if(cb.isEqualTo(baseSortControl)){\n cb.selected = baseSortControl.selected;\n }\n });\n\n this.handleCheckboxes();\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, baseSortControl);\n }\n });\n }\n\n /**\n * handle checkbox mode controls\n */\n handleCheckboxes(){\n\n for(let cb of this.checkboxes){\n\n if(cb.selected){\n cb.element.classList.add(SELECTED_CLASS);\n }\n else{\n cb.element.classList.remove(SELECTED_CLASS);\n }\n\n cb.element.checked = cb.selected;\n }\n }\n\n /**\n * get sort options from all controls in the group\n * @return {Array.} sortOptions\n */\n getSortOptions(){\n\n let sortOptions = [];\n\n let atLeastOneNotSelectedCheckbox = false;\n\n //add all selected checkboxes\n for(let checkbox of this.checkboxes){\n\n if(checkbox.selected) {\n sortOptions = sortOptions.concat(checkbox.getSortOptions());\n }\n else{\n atLeastOneNotSelectedCheckbox = true;\n }\n }\n\n //any number of non selected checkboxes -> 1 default option\n if(atLeastOneNotSelectedCheckbox){\n sortOptions = sortOptions.concat([\n {\n path: 'default'\n }\n ]);\n }\n\n return sortOptions;\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n const cbArr = this.checkboxes.map(cb => {\n\n if(cb.id){\n return cb.selected ? cb.id + '=1' : cb.id + '=0';\n }\n else{\n return '';\n }\n\n }).filter(str => str !== '');\n\n const unique = Array.from(new Set(cbArr));\n return unique.join('&');\n }\n}\n\nexport default CheckboxSortControl;","import BaseSortControlsGroup from '../../base/groups/sort/base-sort-controls-group';\n\nconst SELECTED_CLASS = 'jplist-selected';\n\n/**\n * radio buttons sort control\n *\n * Usage:\n * \n *\n * Optional deep link: #deepLinkName1=1\n * selected value - 1\n * non selected - should not appear in deep link\n */\nclass RadioButtonsSortControl extends BaseSortControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n this.radios = [];\n }\n\n /**\n * add control to the group\n * @param {BaseSortControl} control\n */\n addControl(control){\n\n const baseSortControl = super.addControl(control);\n\n //get additional control properties\n baseSortControl.selected = baseSortControl.element.checked;\n\n //check if control contains a link and it is in the deep links parameters\n if(baseSortControl.id){\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === baseSortControl.id);\n\n if(deepLinkParam){\n baseSortControl.selected = deepLinkParam.value === '1';\n }\n }\n\n this.radios.push(baseSortControl);\n this.handleRadios();\n\n /**\n * on control change -> update the selected control\n */\n baseSortControl.element.addEventListener('change', e => {\n\n e.preventDefault();\n\n for (let radio of this.radios) {\n radio.selected = false;\n }\n\n baseSortControl.selected = true;\n\n this.handleRadios();\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, baseSortControl);\n }\n });\n }\n\n /**\n * get the latest selected radio\n * @return {BaseSortControl} latestSelectedRadio\n */\n getLastSelectedRadio(){\n\n let latestSelectedRadio = null;\n\n //find the latest selected radio\n for (let radio of this.radios) {\n\n if (radio.selected) {\n latestSelectedRadio = radio;\n }\n }\n\n return latestSelectedRadio;\n }\n\n /**\n * handle radio mode controls\n */\n handleRadios(){\n\n if(this.radios.length > 0) {\n\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n //remove selected from all radios\n for (let radio of this.radios) {\n\n radio.selected = false;\n radio.element.classList.remove(SELECTED_CLASS);\n }\n\n if(latestSelectedRadio) {\n\n this.radios.forEach(radio => {\n\n if(radio.isEqualTo(latestSelectedRadio)){\n\n radio.selected = true;\n radio.element.checked = true;\n radio.element.classList.add(SELECTED_CLASS);\n }\n });\n }\n }\n }\n\n /**\n * get sort options from all controls in the group\n * @return {Array.} sortOptions\n */\n getSortOptions(){\n\n let sortOptions = [];\n\n //get options from the latest selected radio if exists\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n if(latestSelectedRadio){\n sortOptions = sortOptions.concat(latestSelectedRadio.getSortOptions());\n }\n\n return sortOptions;\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n const radioArr = this.radios.map(radio => radio.id && radio.selected ? radio.id + '=1' : '').filter(str => str !== '');\n const unique = Array.from(new Set(radioArr));\n return unique.join('&');\n }\n}\n\nexport default RadioButtonsSortControl;","import BaseSortControlsGroup from '../../base/groups/sort/base-sort-controls-group';\n\nconst SELECTED_CLASS = 'jplist-selected';\n\n/**\n * sort buttons jPList control\n *\n * Usage:\n * \n * data-group=\"group1\" \n * data-order=\"asc\" \n * data-type=\"text\" \n * data-name=\"sort1\" \n * data-selected=\"true\" \n * data-datetime-format=\"{month}/{day}/{year}\" \n * data-regex=\"\" \n * data-id=\"deep-link-name1\" \n * data-mode=\"radio\"> \n * Sort by title asc\n * \n *\n * Optional deep link: #deepLinkName1=1&deepLinkName2=1\n * selected value - 1\n * non selected - should not appear in deep link or any value !== 1\n */\nclass ButtonsSortControl extends BaseSortControlsGroup{\n\n /**\n * constructor\n * @param {string} group\n * @param {string} name\n * @param {Array.=} controls\n * @param {Map|null=} deepLinkParams - structure: [groupName, [{key, value}, ...]], ...\n */\n constructor(group, name, controls = [], deepLinkParams = null){\n super(group, name, controls, deepLinkParams);\n\n this.group = group;\n this.name = name;\n\n this.checkboxes = [];\n this.radios = [];\n }\n\n /**\n * add control to the group\n * @param {BaseSortControl} control\n */\n addControl(control){\n\n const baseSortControl = super.addControl(control);\n\n //get additional control properties\n baseSortControl.selected = baseSortControl.element.getAttribute('data-selected') === 'true';\n baseSortControl.mode = baseSortControl.element.getAttribute('data-mode') || 'radio';\n\n //check if control contains a link and it is in the deep links parameters\n if(baseSortControl.id){\n\n const deepLinkParam = this.deepLinkParams.find(param => param.key === baseSortControl.id);\n\n if(deepLinkParam){\n baseSortControl.selected = deepLinkParam.value === '1';\n }\n }\n\n if(baseSortControl.mode === 'radio'){\n\n this.radios.push(baseSortControl);\n this.handleRadios();\n }\n\n if(baseSortControl.mode === 'checkbox'){\n\n this.checkboxes.push(baseSortControl);\n this.handleCheckboxes();\n }\n\n /**\n * on control click -> change the selected control\n */\n baseSortControl.element.addEventListener('click', e => {\n\n e.preventDefault();\n\n if(baseSortControl.mode === 'checkbox'){\n\n baseSortControl.selected = !baseSortControl.selected;\n\n this.checkboxes.forEach(cb => {\n\n if(cb.isEqualTo(baseSortControl)){\n cb.selected = baseSortControl.selected;\n }\n });\n\n this.handleCheckboxes();\n }\n\n if(baseSortControl.mode === 'radio'){\n\n for (let radio of this.radios) {\n radio.selected = false;\n }\n\n baseSortControl.selected = true;\n\n this.handleRadios();\n }\n\n if(window.jplist) {\n\n window.jplist.refresh(this.group, baseSortControl);\n }\n });\n }\n\n /**\n * handle checkbox mode controls\n */\n handleCheckboxes(){\n\n for(let cb of this.checkboxes){\n\n if(cb.selected){\n cb.element.classList.add(SELECTED_CLASS);\n }\n else{\n cb.element.classList.remove(SELECTED_CLASS);\n }\n }\n }\n\n /**\n * get the latest selected radio\n * @return {BaseSortControl} latestSelectedRadio\n */\n getLastSelectedRadio(){\n\n let latestSelectedRadio = null;\n\n //find the latest selected radio\n for (let radio of this.radios) {\n\n if (radio.selected) {\n latestSelectedRadio = radio;\n }\n }\n\n return latestSelectedRadio;\n }\n\n /**\n * handle radio mode controls\n */\n handleRadios(){\n\n if(this.radios.length > 0) {\n\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n //remove selected from all radios\n for (let radio of this.radios) {\n\n radio.selected = false;\n radio.element.classList.remove(SELECTED_CLASS);\n }\n\n if(latestSelectedRadio) {\n\n this.radios.forEach(radio => {\n\n if(radio.isEqualTo(latestSelectedRadio)){\n radio.selected = true;\n radio.element.checked = true;\n radio.element.classList.add(SELECTED_CLASS);\n }\n });\n }\n }\n }\n\n /**\n * get sort options from all controls in the group\n * @return {Array.} sortOptions\n */\n getSortOptions(){\n\n let sortOptions = [];\n\n let atLeastOneNotSelectedCheckbox = false;\n\n //add all selected checkboxes\n for(let checkbox of this.checkboxes){\n\n if(checkbox.selected) {\n sortOptions = sortOptions.concat(checkbox.getSortOptions());\n }\n else{\n atLeastOneNotSelectedCheckbox = true;\n }\n }\n\n if(atLeastOneNotSelectedCheckbox){\n sortOptions = sortOptions.concat([\n {\n path: 'default'\n }\n ]);\n }\n\n //get options from the latest selected radio if exists\n let latestSelectedRadio = this.getLastSelectedRadio();\n\n if(latestSelectedRadio){\n sortOptions = sortOptions.concat(latestSelectedRadio.getSortOptions());\n }\n\n return sortOptions;\n }\n\n /**\n * get deep link according to the current control states\n * @return {string}\n */\n getDeepLink(){\n const cbArr = this.checkboxes.map(cb => cb.id && cb.selected ? cb.id + '=1' : '').filter(str => str !== '');\n const radioArr = this.radios.map(radio => radio.id && radio.selected ? radio.id + '=1' : '').filter(str => str !== '');\n const combined = cbArr.concat(radioArr);\n const unique = Array.from(new Set(combined));\n return unique.join('&');\n }\n}\n\nexport default ButtonsSortControl;","import BaseSortControlsGroup from '../../base/groups/sort/base-sort-controls-group';\n\n/**\n * hidden sort jPList control\n *\n * HTML structure:\n * ----------------\n * \n * \n *\n * Usage in JS:\n * -------------\n * import HiddenSort from './controls/sort/hidden-sort.control';\n * let control = document.getElementById('my-hidden-sort-control');\n * const hiddenSort = new HiddenSort(control);\n * console.log(hiddenSort.type);\n */\nclass HiddenSortControl extends BaseSortControlsGroup{}\n\nexport default HiddenSortControl;\n","/**\n * local storage, session storage, cookies\n */\nclass StorageService{\n\n /**\n * is storage supported?\n * @param {string} storage - 'localStorage', 'sessionStorage', 'cookies'\n * @return {boolean}\n */\n static isSupported(storage){\n\n if(storage === 'cookies') return true;\n\n try{\n return storage in window && window[storage] !== null;\n }\n catch(e){\n return false;\n }\n }\n\n /**\n * save to the storage\n * @param {string} deepLink\n * @param {string} storage - 'localStorage', 'sessionStorage', 'cookies'\n * @param {string} key - storage key\n * @param {number} expiration - cookie expiration in minutes (-1 = cookies expire when browser is closed)\n */\n static set(deepLink, storage, key, expiration = -1){\n\n if(storage === 'cookies'){\n\n const cValue = encodeURIComponent(deepLink);\n const exdate = new Date();\n\n expiration = Number(expiration) || -1;\n\n if(expiration === -1){\n document.cookie = name + '=' + cValue + ';path=/;';\n }\n else{\n exdate.setMinutes(exdate.getMinutes() + expiration);\n document.cookie = name + '=' + cValue + ';path=/; expires=' + exdate.toUTCString();\n }\n }\n else{\n if(StorageService.isSupported(storage)) {\n\n //save json in storage\n window[storage][key] = deepLink;\n }\n }\n }\n\n /**\n * get from storage\n * @param {string} storage - 'localStorage', 'sessionStorage', 'cookies'\n * @param {string} key - storage key\n * @return {string} deepLink\n */\n static get(storage, key){\n\n let deepLink = '';\n\n if(storage === 'cookies'){\n\n //get document cookie\n const cookies = document.cookie.split(';');\n\n for (let i=0; i this.pagesNumber - 1){\n this.currentPage = 0;\n }\n\n this.start = this.currentPage * this.itemsPerPage;\n this.end = this.start + this.itemsPerPage;\n\n //validate the end\n if(this.end > this.itemsNumber){\n this.end = this.itemsNumber;\n }\n\n this.prevPage = this.currentPage <= 0 ? 0 : this.currentPage - 1;\n this.nextPage = this.pagesNumber === 0 ? 0 : (this.currentPage >= this.pagesNumber - 1 ? this.pagesNumber - 1 : this.currentPage + 1);\n\n this.range = Number(range) || 10;\n\n const halfRange = Math.ceil((this.range - 1) / 2);\n this.rangeStart = this.currentPage - halfRange;\n this.rangeEnd = Math.min(this.rangeStart + this.range - 1, this.pagesNumber - 1);\n\n if(this.rangeStart <= 0){\n this.rangeStart = 0;\n this.rangeEnd = Math.min(this.range - 1, this.pagesNumber - 1);\n }\n\n if(this.rangeEnd >= this.pagesNumber - 1){\n this.rangeStart = Math.max(this.pagesNumber - this.range, 0);\n this.rangeEnd = this.pagesNumber - 1;\n }\n }\n}\n\nexport default PaginationAction;","/**\n * sort action\n */\nclass SortAction{\n\n /**\n * general multiple sort\n * @param {Array.} items\n * @param {Array.<{path: string, dataType: text|number|datetime, order: asc|desc, ignoreRegex: string, dateTimeFormat: string}>} options\n * if path = 'default' - the original sort should be kept\n * @return {Array.} sorted items\n */\n static sort(items, options){\n\n if(!options || options.length <= 0){\n\n /**\n * if no options - return to the default browser sort order\n */\n items.sort((item1, item2) => {\n return SortAction.sortByIndex(item1, item2);\n });\n\n return items;\n }\n\n items.sort((item1, item2) => {\n\n /**\n * start recursive helper\n */\n return SortAction.sortHelper(item1, item2, options, 0);\n });\n\n return items;\n }\n\n /**\n * recursive sort helper\n * @param {HTMLElement} item1\n * @param {HTMLElement} item2\n * @param {Array.} options - structure: {path: string, dataType: text|number|datetime, order: asc|desc, ignoreRegex: string, dateTimeFormat: string}\n * @param {number} optionsIndex\n * @return {number} - 0 if equal, <0 if item1 < item2, >0 if item1 > item2\n */\n static sortHelper(item1, item2, options, optionsIndex){\n\n if(!options || options.length <= 0 || optionsIndex >= options.length){\n return 0;\n }\n\n let result = 0;\n\n const option = options[optionsIndex];\n\n if(option.path !== 'default'){\n\n switch(option.dataType){\n\n case 'number': {\n result = SortAction.sortNumbers(item1, item2, option.path, option.order);\n break;\n }\n\n case 'datetime': {\n result = SortAction.sortDateTime(item1, item2, option.path, option.order, option.dateTimeFormat);\n break;\n }\n\n default: {\n result = SortAction.sortText(item1, item2, option.path, option.order, option.ignoreRegex);\n break;\n }\n }\n }\n else{\n result = SortAction.sortByIndex(item1, item2);\n }\n\n if(result === 0 && optionsIndex + 1 < options.length){\n\n //get next result recursive\n result = SortAction.sortHelper(item1, item2, options, optionsIndex + 1);\n }\n\n return result;\n }\n\n /**\n * sort texts\n * @param {HTMLElement} item1\n * @param {HTMLElement} item2\n * @param {string=} path - can be any CSS selector - https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Selectors;\n * empty path means the whole element; path shouldn't have 'default' value\n * @param {string=} order - asc or desc\n * @param {string=} ignoreRegex - optional regex that defines charaters that should be ignored before the sorting\n * @return {number} - 0 if equal, <0 if item1 < item2, >0 if item1 > item2\n */\n static sortText(item1, item2, path = '', order = 'asc', ignoreRegex = ''){\n\n if(!item1 || !item2){\n return 0;\n }\n\n //find elements with the content to sort\n const el1 = path ? item1.querySelector(path) : item1;\n const el2 = path ? item2.querySelector(path) : item2;\n\n if(!el1 || !el2){\n return 0;\n }\n\n let text1 = el1.textContent.trim().toLowerCase();\n let text2 = el2.textContent.trim().toLowerCase();\n\n if(ignoreRegex){\n\n //regex expression that is used to remove irrelevant characters\n const regexExpr = new RegExp(ignoreRegex, 'ig');\n text1 = text1.replace(regexExpr, '').trim();\n text2 = text2.replace(regexExpr, '').trim();\n }\n\n if(text1 === text2){\n return 0;\n }\n\n if(!order){\n order = 'asc';\n }\n\n //compare languages other than English\n if(''.localeCompare){\n\n if (order === 'asc') {\n return text1.localeCompare(text2);\n }\n else {\n return text2.localeCompare(text1);\n }\n }\n else{\n if (order === 'asc') {\n return text1 > text2 ? 1 : -1;\n }\n else {\n return text1 < text2 ? 1 : -1;\n }\n }\n }\n\n /**\n * sort numbers\n * @param {HTMLElement} item1\n * @param {HTMLElement} item2\n * @param {string=} path - can be any CSS selector - https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Selectors;\n * empty path means the whole element; path shouldn't have 'default' value\n * @param {string=} order - asc or desc\n * @return {number} - 0 if equal, <0 if item1 < item2, >0 if item1 > item2\n */\n static sortNumbers(item1, item2, path = '', order = 'asc'){\n\n if(!item1 || !item2){\n return 0;\n }\n\n //find elements with the content to sort\n const el1 = path ? item1.querySelector(path) : item1;\n const el2 = path ? item2.querySelector(path) : item2;\n\n if(!el1 || !el2){\n return 0;\n }\n\n let number1 = el1.textContent.trim().toLowerCase();\n let number2 = el2.textContent.trim().toLowerCase();\n\n //remove other characters\n number1 = parseFloat(number1.replace(/[^-0-9.]+/g,''));\n number2 = parseFloat(number2.replace(/[^-0-9.]+/g,''));\n\n if(isNaN(number1) || isNaN(number2)){\n\n if(isNaN(number1) && isNaN(number2)){\n return 0;\n }\n else {\n return isNaN(number1) ? 1 : -1;\n }\n }\n\n if(number1 === number2){\n return 0;\n }\n\n if(!order){\n order = 'asc';\n }\n\n if(order === 'asc'){\n return number1 - number2;\n }\n else{\n return number2 - number1;\n }\n }\n\n\n /**\n * sort by initial element index\n * @param {HTMLElement} item1\n * @param {HTMLElement} item2\n * @return {number} - 0 if equal, <0 if item1 < item2, >0 if item1 > item2\n */\n static sortByIndex(item1, item2){\n\n if(!item1 || !item2){\n return 0;\n }\n\n let number1 = Number(item1.jplistIndex);\n let number2 = Number(item2.jplistIndex);\n\n if(isNaN(number1) || isNaN(number2)){\n return 0;\n }\n\n return number1 - number2;\n }\n\n // ---------------- DATE TIME ------------------------\n\n /**\n * month name that can be used in date time strings\n * from 0 for January to 11 for December\n * @returns {Array.>}\n */\n static get months() {\n\n return [\n ['january', 'jan', 'jan.'],\n ['february', 'feb', 'feb.'],\n ['march', 'mar', 'mar.'],\n ['april', 'apr', 'apr.'],\n ['may'],\n ['june', 'jun.'],\n ['july', 'jul', 'jul.'],\n ['august', 'aug', 'aug.'],\n ['september', 'sep', 'sep.'],\n ['october', 'oct', 'oct.'],\n ['november', 'nov', 'nov.'],\n ['december', 'dec', 'dec.']\n ];\n }\n\n /**\n * sort datetime\n * @param {HTMLElement} item1\n * @param {HTMLElement} item2\n * @param {string=} path - can be any CSS selector - https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Selectors;\n * empty path means the whole element; path shouldn't have 'default' value;\n * @param {string=} order - asc or desc\n * @param {string=} dateTimeFormat - for example, {month}/{day}/{year}\n * @return {number} - 0 if equal, <0 if item1 < item2, >0 if item1 > item2\n */\n static sortDateTime(item1, item2, path = '', order = 'asc', dateTimeFormat = ''){\n\n if(!item1 || !item2){\n return 0;\n }\n\n //find elements with the content to sort\n const el1 = path ? item1.querySelector(path) : item1;\n const el2 = path ? item2.querySelector(path) : item2;\n\n if(!el1 || !el2){\n return 0;\n }\n\n let datetime1 = el1.textContent.trim().toLowerCase();\n let datetime2 = el2.textContent.trim().toLowerCase();\n\n let date1;\n let date2;\n\n dateTimeFormat = dateTimeFormat.trim();\n\n if(!dateTimeFormat){\n\n date1 = new Date(Date.parse(datetime1));\n date2 = new Date(Date.parse(datetime2));\n }\n else{\n date1 = SortAction.getDateFromString(datetime1, dateTimeFormat);\n date2 = SortAction.getDateFromString(datetime2, dateTimeFormat);\n }\n\n if(date1.getTime() === date2.getTime()){\n return 0;\n }\n\n if(!order){\n order = 'asc';\n }\n\n if(order === 'asc'){\n return date1.getTime() > date2.getTime() ? 1 : -1;\n }\n else{\n return date1.getTime() < date2.getTime() ? 1 : -1;\n }\n }\n\n /**\n * get date time from string that contains wildcards like {year}, {month}, {day}, {hour}, {min}, {sec}\n * @param {string} dateTimeString - for example, 01/12/2017\n * @param {string} dateTimeFormat - for example, {month}/{day}/{year}\n * @return {Date}\n */\n static getDateFromString(dateTimeString, dateTimeFormat){\n\n //remove special characters\n dateTimeFormat = dateTimeFormat.replace(/\\./g, '\\\\.');\n dateTimeFormat = dateTimeFormat.replace(/\\(/g, '\\\\(');\n dateTimeFormat = dateTimeFormat.replace(/\\)/g, '\\\\)');\n dateTimeFormat = dateTimeFormat.replace(/\\[/g, '\\\\[');\n dateTimeFormat = dateTimeFormat.replace(/\\]/g, '\\\\]');\n\n //get year\n let year = SortAction.getDateWildcardValue(dateTimeFormat, '{year}', dateTimeString);\n year = Number(year) || 1900;\n\n //get day\n let day = SortAction.getDateWildcardValue(dateTimeFormat, '{day}', dateTimeString);\n day = Number(day) || 1;\n\n //get month: integer value representing the month, beginning with 0 for January to 11 for December\n let month = SortAction.getDateWildcardValue(dateTimeFormat, '{month}', dateTimeString);\n month = SortAction.getMonthByWildcard(month);\n if(month === -1){\n month = 0;\n }\n\n //get hour: (0-23)\n let hour = SortAction.getDateWildcardValue(dateTimeFormat, '{hour}', dateTimeString);\n hour = Number(hour) || 0;\n\n //get minute: (0-59)\n let minute = SortAction.getDateWildcardValue(dateTimeFormat, '{min}', dateTimeString);\n minute = Number(minute) || 0;\n\n //get second: (0-59)\n let second = SortAction.getDateWildcardValue(dateTimeFormat, '{sec}', dateTimeString);\n second = Number(second) || 0;\n\n return new Date(year, month, day, hour, minute, second);\n }\n\n /**\n * get datetime format section/item\n * @param {string} dateTimeFormat - for example, {month}/{day}/{year} or any other string with wildcards; dateTimeFormat should not contain special characters like . ( ) [ ]\n * @param {string} wildcard - {year}|{month}|{day}|{hour}|{min}|{sec}\n * @param {string} datetimeString - for example, 01/15/2017\n * @return {string|null} - returns the specified wildcard value, for example 2017 for {year} wildcard\n */\n static getDateWildcardValue(dateTimeFormat, wildcard, datetimeString){\n\n let result = null;\n\n //replace the specified wildcard with the (.*)\n //for example, for wildcard=year the string can be: '{month}/{day}/{year}' => '{month}/{day}/(.*)'\n let replacedFormat = dateTimeFormat.replace(wildcard, '(.*)');\n\n //replace all other wildcard with .*\n //for example above it will be: '.*/.*/(.*)'\n const regexValue = replacedFormat.replace(/{year}|{month}|{day}|{hour}|{min}|{sec}/g, '.*');\n\n //for example, run '.*/.*/(.*)' regex on 01/15/2017\n const regex = new RegExp(regexValue, 'g');\n const match = regex.exec(datetimeString);\n\n //we get the wildcard value from the given string: 2017 in the example above\n if(match && match.length > 1){\n result = match[1];\n }\n\n return result;\n }\n\n /**\n * get month number by string\n * @param {string} monthNumberOrName - month number or name from date time string\n * @return {number} from 0 for January to 11 for December; -1 if not found;\n */\n static getMonthByWildcard(monthNumberOrName){\n\n monthNumberOrName = monthNumberOrName ? monthNumberOrName.trim().toLowerCase() : '';\n\n let monthIndex = Number(monthNumberOrName);\n\n if(!isNaN(monthIndex)){\n\n if(monthIndex - 1 < 0){\n return -1;\n }\n else {\n return monthIndex - 1;\n }\n }\n\n //find month index by value\n return SortAction.months.findIndex((monthAliasesArray) => {\n\n return monthAliasesArray.find(monthAlias => {\n return monthAlias.trim() === monthNumberOrName;\n });\n });\n }\n}\n\nexport default SortAction;","import SortAction from '../actions/sort/sort.action';\nimport PaginationAction from '../actions/pagination/pagination.action';\nimport BaseControl from '../controls/base/controls/base.control';\nimport DeepLinksService from '../services/deep-links.service';\nimport StorageService from '../services/storage.service';\nimport FilterAction from '../actions/filter/filter.action';\n\n/**\n * content manager\n */\nclass ContentManager{\n\n /**\n * apply controls on the content groups\n * @param {Object} settings\n * @param {Map} controls - controls split by data-group and data-name: [groupName, [BaseControlsGroup1, BaseControlsGroup2, ...]]\n * @param {Map} groups - [groupName, Array.<{root: HTMLElement, items: Array.] groups\n * @param {string=} groupName - optional group name; if group name is empty or not provided -> refresh all groups\n * @param {BaseControl|undefined=} target - the element that triggered the event\n */\n static apply(settings, controls, groups, groupName = '', target = undefined){\n\n if(!controls || !groups) return;\n\n const filters = [\n {\n options: 'pathFilterOptions',\n name: 'pathFilter'\n },\n {\n options: 'rangeFilterOptions',\n name: 'rangeFilter'\n },\n {\n options: 'textFilterOptions',\n name: 'textFilter'\n }\n ];\n\n //group structure is Array.<{root: HTMLElement, items: Array.}>\n for(let [cGroupName, groupValueArr] of groups){\n\n if((groupName && groupName === cGroupName) || !groupName){\n\n //get controls of this group;\n //received controls array [BaseControlsGroup1, BaseControlsGroup2, ...]\n const baseControlsGroups = controls.get(cGroupName);\n\n //collect sort, pagination and filter options from all controls with the same group name\n const options = ContentManager.collectControlsOptions(baseControlsGroups);\n\n //there can be more than one block of items with the same group name\n //each itemsBlock has structure: {root: HTMLElement, items: Array.}\n for(let itemsBlock of groupValueArr){\n\n let itemsNumber = itemsBlock.items.length;\n\n //hide all elements moving them to the document fragment\n let fragment = ContentManager.getItemsFragment(itemsBlock.items);\n\n if(options.sortOptions && options.sortOptions.length > 0) {\n\n //sort the items of the group using sort options of all controls\n SortAction.sort(itemsBlock.items, options.sortOptions);\n fragment = ContentManager.getItemsFragment(itemsBlock.items);\n }\n\n let filtered = itemsBlock.items;\n for(let filter of filters){\n\n //pathFilterOptions, rangeFilterOptions or textFilterOptions\n const filterName = filter.options;\n\n if(options[filterName]){\n\n const splitted = ContentManager.splitByLogic(options[filterName]);\n\n //apply \"AND\" filter\n filtered = ContentManager.handleFilter(filtered, splitted.and, 'and', filter.name);\n\n //apply \"OR\" filters\n for(let orOptionsGroupName in splitted.or){\n filtered = ContentManager.handleFilter(filtered, splitted.or[orOptionsGroupName], 'or', filter.name);\n }\n\n itemsNumber = filtered.length;\n fragment = ContentManager.getItemsFragment(filtered);\n }\n }\n\n if(options.paginationOptions){\n\n const paginationAction = new PaginationAction(\n options.paginationOptions.currentPage,\n options.paginationOptions.itemsPerPage,\n filtered.length,\n options.paginationOptions.range\n );\n\n //setPaginationOptions applies all computed properties of PaginationAction class to the latest pagination control\n if(baseControlsGroups.length > 0){\n\n for(let bcg of baseControlsGroups){\n if(bcg.setPaginationOptions){\n bcg.setPaginationOptions(paginationAction);\n }\n }\n }\n\n const paginatedItems = filtered.slice(paginationAction.start, paginationAction.end);\n itemsNumber = paginatedItems.length;\n fragment = ContentManager.getItemsFragment(paginatedItems);\n }\n\n //return to HTML only relevant items\n itemsBlock.root.appendChild(fragment);\n\n //dispatch the event with different data about state of controls and items\n ContentManager.sendStateEvent(options, itemsNumber, baseControlsGroups, groups, filtered);\n }\n\n //if one of controls has data-jump attribute -> jump to the specified CSS selector or to the top\n ContentManager.jump(baseControlsGroups, target);\n }\n\n }\n\n if(settings.deepLinking) {\n\n //update deep link if it's enabled\n ContentManager.updateDeepLink(ContentManager.getDeepLink(controls, groups), settings.hashStart);\n }\n else{\n if(settings.storage){\n\n //update storage if it's enabled\n StorageService.set(ContentManager.getDeepLink(controls, groups), settings.storage, settings.storageName, settings.cookiesExpiration);\n }\n }\n }\n\n /**\n * perform filter\n * @param {object} option\n * @param {Array.} filtered\n * @param {string} filterType - 'textFilter', 'rangeFilter' or 'pathFilter'\n * @returns {Array.}\n */\n static performFilter(option, filtered, filterType){\n\n switch(filterType){\n\n case 'textFilter' : {\n return FilterAction.textFilter(\n filtered,\n option.text,\n option.path,\n option.mode,\n option.ignoreRegex);\n }\n\n case 'pathFilter' : {\n return FilterAction.pathFilter(filtered,\n option.path,\n option.isInverted);\n }\n\n case 'rangeFilter' : {\n return FilterAction.rangeFilter(filtered,\n option.path,\n option.from,\n option.to,\n option.min,\n option.max);\n }\n }\n\n return filtered;\n }\n\n /**\n * filter text / path / range\n * @param {Array.} filtered\n * @param {Array.} options\n * @param {string} logic - 'or' / 'and'\n * @param {string} filterType - 'textFilter', 'rangeFilter' or 'pathFilter'\n * @returns {Array.}\n */\n static handleFilter(filtered, options, logic, filterType){\n\n if(options.length <= 0) return filtered;\n\n if(logic === 'and'){\n for(let option of options){\n filtered = ContentManager.performFilter(option, filtered, filterType);\n }\n }\n\n if(logic === 'or'){\n\n let orFiltered = new Set();\n\n for(let option of options){\n\n let temp = ContentManager.performFilter(option, filtered, filterType);\n\n orFiltered = new Set([...orFiltered, ...temp]);\n }\n\n filtered = Array.from(orFiltered);\n }\n\n return filtered;\n }\n\n /**\n * split array of options by \"OR\" / \"AND\" logic\n * all options with \"AND\" logic organize 1 group, \"OR\" options can organize multiple groups\n * @param {Array.} options\n * @return {object}, {and: [option1, option2, ...], or: {'name1': [option1, options, ...], 'name2': [option1, options, ...], ...}}\n */\n static splitByLogic(options){\n\n const result = {\n and: [],\n or: {}\n };\n\n for(let option of options){\n\n const orName = option.or;\n\n if(!orName){\n result.and.push(option);\n }\n else{\n if(result.or[orName] === undefined){\n result.or[orName] = [option];\n }\n else{\n result.or[orName].push(option);\n }\n }\n }\n\n return result;\n }\n\n /**\n * if one of controls has data-jump attribute -> jump to the specified CSS selector or to the top\n * data-jump=\"any CSS selector or 'top' keyword\"\n * examples: data-jump=\"header\"\n * data-jump=\".top-bar\"\n * data-jump=\"#main\"\n * data-jump=\"top\"\n * @param {Array.} baseControlsGroups - [BaseControlsGroup1, BaseControlsGroup2, ...]\n * @param {BaseControl|undefined=} target - the element that triggered the event\n * @history\n * - 21/08/2018 - fixed https://github.com/1rosehip/jplist-es6/issues/11\n */\n static jump(baseControlsGroups, target = undefined){\n\n if(!target || !target.jump) return;\n\n //if(!baseControlsGroups || baseControlsGroups.length <= 0) return;\n\n //-1 means no scroll\n let top = -1;\n\n //top is always the upper ))\n if(target.jump === 'top'){\n top = 0;\n }\n else{\n const jumpEl = document.querySelector(target.jump);\n\n if(!jumpEl) return;\n\n const jumpElRect = jumpEl.getBoundingClientRect();\n\n //make sure element is not hidden or disconnected\n if (!jumpEl.width && !jumpEl.height && !jumpEl.getClientRects().length) return;\n\n const clientTop = document.clientTop || document.body.clientTop || 0;\n\n if(top < 0){\n\n //select the first jump path as the default value\n top = jumpElRect.top + window.pageYOffset - clientTop;\n }\n else{\n if(jumpElRect.top + window.pageYOffset - clientTop < top){\n top = jumpElRect.top + window.pageYOffset - clientTop;\n }\n }\n }\n\n if(top >= 0){\n window.scroll(0, top);\n }\n }\n\n /**\n * send jPList general event with different data about state of controls and items\n * @param {object} options\n * @param {number} itemsNumber\n * @param {BaseControlsGroup} baseControlsGroups\n * @param {Map} groups - [groupName, Array.<{root: HTMLElement, items: Array.] groups\n * @param {Array.} filtered\n */\n static sendStateEvent(options, itemsNumber, baseControlsGroups, groups, filtered){\n\n if(!baseControlsGroups) return;\n\n const stateEvent = new CustomEvent('jplist.state');\n\n stateEvent.jplistState = {\n options: options,\n itemsNumber: itemsNumber,\n groups: groups,\n filtered: filtered\n };\n\n for(let baseControlsGroup of baseControlsGroups){\n\n for(let control of baseControlsGroup.controls){\n\n control.element.dispatchEvent(stateEvent);\n }\n }\n }\n\n /**\n * collect sort, pagination and filter options from all controls with the same group name\n * @param {Array.} baseControlsGroups\n * @return {object} sort, pagination and filter objects\n */\n static collectControlsOptions(baseControlsGroups){\n\n const options = {\n\n //there can be multiple sort options\n sortOptions: [],\n\n //there should be only one pagination options object;\n //in case of multiple -> get the latest\n paginationOptions: null,\n\n //there can be multiple filter options\n textFilterOptions: [],\n pathFilterOptions: [],\n rangeFilterOptions: []\n };\n\n if(!baseControlsGroups) return options;\n\n for(let baseControlsGroup of baseControlsGroups){\n\n //get sort options only from sort controls\n if(baseControlsGroup.getSortOptions) {\n\n //add base control group sort options\n options.sortOptions = options.sortOptions.concat(baseControlsGroup.getSortOptions());\n }\n\n //get text filter options only from text filter controls\n if(baseControlsGroup.getTextFilterOptions) {\n\n //add base control group sort options\n options.textFilterOptions = options.textFilterOptions.concat(baseControlsGroup.getTextFilterOptions());\n }\n\n //get path filter options only from text filter controls\n if(baseControlsGroup.getPathFilterOptions) {\n\n //add base control group sort options\n options.pathFilterOptions = options.pathFilterOptions.concat(baseControlsGroup.getPathFilterOptions());\n }\n\n //get range filter options only from range filter controls\n if(baseControlsGroup.getRangeFilterOptions) {\n\n //add base control group sort options\n options.rangeFilterOptions = options.rangeFilterOptions.concat(baseControlsGroup.getRangeFilterOptions());\n }\n\n if(baseControlsGroup.getPaginationOptions) {\n options.paginationOptions = baseControlsGroup.getPaginationOptions();\n }\n }\n\n return options;\n }\n\n /**\n * get document fragment with the specified items\n * @param {Array.} items\n * @return {DocumentFragment}\n */\n static getItemsFragment(items){\n\n const fragment = document.createDocumentFragment();\n\n for(let item of items){\n fragment.appendChild(item);\n }\n\n return fragment;\n }\n\n /**\n * update deep link -> replace it in URL\n * @param {string} deepLink\n * @param {string} hashStart\n */\n static updateDeepLink(deepLink, hashStart = '#'){\n\n let hashStr = deepLink.replace(hashStart, '').trim();\n\n if(hashStr === ''){\n hashStr = hashStart;\n }\n else{\n hashStr = hashStart + hashStr;\n }\n\n if(window.location.hash !== hashStr){\n\n const index = window.location.href.indexOf(hashStart);\n let href;\n\n if(index === -1){\n href = window.location.href + hashStr;\n }\n else{\n href = window.location.href.substring(0, index) + hashStr;\n }\n\n if('replaceState' in window.history){\n window.history.replaceState('', '', href);\n }\n else{\n window.location.replace(href);\n }\n }\n }\n\n /**\n * update deep link URL according to the current controls states\n * @return {string} deep link\n */\n static getDeepLink(controls, groups){\n\n let deeplink = [];\n\n //group structure is Array.<{root: HTMLElement, items: Array.}>\n for(let cGroupName of groups.keys()){\n\n //get controls of this group;\n //received controls array [BaseControlsGroup1, BaseControlsGroup2, ...]\n const baseControlsGroups = controls.get(cGroupName);\n\n const deepLinkParts = [];\n for(let baseControlsGroup of baseControlsGroups){\n\n const dl = baseControlsGroup.getDeepLink();\n\n if(dl){\n deepLinkParts.push(dl);\n }\n }\n\n if(deepLinkParts.length > 0){\n deeplink.push('group=' + cGroupName);\n deeplink = deeplink.concat(deepLinkParts);\n }\n }\n\n return deeplink.join('&');\n }\n\n /**\n * find all groups of elements that should be sorted, filtered, etc.\n * each group defined by data-jplist-group attribute;\n * each element in the group defined by data-jplist-item attribute;\n * @param {HTMLCollection} groups\n * @return {Map} Map[groupName, Array.<{root: HTMLElement, items: Array.] groups\n */\n static findGroups(groups){\n\n const groupsMap = new Map();\n\n if(!groups){\n return groupsMap;\n }\n\n //get all items with data attribute data-jplist-group\n const groupElements = [...groups];\n\n for(let groupElement of groupElements){\n\n const groupName = groupElement.getAttribute('data-jplist-group');\n\n let groupValue = [];\n\n if(groupsMap.has(groupName)){\n groupValue = groupsMap.get(groupName);\n }\n\n groupValue.push({\n\n /**\n * the root element of the group\n */\n root: groupElement,\n\n /**\n * all group elements\n */\n items: [...groupElement.querySelectorAll('[data-jplist-item]')],\n\n /**\n * this fragment used as a container for invisible items\n */\n fragment: document.createDocumentFragment()\n });\n\n groupsMap.set(groupName, groupValue);\n }\n\n return groupsMap;\n }\n\n /**\n * find all controls defined on page by data-jplist-control attribute;\n * control classes should be registered in window.jplist.controlTypes before using this method:\n * window.jplist.controlTypes = new Map([\n * ['hidden-sort', HiddenSortControl],\n * ...\n * ]);\n * @param {HTMLElement} root\n * @return {Array.}\n */\n static findControls(root){\n\n if(!root) return [];\n\n const controls = [];\n\n //find all control\n const elements = root.querySelectorAll('[data-jplist-control]');\n\n if(elements) {\n\n for(let element of elements){\n\n const controlType = element.getAttribute('data-jplist-control');\n\n if(!controlType) continue;\n\n const controlInstance = new BaseControl(element);\n controls.push(controlInstance);\n }\n }\n\n return controls;\n }\n\n /**\n * split control by their data-group property\n * @param {Array.} controls\n * @return {Map} [[groupName, controls array], [...], ...]\n */\n static findControlGroups(controls){\n\n const map = new Map();\n\n if(controls) {\n\n for (let control of controls) {\n\n let arr = [];\n\n if (map.has(control.group)) {\n arr = map.get(control.group);\n }\n\n arr.push(control);\n\n map.set(control.group, arr);\n }\n }\n\n return map;\n }\n\n /**\n * find controls with the same name\n * @param {object} settings\n * @param {Array.} controls\n * @return {Map} [[name, BaseControlsGroup], [...]]\n */\n static findSameNameControls(settings, controls){\n\n const map = new Map();\n\n if(controls){\n\n let deepLinkParams = null;\n\n if(settings.deepLinking){\n deepLinkParams = DeepLinksService.getUrlParams(window.location.hash, settings.hashStart);\n }\n else{\n if(settings.storage){\n\n const deepLinkSavedInStorage = StorageService.get(settings.storage, settings.storageName);\n deepLinkParams = DeepLinksService.getUrlParams(deepLinkSavedInStorage, '');\n }\n }\n\n for(let control of controls){\n\n //control with not defined type should be ignored\n if(!control.type || !window.jplist.controlTypes.has(control.type)) continue;\n\n //check if data-type class defined in window.jplist.controlTypes;\n //it should be defined like this:\n //window.jplist.controlTypes = window.jplist.controlTypes || new Map([\n // ['hidden-sort', HiddenSortControl],\n // ...\n //]);\n const controlClass = window.jplist.controlTypes.get(control.type);\n\n if(controlClass){\n\n let controlGroup = null;\n\n if (map.has(control.name)) {\n controlGroup = map.get(control.name);\n }\n else{\n controlGroup = new controlClass(control.group, control.name, [], deepLinkParams);\n }\n\n controlGroup.addControl(control);\n\n map.set(control.name, controlGroup);\n }\n }\n }\n\n return map;\n }\n\n /**\n * initialize controls and split them by group and name\n * @param {object} settings\n * @param {HTMLElement} root\n * @return {Map} [groupName, [BaseControlsGroup1, BaseControlsGroup2, ...]]\n */\n static splitByGroupAndName(settings, root){\n\n const res = new Map();\n\n if(!root) return res;\n\n //find all controls: received {Array.}\n const controls = ContentManager.findControls(root);\n\n //split controls by their data-group attributes;\n //the received structure is map: [[groupName, controls array], [...], ...]\n const controlsByGroupNames = ContentManager.findControlGroups(controls);\n\n for(let [groupName, groupControls] of controlsByGroupNames){\n\n //received {Map} - [[name, BaseControlsGroup], [...]]\n const sameNameControls = ContentManager.findSameNameControls(settings, groupControls);\n\n let arr = [];\n\n for(let baseControlsGroup of sameNameControls.values()){\n arr.push(baseControlsGroup);\n }\n\n res.set(groupName, arr);\n }\n\n return res;\n }\n}\n\nexport default ContentManager;","import ContentManager from './content/content-manager';\nimport BaseControl from \"./controls/base/controls/base.control\";\n\n/**\n * the main jPList class\n */\nexport default class jPList{\n\n /**\n * API: initialize jPList controls + elements from outside\n * @param {Object} options\n */\n init(options){\n\n this.settings = Object.assign({}, {\n\n //storage\n storage: '', //'', 'localStorage', 'sessionStorage', 'cookies'\n storageName: 'jplist',\n cookiesExpiration: -1, //cookies expiration in minutes (-1 = cookie expires when browser is closed)\n\n //deep links\n deepLinking: false,\n hashStart: '#' //the start of the hash part, for example it may be '#!key='\n\n }, options);\n\n //find all controls split by data-group and data-name\n this.controls = ContentManager.splitByGroupAndName(this.settings, document.body);\n\n //find all jplist groups\n this.elements = document.querySelectorAll('[data-jplist-group]');\n\n //get from each group the data about its root and items;\n //the received structure is: Map[groupName, Array.<{root: HTMLElement, items: Array.}>]\n this.groups = ContentManager.findGroups(this.elements);\n\n let items = [...document.querySelectorAll('[data-jplist-item]')];\n\n //set jPList index for every element\n //it's used to return to the default browser sorting if needed\n for(let jplistIndex = 0; jplistIndex < items.length; jplistIndex++){\n\n items[jplistIndex].jplistIndex = jplistIndex;\n }\n\n //first refresh\n this.refresh('');\n }\n\n /**\n * API: apply controls on content\n * @param {string=} groupName - optional group name\n * @param {BaseControl|undefined=} target - the element that triggered the event\n */\n refresh(groupName = '', target = undefined){\n ContentManager.apply(this.settings, this.controls, this.groups, groupName, target);\n }\n\n /**\n * API: reset control by CSS selector and apply it on content\n * @param {HTMLElement} element\n */\n resetControl(element){\n\n if(!element) return;\n\n if(this.controls) {\n\n for (let [groupName, groupControls] of this.controls) {\n for (let group of groupControls) {\n let controlIndex = group.controls.findIndex(control => control.element === element);\n\n if(controlIndex >= 0){\n\n //find the control\n const control = group.controls[controlIndex];\n const oldElement = control.element;\n\n //create HTML element from outer HTML string\n const div = document.createElement('div');\n div.innerHTML = oldElement.initialHTML;\n const newElement = div.firstChild;\n\n if(oldElement.parentNode) {\n\n //replace HTML element in the DOM\n oldElement.parentNode.replaceChild(newElement, oldElement);\n\n //replace the control in the group\n group.controls.splice(controlIndex, 1);\n group.addControl(new BaseControl(newElement));\n\n //update state\n this.refresh(groupName);\n }\n\n return;\n }\n }\n }\n }\n }\n\n /**\n * API: reset all jplist controls and apply them on content\n * @param {string=} groupName\n */\n resetControls(groupName = ''){\n\n if(this.controls) {\n\n //this.controls is a Map: [groupName, [BaseControlsGroup1, BaseControlsGroup2, ...]]\n for (let [groupName, groupControls] of this.controls) {\n\n for (let group of groupControls) {\n\n for(let control of group.controls){\n\n if (!control.element || !control.element.initialHTML) continue;\n\n control.element.outerHTML = control.element.initialHTML;\n\n }\n }\n }\n }\n\n //find all controls split by data-group and data-name\n this.controls = ContentManager.splitByGroupAndName(this.settings, document.body);\n\n this.refresh(groupName);\n }\n\n /**\n * API: refresh HTML content after add / remove items\n * @param {Function} updateContentFunc\n */\n resetContent(updateContentFunc){\n\n for(let [cGroupName, groupValueArr] of this.groups){\n\n for(let itemsBlock of groupValueArr) {\n\n //hide all elements moving them to the document fragment\n let fragment = ContentManager.getItemsFragment(itemsBlock.items);\n\n itemsBlock.root.appendChild(fragment);\n }\n }\n\n if(updateContentFunc){\n updateContentFunc(this.groups);\n }\n\n //find all jplist groups\n this.elements = document.querySelectorAll('[data-jplist-group]');\n\n //get from each group the data about its root and items;\n //the received structure is: Map[groupName, Array.<{root: HTMLElement, items: Array.}>]\n this.groups = ContentManager.findGroups(this.elements);\n\n let items = [...document.querySelectorAll('[data-jplist-item]')];\n\n //set jPList index for every element\n //it's used to return to the default browser sorting if needed\n for(let jplistIndex = 0; jplistIndex < items.length; jplistIndex++){\n\n items[jplistIndex].jplistIndex = jplistIndex;\n }\n\n //first refresh\n this.refresh('');\n\n }\n\n}","/*\n\n |----\n | /\n | \\\n |----\n |\n /*\\\n // \\\\\n // \\\\\n //=====\\\\\n // \\\\\n----| |=========| |----\n \\ | | | | /\n / | | [] | | \\\n----| | | |----\n | | [] | |\n /=\\| |/=\\\n //=\\\\ [] //=\\\\\n //===\\\\ //===\\\\\n//=====\\\\ //=====\\\\\n||=====||=====||=====||\n-----------------------\n|||||||||||||||||||||||\n-----------------------\n|| ***** ||\n|| ||||||| ||\n|| || | || ||\n|| || | || ||\n|| || (|) || ||\n|| || | || ||\n|| || | || ||\n**===================**/\n\nimport jPList from './jplist';\n\n//sort\nimport HiddenSortControl from './controls/sort/hidden-sort/hidden-sort.control';\nimport ButtonsSortControl from './controls/sort/buttons-sort/buttons-sort.control';\nimport RadioButtonsSortControl from './controls/sort/radio-buttons-sort/radio-buttons-sort.control';\nimport CheckboxSortControl from './controls/sort/checkbox-sort/checkbox-sort.control';\nimport SelectSortControl from './controls/sort/select-sort/select-sort.control';\nimport DropdownSortControl from './controls/sort/dropdown-sort/dropdown-sort.control';\n\n//pagination\nimport PaginationControl from './controls/pagination/pagination.control';\n\n//text filter\nimport TextboxFilterControl from './controls/filter/text-filters/textbox-filter/textbox-filter.control';\nimport CheckboxTextFilterControl from './controls/filter/text-filters/checkbox-text-filter/checkbox-text-filter.control';\nimport RadioButtonsTextFilterControl from './controls/filter/text-filters/radio-buttons-text-filter/radio-buttons-text-filter.control';\nimport ButtonsTextFilterControl from './controls/filter/text-filters/buttons-text-filter/buttons-text-filter.control';\n\n//path filter\nimport SelectFilterControl from './controls/filter/path-filters/select-filter/select-filter.control';\nimport CheckboxPathFilterControl from './controls/filter/path-filters/checkbox-path-filter/checkbox-path-filter.control';\nimport RadioButtonsPathFilterControl from './controls/filter/path-filters/radio-buttons-path-filter/radio-buttons-path-filter.control';\nimport ButtonsPathFilterControl from './controls/filter/path-filters/buttons-path-filter/buttons-path-filter.control';\nimport DropdownFilterControl from './controls/filter/path-filters/dropdown-filter/dropdown-filter.control';\n\n//range filter\nimport ButtonsRangeFilter from './controls/filter/range-filters/buttons-range-filter/buttons-range-filter.control';\nimport RangeSliderFilter from './controls/filter/range-filters/slider-range-filter/slider-range-filter.control';\n\n//other\nimport NoResultsControl from './controls/no-results/no-results.control';\nimport DropdownControl from './controls/base/controls/dropdown/base-dropdown.control';\nimport LayoutControl from './controls/layout/layout.control';\nimport ResetControl from './controls/reset/reset.control';\nimport CounterControl from './controls/counter/counter.control';\n\n(() => {\n 'use strict';\n\n //custom events polyfill for IE 10+\n //https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n if (typeof window.CustomEvent !== 'function' ){\n\n const CustomEvent = (event, params) => {\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n var evt = document.createEvent( 'CustomEvent' );\n evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent;\n }\n\n /**\n * global jplist function, one per page\n */\n window.jplist = window.jplist || {};\n\n /**\n * registered control types\n * @type {Map}\n */\n window.jplist.controlTypes = window.jplist.controlTypes || new Map([\n ['hidden-sort', HiddenSortControl],\n ['sort-buttons', ButtonsSortControl],\n ['radio-buttons-sort', RadioButtonsSortControl],\n ['checkbox-sort', CheckboxSortControl],\n ['select-sort', SelectSortControl],\n ['dropdown-sort', DropdownSortControl],\n\n ['pagination', PaginationControl],\n\n ['textbox-filter', TextboxFilterControl],\n ['checkbox-text-filter', CheckboxTextFilterControl],\n ['radio-buttons-text-filter', RadioButtonsTextFilterControl],\n ['buttons-text-filter', ButtonsTextFilterControl],\n\n ['select-filter', SelectFilterControl],\n ['dropdown-filter', DropdownFilterControl],\n ['checkbox-path-filter', CheckboxPathFilterControl],\n ['radio-buttons-path-filter', RadioButtonsPathFilterControl],\n ['buttons-path-filter', ButtonsPathFilterControl],\n\n ['buttons-range-filter', ButtonsRangeFilter],\n ['slider-range-filter', RangeSliderFilter],\n\n ['no-results', NoResultsControl],\n ['dropdown', DropdownControl],\n ['layout', LayoutControl],\n ['reset', ResetControl],\n ['counter', CounterControl]\n ]);\n\n let jplist = new jPList();\n\n /**\n * external api\n */\n window.jplist.init = jplist.init.bind(jplist);\n window.jplist.refresh = jplist.refresh.bind(jplist);\n window.jplist.resetControls = jplist.resetControls.bind(jplist);\n window.jplist.resetControl = jplist.resetControl.bind(jplist);\n window.jplist.resetContent = jplist.resetContent.bind(jplist);\n})();"],"sourceRoot":""}