PageSourceSearch

https://www.perfectdraft.com/static/version0.0.0.1228/frontend/Bee…/fr_BE/Algolia_AlgoliaSearch/js/insights.js

js perfectdraft.com collected 2026-10-09 22:39:26 UTC 9,867 bytes, 282 lines download raw bytes

1requirejs([
2    'jquery',
3    'algoliaAnalytics',
4    'algoliaBundle',
5], function ($, algoliaAnalyticsWrapper, algoliaBundle) {
6
7    algoliaAnalytics = algoliaAnalyticsWrapper.default;
8
9    var algoliaInsights = {
10        config: null,
11        defaultIndexName: null,
12        isTracking: false,
13        hasAddedParameters: false,
14
15        track: function(algoliaConfig) {
16
17            if (this.isTracking) {
18                return;
19            }
20
21            this.config = algoliaConfig;
22            this.defaultIndexName = algoliaConfig.indexName + '_products';
23
24            if (algoliaConfig.ccAnalytics.enabled
25                || algoliaConfig.personalization.enabled) {
26
27                this.initializeAnalytics();
28                this.addSearchParameters();
29                this.bindData();
30                this.bindEvents();
31
32                this.isTracking = true;
33            }
34        },
35
36        initializeAnalytics: function() {
37
38            algoliaAnalytics.init({
39                appId: this.config.applicationId,
40                apiKey: this.config.apiKey
41            });
42
43            var userAgent = 'insights-js-in-magento (' + this.config.extensionVersion + ')';
44            algoliaAnalytics.addAlgoliaAgent(userAgent);
45
46            var userToken = getCookie('aa-search');
47            if (userToken && userToken !== '') algoliaAnalytics.setUserToken(userToken);
48
49        },
50
51        addSearchParameters: function() {
52
53            if (this.hasAddedParameters) {
54                return;
55            }
56
57            algolia.registerHook('beforeWidgetInitialization', function (allWidgetConfiguration) {
58                allWidgetConfiguration.configure = allWidgetConfiguration.configure || {};
59                if (algoliaConfig.ccAnalytics.enabled) {
60                    allWidgetConfiguration.configure.clickAnalytics = true;
61                }
62
63                if (algoliaConfig.personalization.enabled) {
64                    allWidgetConfiguration.configure.enablePersonalization = true;
65                    allWidgetConfiguration.configure.userToken = algoliaAnalytics.userToken;
66                }
67
68                return allWidgetConfiguration;
69            });
70
71            this.hasAddedParameters = true;
72
73        },
74
75        bindData: function() {
76
77            var persoConfig = this.config.personalization;
78
79            if (persoConfig.enabled && persoConfig.clickedEvents.productRecommended.enabled) {
80                $(persoConfig.clickedEvents.productRecommended.selector).each(function (index, element) {
81                    if ($(element).find('[data-role="priceBox"]').length) {
82                        var objectId = $(element).find('[data-role="priceBox"]').data('product-id');
83                        $(element).attr('data-objectid', objectId);
84                    }
85                });
86            }
87        },
88
89        bindEvents: function() {
90
91            this.bindClickedEvents();
92            this.bindViewedEvents();
93
94            algolia.triggerHooks('afterInsightsBindEvents', this);
95
96        },
97
98        bindClickedEvents: function() {
99
100            var self = this;
101
102            algoliaBundle.$(function ($) {
103                $(self.config.autocomplete.selector).on('autocomplete:selected', function (e, suggestion) {
104                    var eventData = self.buildEventData(
105                        'Clicked', suggestion.objectID, suggestion.__indexName, suggestion.__position, suggestion.__queryID
106                    );
107                    self.trackClick(eventData);
108                });
109            });
110
111
112            if (this.config.ccAnalytics.enabled || this.config.personalization.enabled) {
113                $(document).on('click', this.config.ccAnalytics.ISSelector, function() {
114                    var $this = $(this);
115                    if ($this.data('clicked')) return;
116
117                    var eventData = self.buildEventData(
118                        'Clicked', $this.data('objectid'), $this.data('indexname'), $this.data('position'), $this.data('queryid')
119                    );
120
121                    self.trackClick(eventData);
122                    // to prevent duplicated click events
123                    $this.attr('data-clicked', true);
124                });
125            }
126
127            if (this.config.personalization.enabled) {
128
129                // Clicked Events
130                var clickEvents = Object.keys(this.config.personalization.clickedEvents);
131
132                for (var i = 0; i < clickEvents.length; i++) {
133                    var clickEvent = this.config.personalization.clickedEvents[clickEvents[i]];
134                    if (clickEvent.enabled && clickEvent.method == 'clickedObjectIDs') {
135                        $(document).on('click', clickEvent.selector, function(e) {
136                            var $this = $(this);
137                            if ($this.data('clicked')) return;
138
139                            var event = self.getClickedEventBySelector(e.handleObj.selector);
140                            var eventData = self.buildEventData(
141                                event.eventName,
142                                $this.data('objectid'),
143                                $this.data('indexname') ? $this.data('indexname') : self.defaultIndexName
144                            );
145
146                            self.trackClick(eventData);
147                            $this.attr('data-clicked', true);
148                        });
149                    }
150                }
151
152                // Filter Clicked
153                if (this.config.personalization.filterClicked.enabled) {
154                    var facets = this.config.facets;
155                    var containers = [];
156                    for (var i = 0; i < facets.length; i++) {
157                        var elem = createISWidgetContainer(facets[i].attribute);
158                        containers.push('.' + elem.className);
159                    }
160
161                    algolia.registerHook('afterInstantsearchStart', function (search, algoliaBundle) {
162                        var selectors = document.querySelectorAll(containers.join(', '));
163                        selectors.forEach(function (e) {
164                            e.addEventListener('click', function (event) {
165                                var attribute = this.dataset.attr;
166                                var elem = event.target;
167                                if ($(elem).is("input[type=checkbox]") && elem.checked) {
168                                    var filter = attribute + ':' + elem.value;
169                                    self.trackFilterClick([filter]);
170                                }
171                            });
172                        });
173
174                        return search;
175                    });
176                }
177            }
178        },
179
180        getClickedEventBySelector: function(selector) {
181
182            var events = this.config.personalization.clickedEvents,
183                keys = Object.keys(events);
184
185            for (var i = 0; i < keys.length; i++) {
186                if (events[keys[i]].selector == selector) {
187                    return events[keys[i]];
188                }
189            }
190
191            return {};
192        },
193
194        bindViewedEvents: function() {
195
196            var self = this;
197
198            // viewed event is exclusive to personalization
199            if (!this.config.personalization.enabled) {
200                return;
201            }
202
203            var viewConfig = this.config.personalization.viewedEvents.viewProduct;
204            if (viewConfig.enabled) {
205                $(document).ready(function () {
206                    if ($('body').hasClass('catalog-product-view')) {
207                        var objectId = $('#product_addtocart_form').find('input[name="product"]').val(),
208                            params = new URLSearchParams(window.location.search),
209                            queryId = params.get('queryID');
210                        if (objectId) {
211                            var viewData = self.buildEventData(viewConfig.eventName, objectId, self.defaultIndexName, null, queryId);
212                            self.trackView(viewData);
213                        }
214                    }
215                });
216            }
217        },
218
219        buildEventData: function(eventName, objectId, indexName, position = null, queryId = null) {
220
221            var eventData = {
222                eventName: eventName,
223                objectIDs: [objectId + ''],
224                index: indexName
225            };
226
227            if (position) {
228                eventData.positions = [parseInt(position)];
229            }
230
231            if (queryId) {
232                eventData.queryID = queryId;
233            }
234
235            return eventData;
236        },
237
238        trackClick: function(eventData) {
239
240            if (eventData.queryID) {
241                algoliaAnalytics.clickedObjectIDsAfterSearch(eventData);
242            } else {
243                algoliaAnalytics.clickedObjectIDs(eventData);
244            }
245        },
246
247        trackFilterClick: function(filters) {
248
249            var eventData = {
250                index: this.defaultIndexName,
251                eventName: this.config.personalization.filterClicked.eventName,
252                filters: filters
253            };
254
255            algoliaAnalytics.clickedFilters(eventData);
256        },
257
258        trackView: function(eventData) {
259            algoliaAnalytics.viewedObjectIDs(eventData);
260        },
261
262        trackConversion: function(eventData) {
263            if (eventData.queryID) {
264                algoliaAnalytics.convertedObjectIDsAfterSearch(eventData);
265            } else {
266                algoliaAnalytics.convertedObjectIDs(eventData);
267            }
268        }
269
270    };
271
272    algoliaInsights.addSearchParameters();
273
274    algoliaBundle.$(function ($) {
275        if (window.algoliaConfig) {
276            algoliaInsights.track(algoliaConfig);
277        }
278    });
279
280    return algoliaInsights;
281
282});

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.