{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/1.1.1/controls/base/groups/base-controls-group.js","webpack:///./src/1.1.1/controls/base/groups/sort/base-sort-controls-group.js","webpack:///./src/1.1.1/controls/base/controls/base.control.js","webpack:///./src/1.1.1/controls/base/groups/filter/base-path-filter-controls-group.js","webpack:///./src/1.1.1/controls/base/groups/filter/base-text-filter-controls-group.js","webpack:///./src/1.1.1/controls/base/controls/dropdown/base-dropdown.control.js","webpack:///./src/1.1.1/controls/base/controls/filter/base-path-filter.control.js","webpack:///./src/1.1.1/controls/base/groups/mixins/buttons.mixin.js","webpack:///./src/1.1.1/controls/base/controls/sort/base-sort.control.js","webpack:///./src/1.1.1/controls/base/groups/filter/base-range-filter-controls-group.js","webpack:///./src/1.1.1/controls/base/groups/mixins/radio-buttons.mixin.js","webpack:///./src/1.1.1/controls/base/groups/mixins/checkbox.mixin.js","webpack:///./src/1.1.1/controls/reset/reset.control.js","webpack:///./src/1.1.1/controls/layout/layout.control.js","webpack:///./src/1.1.1/controls/no-results/no-results.control.js","webpack:///./src/1.1.1/controls/base/controls/slider/base-slider.control.js","webpack:///./src/1.1.1/controls/filter/range-filters/slider-range-filter/slider-range-filter.control.js","webpack:///./src/1.1.1/controls/base/controls/filter/base-range-filter.control.js","webpack:///./src/1.1.1/controls/filter/range-filters/buttons-range-filter/buttons-range-filter.control.js","webpack:///./src/1.1.1/controls/filter/path-filters/dropdown-filter/dropdown-filter.control.js","webpack:///./src/1.1.1/controls/filter/path-filters/buttons-path-filter/buttons-path-filter.control.js","webpack:///./src/1.1.1/controls/filter/path-filters/radio-buttons-path-filter/radio-buttons-path-filter.control.js","webpack:///./src/1.1.1/controls/filter/path-filters/checkbox-path-filter/checkbox-path-filter.control.js","webpack:///./src/1.1.1/controls/filter/path-filters/select-filter/select-filter.control.js","webpack:///./src/1.1.1/controls/filter/text-filters/buttons-text-filter/buttons-text-filter.control.js","webpack:///./src/1.1.1/controls/filter/text-filters/radio-buttons-text-filter/radio-buttons-text-filter.control.js","webpack:///./src/1.1.1/controls/filter/text-filters/checkbox-text-filter/checkbox-text-filter.control.js","webpack:///./src/1.1.1/controls/base/controls/filter/base-text-filter.control.js","webpack:///./src/1.1.1/controls/filter/text-filters/textbox-filter/textbox-filter.control.js","webpack:///./src/1.1.1/controls/base/controls/pagination/base-pagination.control.js","webpack:///./src/1.1.1/controls/base/groups/pagination/base-pagination-controls-group.js","webpack:///./src/1.1.1/controls/pagination/pagination.control.js","webpack:///./src/1.1.1/controls/sort/dropdown-sort/dropdown-sort.control.js","webpack:///./src/1.1.1/controls/sort/select-sort/select-sort.control.js","webpack:///./src/1.1.1/controls/sort/checkbox-sort/checkbox-sort.control.js","webpack:///./src/1.1.1/controls/sort/radio-buttons-sort/radio-buttons-sort.control.js","webpack:///./src/1.1.1/controls/sort/buttons-sort/buttons-sort.control.js","webpack:///./src/1.1.1/controls/sort/hidden-sort/hidden-sort.control.js","webpack:///./src/1.1.1/actions/filter/filter.action.js","webpack:///./src/1.1.1/services/storage.service.js","webpack:///./src/1.1.1/services/deep-links.service.js","webpack:///./src/1.1.1/actions/pagination/pagination.action.js","webpack:///./src/1.1.1/actions/sort/sort.action.js","webpack:///./src/1.1.1/content/content-manager.js","webpack:///./src/1.1.1/jplist.js","webpack:///./src/1.1.1/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","selectedJumpPath","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","next","done","jump","el","document","querySelector","elRect","getBoundingClientRect","width","height","getClientRects","prevEl","prevElRect","top","err","return","BaseSortControlsGroup","sortOptions","concat","getSortOptions","baseSortControl","_baseSort2","default","element","BaseControl","type","getAttribute","id","BasePathFilterControlsGroup","basePathFilterControl","_basePathFilter2","options","getPathFilterOptions","BaseTextFilterControlsGroup","getTextFilterOptions","baseTextFilterControl","_baseTextFilter2","dl","map","text","filter","str","Array","from","Set","join","BaseDropdownControl","panels","querySelectorAll","openedClass","panel","initialContent","innerHTML","contents","handlePanelsClick","_this","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_loop","addEventListener","e","atLeastOnePanelIsOpened","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","dropdownContent","classList","toggle","contains","add","remove","_iterator2","target","close","content","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_step5","_iterator5","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_step6","_iterator6","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_step7","_iterator7","_base","BasePathFilterControl","_possibleConstructorReturn","__proto__","getPrototypeOf","path","isInverted","or","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","BaseRangeFilterControlsGroup","baseRangeFilterControl","_baseRangeFilter2","getRangeFilterOptions","baseControl","_baseControlsGroup","ResetControl","_get","resetControls","LayoutControl","classNames","selectedClassName","groupClassName","handleSelectedControls","handleClasses","groups","resetAllGroups","getLatestSelectedControl","addClassToGroups","cn","selectedGroupClassName","arr","NoResultsControl","jplistState","itemsNumber","style","display","BaseSliderControl","isVertical","min","value1","value2","max","callback","handler1","createElement","appendChild","range","left","handler2","dragging","start","bind","render","resize","stop","body","setValues","sendCallback","pos1","getInnerValue","pos2","update","x","y","newStart","newEnd","position","getHandlerPos","Math","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","textContent","parts","split","to","slider","_baseSlider2","round","controlOptions","BaseRangeFilterControl","Infinity","isNaN","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","BaseTextFilterControl","initialText","_text","includeValue","_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","firstChild","removeChild","_loop3","div","replace","RegExp","pageButton","rangeStart","rangeEnd","setPageAttr","pagesNumber","prevPage","nextPage","infos","end","_iteratorNormalCompletion8","_didIteratorError8","_iteratorError8","_step8","_iterator8","html","_iteratorNormalCompletion9","_didIteratorError9","_iteratorError9","_step9","_iterator9","info","pageNumber","_iteratorNormalCompletion10","_didIteratorError10","_iteratorError10","_step10","_iterator10","items","page","isEnabled","_iteratorNormalCompletion11","_didIteratorError11","_iteratorError11","_step11","_iterator11","item","eventName","func","_iteratorNormalCompletion12","_didIteratorError12","_iteratorError12","_step12","_loop4","_iterator12","DropdownSortControl","btnSortControl","SelectSortControl","_baseSortControlsGroup","CheckboxSortControl","atLeastOneNotSelectedCheckbox","RadioButtonsSortControl","ButtonsSortControl","HiddenSortControl","FilterAction","filtered","formattedText","elements","shouldBeAdded","elText","startsWith","endsWith","indexOf","parseFloat","isFinite","itemElements","numbers","num","maxNumber","apply","minNumber","isNumeric","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","filterType","_filter2","textFilter","pathFilter","rangeFilter","logic","performFilter","orFiltered","temp","_toConsumableArray","orName","getJumpPath","groupJumpEl","groupJumpElRect","clientTop","pageYOffset","scroll","stateEvent","CustomEvent","baseControlsGroup","dispatchEvent","textFilterOptions","pathFilterOptions","rangeFilterOptions","createDocumentFragment","hashStr","location","href","substring","history","replaceState","deeplink","_iteratorNormalCompletion13","_didIteratorError13","_iteratorError13","_step13","_iterator13","keys","deepLinkParts","_iteratorNormalCompletion14","_didIteratorError14","_iteratorError14","_step14","_iterator14","groupsMap","groupElements","_iteratorNormalCompletion15","_didIteratorError15","_iteratorError15","_step15","_iterator15","groupElement","groupValue","_iteratorNormalCompletion16","_didIteratorError16","_iteratorError16","_step16","_iterator16","initialHTML","outerHTML","controlInstance","_base2","_iteratorNormalCompletion17","_didIteratorError17","_iteratorError17","_step17","_iterator17","_deepLinks2","getUrlParams","deepLinkSavedInStorage","_iteratorNormalCompletion18","_didIteratorError18","_iteratorError18","_step18","_iterator18","controlTypes","controlClass","controlGroup","addControl","res","findControls","controlsByGroupNames","findControlGroups","_iteratorNormalCompletion19","_didIteratorError19","_iteratorError19","_step19","_iterator19","_step19$value","groupControls","sameNameControls","findSameNameControls","_iteratorNormalCompletion20","_didIteratorError20","_iteratorError20","_step20","_iterator20","values","_contentManager","jPList","assign","_contentManager2","splitByGroupAndName","findGroups","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","_jplist2","init"],"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 = 45);\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 * if multiple control in the group have data-jump attribute -> select the upper one\n * @return {string}\n */\n getJumpPath(){\n\n let selectedJumpPath = '';\n\n for(let control of this.controls){\n\n if(!control.jump) continue;\n\n //top is always the upper ))\n if(control.jump === 'top'){\n return 'top';\n }\n\n const el = document.querySelector(control.jump);\n\n if(!el) continue;\n\n const elRect = el.getBoundingClientRect();\n\n //make sure element is not hidden or disconnected\n if (!elRect.width && !elRect.height && !elRect.getClientRects().length) continue;\n\n if(!selectedJumpPath){\n\n //select the first data-jump as the default value\n selectedJumpPath = control.jump;\n }\n else{\n\n const prevEl = document.querySelector(selectedJumpPath);\n\n if(!prevEl) continue;\n\n const prevElRect = prevEl.getBoundingClientRect();\n\n //const elTop = elRect.top + window.pageYOffset - document.clientTop;\n //const elLeft = elRect.left + window.pageXOffset - document.clientLeft;\n //const prevElementTop = prevElRect.top + window.pageYOffset - document.clientTop;\n\n if(elRect.top < prevElRect.top){\n selectedJumpPath = control.jump;\n }\n\n }\n }\n\n return selectedJumpPath;\n }\n\n}\n\nexport default BaseControlsGroup;","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","/**\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 * 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 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 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;","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;","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);\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} 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);\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);\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 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 {BasePaginationControl|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);\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 {BasePaginationControl|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);\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 {BasePaginationControl|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);\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 BaseControl from '../base.control';\n\n/**\n * base range filter control\n */\nclass BaseRangeFilterControl 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 initial list; if path is empty -> 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 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\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);\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);\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 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;","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);\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));\n PaginationControl.bindEventHandler(basePaginationControl.lastButtons, 'click', this.pageButtonClick.bind(this));\n PaginationControl.bindEventHandler(basePaginationControl.prevButtons, 'click', this.pageButtonClick.bind(this));\n PaginationControl.bindEventHandler(basePaginationControl.nextButtons, 'click', this.pageButtonClick.bind(this));\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 dropdowns\n basePaginationControl.itemsPerPageDD = Array.from(basePaginationControl.element.querySelectorAll('[data-type=\"items-per-page-dd\"]'));\n this.initCustomDropdowns(basePaginationControl.itemsPerPageDD);\n\n PaginationControl.bindEventHandler(basePaginationControl.itemsPerPageSelects, 'change', this.selectChange.bind(this));\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 {HTMLCollection} itemsPerPageDD\n */\n initCustomDropdowns(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);\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); });\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 }\n\n // --------------------- EVENT HANDLERS ---------------------\n\n /**\n * page, first, last, prev and next button onclick handler\n * @param {HTMLElement} btn\n */\n pageButtonClick(e, btn){\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);\n }\n }\n\n /**\n * on items per page select change\n */\n selectChange(e){\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);\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 */\n static bindEventHandler(items, eventName, func){\n\n if(!items) return;\n\n for(let item of items){\n item.addEventListener(eventName, (e) => {func(e, item); });\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\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);\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);\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);\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);\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);\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 * 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;","/**\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 */\n static apply(settings, controls, groups, groupName = ''){\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);\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);\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 */\n static jump(baseControlsGroups){\n\n if(!baseControlsGroups || baseControlsGroups.length <= 0) return;\n\n //-1 means no scroll\n let top = -1;\n\n //if multiple control in the group have data-jump attribute -> select the upper one\n for(let group of baseControlsGroups) {\n\n const path = group.getJumpPath();\n\n if(!path) continue;\n\n //top is always the upper ))\n if(path === 'top'){\n top = 0;\n break;\n }\n\n const groupJumpEl = document.querySelector(path);\n\n if(!groupJumpEl) continue;\n\n const groupJumpElRect = groupJumpEl.getBoundingClientRect();\n\n //make sure element is not hidden or disconnected\n if (!groupJumpEl.width && !groupJumpEl.height && !groupJumpEl.getClientRects().length) continue;\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 = groupJumpElRect.top + window.pageYOffset - clientTop;\n }\n else{\n if(groupJumpElRect.top + window.pageYOffset - clientTop < top){\n top = groupJumpElRect.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 */\n static sendStateEvent(options, itemsNumber, baseControlsGroups){\n\n if(!baseControlsGroups) return;\n\n const stateEvent = new CustomEvent('jplist.state');\n\n stateEvent.jplistState = {\n options: options,\n itemsNumber: itemsNumber\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 element.initialHTML = element.outerHTML;\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';\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 */\n refresh(groupName = ''){\n ContentManager.apply(this.settings, this.controls, this.groups, groupName);\n }\n\n /**\n * API: reset all jplist controls and apply them on content\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\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';\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 ]);\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\n})();"],"sourceRoot":""}