Benutzer, Ticketzuweißungen
This commit is contained in:
@@ -19,9 +19,17 @@ const loadingEl = document.getElementById('page-loading');
|
||||
const mainEl = document.getElementById('page-main');
|
||||
const errEl = document.getElementById('page-error');
|
||||
const listEl = document.getElementById('home-ticket-list');
|
||||
const listMineEl = document.getElementById('home-ticket-list-mine');
|
||||
const emptyEl = document.getElementById('home-empty');
|
||||
const tpl = document.getElementById('tpl-home-ticket');
|
||||
|
||||
function formatAssigneeLabel(ticket) {
|
||||
const u = ticket.assignedTo;
|
||||
if (!u) return '—';
|
||||
const name = [u.firstName, u.lastName].filter(Boolean).join(' ').trim();
|
||||
return name || u.username || u.id;
|
||||
}
|
||||
|
||||
function showError(msg) {
|
||||
loadingEl.hidden = true;
|
||||
mainEl.hidden = true;
|
||||
@@ -48,7 +56,8 @@ function renderEventBoxes(events) {
|
||||
.join('');
|
||||
}
|
||||
|
||||
function fillTicketCard(node, t, events) {
|
||||
/** @param {'open' | 'mine'} listKind */
|
||||
function fillTicketCard(node, t, events, listKind) {
|
||||
const id = t.id;
|
||||
const detailId = `home-ticket-detail-${id}`;
|
||||
node.dataset.ticketId = id;
|
||||
@@ -79,6 +88,25 @@ function fillTicketCard(node, t, events) {
|
||||
pr.textContent = ticketPriorityLabel[t.priority];
|
||||
pr.className = `badge js-priority ${priorityBadgeClass[t.priority] || ''}`;
|
||||
|
||||
const assignTag = node.querySelector('.js-assignee-tag');
|
||||
if (assignTag) {
|
||||
const name = formatAssigneeLabel(t);
|
||||
if (listKind === 'mine') {
|
||||
assignTag.textContent = name;
|
||||
assignTag.hidden = false;
|
||||
assignTag.className = 'badge js-assignee-tag badge-assignee';
|
||||
assignTag.title = `Zugewiesen: ${name}`;
|
||||
} else {
|
||||
const hasOther = Boolean(t.assignedTo);
|
||||
assignTag.textContent = hasOther ? name : 'Nicht zugewiesen';
|
||||
assignTag.hidden = false;
|
||||
assignTag.className = hasOther
|
||||
? 'badge js-assignee-tag badge-assignee'
|
||||
: 'badge js-assignee-tag badge-assignee badge-assignee--none';
|
||||
assignTag.title = hasOther ? `Zugewiesen: ${name}` : 'Noch niemandem zugewiesen';
|
||||
}
|
||||
}
|
||||
|
||||
const metaM = node.querySelector('.js-meta-machine');
|
||||
metaM.innerHTML = t.machine
|
||||
? `<span class="muted">Maschine:</span> ${machineLabel}`
|
||||
@@ -87,6 +115,8 @@ function fillTicketCard(node, t, events) {
|
||||
node.querySelector('.js-meta-standort').textContent = standort;
|
||||
node.querySelector('.js-meta-created').textContent = formatDateTime(t.createdAt);
|
||||
node.querySelector('.js-meta-updated').textContent = formatDateTime(t.updatedAt);
|
||||
const assigneeEl = node.querySelector('.js-meta-assignee');
|
||||
if (assigneeEl) assigneeEl.textContent = formatAssigneeLabel(t);
|
||||
|
||||
const openA = node.querySelector('.js-ticket-open');
|
||||
openA.href = `/ticket.html?id=${encodeURIComponent(id)}`;
|
||||
@@ -112,32 +142,53 @@ function fillTicketCard(node, t, events) {
|
||||
};
|
||||
}
|
||||
|
||||
function renderTicketListInto(container, tickets, eventsLists, listKind) {
|
||||
container.innerHTML = '';
|
||||
tickets.forEach((t, i) => {
|
||||
const frag = tpl.content.cloneNode(true);
|
||||
const article = frag.querySelector('.home-ticket-card');
|
||||
fillTicketCard(article, t, eventsLists[i] || [], listKind);
|
||||
container.appendChild(article);
|
||||
});
|
||||
}
|
||||
|
||||
async function run() {
|
||||
const tickets = await apiGet('/tickets?open=1');
|
||||
const eventsLists =
|
||||
tickets.length === 0
|
||||
const [ticketsAll, ticketsMine] = await Promise.all([
|
||||
apiGet('/tickets?open=1&assignedTo=not_me'),
|
||||
apiGet('/tickets?open=1&assignedTo=me'),
|
||||
]);
|
||||
|
||||
const eventsAll =
|
||||
ticketsAll.length === 0
|
||||
? []
|
||||
: await Promise.all(tickets.map((t) => apiGet(`/tickets/${t.id}/events`)));
|
||||
|
||||
const openCount = tickets.filter((t) => t.status === 'OPEN').length;
|
||||
const waitingCount = tickets.filter((t) => t.status === 'WAITING').length;
|
||||
: await Promise.all(ticketsAll.map((t) => apiGet(`/tickets/${t.id}/events`)));
|
||||
const eventsMine =
|
||||
ticketsMine.length === 0
|
||||
? []
|
||||
: await Promise.all(ticketsMine.map((t) => apiGet(`/tickets/${t.id}/events`)));
|
||||
|
||||
const openCount = ticketsAll.filter((t) => t.status === 'OPEN').length;
|
||||
const waitingCount = ticketsAll.filter((t) => t.status === 'WAITING').length;
|
||||
document.getElementById('kpi-open').textContent = `${openCount} Offen`;
|
||||
document.getElementById('kpi-waiting').textContent = `${waitingCount} Wartend`;
|
||||
document.getElementById('kpi-total').textContent = `gesamt: ${tickets.length}`;
|
||||
document.getElementById('kpi-total').textContent = `gesamt: ${ticketsAll.length}`;
|
||||
|
||||
listEl.innerHTML = '';
|
||||
if (tickets.length === 0) {
|
||||
const mineOpen = ticketsMine.filter((t) => t.status === 'OPEN').length;
|
||||
const mineWaiting = ticketsMine.filter((t) => t.status === 'WAITING').length;
|
||||
document.getElementById('kpi-mine-open').textContent = `${mineOpen} Offen`;
|
||||
document.getElementById('kpi-mine-waiting').textContent = `${mineWaiting} Wartend`;
|
||||
document.getElementById('kpi-mine-total').textContent = `gesamt: ${ticketsMine.length}`;
|
||||
|
||||
if (ticketsAll.length === 0) {
|
||||
emptyEl.hidden = false;
|
||||
emptyEl.textContent = 'Keine offenen Tickets.';
|
||||
listEl.innerHTML = '';
|
||||
} else {
|
||||
emptyEl.hidden = true;
|
||||
tickets.forEach((t, i) => {
|
||||
const frag = tpl.content.cloneNode(true);
|
||||
const article = frag.querySelector('.home-ticket-card');
|
||||
fillTicketCard(article, t, eventsLists[i] || []);
|
||||
listEl.appendChild(article);
|
||||
});
|
||||
renderTicketListInto(listEl, ticketsAll, eventsAll, 'open');
|
||||
}
|
||||
|
||||
renderTicketListInto(listMineEl, ticketsMine, eventsMine, 'mine');
|
||||
}
|
||||
|
||||
async function init() {
|
||||
@@ -146,6 +197,7 @@ async function init() {
|
||||
loadingEl.hidden = true;
|
||||
mainEl.hidden = false;
|
||||
bindAttachmentPreview(document.body);
|
||||
|
||||
try {
|
||||
await run();
|
||||
} catch (e) {
|
||||
|
||||
Reference in New Issue
Block a user