PageSourceSearch

https://www.xanax.com/-/media/Base-Themes/SearchTheme/Scripts/component-search-variant-filter.js

js xanax.com collected 2026-09-24 22:55:05 UTC 9,090 bytes, 218 lines download raw bytes

1/**
2 * Facet dropdown component functionality
3 * @module variantFilter
4 * @param  {jQuery} $ Instance of jQuery
5 * @param  {Document} document dom document object
6 * @return {Object} list of methods for variant filter component
7*/
8XA.component.search.variantFilter = (function ($, document) {
9    /**
10    * This object stores all public api methods
11    * @type {Object.<Methods>}
12    * @memberOf module:variantFilter
13    */
14    var api = {},
15        queryModel,
16        queryParameters,
17        variantMappings = [],
18        initialized = false,
19        variantMappings = {};
20    /**
21    * @name module:variantFilter.VariantSelectorModel
22    * @constructor
23    * @augments Backbone.Model
24    */
25    var VariantSelectorModel = Backbone.Model.extend(
26        /** @lends module:variantFilter.VariantSelectorModel.prototype **/
27        {
28            /**
29            * Default model options
30            * @default
31            */
32            defaults: {
33                dataProperties: {},
34                sig: []
35            }
36        });
37    /**
38    * @name module:variantFilter.VariantSelectorView
39    * @constructor
40    * @augments Backbone.View
41    */
42    var VariantSelectorView = XA.component.search.baseView.extend(
43        /** @lends module:variantFilter.VariantSelectorView.prototype **/
44        {
45            /**
46            * Initially sets data to model and watches events on which
47            * view should be updated
48            * @listens module:XA.component.search.vent~event:results-loaded
49            * @memberof module:variantFilter.VariantSelectorView
50            * @alias module:variantFilter.VariantSelectorView#initialize
51            */
52            initialize: function () {
53                var hashObj = queryModel.parseHashParameters(window.location.hash),
54                    dataProperties = this.$el.data(),
55                    sig = this.translateSignatures(dataProperties.properties.searchResultsSignature, "v"),
56                    inst = this,
57                    i;
58
59                if (dataProperties.properties.searchResultsSignature === null) {
60                    dataProperties.properties.searchResultsSignature = "";
61                }
62
63                this.model.set({ dataProperties: dataProperties });
64                this.model.set("sig", sig);
65
66                for (i = 0; i < sig.length; i++) {
67                    if (hashObj.hasOwnProperty(sig[i])) {
68                        this.selectVariantIcon(hashObj[sig[i]]);
69                    }
70                }
71
72                XA.component.search.vent.on("results-loaded", function (resultsData) {
73                    var rawSignatures = dataProperties.properties.searchResultsSignature.split(','),
74                        signature,
75                        startingVariant,
76                        signatureVariants;
77
78                    hashObj = queryModel.parseHashParameters(window.location.hash);
79
80                    for (i = 0; i < rawSignatures.length; i++) {
81                        signature = rawSignatures[i];
82                        if (hashObj.hasOwnProperty(sig[i]) && variantMappings.hasOwnProperty(signature)) {
83                            signatureVariants = variantMappings[signature];
84                            startingVariant = signatureVariants[hashObj[sig[i]]];
85                            inst.triggerAddVariant(startingVariant.cssClass, signature);
86                            inst.selectVariantIcon(hashObj[sig[i]]);
87                        } else {
88                            //selects first variant if there is no variant param in the hash
89                            if (variantMappings.hasOwnProperty(signature) && variantMappings[signature].hasOwnProperty(0)) {
90                                setTimeout(function () {
91                                    inst.triggerAddVariant(variantMappings[signature][0].cssClass, signature);
92                                    inst.selectVariantIcon(0);
93                                }, 100);
94                            }
95                        }
96                    }
97                });
98            },
99            /**
100            * list of events for Backbone View
101            * @memberof module:variantFilter.VariantSelectorView
102            * @alias module:variantFilter.VariantSelectorView#events
103            */
104            events: {
105                "click div > div": "changeVariant"
106            },
107            /**
108            * Changes variant of search result view
109            * @param {Event} EVent object with selected variant as a current Target
110            * @listens module:XA.component.search.vent~event:results-loaded
111            * @memberof module:variantFilter.VariantSelectorView
112            * @alias module:variantFilter.VariantSelectorView#changeVariant
113            */
114            changeVariant: function (event) {
115                var $target = $(event.currentTarget),
116                    sig = this.model.get("sig"),
117                    props = $target.data();
118
119                this.$el.find(".active-variant").removeClass("active-variant");
120                $target.addClass("active-variant");
121
122                queryParameters.updateHash(this.updateSignaturesHash(sig, props.variantindex, {}));
123                this.triggerAddVariant($(event.currentTarget).attr("class"));
124            },
125            /**
126            * Changes variant of search result view
127            * @param {String} classes css class of chosen variant
128            * @param {String} signature component signature
129            * @fires module:XA.component.search.vent~event:add-variant-class
130            * @memberof module:variantFilter.VariantSelectorView
131            * @alias module:variantFilter.VariantSelectorView#triggerAddVariant
132            */
133            triggerAddVariant: function (classes, signature) {
134                XA.component.search.vent.trigger("add-variant-class", {
135                    classes: classes,
136                    sig: signature
137                });
138            },
139            /**
140            * Manages active-variant class for variant icons
141            * @param {String} v data variant index of selected element 
142            * @fires module:XA.component.search.vent~event:add-variant-class
143            * @memberof module:variantFilter.VariantSelectorView
144            * @alias module:variantFilter.VariantSelectorView#selectVariantIcon
145            */
146            selectVariantIcon: function (v) {
147                this.$el.find("div[data-variantIndex]").removeClass("active-variant");
148                this.$el.find("div[data-variantIndex=" + v + "]").addClass("active-variant");
149            }
150        });
151
152    /**
153    * For each search variant filters component on a page creates instance of 
154    * ["VariantSelectorModel"]{@link module:variantFilter.VariantSelectorModel} and 
155    * ["VariantSelectorView"]{@link module:variantFilter.VariantSelectorView} 
156    * @memberOf module:variantFilter
157    * @alias module:variantFilter.init
158    */
159    api.init = function () {
160        if ($("body").hasClass("on-page-editor") || initialized) {
161            return;
162        }
163
164        queryModel = XA.component.search.query;
165        queryParameters = XA.component.search.parameters;
166
167        var variantSelectors = $(".variant-selector");
168        _.each(variantSelectors, function (elem) {
169            var view = new VariantSelectorView({ el: $(elem), model: new VariantSelectorModel() });
170        });
171
172        initialized = true;
173    };
174
175    /**
176    * 
177    * @param signature
178    * @param {String} signature component signature
179    * @memberOf module:variantFilter
180    * @alias module:variantFilter.getVariantMappings
181    */
182    api.getVariantMappings = function (signature) {
183        var variantSelectors = $(".variant-selector"),
184            componentVariants = {},
185            allVariantItems,
186            signatures = [],
187            properties,
188            i;
189
190        if (!variantMappings.hasOwnProperty(signature)) {
191            for (i = 0; i < variantSelectors.length; i++) {
192                properties = $(variantSelectors[i]).data().properties;
193                signatures = properties.searchResultsSignature.split(',');
194
195                if (signatures.indexOf(signature) !== -1) {
196                    allVariantItems = $(variantSelectors[i]).find(".variant-option");
197                    _.each(allVariantItems, function (variant) {
198                        var data = $(variant).data();
199                        componentVariants[data.variantindex] = { id: data.variant, cssClass: $(variant).attr("class") };
200                    });
201                    variantMappings[signature] = componentVariants;
202                }
203            }
204        }
205
206        if (variantMappings.hasOwnProperty(signature)) {
207            return variantMappings[signature];
208        }
209
210        return {};
211    };
212
213    return api;
214
215}(jQuery, document));
216
217XA.register('variantFilter', XA.component.search.variantFilter);
218

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.