1function handleBlockDatalayerEvents() { 2 const blockSelectors = [ 3 ".view-display-id-group_page", 4 "[data-class='discovermorecardgrid']", 5 ]; 6 7 blockSelectors.forEach(function (selector) { 8 const currentSelector = document.querySelector(selector); 9 const buttons = currentSelector?.getElementsByClassName("card__btn"); 10 11 if (!buttons) { 12 return; 13 } 14 15 [...buttons]?.forEach((button) => { 16 button.addEventListener("click", (e) => { 17 const parentNode = button.parentNode; 18 19 const dataLayers = drupalSettings.lfi_datalayer; 20 const bvRaitingElements = parentNode?.getElementsByClassName( 21 "ecommerce-product-sku" 22 ); 23 24 let productID; 25 [...bvRaitingElements]?.forEach((element) => { 26 if (element.getAttribute("data-bv-product-id")) { 27 productID = element.getAttribute("data-bv-product-id"); 28 } 29 }); 30 31 let event; 32 switch (selector) { 33 case "[data-class='discovermorecardgrid']": 34 event = dataLayers.related_products_block; 35 break; 36 case ".view-display-id-group_page": 37 event = dataLayers.category_page; 38 break; 39 40 default: 41 break; 42 } 43 44 if (event) { 45 if (selector === "[data-class='discovermorecardgrid']") { 46 const formattedItems = Object.values(event.ecommerce.items).flat(); 47 48 event.ecommerce.items = formattedItems; 49 } 50 51 let product; 52 53 // Try to find bundle via the name (no BV on bundles) 54 if (!productID) { 55 const bundleName = parentNode?.querySelector( 56 ".card__bundle-title .field__item" 57 )?.innerText; 58 product = event.ecommerce.items.find(function (item) { 59 return item.item_name === bundleName; 60 }); 61 } else { 62 product = event.ecommerce.items.find(function (item) { 63 return item.item_id === productID; 64 }); 65 } 66 67 window.dataLayer.push({ ecommerce: null }); 68 window.dataLayer.push({ 69 event: "select_item", 70 ecommerce: { 71 items: [product], 72 }, 73 }); 74 } 75 }); 76 }); 77 }); 78} 79 80/** 81 * This script handles various datalayer events such as user login, 82 * user register, category page visit and different block datalayers. 83 * @param {jQuery} $ - The jQuery object. 84 * @param {Drupal} Drupal - The Drupal object. 85 * @param {Object} drupalSettings - The Drupal settings object. 86 */ 87(function ($, Drupal, drupalSettings) { 88 var initialized = false; 89 90 function init() { 91 if (!initialized) { 92 initialized = true; 93 94 const currentQuery = drupalSettings?.path?.currentQuery; 95 96 if (currentQuery?.check_logged_in === "1") { 97 window.dataLayer.push({ ecommerce: null }); 98 window.dataLayer.push({ 99 event: "login", 100 loginMethod: "email", 101 email: drupalSettings?.user?.hash_mail, 102 item_category5: "Sign in", 103 }); 104 } 105 106 if (currentQuery?.registered) { 107 window.dataLayer.push({ ecommerce: null }); 108 window.dataLayer.push({ 109 event: "login", 110 loginMethod: "email", 111 item_category5: "Create account", 112 }); 113 } 114 115 // Onload datalayers 116 const dataLayers = drupalSettings.lfi_datalayer; 117 const dlTypes = Object.keys(dataLayers || {}); 118 119 if (dlTypes?.length) { 120 dlTypes.forEach((type) => { 121 const event = dataLayers[type]; 122 123 if (type === "related_products_block") { 124 const formattedItems = Object.values( 125 event?.ecommerce?.items 126 ).flat(); 127 128 event.ecommerce.items = formattedItems; 129 } 130 131 // Clear ecom object on non-ty page events 132 if (type !== "trans" && type !== "purchase") { 133 window.dataLayer.push({ ecommerce: null }); 134 } 135 136 window.dataLayer.push(event); 137 }); 138 } 139 140 handleBlockDatalayerEvents(); 141 } 142 } 143 144 Drupal.behaviors.lfi_datalayer = { 145 attach: function attach() { 146 init(); 147 }, 148 }; 149})(jQuery, Drupal, drupalSettings);
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.