235 lines
10 KiB
HTML
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 %}
|