Yang UI, Yang Utils - split services into separate files
[dlux.git] / modules / common-yangutils-resources / src / main / resources / yangutils / services / list-filtering.services.js
diff --git a/modules/common-yangutils-resources/src/main/resources/yangutils/services/list-filtering.services.js b/modules/common-yangutils-resources/src/main/resources/yangutils/services/list-filtering.services.js
new file mode 100644 (file)
index 0000000..89b79c1
--- /dev/null
@@ -0,0 +1,253 @@
+define([], function () {
+    'use strict';
+
+    function ListFilteringService(FilterNodeWrapperService, RequestBuilderService){
+        var wasFound,
+            filterResult;
+
+
+        var getNodePathInStructure = function (filterRootNode,node) {
+                var iterator = -1,
+                    findNodeInStructure = function (currentParentStructure){
+                        if(currentParentStructure.children.length && currentParentStructure.type !== 'leaf'){
+                            if(!(currentParentStructure.children.some(function(element){ return element === node; }))){
+                                currentParentStructure.children.forEach(function(child,index){
+                                    checkHasSearchedNode(child,node);
+                                });
+                            }else{
+                                wasFound = true;
+                            }
+                        }
+                    },
+                    checkHasSearchedNode = function (currentParent) {
+                        if(currentParent === node){
+                            wasFound = true;
+                        }else{
+                            if(currentParent.actElemStructure){
+                                findNodeInStructure(currentParent.actElemStructure);
+                            }else{
+                                findNodeInStructure(currentParent);
+                            }
+                        }
+                    },
+                    getIndexOfSearchedNode = function (parentNodeStructure) {
+                        parentNodeStructure.children.forEach(function(elem,index){
+                            wasFound = false;
+                            checkHasSearchedNode(elem,node);
+                            if(wasFound){
+                                node.searchedPath.push(index);
+                            }
+                        });
+                        if(parentNodeStructure.children[node.searchedPath[iterator]] !== node){
+                            getSearchedPath(parentNodeStructure.children[node.searchedPath[iterator]]);
+                        }
+                    },
+                    getSearchedPath = function(parentNode){
+                        iterator++;
+                        if(parentNode.actElemStructure){
+                            getIndexOfSearchedNode(parentNode.actElemStructure);
+                        }else{
+                            getIndexOfSearchedNode(parentNode);
+                        }
+                    };
+
+                if(filterRootNode !== node){
+                    getSearchedPath(filterRootNode);
+                }
+            },
+
+            clearFilterNodes = function(node) {
+                node.referenceNode.filterNodes.forEach(function(filterNode){
+                    filterNode.clear();
+                });
+            },
+
+            loadFilterNodes = function (node) {
+                var fillFuc = function(fillNods, prop, filVal){
+                    fillNods.forEach(function(filterNode){
+                        filterNode.fill(prop, filVal[prop]);
+                    });
+                };
+
+                if(node.referenceNode.filters[node.currentFilter].filteredValues){
+                    node.referenceNode.filters[node.currentFilter].filteredValues.forEach(function(item){
+                        for (var prop in item) {
+                            fillFuc(node.referenceNode.filterNodes, prop, item);
+                        }
+                    });
+                }
+            },
+
+            getFilterResult = function(element, filterValue, node){
+                for (var i in filterValue){
+                    if(!filterValue[i].hasOwnProperty('value') && !filterValue[i].hasOwnProperty('selectboxBitsValue') && !filterValue[i].hasOwnProperty('bitsValue') &&
+                        !filterValue[i].hasOwnProperty('filterRangeFrom') && !filterValue[i].hasOwnProperty('filterRangeTo')){
+                        getFilterResult(element[i],filterValue[i]);
+                    }else{
+                        if(filterValue[i].selectboxBitsValue && filterValue[i].selectboxBitsValue.length){
+                            filterResult = filterValue[i].getResult(element,filterValue[i].selectboxBitsValue,i);
+                        }else{
+                            if((filterValue[i].filterRangeFrom && filterValue[i].filterRangeFrom !== '') || (filterValue[i].filterRangeTo && filterValue[i].filterRangeTo !== '')){
+                                filterResult = filterValue[i].getFilterResult[filterValue[i].filterType](element,filterValue[i].filterRangeFrom,filterValue[i].filterRangeTo,i);
+                            }else if(filterValue[i].bitsValue && filterValue[i].bitsValue !== ''){
+                                filterResult = filterValue[i].getFilterResult[filterValue[i].filterType](element,filterValue[i].bitsValue,i);
+                            }else {
+                                filterResult = filterValue[i].getFilterResult[filterValue[i].filterType](element,filterValue[i].value,i);
+                            }
+                        }
+                    }
+                }
+            },
+
+            getActElementFilter = function (node) {
+                var actData = [];
+
+                node.actElemIndex = 0;
+                if(node.filteredListData && node.filteredListData.length){
+                    actData = node.filteredListData[node.actElemIndex];
+                }else{
+                    actData = node.listData[node.actElemIndex];
+                }
+
+                node.actElemStructure.clear();
+                for (var prop in actData) {
+                    node.actElemStructure.fillListElement(prop, actData[prop]);
+                }
+            };
+
+        var listFiltering = {};
+
+        listFiltering.removeEmptyFilters = function (node) {
+            if(node.referenceNode && node.referenceNode.filters){
+                var wasDeleted = false;
+                node.referenceNode.filters = node.referenceNode.filters.filter(function(filter){
+                    if(filter.filteredValues && filter.filteredValues.length){
+                        return true;
+                    }else{
+                        wasDeleted = true;
+                        return false;
+                    }
+                });
+
+                if(wasDeleted){
+                    listFiltering.switchFilter(node,0,true);
+                }
+            }
+        };
+
+        listFiltering.showListFilterWin = function (filterRootNode,node) {
+            if(!node.searchedPath.length){
+                getNodePathInStructure(filterRootNode,node);
+            }
+
+            if(!node.referenceNode){
+                node.referenceNode = filterRootNode;
+                node.searchedPath.forEach(function(elem){
+                    node.referenceNode = node.referenceNode.children[elem];
+                });
+            }
+
+            if(!node.referenceNode.filterNodes.length){
+                FilterNodeWrapperService.init(node);
+                node.referenceNode.filterNodes = node.getNewFilterElement();
+            }
+
+            if(!(node.referenceNode.filters && node.referenceNode.filters.length)){
+                node.referenceNode.filters.push({name : 'Filter 1 name', active : 1});
+            }else{
+                listFiltering.getFilterData(node);
+                listFiltering.removeEmptyFilters(node);
+            }
+        };
+
+        listFiltering.createNewFilter = function (node) {
+            node.referenceNode.filters.push({name : 'Filter ' + (node.referenceNode.filters.length+1) + ' name', active : 1});
+
+            listFiltering.switchFilter(node,node.referenceNode.filters.length-1);
+        };
+
+        listFiltering.getFilterData = function (node) {
+            node.referenceNode.filters[node.currentFilter].filteredValues = node.referenceNode.filterNodes.map(function(element){
+                var requestData = {};
+                element.buildRequest(RequestBuilderService, requestData);
+                return requestData;
+            }).filter(function(item){
+                return $.isEmptyObject(item) === false;
+            });
+        };
+
+        listFiltering.switchFilter = function (node,showedFilter,fromRemoveEmptyFilters) {
+            if(node.referenceNode.filters.length){
+                if(!fromRemoveEmptyFilters){
+                    listFiltering.getFilterData(node);
+                }
+                clearFilterNodes(node);
+                node.currentFilter = showedFilter;
+                loadFilterNodes(node);
+            }else{
+                node.currentFilter = 0;
+            }
+        };
+
+        listFiltering.applyFilter = function (node) {
+            listFiltering.getFilterData(node);
+            listFiltering.removeEmptyFilters(node);
+
+            node.filteredListData = node.listData.slice().filter(function(element){
+                return node.referenceNode.filters.filter(function(fil){
+                    return fil.active === 1;
+                }).some(function(filter){
+                    return filter.filteredValues.every(function(filterValue){
+                        filterResult = null;
+                        getFilterResult(element,filterValue,node);
+                        return filterResult;
+                    });
+                });
+            });
+
+            getActElementFilter(node);
+            // console.info('applyFilter node',node,'node.referenceNode.filterNodes',node.referenceNode.filterNodes,'node.referenceNode.filters',node.referenceNode.filters);
+        };
+
+        listFiltering.clearFilterData = function (node, changeAct, filterForClear, removeFilters) {
+            if(filterForClear){
+                filterForClear--;
+                if(node.referenceNode.filters.length === 1){
+                    node.referenceNode.filters = [];
+                    node.referenceNode.filters.push({name : 'Filter 1 name', active : 1});
+                    clearFilterNodes(node);
+                }else{
+                    node.referenceNode.filters.splice(filterForClear,1);
+                    node.currentFilter = 0;
+                    clearFilterNodes(node);
+                    loadFilterNodes(node);
+                }
+            }else{
+                if(removeFilters){
+                    node.referenceNode.filters = [];
+                    clearFilterNodes(node);
+                    node.currentFilter = 0;
+                }else{
+                    node.referenceNode.filters.forEach(function(filter){
+                        filter.active = 2;
+                    });
+                    listFiltering.getFilterData(node);
+                    listFiltering.removeEmptyFilters(node);
+                }
+                node.filteredListData = [];
+            }
+
+            if(changeAct){
+                getActElementFilter(node);
+            }
+
+        };
+
+        return listFiltering;
+    }
+
+    ListFilteringService.$inject=['FilterNodeWrapperService', 'RequestBuilderService'];
+
+    return ListFilteringService;
+
+});
\ No newline at end of file