Jump to content

Widget:UPDEvents: Difference between revisions

From Iskomunidad
No edit summary
No edit summary
Line 1: Line 1:
<includeonly>
<includeonly>
<div id="upd-events-widget" class="upd-events-widget">
<div id="upd-events-widget">
    <div class="upd-events-loading">
  <div class="upd-events-loading">Loading upcoming events...</div>
        Loading UP Diliman events...
  <ul class="upd-events-list" style="display:none;"></ul>
    </div>
 
    <ul class="upd-events-list" style="display:none;"></ul>
 
    <div class="upd-events-error" style="display:none;">
        Events are temporarily unavailable.
        <a href="https://upd.edu.ph/events-list/" target="_blank" rel="noopener">
            View the official events list
        </a>.
    </div>
 
    <div class="upd-events-footer">
        <a href="https://upd.edu.ph/events/" target="_blank" rel="noopener">
            View all UP Diliman events →
        </a>
    </div>
</div>
</div>


<style>
<script>
.upd-events-widget {
(function () {
    width: 100%;
  var container = document.getElementById('upd-events-widget');
    box-sizing: border-box;
  if (!container || container.dataset.loaded === '1') return;
    color: #000;
  container.dataset.loaded = '1';
}


.upd-events-widget .upd-events-list {
  var loading = container.querySelector('.upd-events-loading');
    list-style: none;
  var list = container.querySelector('.upd-events-list');
    padding: 0;
    margin: 0;
}


.upd-events-widget .upd-events-list li {
  var feedUrl = 'https://upd.edu.ph/events-list/?ical=1';
    padding: 10px 0;
    border-bottom: 1px solid #e5e5e5;
    line-height: 1.5;
}


.upd-events-widget .upd-events-list li:last-child {
  function decodeICS(value) {
    border-bottom: none;
    return value
}
      .replace(/\\n/gi, '\n')
      .replace(/\\,/g, ',')
      .replace(/\\;/g, ';')
      .replace(/\\\\/g, '\\');
  }


.upd-events-widget .upd-events-list a {
  function parseDate(value) {
     color: #850038 !important;
     if (!value) return null;
    text-decoration: none;
    font-weight: 500;
}


.upd-events-widget .upd-events-list a:hover {
    // All-day event: DTSTART;VALUE=DATE:20261106
    text-decoration: underline;
    if (/^\d{8}$/.test(value)) {
}
      return new Date(
        Date.UTC(
          Number(value.slice(0, 4)),
          Number(value.slice(4, 6)) - 1,
          Number(value.slice(6, 8))
        )
      );
    }


.upd-events-widget .upd-events-loading,
    // UTC date-time ending in Z
.upd-events-widget .upd-events-error {
    if (/^\d{8}T\d{6}Z$/.test(value)) {
    padding: 8px 0;
      return new Date(
    color: #333;
        value.slice(0, 4) + '-' +
}
        value.slice(4, 6) + '-' +
        value.slice(6, 8) + 'T' +
        value.slice(9, 11) + ':' +
        value.slice(11, 13) + ':' +
        value.slice(13, 15) + 'Z'
      );
    }


.upd-events-widget .upd-events-footer {
    // Date-time without Z: interpret as Philippine local time
    margin-top: 12px;
    if (/^\d{8}T\d{6}$/.test(value)) {
    font-size: 0.9em;
      return new Date(
}
        value.slice(0, 4) + '-' +
        value.slice(4, 6) + '-' +
        value.slice(6, 8) + 'T' +
        value.slice(9, 11) + ':' +
        value.slice(11, 13) + ':' +
        value.slice(13, 15) + '+08:00'
      );
    }


.upd-events-widget .upd-events-footer a {
     return null;
    color: #850038 !important;
  }
     text-decoration: none;
}


.upd-events-widget .upd-events-footer a:hover {
  function showError() {
     text-decoration: underline;
    loading.textContent =
}
      'Upcoming events could not be loaded. Please visit the UP Diliman Events page.';
</style>
    var link = document.createElement('a');
    link.href = 'https://upd.edu.ph/events-list/';
    link.textContent = ' View all events';
    link.target = '_blank';
    link.rel = 'noopener noreferrer';
     loading.appendChild(link);
  }


<script>
  fetch(feedUrl)
(function () {
    .then(function (response) {
     "use strict";
      if (!response.ok) throw new Error('Calendar feed unavailable');
      return response.text();
     })
    .then(function (ics) {
      // Join folded iCalendar lines.
      ics = ics.replace(/\r?\n[ \t]/g, '');


    var widgets = document.querySelectorAll(
      var blocks = ics.match(/BEGIN:VEVENT[\s\S]*?END:VEVENT/g) || [];
        '.upd-events-widget:not([data-loaded])'
      var now = new Date();
    );
      var events = [];
      var seen = {};


    widgets.forEach(function (widget) {
      blocks.forEach(function (block) {
         widget.setAttribute('data-loaded', 'true');
         var startMatch = block.match(/^DTSTART(?:;[^:]*)?:(.+)$/m);
        var titleMatch = block.match(/^SUMMARY(?:;[^:]*)?:(.+)$/m);
        var urlMatch = block.match(/^URL(?:;[^:]*)?:(.+)$/m);


         var loading = widget.querySelector('.upd-events-loading');
         if (!startMatch || !titleMatch || !urlMatch) return;
        var list = widget.querySelector('.upd-events-list');
        var error = widget.querySelector('.upd-events-error');


         // Endpoint on the same Iskomunidad server.
         var start = parseDate(startMatch[1].trim());
         var endpoint = '/upd-events-proxy.php';
        var title = decodeICS(titleMatch[1].trim());
         var url = urlMatch[1].trim();


         fetch(endpoint, {
         if (!start || start <= now) return;
            method: 'GET',
         if (!/^https:\/\/upd\.edu\.ph\/events\//i.test(url)) return;
            credentials: 'same-origin',
            cache: 'no-cache'
        })
        .then(function (response) {
            if (!response.ok) {
                throw new Error('Could not load events.');
            }
            return response.json();
         })
        .then(function (events) {
            if (!Array.isArray(events)) {
                throw new Error('Unexpected event data.');
            }


            loading.style.display = 'none';
        // Keep only the nearest upcoming occurrence of each event page.
        var key = url + '|' + title.toLowerCase();
        if (seen[key]) return;
        seen[key] = true;


            if (events.length === 0) {
        events.push({
                error.style.display = 'block';
          title: title,
                error.textContent =
          url: url,
                    'No upcoming events were found. ';
          start: start
                var link = document.createElement('a');
        });
                link.href = 'https://upd.edu.ph/events-list/';
      });
                link.target = '_blank';
                link.rel = 'noopener';
                link.textContent = 'View the official events list';
                error.appendChild(link);
                error.appendChild(document.createTextNode('.'));
                return;
            }


            events.slice(0, 5).forEach(function (event) {
      events.sort(function (a, b) {
                if (!event.title || !event.url) {
        return a.start - b.start;
                    return;
      });
                }


                // Only allow official UP Diliman event links.
      events = events.slice(0, 5);
                var url;
                try {
                    url = new URL(event.url);
                } catch (e) {
                    return;
                }


                if (
      if (!events.length) {
                    url.protocol !== 'https:' ||
        loading.textContent = 'There are no upcoming events at this time.';
                    url.hostname !== 'upd.edu.ph' ||
        return;
                    !url.pathname.startsWith('/events/')
      }
                ) {
                    return;
                }


                var item = document.createElement('li');
      events.forEach(function (event) {
                var anchor = document.createElement('a');
        var item = document.createElement('li');
        var link = document.createElement('a');


                anchor.href = url.href;
        link.href = event.url;
                anchor.target = '_blank';
        link.textContent = event.title;
                anchor.rel = 'noopener noreferrer';
        link.target = '_blank';
                anchor.textContent = event.title;
        link.rel = 'noopener noreferrer';


                item.appendChild(anchor);
        item.appendChild(link);
                list.appendChild(item);
        list.appendChild(item);
            });
      });


            if (list.children.length === 0) {
      loading.style.display = 'none';
                error.style.display = 'block';
      list.style.display = 'block';
            } else {
    })
                list.style.display = 'block';
    .catch(function (error) {
            }
      console.error('UP Diliman Events widget:', error);
        })
      showError();
        .catch(function (err) {
            console.error('UP Diliman Events widget:', err);
            loading.style.display = 'none';
            error.style.display = 'block';
        });
     });
     });
})();
})();
</script>
</script>
</includeonly>
</includeonly>

Revision as of 01:50, 29 October 2026