bump project
This commit is contained in:
48
app/templates/attendance/index.html
Normal file
48
app/templates/attendance/index.html
Normal file
@@ -0,0 +1,48 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Attendance · Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
<div>
|
||||
<p class="eyebrow">Reports</p>
|
||||
<h1>Attendance</h1>
|
||||
</div>
|
||||
{% if current_user.can_operate %}
|
||||
<a class="btn btn-primary" href="{{ url_for('attendance.kiosk') }}">Open kiosk</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<section class="content-section">
|
||||
{% if events %}
|
||||
<div class="table-responsive">
|
||||
<table class="table align-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Person</th>
|
||||
<th>Employee ID</th>
|
||||
<th>Type</th>
|
||||
<th>Time</th>
|
||||
<th>Source</th>
|
||||
<th>Recorded by</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for event in events %}
|
||||
<tr>
|
||||
<td><a href="{{ url_for('people.detail', person_id=event.person.id) }}">{{ event.person.full_name }}</a></td>
|
||||
<td>{{ event.person.employee_id }}</td>
|
||||
<td><span class="badge text-bg-{{ 'success' if event.event_type == 'check_in' else 'warning' }}">{{ event.type_label }}</span></td>
|
||||
<td>{{ event.occurred_at.strftime("%Y-%m-%d %H:%M") }}</td>
|
||||
<td>{{ event.source }}</td>
|
||||
<td>{{ event.created_by.full_name if event.created_by else "System" }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="empty-state">No attendance has been recorded yet.</div>
|
||||
{% endif %}
|
||||
</section>
|
||||
{% endblock %}
|
||||
39
app/templates/attendance/kiosk.html
Normal file
39
app/templates/attendance/kiosk.html
Normal file
@@ -0,0 +1,39 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Kiosk · Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
<div>
|
||||
<p class="eyebrow">Recognition</p>
|
||||
<h1>Attendance kiosk</h1>
|
||||
</div>
|
||||
<a class="btn btn-outline-secondary" href="{{ url_for('attendance.index') }}">Reports</a>
|
||||
</div>
|
||||
|
||||
<div class="kiosk-grid" data-identify-url="{{ url_for('recognition.identify') }}" data-record-url="{{ url_for('attendance.create_event') }}">
|
||||
<section class="camera-panel">
|
||||
<div class="camera-frame">
|
||||
<video id="cameraStream" autoplay playsinline muted></video>
|
||||
<img id="snapshotPreview" alt="Processed camera snapshot">
|
||||
<canvas id="snapshotCanvas"></canvas>
|
||||
</div>
|
||||
<div class="camera-actions">
|
||||
<button class="btn btn-outline-secondary" id="startCamera" type="button">Start camera</button>
|
||||
<button class="btn btn-primary" id="capturePhoto" type="button" disabled>Capture and identify</button>
|
||||
</div>
|
||||
<p class="text-secondary small mb-0" id="cameraStatus">Camera is not active.</p>
|
||||
</section>
|
||||
|
||||
<section class="content-section result-panel">
|
||||
<h2>Recognition results</h2>
|
||||
<div id="recognitionResults" class="result-list">
|
||||
<div class="empty-state">Capture a face to see matching people.</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script src="{{ url_for('static', filename='js/kiosk.js') }}"></script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user