PageSourceSearch

https://icma.org/modules/custom/icma_netforum_donations/js/donation-progress.js?v=1.x

js icma.org collected 2026-10-02 02:18:53 UTC 4,079 bytes, 153 lines download raw bytes

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.