PageSourceSearch

https://www.zoloft.com/-/media/Base-Themes/SearchTheme/Scripts/component-search-facet-data.js

js zoloft.com collected 2026-09-24 20:04:00 UTC 11,746 bytes, 227 lines download raw bytes

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.