60 lines
3.6 KiB
HTML
60 lines
3.6 KiB
HTML
{% extends "page.html" %}
|
|
{% block page_content %}
|
|
<div class="card">
|
|
<div class="card-header"><h2>Назначение сотрудников</h2>
|
|
<button class="btn btn-primary btn-sm" onclick="document.getElementById('modal-assignment').classList.add('open')">+ Назначить</button>
|
|
</div>
|
|
<div class="table-wrap"><table><thead><tr><th>Объект</th><th>Сотрудник</th><th>Роль</th><th>Назначен</th><th class="actions"></th></tr></thead>
|
|
<tbody>{% for a in assignments %}<tr>
|
|
<td>{{ a.object.name if a.object else '' }}</td><td>{{ a.user.full_name if a.user else '' }}</td>
|
|
<td><span class="badge badge-{{ a.role }}">{{ {'engineer':'Инженер','technician':'Техник'}[a.role] }}</span></td>
|
|
<td>{{ a.assigned_at.strftime('%d.%m.%Y %H:%M') if a.assigned_at else '' }}</td>
|
|
<td class="actions">
|
|
<button class="btn btn-danger btn-sm" onclick="openConfirmUnassign({{ a.id }},'{{ (a.user.full_name if a.user else '')|e }}','{{ (a.object.name if a.object else '')|e }}')" title="Отвязать">✕</button>
|
|
</td>
|
|
</tr>{% endfor %}</tbody></table>
|
|
</div>
|
|
</div>
|
|
<div class="modal-overlay" id="modal-assignment"><div class="modal">
|
|
<button type="button" class="modal-close" onclick="this.closest('.modal-overlay').classList.remove('open')">✕</button>
|
|
<h2>Новое назначение</h2>
|
|
<form method="post" action="/service/assignments/create">
|
|
<div class="form-group"><label>Объект</label><select name="object_id" required>{% for o in objects %}<option value="{{ o.id }}">{{ o.name }}</option>{% endfor %}</select></div>
|
|
<div class="form-group"><label>Сотрудник</label><select name="user_id" required>{% for u in users %}<option value="{{ u.id }}">{{ u.full_name }} ({{ u.role }})</option>{% endfor %}</select></div>
|
|
<div class="form-actions"><button type="submit" class="btn btn-primary">Назначить</button>
|
|
<button type="button" class="btn" onclick="this.closest('.modal-overlay').classList.remove('open')">Отмена</button></div>
|
|
</form>
|
|
</div></div>
|
|
<div class="modal-overlay" id="confirm-unassign">
|
|
<div class="modal" style="max-width:420px;">
|
|
<h2 style="font-size:16px;margin-bottom:8px;">Отвязать сотрудника?</h2>
|
|
<p style="color:var(--text-secondary);font-size:14px;margin-bottom:20px;">
|
|
Назначение <strong id="unassign-info"></strong> будет удалено. Это действие нельзя отменить.
|
|
</p>
|
|
<div class="form-actions" style="justify-content:flex-end;">
|
|
<button type="button" class="btn btn-danger" onclick="confirmUnassign()">Отвязать</button>
|
|
<button type="button" class="btn" onclick="document.getElementById('confirm-unassign').classList.remove('open')">Отмена</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script>
|
|
var unassignId = null;
|
|
function openConfirmUnassign(id, userName, objectName){
|
|
unassignId = id;
|
|
document.getElementById('unassign-info').textContent = userName + ' → ' + objectName;
|
|
document.getElementById('confirm-unassign').classList.add('open');
|
|
}
|
|
function confirmUnassign(){
|
|
if(!unassignId) return;
|
|
var form = document.createElement('form');
|
|
form.method = 'POST';
|
|
form.action = '/service/assignments/unassign';
|
|
var input = document.createElement('input');
|
|
input.type = 'hidden'; input.name = 'id'; input.value = unassignId;
|
|
form.appendChild(input);
|
|
document.body.appendChild(form);
|
|
form.submit();
|
|
}
|
|
</script>
|
|
{% endblock %}
|