mirror of
https://github.com/kjanat/livegraphs-django.git
synced 2026-01-16 06:32:10 +01:00
317 lines
13 KiB
HTML
317 lines
13 KiB
HTML
<!-- templates/dashboard/data_view.html -->
|
|
{% extends 'base.html' %}
|
|
{% load dashboard_extras %}
|
|
|
|
{% block title %}Data View | Chat Analytics{% endblock %}
|
|
|
|
{% block content %}
|
|
<div
|
|
class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom"
|
|
>
|
|
<h1 class="h2">Data View</h1>
|
|
<div class="btn-toolbar mb-2 mb-md-0">
|
|
<div class="btn-group me-2">
|
|
<a href="{% url 'dashboard' %}" class="btn btn-sm btn-outline-secondary">
|
|
<i class="fas fa-arrow-left"></i> Back to Dashboard
|
|
</a>
|
|
{% if selected_data_source %}
|
|
<a
|
|
href="{% url 'data_source_detail' selected_data_source.id %}"
|
|
class="btn btn-sm btn-outline-secondary"
|
|
>
|
|
<i class="fas fa-database"></i> View Source
|
|
</a>
|
|
{% endif %}
|
|
</div>
|
|
<div class="dropdown">
|
|
<button
|
|
class="btn btn-sm btn-outline-primary dropdown-toggle"
|
|
type="button"
|
|
id="dataViewDropdown"
|
|
data-bs-toggle="dropdown"
|
|
aria-expanded="false"
|
|
>
|
|
<i class="fas fa-filter"></i> Filter
|
|
</button>
|
|
<ul class="dropdown-menu" aria-labelledby="dataViewDropdown">
|
|
<li><a class="dropdown-item" href="?view=all">All Sessions</a></li>
|
|
<li><a class="dropdown-item" href="?view=recent">Recent Sessions</a></li>
|
|
<li><a class="dropdown-item" href="?view=positive">Positive Sentiment</a></li>
|
|
<li><a class="dropdown-item" href="?view=negative">Negative Sentiment</a></li>
|
|
<li><a class="dropdown-item" href="?view=escalated">Escalated Sessions</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Data Source Selection -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title mb-0">Data Source Selection</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<form method="get" class="row g-3 align-items-center">
|
|
<div class="col-md-6">
|
|
<select name="data_source_id" class="form-select" aria-label="Select Data Source">
|
|
<option value="">All Data Sources</option>
|
|
{% for ds in data_sources %}
|
|
<option
|
|
value="{{ ds.id }}"
|
|
{% if selected_data_source.id == ds.id %}selected{% endif %}
|
|
>
|
|
{{ ds.name }}
|
|
</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<select name="view" class="form-select" aria-label="Select View">
|
|
<option value="all" {% if view == 'all' %}selected{% endif %}>All Sessions</option>
|
|
<option value="recent" {% if view == 'recent' %}selected{% endif %}>
|
|
Recent Sessions
|
|
</option>
|
|
<option value="positive" {% if view == 'positive' %}selected{% endif %}>
|
|
Positive Sentiment
|
|
</option>
|
|
<option value="negative" {% if view == 'negative' %}selected{% endif %}>
|
|
Negative Sentiment
|
|
</option>
|
|
<option value="escalated" {% if view == 'escalated' %}selected{% endif %}>
|
|
Escalated Sessions
|
|
</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-2">
|
|
<button type="submit" class="btn btn-primary w-100">Apply</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Data Table -->
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header d-flex justify-content-between align-items-center">
|
|
<h5 class="card-title mb-0">
|
|
Chat Sessions
|
|
{% if selected_data_source %}
|
|
for {{ selected_data_source.name }}
|
|
{% endif %}
|
|
{% if view != 'all' %}
|
|
({{ view|title }})
|
|
{% endif %}
|
|
</h5>
|
|
<span class="badge bg-primary">{{ page_obj.paginator.count }} sessions</span>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="table-responsive">
|
|
<table class="table table-striped table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th>Session ID</th>
|
|
<th>Start Time</th>
|
|
<th>Country</th>
|
|
<th>Language</th>
|
|
<th>Messages</th>
|
|
<th>Sentiment</th>
|
|
<th>Response Time</th>
|
|
<th>Category</th>
|
|
<th>Actions</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for session in page_obj %}
|
|
<tr>
|
|
<td>{{ session.session_id|truncatechars:10 }}</td>
|
|
<td>{{ session.start_time|date:"M d, Y H:i" }}</td>
|
|
<td>{{ session.country|default:"N/A" }}</td>
|
|
<td>{{ session.language|default:"N/A" }}</td>
|
|
<td>{{ session.messages_sent }}</td>
|
|
<td>
|
|
{% if session.sentiment %}
|
|
{% if 'positive' in session.sentiment|lower %}
|
|
<span class="badge bg-success">{{ session.sentiment }}</span>
|
|
{% elif 'negative' in session.sentiment|lower %}
|
|
<span class="badge bg-danger">{{ session.sentiment }}</span>
|
|
{% elif 'neutral' in session.sentiment|lower %}
|
|
<span class="badge bg-warning">{{ session.sentiment }}</span>
|
|
{% else %}
|
|
<span class="badge bg-secondary">{{ session.sentiment }}</span>
|
|
{% endif %}
|
|
{% else %}
|
|
<span class="text-muted">N/A</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>{{ session.avg_response_time|floatformat:2 }}s</td>
|
|
<td>{{ session.category|default:"N/A" }}</td>
|
|
<td>
|
|
<a
|
|
href="{% url 'chat_session_detail' session.session_id %}"
|
|
class="btn btn-sm btn-outline-primary"
|
|
>
|
|
<i class="fas fa-eye"></i>
|
|
</a>
|
|
</td>
|
|
</tr>
|
|
{% empty %}
|
|
<tr>
|
|
<td colspan="9" class="text-center">No chat sessions found.</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
{% if page_obj.paginator.num_pages > 1 %}
|
|
<nav aria-label="Page navigation" class="mt-4">
|
|
<ul class="pagination justify-content-center">
|
|
{% if page_obj.has_previous %}
|
|
<li class="page-item">
|
|
<a
|
|
class="page-link"
|
|
href="?{% if selected_data_source %}data_source_id={{ selected_data_source.id }}&{% endif %}{% if view %}view={{ view }}&{% endif %}page=1"
|
|
aria-label="First"
|
|
>
|
|
<span aria-hidden="true">««</span>
|
|
</a>
|
|
</li>
|
|
<li class="page-item">
|
|
<a
|
|
class="page-link"
|
|
href="?{% if selected_data_source %}data_source_id={{ selected_data_source.id }}&{% endif %}{% if view %}view={{ view }}&{% endif %}page={{ page_obj.previous_page_number }}"
|
|
aria-label="Previous"
|
|
>
|
|
<span aria-hidden="true">«</span>
|
|
</a>
|
|
</li>
|
|
{% else %}
|
|
<li class="page-item disabled">
|
|
<a class="page-link" href="#" aria-label="First">
|
|
<span aria-hidden="true">««</span>
|
|
</a>
|
|
</li>
|
|
<li class="page-item disabled">
|
|
<a class="page-link" href="#" aria-label="Previous">
|
|
<span aria-hidden="true">«</span>
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
|
|
{% for num in page_obj.paginator.page_range %}
|
|
{% if page_obj.number == num %}
|
|
<li class="page-item active">
|
|
<a
|
|
class="page-link"
|
|
href="?{% if selected_data_source %}data_source_id={{ selected_data_source.id }}&{% endif %}{% if view %}view={{ view }}&{% endif %}page={{ num }}"
|
|
>{{ num }}</a
|
|
>
|
|
</li>
|
|
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
|
|
<li class="page-item">
|
|
<a
|
|
class="page-link"
|
|
href="?{% if selected_data_source %}data_source_id={{ selected_data_source.id }}&{% endif %}{% if view %}view={{ view }}&{% endif %}page={{ num }}"
|
|
>{{ num }}</a
|
|
>
|
|
</li>
|
|
{% endif %}
|
|
{% endfor %}
|
|
|
|
{% if page_obj.has_next %}
|
|
<li class="page-item">
|
|
<a
|
|
class="page-link"
|
|
href="?{% if selected_data_source %}data_source_id={{ selected_data_source.id }}&{% endif %}{% if view %}view={{ view }}&{% endif %}page={{ page_obj.next_page_number }}"
|
|
aria-label="Next"
|
|
>
|
|
<span aria-hidden="true">»</span>
|
|
</a>
|
|
</li>
|
|
<li class="page-item">
|
|
<a
|
|
class="page-link"
|
|
href="?{% if selected_data_source %}data_source_id={{ selected_data_source.id }}&{% endif %}{% if view %}view={{ view }}&{% endif %}page={{ page_obj.paginator.num_pages }}"
|
|
aria-label="Last"
|
|
>
|
|
<span aria-hidden="true">»»</span>
|
|
</a>
|
|
</li>
|
|
{% else %}
|
|
<li class="page-item disabled">
|
|
<a class="page-link" href="#" aria-label="Next">
|
|
<span aria-hidden="true">»</span>
|
|
</a>
|
|
</li>
|
|
<li class="page-item disabled">
|
|
<a class="page-link" href="#" aria-label="Last">
|
|
<span aria-hidden="true">»»</span>
|
|
</a>
|
|
</li>
|
|
{% endif %}
|
|
</ul>
|
|
</nav>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Data Summary -->
|
|
{% if page_obj %}
|
|
<div class="row mt-4">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="card-title mb-0">Summary</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-3">
|
|
<div class="card stats-card bg-light">
|
|
<div class="card-body">
|
|
<h6 class="card-title">Total Sessions</h6>
|
|
<h3>{{ page_obj.paginator.count }}</h3>
|
|
<p>Chat conversations</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card stats-card bg-light">
|
|
<div class="card-body">
|
|
<h6 class="card-title">Avg Response Time</h6>
|
|
<h3>{{ avg_response_time|floatformat:2 }}s</h3>
|
|
<p>Average response</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card stats-card bg-light">
|
|
<div class="card-body">
|
|
<h6 class="card-title">Avg Messages</h6>
|
|
<h3>{{ avg_messages|floatformat:1 }}</h3>
|
|
<p>Per conversation</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="card stats-card bg-light">
|
|
<div class="card-body">
|
|
<h6 class="card-title">Escalation Rate</h6>
|
|
<h3>{{ escalation_rate|floatformat:1 }}%</h3>
|
|
<p>Escalated sessions</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
{% endblock %}
|