| {% extends "admin/base.html" %} | |
| {% block admin_content %} | |
| <div class="admin-header"> | |
| <div class="admin-title">User Details</div> | |
| <a href="{{ url_for('admin.users') }}" class="btn-secondary">Back to Users</a> | |
| </div> | |
| <div class="admin-card"> | |
| <div class="admin-card-header"> | |
| <div class="admin-card-title">User Information</div> | |
| </div> | |
| <div class="user-info"> | |
| <div class="user-detail-row"> | |
| <div class="user-detail-label">Username:</div> | |
| <div class="user-detail-value">{{ user.username }}</div> | |
| </div> | |
| <div class="user-detail-row"> | |
| <div class="user-detail-label">Hugging Face ID:</div> | |
| <div class="user-detail-value">{{ user.hf_id }}</div> | |
| </div> | |
| <div class="user-detail-row"> | |
| <div class="user-detail-label">Join Date:</div> | |
| <div class="user-detail-value">{{ user.join_date.strftime('%Y-%m-%d %H:%M:%S') }}</div> | |
| </div> | |
| </div> | |
| <div class="user-stats"> | |
| <div class="stat-card"> | |
| <div class="stat-title">Total Votes</div> | |
| <div class="stat-value">{{ total_votes }}</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-title">TTS Votes</div> | |
| <div class="stat-value">{{ tts_votes }}</div> | |
| </div> | |
| <div class="stat-card"> | |
| <div class="stat-title">Conversational Votes</div> | |
| <div class="stat-value">{{ conversational_votes }}</div> | |
| </div> | |
| </div> | |
| </div> | |
| {% if favorite_models %} | |
| <div class="admin-card"> | |
| <div class="admin-card-header"> | |
| <div class="admin-card-title">Favorite Models</div> | |
| </div> | |
| <div class="table-responsive"> | |
| <table class="admin-table"> | |
| <thead> | |
| <tr> | |
| <th>Model</th> | |
| <th>Votes</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| {% for model in favorite_models %} | |
| <tr> | |
| <td>{{ model.name }}</td> | |
| <td>{{ model.count }}</td> | |
| </tr> | |
| {% endfor %} | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| {% endif %} | |
| {% if recent_votes %} | |
| <div class="admin-card"> | |
| <div class="admin-card-header"> | |
| <div class="admin-card-title">Recent Votes</div> | |
| </div> | |
| <div class="table-responsive"> | |
| <table class="admin-table"> | |
| <thead> | |
| <tr> | |
| <th>Date</th> | |
| <th>Type</th> | |
| <th>Chosen Model</th> | |
| <th>Rejected Model</th> | |
| <th>Text</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| {% for vote in recent_votes %} | |
| <tr> | |
| <td>{{ vote.vote_date.strftime('%Y-%m-%d %H:%M') }}</td> | |
| <td>{{ vote.model_type }}</td> | |
| <td>{{ vote.chosen.name }}</td> | |
| <td>{{ vote.rejected.name }}</td> | |
| <td> | |
| <div class="text-truncate" title="{{ vote.text }}"> | |
| {{ vote.text }} | |
| </div> | |
| </td> | |
| </tr> | |
| {% endfor %} | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| {% endif %} | |
| <style> | |
| .user-detail-row { | |
| display: flex; | |
| margin-bottom: 10px; | |
| } | |
| .user-detail-label { | |
| font-weight: 600; | |
| min-width: 150px; | |
| } | |
| .user-detail-value { | |
| flex: 1; | |
| } | |
| .user-stats { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); | |
| gap: 16px; | |
| margin-top: 24px; | |
| } | |
| .text-truncate { | |
| max-width: 300px; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| @media (max-width: 576px) { | |
| .user-detail-row { | |
| flex-direction: column; | |
| } | |
| .user-detail-label { | |
| margin-bottom: 4px; | |
| } | |
| } | |
| </style> | |
| {% endblock %} |