LabCodeHub öffentliche Ansicht
Anmelden
Küpper / Quildrop öffentlich
Branch: main
Quildrop / themes / ehc / static / js / partner-grid.js
Verlauf Rohdaten
R Rüdiger Küpper fix: new version with themes + multi arch builds
b56ed7e0 vor 14 Tagen
themes/ehc/static/js/partner-grid.js 72 Zeilen · 2.0 KB · JavaScript
1
/* ============================================================
2
   Partner-Grid — Quilldrop Widget
3
   ------------------------------------------------------------
4
   Erwartet im DOM:
5
     <div id="partner-grid"></div>
6
7
   Daten: /static/data/partners.json
8
   Konfig per data-Attribut auf #partner-grid:
9
     data-sort="name|none"   alphabetisch sortieren (Default: name)
10
   ============================================================ */
11
(function() {
12
  'use strict';
13
14
  const DATA_URL = '/static/data/partners.json';
15
16
  function esc(s) {
17
    return String(s).replace(/[&<>"]/g, c =>
18
      ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c])
19
    );
20
  }
21
22
  function build(host, partners) {
23
    host.classList.add('partner-grid');
24
    host.innerHTML = '';
25
26
    partners.forEach(p => {
27
      const tag = p.url ? 'a' : 'div';
28
      const el  = document.createElement(tag);
29
      el.className = 'partner-tile';
30
      if (p.url) {
31
        el.href   = p.url;
32
        el.target = '_blank';
33
        el.rel    = 'noopener';
34
      }
35
      el.innerHTML = `
36
        <div class="logo">
37
          <img src="${esc(p.src)}" alt="${esc(p.name)}" loading="lazy" />
38
        </div>
39
        <div class="info">
40
          <div class="name">${esc(p.name)}</div>
41
          ${p.url
42
            ? `<div class="visit">Website besuchen &rarr;</div>`
43
            : `<div class="no-url">Website folgt</div>`}
44
        </div>`;
45
      host.appendChild(el);
46
    });
47
  }
48
49
  function init() {
50
    const host = document.getElementById('partner-grid');
51
    if (!host) return;
52
53
    const sortMode = host.dataset.sort || 'name';
54
55
    fetch(DATA_URL)
56
      .then(r => r.json())
57
      .then(partners => {
58
        if (!Array.isArray(partners) || partners.length === 0) return;
59
        if (sortMode === 'name') {
60
          partners.sort((a, b) => a.name.localeCompare(b.name, 'de'));
61
        }
62
        build(host, partners);
63
      })
64
      .catch(err => console.error('partner-grid:', err));
65
  }
66
67
  if (document.readyState === 'loading') {
68
    document.addEventListener('DOMContentLoaded', init);
69
  } else {
70
    init();
71
  }
72
})();