1/** 2 * Check if GA4 for dataLayer 3 */ 4function isGA4(){ 5 return window.dataLayer; 6} 7 8 9 10/** 11 * Event Register Category 12 * Events/_register 13 */ 14function ga4EventRegisterCategoryForm(){ 15 if (!isGA4()) return; 16 17 dataLayer.push({ ecommerce: null }); 18 19 // Selected Category 20 var $selected = $('#categories_items input[name="data[Registration][category_id]"]:checked'); 21 var $parent = $selected.closest('.row'); 22 var item_value = $('[data-item-value]', $parent).data('item-value'); 23 if ($selected.length && !!item_value) { 24 dataLayer.push({ 25 event: "add_to_cart", 26 ecommerce: { 27 currency: "USD", 28 value: Number(item_value).toFixed(2), 29 items: [ 30 { 31 item_name: $('.name', $parent).text(), 32 price: Number(item_value).toFixed(2), 33 quantity: 1 34 } 35 ] 36 } 37 }); 38 } 39 40 // Selected Ticket 41 var $ticketed = $('#tickets_items select[name^="data[Ticket]"]'); 42 if ($ticketed.length) { 43 $.each($ticketed, function(){ 44 var me = $(this); 45 var $parent = me.closest('.row'); 46 if (me.val() == 0) return; 47 dataLayer.push({ 48 event: "add_to_cart", 49 ecommerce: { 50 currency: "USD", 51 value: Number($('[data-item-value]', $parent).data('item-value')).toFixed(2), 52 items: [ 53 { 54 item_name: $('.name', $parent).text(), 55 price: Number($('[data-item-value]', $parent).data('item-value')).toFixed(2), 56 quantity: me.val() 57 } 58 ] 59 } 60 }); 61 }); 62 } 63 64 // Selected Bundle 65 var $selected = $('#bundles_items input[name="data[Registration][category_id]"]:checked'); 66 var $parent = $selected.closest('.row'); 67 var item_value = $('[data-item-value]', $parent).data('item-value'); 68 if ($selected.length) { 69 dataLayer.push({ 70 event: "add_to_cart", 71 ecommerce: { 72 currency: "USD", 73 value: Number(item_value).toFixed(2), 74 items: [ 75 { 76 item_name: $('.name', $parent).text(), 77 price: Number(item_value).toFixed(2), 78 quantity: 1 79 } 80 ] 81 } 82 }); 83 } 84} 85 86 87 88/** 89 * Edit/Change Registration Category 90 * Registrations/category 91 */ 92function ga4RegistrationsCategory(e){ 93 if (!isGA4()) return; 94 95 var $selected = $('input[name^="data[Registration][category_id]"]:checked'); 96 var $parent = $selected.closest('.row'); 97 dataLayer.push({ ecommerce: null }); 98 dataLayer.push({ 99 event: "add_to_cart", 100 ecommerce: { 101 currency: "USD", 102 value: Number($('[data-item-value]', $parent).data('item-value')).toFixed(2), 103 items: [ 104 { 105 item_name: $('.name', $parent).text(), 106 price: Number(item_value).toFixed(2), 107 quantity: 1 108 } 109 ] 110 } 111 }); 112} 113 114 115 116/** 117 * Element/Orders/modal 118 * Purchase 119 */ 120function ga4OrdersModalPurchase(order_id, total, item_details, hash_email, hash_phone){ 121 if (!isGA4()) return; 122 123 if (item_details.length) { 124 dataLayer.push({ ecommerce: null }); 125 dataLayer.push({ 126 event: "purchase", 127 email: hash_email, 128 phone: hash_phone, 129 ecommerce: { 130 transaction_id: order_id, 131 currency: "USD", 132 value: Number(total).toFixed(2), 133 items: item_details 134 } 135 }); 136 console.log(dataLayer) 137 } 138}
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.