1 define([], function () {
4 function ListFilteringService(FilterNodeWrapperService, RequestBuilderService){
9 var getNodePathInStructure = function (filterRootNode,node) {
11 findNodeInStructure = function (currentParentStructure){
12 if(currentParentStructure.children.length && currentParentStructure.type !== 'leaf'){
13 if(!(currentParentStructure.children.some(function(element){ return element === node; }))){
14 currentParentStructure.children.forEach(function(child,index){
15 checkHasSearchedNode(child,node);
22 checkHasSearchedNode = function (currentParent) {
23 if(currentParent === node){
26 if(currentParent.actElemStructure){
27 findNodeInStructure(currentParent.actElemStructure);
29 findNodeInStructure(currentParent);
33 getIndexOfSearchedNode = function (parentNodeStructure) {
34 parentNodeStructure.children.forEach(function(elem,index){
36 checkHasSearchedNode(elem,node);
38 node.searchedPath.push(index);
41 if(parentNodeStructure.children[node.searchedPath[iterator]] !== node){
42 getSearchedPath(parentNodeStructure.children[node.searchedPath[iterator]]);
45 getSearchedPath = function(parentNode){
47 if(parentNode.actElemStructure){
48 getIndexOfSearchedNode(parentNode.actElemStructure);
50 getIndexOfSearchedNode(parentNode);
54 if(filterRootNode !== node){
55 getSearchedPath(filterRootNode);
59 clearFilterNodes = function(node) {
60 node.referenceNode.filterNodes.forEach(function(filterNode){
65 loadFilterNodes = function (node) {
66 var fillFuc = function(fillNods, prop, filVal){
67 fillNods.forEach(function(filterNode){
68 filterNode.fill(prop, filVal[prop]);
72 if(node.referenceNode.filters[node.currentFilter].filteredValues){
73 node.referenceNode.filters[node.currentFilter].filteredValues.forEach(function(item){
74 for (var prop in item) {
75 fillFuc(node.referenceNode.filterNodes, prop, item);
81 getFilterResult = function(element, filterValue, node){
82 for (var i in filterValue){
83 if(!filterValue[i].hasOwnProperty('value') && !filterValue[i].hasOwnProperty('selectboxBitsValue') && !filterValue[i].hasOwnProperty('bitsValue') &&
84 !filterValue[i].hasOwnProperty('filterRangeFrom') && !filterValue[i].hasOwnProperty('filterRangeTo')){
85 getFilterResult(element[i],filterValue[i]);
87 if(filterValue[i].selectboxBitsValue && filterValue[i].selectboxBitsValue.length){
88 filterResult = filterValue[i].getResult(element,filterValue[i].selectboxBitsValue,i);
90 if((filterValue[i].filterRangeFrom && filterValue[i].filterRangeFrom !== '') || (filterValue[i].filterRangeTo && filterValue[i].filterRangeTo !== '')){
91 filterResult = filterValue[i].getFilterResult[filterValue[i].filterType](element,filterValue[i].filterRangeFrom,filterValue[i].filterRangeTo,i);
92 }else if(filterValue[i].bitsValue && filterValue[i].bitsValue !== ''){
93 filterResult = filterValue[i].getFilterResult[filterValue[i].filterType](element,filterValue[i].bitsValue,i);
95 filterResult = filterValue[i].getFilterResult[filterValue[i].filterType](element,filterValue[i].value,i);
102 getActElementFilter = function (node) {
105 node.actElemIndex = 0;
106 if(node.filteredListData && node.filteredListData.length){
107 actData = node.filteredListData[node.actElemIndex];
109 actData = node.listData[node.actElemIndex];
112 node.actElemStructure.clear();
113 for (var prop in actData) {
114 node.actElemStructure.fillListElement(prop, actData[prop]);
118 var listFiltering = {};
120 listFiltering.removeEmptyFilters = function (node) {
121 if(node.referenceNode && node.referenceNode.filters){
122 var wasDeleted = false;
123 node.referenceNode.filters = node.referenceNode.filters.filter(function(filter){
124 if(filter.filteredValues && filter.filteredValues.length){
133 listFiltering.switchFilter(node,0,true);
138 listFiltering.showListFilterWin = function (filterRootNode,node) {
139 if(!node.searchedPath.length){
140 getNodePathInStructure(filterRootNode,node);
143 if(!node.referenceNode){
144 node.referenceNode = filterRootNode;
145 node.searchedPath.forEach(function(elem){
146 node.referenceNode = node.referenceNode.children[elem];
150 if(!node.referenceNode.filterNodes.length){
151 FilterNodeWrapperService.init(node);
152 node.referenceNode.filterNodes = node.getNewFilterElement();
155 if(!(node.referenceNode.filters && node.referenceNode.filters.length)){
156 node.referenceNode.filters.push({name : 'Filter 1 name', active : 1});
158 listFiltering.getFilterData(node);
159 listFiltering.removeEmptyFilters(node);
163 listFiltering.createNewFilter = function (node) {
164 node.referenceNode.filters.push({name : 'Filter ' + (node.referenceNode.filters.length+1) + ' name', active : 1});
166 listFiltering.switchFilter(node,node.referenceNode.filters.length-1);
169 listFiltering.getFilterData = function (node) {
170 node.referenceNode.filters[node.currentFilter].filteredValues = node.referenceNode.filterNodes.map(function(element){
171 var requestData = {};
172 element.buildRequest(RequestBuilderService, requestData);
174 }).filter(function(item){
175 return $.isEmptyObject(item) === false;
179 listFiltering.switchFilter = function (node,showedFilter,fromRemoveEmptyFilters) {
180 if(node.referenceNode.filters.length){
181 if(!fromRemoveEmptyFilters){
182 listFiltering.getFilterData(node);
184 clearFilterNodes(node);
185 node.currentFilter = showedFilter;
186 loadFilterNodes(node);
188 node.currentFilter = 0;
192 listFiltering.applyFilter = function (node) {
193 listFiltering.getFilterData(node);
194 listFiltering.removeEmptyFilters(node);
196 node.filteredListData = node.listData.slice().filter(function(element){
197 return node.referenceNode.filters.filter(function(fil){
198 return fil.active === 1;
199 }).some(function(filter){
200 return filter.filteredValues.every(function(filterValue){
202 getFilterResult(element,filterValue,node);
208 getActElementFilter(node);
209 // console.info('applyFilter node',node,'node.referenceNode.filterNodes',node.referenceNode.filterNodes,'node.referenceNode.filters',node.referenceNode.filters);
212 listFiltering.clearFilterData = function (node, changeAct, filterForClear, removeFilters) {
215 if(node.referenceNode.filters.length === 1){
216 node.referenceNode.filters = [];
217 node.referenceNode.filters.push({name : 'Filter 1 name', active : 1});
218 clearFilterNodes(node);
220 node.referenceNode.filters.splice(filterForClear,1);
221 node.currentFilter = 0;
222 clearFilterNodes(node);
223 loadFilterNodes(node);
227 node.referenceNode.filters = [];
228 clearFilterNodes(node);
229 node.currentFilter = 0;
231 node.referenceNode.filters.forEach(function(filter){
234 listFiltering.getFilterData(node);
235 listFiltering.removeEmptyFilters(node);
237 node.filteredListData = [];
241 getActElementFilter(node);
246 return listFiltering;
249 ListFilteringService.$inject=['FilterNodeWrapperService', 'RequestBuilderService'];
251 return ListFilteringService;