Feature 5: Implement Bulk Actions (Admin Only)

Add comprehensive bulk operations system for admins:

- Created BulkOperationsModel.php with operation tracking and processing
- Added bulk_operation.php API endpoint for bulk operations
- Created get_users.php API endpoint for user dropdown in bulk assign
- Updated DashboardView.php with checkboxes and bulk actions toolbar
- Added JavaScript functions for:
  - Select all/clear selection
  - Bulk close tickets
  - Bulk assign tickets
  - Bulk change priority
- Added comprehensive CSS for bulk actions toolbar and modals
- All bulk operations are admin-only (enforced server-side)
- Operations tracked in bulk_operations table with audit logging
- Supports bulk_close, bulk_assign, and bulk_priority operations

Admins can now select multiple tickets and perform batch operations, significantly improving workflow efficiency.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-01 19:06:33 -05:00
parent 353ce83a36
commit ac094c8706
6 changed files with 751 additions and 2 deletions

View File

@@ -173,9 +173,26 @@
</div>
</div>
<?php if ($GLOBALS['currentUser']['is_admin'] ?? false): ?>
<div class="bulk-actions-toolbar" style="display: none;">
<div class="bulk-actions-info">
<span id="selected-count">0</span> tickets selected
</div>
<div class="bulk-actions-buttons">
<button onclick="bulkClose()" class="btn btn-bulk">Close Selected</button>
<button onclick="showBulkAssignModal()" class="btn btn-bulk">Assign Selected</button>
<button onclick="showBulkPriorityModal()" class="btn btn-bulk">Change Priority</button>
<button onclick="clearSelection()" class="btn btn-secondary">Clear Selection</button>
</div>
</div>
<?php endif; ?>
<table>
<thead>
<tr>
<?php if ($GLOBALS['currentUser']['is_admin'] ?? false): ?>
<th style="width: 40px;"><input type="checkbox" id="selectAllCheckbox" onclick="toggleSelectAll()"></th>
<?php endif; ?>
<?php
$currentSort = isset($_GET['sort']) ? $_GET['sort'] : 'ticket_id';
$currentDir = isset($_GET['dir']) ? $_GET['dir'] : 'desc';
@@ -209,6 +226,12 @@
foreach($tickets as $row) {
$creator = $row['creator_display_name'] ?? $row['creator_username'] ?? 'System';
echo "<tr class='priority-{$row['priority']}'>";
// Add checkbox column for admins
if ($GLOBALS['currentUser']['is_admin'] ?? false) {
echo "<td><input type='checkbox' class='ticket-checkbox' value='{$row['ticket_id']}' onchange='updateSelectionCount()'></td>";
}
echo "<td><a href='/ticket/{$row['ticket_id']}' class='ticket-link'>{$row['ticket_id']}</a></td>";
echo "<td><span>{$row['priority']}</span></td>";
echo "<td>" . htmlspecialchars($row['title']) . "</td>";
@@ -221,7 +244,8 @@
echo "</tr>";
}
} else {
echo "<tr><td colspan='9'>No tickets found</td></tr>";
$colspan = ($GLOBALS['currentUser']['is_admin'] ?? false) ? '10' : '9';
echo "<tr><td colspan='$colspan'>No tickets found</td></tr>";
}
?>
</tbody>