111 lines
4.9 KiB
HTML
111 lines
4.9 KiB
HTML
{% extends "base.html" %}
|
||
{% block title %}All Tickets{% endblock %}
|
||
{% block page_title %}All Tickets{% endblock %}
|
||
|
||
{% block content %}
|
||
<!-- Filters -->
|
||
<div class="card mb-4">
|
||
<div class="card-body">
|
||
<form method="GET" class="row g-2 align-items-end">
|
||
<div class="col-md-3">
|
||
<label class="form-label">Status</label>
|
||
<select class="form-select" name="status">
|
||
<option value="">All Statuses</option>
|
||
{% for s in ['open','in_progress','pending','resolved','closed'] %}
|
||
<option value="{{ s }}" {% if s == status %}selected{% endif %}>{{ s.replace('_',' ').title() }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<label class="form-label">Priority</label>
|
||
<select class="form-select" name="priority">
|
||
<option value="">All Priorities</option>
|
||
{% for p in ['low','medium','high','critical'] %}
|
||
<option value="{{ p }}" {% if p == priority %}selected{% endif %}>{{ p.title() }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
</div>
|
||
<div class="col-md-3">
|
||
<label class="form-label">Assignment</label>
|
||
<select class="form-select" name="assigned">
|
||
<option value="">All</option>
|
||
<option value="me" {% if assigned == 'me' %}selected{% endif %}>Assigned to Me</option>
|
||
<option value="unassigned" {% if assigned == 'unassigned' %}selected{% endif %}>Unassigned</option>
|
||
</select>
|
||
</div>
|
||
<div class="col-md-3 d-flex gap-2">
|
||
<button type="submit" class="btn btn-primary flex-fill"><i class="bi bi-search me-1"></i>Filter</button>
|
||
<a href="{{ url_for('admin.all_tickets') }}" class="btn btn-secondary"><i class="bi bi-x-lg"></i></a>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card">
|
||
<div class="card-header">
|
||
<i class="bi bi-collection me-2"></i>Tickets
|
||
<span style="font-size:12px;color:var(--muted);font-family:'Space Mono',monospace;">({{ tickets.total }})</span>
|
||
</div>
|
||
<div class="card-body p-0">
|
||
{% if tickets.items %}
|
||
<table class="table mb-0">
|
||
<thead>
|
||
<tr>
|
||
<th>Ticket #</th>
|
||
<th>Title</th>
|
||
<th>Category</th>
|
||
<th>Status</th>
|
||
<th>Priority</th>
|
||
<th>Submitted By</th>
|
||
<th>Assigned To</th>
|
||
<th>Date</th>
|
||
<th></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{% for t in tickets.items %}
|
||
<tr>
|
||
<td><a href="{{ url_for('tickets.ticket_detail', ticket_id=t.id) }}" class="mono" style="font-size:11px;color:var(--accent3);">{{ t.ticket_number }}</a></td>
|
||
<td style="font-size:13px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">{{ t.title }}</td>
|
||
<td style="font-size:12px;color:var(--muted);">{{ t.category.replace('_',' ').title() }}</td>
|
||
<td><span class="badge badge-{{ t.status }}">{{ t.status.replace('_',' ').upper() }}</span></td>
|
||
<td><span class="badge badge-{{ t.priority }}">{{ t.priority.upper() }}</span></td>
|
||
<td style="font-size:13px;">{{ t.creator.full_name }}</td>
|
||
<td style="font-size:13px;color:var(--muted);">{{ t.assignee.full_name if t.assignee else '—' }}</td>
|
||
<td style="font-size:11px;color:var(--muted);">{{ t.created_at.strftime('%b %d') }}</td>
|
||
<td><a href="{{ url_for('tickets.ticket_detail', ticket_id=t.id) }}" class="btn btn-secondary btn-sm"><i class="bi bi-eye"></i></a></td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
|
||
{% if tickets.pages > 1 %}
|
||
<div class="d-flex justify-content-center py-3">
|
||
<nav><ul class="pagination mb-0">
|
||
{% if tickets.has_prev %}
|
||
<li class="page-item"><a class="page-link" href="{{ url_for('admin.all_tickets', page=tickets.prev_num, status=status, priority=priority, assigned=assigned) }}">‹</a></li>
|
||
{% endif %}
|
||
{% for p in tickets.iter_pages(left_edge=1, right_edge=1, left_current=2, right_current=2) %}
|
||
{% if p %}
|
||
<li class="page-item {% if p==tickets.page %}active{% endif %}">
|
||
<a class="page-link" href="{{ url_for('admin.all_tickets', page=p, status=status, priority=priority, assigned=assigned) }}">{{ p }}</a>
|
||
</li>
|
||
{% else %}
|
||
<li class="page-item disabled"><span class="page-link">…</span></li>
|
||
{% endif %}
|
||
{% endfor %}
|
||
{% if tickets.has_next %}
|
||
<li class="page-item"><a class="page-link" href="{{ url_for('admin.all_tickets', page=tickets.next_num, status=status, priority=priority, assigned=assigned) }}">›</a></li>
|
||
{% endif %}
|
||
</ul></nav>
|
||
</div>
|
||
{% endif %}
|
||
{% else %}
|
||
<div class="p-5 text-center" style="color:var(--muted);">
|
||
<i class="bi bi-inbox" style="font-size:40px;display:block;margin-bottom:12px;"></i>No tickets match the current filters.
|
||
</div>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
{% endblock %}
|