1(function () { 2 3 function formatCurrency(number) { 4 return '$' + Number(number).toLocaleString('en-US', { 5 minimumFractionDigits: 2, 6 maximumFractionDigits: 2 7 }); 8 } 9 10 function calculateDynamicLeft(percent) { 11 if (percent < 12) { 12 return 6; 13 } 14 else if (percent < 55) { 15 return percent - 7; 16 } 17 else { 18 return 50; 19 } 20 } 21 22 function loadDonationData(wrapper) { 23 24 var paragraphId = wrapper.dataset.paragraphId; 25 var goal = parseFloat(wrapper.dataset.goal); 26 27 var url = wrapper.dataset.source === 'block' 28 ? '/icma/live-donations' 29 : '/icma/live-donations/' + paragraphId; 30 31fetch(url, { 32 33 // fetch("/icma/live-donations/" + paragraphId, { 34 cache: "no-store" 35 }) 36 .then(function(response) { 37 return response.json(); 38 }) 39 .then(function(data) { 40 41 var total = parseFloat(data.donation_total); 42 43 var percentage = goal > 0 44 ? Math.min(100, ((total / goal) * 100)) 45 : 0; 46 47 percentage = Math.round(percentage * 100) / 100; 48 49 var dynamicLeft = calculateDynamicLeft(percentage); 50 51 wrapper.querySelector('.donation-total') 52 .innerHTML = formatCurrency(total); 53 54 wrapper.querySelector('.donation-progress-bar') 55 .style.width = percentage + '%'; 56 57 var percentElement = wrapper.querySelector('.donation-percentage'); 58 percentElement.innerHTML = percentage + '%'; 59 percentElement.style.left = dynamicLeft + '%'; 60 61 }) 62 .catch(function(error) { 63 console.log("Donation fetch error:", error); 64 }); 65 } 66 67 function init() { 68 69 var wrappers = document.querySelectorAll('.donation-progress-wrapper'); 70 71 wrappers.forEach(function(wrapper) { 72 loadDonationData(wrapper); 73 }); 74 75 } 76 77 if (document.readyState === "loading") { 78 document.addEventListener("DOMContentLoaded", init); 79 } else { 80 init(); 81 } 82 83})(); 84 85/** 86 * @file 87 * JavaScript for donation components. 88 */ 89 90(function($, Drupal, once) { 91 'use strict'; 92 93 // Behavior para Top States List 94 Drupal.behaviors.topStatesList = { 95 attach: function(context, settings) { 96 97 $(once('top-states', '.top-states-card', context)).each(function() { 98 var $card = $(this); 99 var year = $card.data('year'); 100 var maxItems = $card.data('max-items'); 101 var paragraphId = $card.data('paragraph-id'); 102 103 var $loading = $card.find('.top-states-loading'); 104 var $list = $card.find('.top-states-list'); 105 106 fetch('/api/netforum/top-states?year=' + year) 107 .then(function(response) { 108 if (!response.ok) { 109 throw new Error('Network response was not ok: ' + response.status); 110 } 111 return response.json(); 112 }) 113 .then(function(data) { 114 115 var states = data.states.slice(0, maxItems); 116 117 $list.empty(); 118 119 if (states.length === 0) { 120 $loading.text('No data available for ' + year); 121 return; 122 } 123 124 states.forEach(function(state, index) { 125 var rank = index + 1; 126 var $li = $('<li class="top-state-item">'); 127 128 // Rank 129 $li.append('<span class="top-state-rank">' + rank + '</span>'); 130 131 var $info = $('<div class="top-state-info">'); 132 $info.append('<span class="top-state-name">' + state.name + '</span>'); 133 134 var amountFormatted = '$' + state.amount.toFixed(0).replace(/\B(?=(\d{3})+(?!\d))/g, ','); 135 $info.append('<span class="top-state-amount">' + amountFormatted + '</span>'); 136 137 $li.append($info); 138 $list.append($li); 139 }); 140 141 $loading.hide(); 142 $list.show(); 143 }) 144 .catch(function(error) { 145 console.error('â Error fetching top states:', error); 146 $loading.hide(); 147 $card.append('<div class="top-states-error">Error loading data. Please try again.</div>'); 148 }); 149 }); 150 } 151 }; 152 153})(jQuery, Drupal, once);
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.