1/** 2 * Includes functionality for manipulating facet data 3 * @module FacetData 4 * @param {jQuery} $ Instance of jQuery 5 * @param {Document} document dom document object 6 * @return {FacetDataModel} FacetDataModel api 7*/ 8XA.component.search.facet.data = (function ($, document) { 9 /** 10 * @name module:FacetData.FacetDataModel 11 * @constructor 12 * @augments Backbone.Model 13 */ 14 var FacetDataModel = Backbone.Model.extend( 15 /** @lends module:FacetData.FacetDataModel.prototype **/ 16 { 17 /** 18 * Default model options 19 * @default 20 */ 21 defaults: { 22 }, 23 /** 24 * @memberof module:FacetData.FacetDataModel.prototype 25 */ 26 initialize: function () { 27 }, 28 /** 29 * Gets facet data by calling 30 * ["search.ajax.getData"]{@link module:ajax.ApiModel#getData} method 31 * @memberof module:FacetData.FacetDataModel 32 * @alias module:FacetData.FacetDataModel#getInitialFacetData 33 */ 34 getInitialFacetData: function () { 35 var facetRequestData = this.getFacetRequestData(), 36 data = facetRequestData.data, 37 facetNames = [], 38 language; 39 40 for (var signature in data) { 41 if (data.hasOwnProperty(signature)) { 42 //here we don't have any params after hash in the url, we are getting all data at once 43 facetNames = facetNames.concat(data[signature].normalFiltering); 44 facetNames = facetNames.concat(data[signature].partialFiltering); 45 46 //get language settings form Search Results rendering 47 language = this.getSearchResultsLanguage(signature); 48 49 if (facetNames.length > 0) { 50 XA.component.search.ajax.getData({ 51 callback: function (data) { 52 XA.component.search.vent.trigger("facet-data-loaded", data); 53 }, 54 url: XA.component.search.url.createMultiFacetUrl({ 55 endpoint: facetRequestData.endpoint, 56 s: facetRequestData.s, 57 l: language 58 }, facetNames, signature) 59 }); 60 } 61 } 62 } 63 }, 64 /** 65 * Filter facet data 66 * ["search.ajax.getData"]{@link module:ajax.ApiModel#getData} method and 67 * triggered event '' on callback with sending response from server 68 * @memberof module:FacetData.FacetDataModel 69 * @param {Object} hashObj Object with hashes from url 70 * @fires XA.component.search.vent#facet-data-filtered 71 * @fires XA.component.search.vent#facet-data-partial-filtered 72 * @alias module:FacetData.FacetDataModel#filterFacetData 73 */ 74 filterFacetData: function (hashObj) { 75 var facetRequestData = this.getFacetRequestData(hashObj), 76 data = facetRequestData.data, 77 requestData, 78 language, 79 scope, 80 searchModel, 81 itemId; 82 83 for (var signature in data) { 84 if (data.hasOwnProperty(signature)) { 85 //Gets language settings form Search Results rendering 86 language = this.getSearchResultsLanguage(signature); 87 //Gets scope settings form Search Results rendering 88 scope = this.getSearchResultsScope(signature); 89 90 searchModel = this.getSearchResultsModelBySignature(signature), 91 itemId = searchModel.get('dataProperties').itemid; 92 93 //Makes one request for data for facet controls with all hash params 94 if (data[signature].normalFiltering.length > 0) { 95 requestData = $.extend({ endpoint: facetRequestData.endpoint, s: scope, l: language }, hashObj); 96 XA.component.search.ajax.getData({ 97 callback: function (data) { 98 XA.component.search.vent.trigger("facet-data-filtered", data); 99 }, 100 url: XA.component.search.url.createMultiFacetUrl(requestData, data[signature].normalFiltering, signature, itemId) 101 }); 102 } 103 104 //Makes as many requests as many controls that require partial filtering we have 105 //We will take all params from url hash without control facet name so controls won't collapse 106 if (data[signature].partialFiltering.length > 0) { 107 _.each(data[signature].partialFiltering, function (facetName) { 108 var hash = $.extend({}, hashObj); 109 110 //Ensures removal of facet (despite lower case or not) from hash object in case of partial filtering 111 delete hash[signature !== "" ? signature + "_" + facetName : facetName]; 112 delete hash[signature !== "" ? signature + "_" + facetName.toLowerCase() : facetName.toLowerCase()]; 113 114 requestData = $.extend({ endpoint: facetRequestData.endpoint, s: scope, l: language }, hash); 115 116 XA.component.search.ajax.getData({ 117 callback: function (data) { 118 XA.component.search.vent.trigger("facet-data-partial-filtered", data); 119 }, 120 url: XA.component.search.url.createMultiFacetUrl(requestData, [facetName], signature, itemId) 121 }); 122 }); 123 } 124 } 125 } 126 }, 127 128 /** 129 * Gets facet request data from server by calling 130 * getFacetDataRequestInfo method in a loop for all facet components 131 * and stores them in returned object 132 * @memberof module:FacetData.FacetDataModel 133 * @param {Object} hashObj Object with hashes from url 134 * @returns {facetRequestData} request data from each facet component stored in object 135 * @alias module:FacetData.FacetDataModel#getFacetRequestData 136 */ 137 getFacetRequestData: function (hashObj) { 138 var that = this, data = [], requestData = {}, facetControl, control, endpoint, facetName; 139 140 for (facetControl in XA.component.search.facet) { 141 control = XA.component.search.facet[facetControl]; 142 if (typeof (control.getFacetDataRequestInfo) === "function") { 143 data = control.getFacetDataRequestInfo(); 144 _.each(data, function (controlData) { 145 facetName = controlData.signature !== "" ? controlData.signature + "_" + controlData.facetName : controlData.facetName; 146 147 if (!requestData.hasOwnProperty(controlData.signature)) { 148 that.initRequestObject(requestData, controlData); 149 } 150 151 if (!controlData.filterWithoutMe || (hashObj !== undefined && !hashObj.hasOwnProperty(facetName) && !hashObj.hasOwnProperty(facetName.toLowerCase()))) { 152 //If the control does not require partial filtering or control facet name is not in the hash, add it to "one request" list. 153 requestData[controlData.signature].normalFiltering.push(controlData.facetName); 154 endpoint = controlData.endpoint; 155 } else { 156 requestData[controlData.signature].partialFiltering.push(controlData.facetName); 157 endpoint = controlData.endpoint; 158 } 159 }); 160 } 161 } 162 return { 163 endpoint: endpoint, 164 data: requestData 165 }; 166 }, 167 /** 168 * On initialization fullfils requestData argument with 169 * right structure 170 * @memberof module:FacetData.FacetDataModel 171 * @param {Object} requestData Object with request data 172 * @param {Object} controlData Object data taked from facet 173 * @alias module:FacetData.FacetDataModel#initRequestObject 174 */ 175 initRequestObject: function (requestData, controlData) { 176 requestData[controlData.signature] = {}; 177 requestData[controlData.signature].normalFiltering = []; 178 requestData[controlData.signature].partialFiltering = []; 179 }, 180 /** 181 * Returns language of search result 182 * @memberof module:FacetData.FacetDataModel 183 * @param {String} signature - signature of search result 184 * @alias module:FacetData.FacetDataModel#getSearchResultsLanguage 185 * @returns {String} search result language 186 */ 187 getSearchResultsLanguage: function (signature) {
188 var searchResultsModel = this.getSearchResultsModelBySignature(signature); 189 if (typeof searchResultsModel !== "undefined") { 190 return searchResultsModel.get("dataProperties").l; 191 } 192 return ""; 193 }, 194 /** 195 * Returns search result scope 196 * @memberof module:FacetData.FacetDataModel 197 * @param {String} signature - signature of search result 198 * @alias module:FacetData.FacetDataModel#getSearchResultsScope 199 * @returns {String} search result scope 200 */ 201 getSearchResultsScope: function (signature) { 202 var searchResultsModel = this.getSearchResultsModelBySignature(signature); 203 if (typeof searchResultsModel !== "undefined") { 204 return searchResultsModel.get("dataProperties").s; 205 } 206 return ""; 207 }, 208 /** 209 * Returns search result model by signature 210 * @memberof module:FacetData.FacetDataModel 211 * @param {String} signature - signature of search result 212 * @alias module:FacetData.FacetDataModel#getSearchResultsModelBySignature 213 * @returns {BackboneModel} search result model 214 */ 215 getSearchResultsModelBySignature: function (signature) { 216 var searchResultModels = XA.component.search.results.searchResultModels, 217 model = searchResultModels.filter(function (element) { 218 return element.get("dataProperties").sig === signature; 219 })[0]; 220 221 return model; 222 } 223 }); 224 225 return new FacetDataModel(); 226 227}(jQuery, document));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.