80 lines
3.7 KiB
HTML
80 lines
3.7 KiB
HTML
{# ── Bulk-action toolbar for the issues list ──────────────────────────────────
|
|
Included by BOTH issues/list.html and modern/issues/list.html — edit here,
|
|
not in either copy.
|
|
|
|
The form lives OUTSIDE the table on purpose. Row checkboxes join it with the
|
|
HTML5 `form="issuesBulkForm"` attribute instead of being wrapped by it, so
|
|
the per-row delete / unfollow forms inside the table are never nested inside
|
|
this one (rule 9 — browsers silently discard nested forms, and the row
|
|
actions would stop working with no error).
|
|
|
|
`next` carries the current filtered list URL so the action returns here
|
|
rather than to the bare index.
|
|
|
|
Requires from the view: `staff` (assignable users).
|
|
#}
|
|
{% set can_manage = current_user.role in ['admin', 'director', 'auditor'] %}
|
|
{% set can_delete = current_user.role in ['admin', 'director'] %}
|
|
{% if can_manage or can_delete %}
|
|
<form method="POST" id="issuesBulkForm"
|
|
action="{{ url_for('issues.bulk_action') }}"
|
|
class="border-bottom bg-light px-3 py-2">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
|
<input type="hidden" name="next" value="{{ current_url() }}">
|
|
|
|
<div class="d-flex flex-wrap align-items-center gap-2">
|
|
<span class="small fw-semibold text-nowrap">
|
|
<span class="bulk-count">0</span> selected
|
|
</span>
|
|
<span class="text-muted small d-none d-md-inline">|</span>
|
|
|
|
{% if can_manage %}
|
|
<div class="d-flex align-items-center gap-1">
|
|
<select name="assigned_to" class="form-select form-select-sm"
|
|
style="min-width:150px;font-size:.8rem;" aria-label="Assign selected to">
|
|
<option value="0">— Unassigned —</option>
|
|
{% for u in staff %}
|
|
<option value="{{ u.id }}">{{ u.display_name }}{{ ' (Customer)' if u.is_external_inspector }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
<button type="submit" name="action" value="assign"
|
|
class="btn btn-sm btn-outline-primary text-nowrap" data-bulk-action
|
|
data-bulk-confirm="Assign the selected issues to the chosen user?">
|
|
<i class="bi bi-person-check"></i> Assign
|
|
</button>
|
|
</div>
|
|
|
|
<div class="d-flex align-items-center gap-1">
|
|
<select name="status" class="form-select form-select-sm"
|
|
style="min-width:150px;font-size:.8rem;" aria-label="Set status of selected">
|
|
<option value="">— Set status… —</option>
|
|
<option value="open">Open</option>
|
|
<option value="in_progress">In Progress</option>
|
|
<option value="pending_verification">Pending Verification</option>
|
|
<option value="resolved">Resolved</option>
|
|
</select>
|
|
<button type="submit" name="action" value="status"
|
|
class="btn btn-sm btn-outline-primary text-nowrap" data-bulk-action
|
|
data-bulk-confirm="Change the status of the selected issues?">
|
|
<i class="bi bi-arrow-repeat"></i> Apply
|
|
</button>
|
|
</div>
|
|
|
|
<button type="submit" name="action" value="verify"
|
|
class="btn btn-sm btn-outline-success text-nowrap" data-bulk-action
|
|
data-bulk-confirm="Verify and close the selected issues? Issues that are not awaiting verification are skipped.">
|
|
<i class="bi bi-patch-check"></i> Verify & Close
|
|
</button>
|
|
{% endif %}
|
|
|
|
{% if can_delete %}
|
|
<button type="submit" name="action" value="delete"
|
|
class="btn btn-sm btn-outline-danger text-nowrap ms-auto" data-bulk-action
|
|
data-bulk-confirm="Permanently delete the selected issues and their photos? This cannot be undone.">
|
|
<i class="bi bi-trash"></i> Delete
|
|
</button>
|
|
{% endif %}
|
|
</div>
|
|
</form>
|
|
{% endif %}
|