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.