Files
Ske_Signage/app/templates/dashboard/index.html
2025-07-16 11:19:31 +03:00

235 lines
10 KiB
HTML

{% extends "base.html" %}
{% block title %}Dashboard - SKE Digital Signage{% endblock %}
{% block content %}
<div class="container-fluid py-4">
<!-- Page Header -->
<div class="row mb-4">
<div class="col">
<h1><i class="bi bi-house"></i> Dashboard</h1>
<p class="text-muted">Manage your digital signage displays and content</p>
</div>
{% if current_user.is_admin %}
<div class="col-auto">
<a href="{{ url_for('content.upload') }}" class="btn btn-primary">
<i class="bi bi-cloud-upload"></i> Upload Content
</a>
</div>
{% endif %}
</div>
<!-- Statistics Cards -->
<div class="row mb-4">
<div class="col-md-3">
<div class="card bg-primary text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h5 class="card-title">Players</h5>
<h2>{{ players|length }}</h2>
</div>
<div class="align-self-center">
<i class="bi bi-display display-6"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-success text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h5 class="card-title">Groups</h5>
<h2>{{ groups|length }}</h2>
</div>
<div class="align-self-center">
<i class="bi bi-collection display-6"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-info text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h5 class="card-title">Active Players</h5>
<h2>{{ active_players }}</h2>
</div>
<div class="align-self-center">
<i class="bi bi-play-circle display-6"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-warning text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h5 class="card-title">Total Content</h5>
<h2>{{ total_content }}</h2>
</div>
<div class="align-self-center">
<i class="bi bi-file-earmark-play display-6"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<!-- Players Section -->
<div class="col-md-6 mb-4">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5><i class="bi bi-display"></i> Players</h5>
{% if current_user.is_admin %}
<a href="{{ url_for('player.add') }}" class="btn btn-sm btn-outline-primary">
<i class="bi bi-plus"></i> Add Player
</a>
{% endif %}
</div>
<div class="card-body">
{% if players %}
{% for player in players %}
<div class="d-flex justify-content-between align-items-center p-2 border-bottom">
<div>
<h6 class="mb-1">{{ player.username }}</h6>
<small class="text-muted">{{ player.hostname }}</small>
{% if player.is_locked_to_group %}
<span class="badge bg-info ms-2">Locked to Group</span>
{% endif %}
</div>
<div>
<span class="badge bg-{{ 'success' if player.is_active else 'secondary' }}">
{{ 'Online' if player.is_active else 'Offline' }}
</span>
<div class="btn-group btn-group-sm ms-2">
<a href="{{ url_for('player.view', player_id=player.id) }}"
class="btn btn-outline-secondary" title="View">
<i class="bi bi-eye"></i>
</a>
<a href="{{ url_for('player.fullscreen', player_id=player.id) }}"
class="btn btn-outline-primary" title="Fullscreen" target="_blank">
<i class="bi bi-arrows-fullscreen"></i>
</a>
</div>
</div>
</div>
{% endfor %}
{% else %}
<div class="text-center text-muted py-4">
<i class="bi bi-display display-1"></i>
<p class="mt-2">No players configured yet</p>
{% if current_user.is_admin %}
<a href="{{ url_for('player.add') }}" class="btn btn-primary">
Add Your First Player
</a>
{% endif %}
</div>
{% endif %}
</div>
</div>
</div>
<!-- Groups Section -->
<div class="col-md-6 mb-4">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5><i class="bi bi-collection"></i> Groups</h5>
{% if current_user.is_admin %}
<a href="{{ url_for('group.create') }}" class="btn btn-sm btn-outline-primary">
<i class="bi bi-plus"></i> Create Group
</a>
{% endif %}
</div>
<div class="card-body">
{% if groups %}
{% for group in groups %}
<div class="d-flex justify-content-between align-items-center p-2 border-bottom">
<div>
<h6 class="mb-1">{{ group.name }}</h6>
<small class="text-muted">{{ group.player_count }} players</small>
</div>
<div class="btn-group btn-group-sm">
{% if current_user.is_admin %}
<a href="{{ url_for('group.manage', group_id=group.id) }}"
class="btn btn-outline-secondary" title="Manage">
<i class="bi bi-gear"></i>
</a>
{% endif %}
<a href="{{ url_for('group.fullscreen', group_id=group.id) }}"
class="btn btn-outline-primary" title="Fullscreen" target="_blank">
<i class="bi bi-arrows-fullscreen"></i>
</a>
</div>
</div>
{% endfor %}
{% else %}
<div class="text-center text-muted py-4">
<i class="bi bi-collection display-1"></i>
<p class="mt-2">No groups created yet</p>
{% if current_user.is_admin %}
<a href="{{ url_for('group.create') }}" class="btn btn-primary">
Create Your First Group
</a>
{% endif %}
</div>
{% endif %}
</div>
</div>
</div>
</div>
<!-- Server Logs -->
{% if current_user.is_admin and server_logs %}
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h5><i class="bi bi-journal-text"></i> Recent Server Logs</h5>
</div>
<div class="card-body">
<div class="table-responsive" style="max-height: 300px; overflow-y: auto;">
<table class="table table-sm">
<thead>
<tr>
<th>Time</th>
<th>Action</th>
<th>User</th>
<th>Level</th>
</tr>
</thead>
<tbody>
{% for log in server_logs %}
<tr class="log-entry">
<td class="text-nowrap">{{ log.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}</td>
<td>{{ log.action }}</td>
<td>{{ log.user.username if log.user else '-' }}</td>
<td>
<span class="badge bg-{{ 'danger' if log.level == 'ERROR' else 'warning' if log.level == 'WARNING' else 'info' }}">
{{ log.level }}
</span>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
{% endif %}
</div>
{% endblock %}