File size: 3,225 Bytes
d70361b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/** Application logs viewer. */
(function () {
  const wrap = document.getElementById('logs-table-wrap');
  const meta = document.getElementById('logs-meta');
  let timer = null;

  function levelClass(level) {
    const l = (level || '').toUpperCase();
    if (l === 'ERROR' || l === 'CRITICAL') return 'is-error';
    if (l === 'WARNING') return 'is-warn';
    if (l === 'DEBUG') return 'is-debug';
    return 'is-info';
  }

  async function loadLogs() {
    if (!wrap) return;
    const q = document.getElementById('logs-q')?.value?.trim() || '';
    const level = document.getElementById('logs-level')?.value || '';
    const logger = document.getElementById('logs-logger')?.value?.trim() || '';
    const params = new URLSearchParams({ limit: '300', offset: '0' });
    if (q) params.set('q', q);
    if (level) params.set('level', level);
    if (logger) params.set('logger', logger);
    try {
      const data = await ddaApi('GET', '/api/dda/logs?' + params.toString());
      const rows = data.logs || [];
      if (meta) meta.textContent = `${data.total || 0} event${data.total === 1 ? '' : 's'}`;
      if (!rows.length) {
        wrap.innerHTML = '<p class="dim">No log events match these filters.</p>';
        return;
      }
      wrap.innerHTML = `
        <table class="dda-logs-table">
          <thead>
            <tr><th>Time (IST)</th><th>Level</th><th>Logger</th><th>Message</th></tr>
          </thead>
          <tbody>
            ${rows.map((r) => `
              <tr class="dda-log-row ${levelClass(r.level)}">
                <td><time class="dda-date">${typeof formatDateIst === 'function' ? formatDateIst(r.ts) : escapeHtml(r.ts || '')}</time></td>
                <td><span class="dda-log-level">${escapeHtml(r.level)}</span></td>
                <td class="dda-log-logger">${escapeHtml(r.logger || '')}</td>
                <td class="dda-log-msg">${escapeHtml(r.message || '')}</td>
              </tr>`).join('')}
          </tbody>
        </table>`;
    } catch (err) {
      wrap.innerHTML = `<p class="dim">${escapeHtml(err.message || 'Could not load logs.')}</p>`;
    }
  }

  function scheduleLive() {
    if (timer) clearInterval(timer);
    timer = null;
    if (document.getElementById('logs-live')?.checked) {
      timer = setInterval(loadLogs, 4000);
    }
  }

  document.getElementById('btn-logs-refresh')?.addEventListener('click', loadLogs);
  document.getElementById('logs-live')?.addEventListener('change', scheduleLive);
  ['logs-q', 'logs-level', 'logs-logger'].forEach((id) => {
    const el = document.getElementById(id);
    if (!el) return;
    el.addEventListener(el.tagName === 'SELECT' ? 'change' : 'input', () => {
      clearTimeout(window._logsFilterTimer);
      window._logsFilterTimer = setTimeout(loadLogs, 250);
    });
  });
  document.getElementById('btn-logs-clear')?.addEventListener('click', async () => {
    if (!confirm('Clear the in-memory log buffer and truncate the log file?')) return;
    try {
      await ddaApi('DELETE', '/api/dda/logs');
      showDdaSuccess?.('Logs cleared.');
      await loadLogs();
    } catch (err) {
      showDdaError?.(err.message || 'Could not clear logs.');
    }
  });

  loadLogs();
  scheduleLive();
})();