[deploy]
All checks were successful
Deploy Discord Bot / deploy (push) Successful in 37s

This commit is contained in:
Pascal Prießnitz
2025-12-04 16:43:38 +01:00
parent 311f5a87f1
commit 22caa79b54
60 changed files with 2652 additions and 2999 deletions

View File

@@ -0,0 +1,38 @@
import { api } from '../../services/api.js';
import { showToast } from '../../ui/toast.js';
export async function renderAutomations(guildId: string) {
const container = document.getElementById('tickets-automations');
if (!container) return;
container.innerHTML = '<p class="muted">Lade Automationen...</p>';
try {
const data: any = await api.automations(guildId);
const rules = data?.rules || data || [];
if (!rules.length) {
container.innerHTML = '<div class="empty-state">Keine Regeln angelegt.</div>';
return;
}
const list = document.createElement('div');
list.className = 'ticket-list';
rules.forEach((r: any) => {
const item = document.createElement('div');
item.className = 'ticket-item';
item.innerHTML = `
<div class="row" style="justify-content:space-between;">
<div>
<div style="font-weight:750;">${r.name || 'Regel'}</div>
<div class="muted">${r.condition?.type || r.condition?.status || ''}</div>
</div>
<span class="pill">${r.active ? 'aktiv' : 'inaktiv'}</span>
</div>
`;
list.appendChild(item);
});
container.innerHTML = '<h3 class="label">Automationen</h3>';
container.appendChild(list);
} catch (err) {
console.error(err);
container.innerHTML = '<div class="empty-state">Automationen konnten nicht geladen werden.</div>';
showToast('Fehler beim Laden der Automationen', true);
}
}

View File

@@ -0,0 +1,29 @@
import { renderTicketList } from './list.js';
import { renderPipeline } from './pipeline.js';
import { renderSla } from './sla.js';
import { renderAutomations } from './automations.js';
import { renderKb } from './kb.js';
export async function initTicketsSection(guildId: string) {
const section = document.getElementById('section-tickets');
if (!section) return;
section.innerHTML = `
<h2 class="section-title">Tickets</h2>
<div class="tickets-grid">
<div class="card" id="tickets-list"></div>
<div class="card" id="tickets-pipeline"></div>
<div class="card" id="tickets-sla"></div>
</div>
<div class="grid" style="margin-top:16px;">
<div class="card" id="tickets-automations"></div>
<div class="card" id="tickets-kb"></div>
</div>
`;
await Promise.all([
renderTicketList(guildId),
renderPipeline(guildId),
renderSla(guildId),
renderAutomations(guildId),
renderKb(guildId)
]);
}

View File

@@ -0,0 +1,33 @@
import { api } from '../../services/api.js';
import { showToast } from '../../ui/toast.js';
export async function renderKb(guildId: string) {
const container = document.getElementById('tickets-kb');
if (!container) return;
container.innerHTML = '<p class="muted">Lade Knowledge Base...</p>';
try {
const data: any = await api.kb(guildId);
const entries = data?.articles || data?.kb || [];
if (!entries.length) {
container.innerHTML = '<div class="empty-state">Keine KB-Eintraege.</div>';
return;
}
const list = document.createElement('div');
list.className = 'ticket-list';
entries.slice(0, 4).forEach((k: any) => {
const item = document.createElement('div');
item.className = 'ticket-item';
item.innerHTML = `
<div style="font-weight:750;">${k.title || 'Artikel'}</div>
<div class="muted">${k.keywords || ''}</div>
`;
list.appendChild(item);
});
container.innerHTML = '<h3 class="label">Knowledge Base</h3>';
container.appendChild(list);
} catch (err) {
console.error(err);
container.innerHTML = '<div class="empty-state">KB konnte nicht geladen werden.</div>';
showToast('Fehler beim Laden der KB', true);
}
}

View File

@@ -0,0 +1,39 @@
import { api } from '../../services/api.js';
import { showToast } from '../../ui/toast.js';
export async function renderTicketList(guildId: string) {
const container = document.getElementById('tickets-list');
if (!container) return;
container.innerHTML = '<p class="muted">Lade Tickets...</p>';
try {
const data: any = await api.tickets(guildId);
const tickets = data?.tickets || [];
if (!tickets.length) {
container.innerHTML = '<div class="empty-state">Keine Tickets</div>';
return;
}
const list = document.createElement('div');
list.className = 'ticket-list';
tickets.slice(0, 5).forEach((t: any) => {
const item = document.createElement('div');
item.className = 'ticket-item';
item.innerHTML = `
<div class="row" style="justify-content:space-between;">
<div>
<div style="font-weight:750;font-size:15px;">${t.title || t.id}</div>
<div class="muted">${t.user || ''}</div>
</div>
<div class="ticket-status status-${t.status || 'open'}">${t.status || 'open'}</div>
</div>
<div class="muted">${t.description || ''}</div>
`;
list.appendChild(item);
});
container.innerHTML = '<h3 class="label">Aktuelle Tickets</h3>';
container.appendChild(list);
} catch (err) {
console.error(err);
container.innerHTML = '<div class="empty-state">Tickets konnten nicht geladen werden.</div>';
showToast('Fehler beim Laden der Tickets', true);
}
}

View File

@@ -0,0 +1,33 @@
import { api } from '../../services/api.js';
import { showToast } from '../../ui/toast.js';
export async function renderPipeline(guildId: string) {
const container = document.getElementById('tickets-pipeline');
if (!container) return;
container.innerHTML = '<p class="muted">Lade Pipeline...</p>';
try {
const data: any = await api.pipeline(guildId);
const lanes = data?.lanes || [];
container.innerHTML = '<h3 class="label">Pipeline</h3>';
if (!lanes.length) {
container.innerHTML += '<div class="empty-state">Keine Pipeline-Daten</div>';
return;
}
const grid = document.createElement('div');
grid.className = 'grid';
lanes.forEach((lane: any) => {
const card = document.createElement('div');
card.className = 'card';
card.innerHTML = `
<p class="label">${lane.name || 'Lane'}</p>
<p class="stat">${lane.count ?? 0}</p>
`;
grid.appendChild(card);
});
container.appendChild(grid);
} catch (err) {
console.error(err);
container.innerHTML = '<div class="empty-state">Pipeline konnte nicht geladen werden.</div>';
showToast('Fehler beim Laden der Pipeline', true);
}
}

View File

@@ -0,0 +1,21 @@
import { api } from '../../services/api.js';
import { showToast } from '../../ui/toast.js';
export async function renderSla(guildId: string) {
const container = document.getElementById('tickets-sla');
if (!container) return;
container.innerHTML = '<p class="muted">Lade SLA...</p>';
try {
const data: any = await api.sla(guildId);
const stats = data?.stats || {};
container.innerHTML = `
<h3 class="label">SLA</h3>
<p class="stat">${stats.averageResponse ?? '-'}m</p>
<p class="muted">Durchschnittliche Antwortzeit</p>
`;
} catch (err) {
console.error(err);
container.innerHTML = '<div class="empty-state">SLA konnte nicht geladen werden.</div>';
showToast('Fehler beim Laden der SLA', true);
}
}