$filters['status'] ?? '', 'priority' => $filters['priority'] ?? '', 'assignee_id' => $filters['assignee_id'] ?? '', 'search' => $filters['search'] ?? '', ]; $tableUrl = $baseUrl . '?view=table'; $kanbanUrl = $baseUrl . '?view=kanban'; $cardsUrl = $baseUrl . '?view=cards'; $deadlineRank = function (array $task): int { $deadline = taskDeadlineState($task['planned_at'] ?? null, $task['status'] ?? null); return match ($deadline['code'] ?? '') { 'red' => 1, 'yellow' => 2, 'green' => 3, default => 4, }; }; usort($tasks, function (array $a, array $b) use ($deadlineRank): int { $rankA = $deadlineRank($a); $rankB = $deadlineRank($b); if ($rankA !== $rankB) { return $rankA <=> $rankB; } return strtotime((string)($a['planned_at'] ?? '9999-12-31')) <=> strtotime((string)($b['planned_at'] ?? '9999-12-31')); }); if (!empty($columns)) { foreach ($columns as $statusCode => $column) { usort($columns[$statusCode]['tasks'], function (array $a, array $b) use ($deadlineRank): int { $rankA = $deadlineRank($a); $rankB = $deadlineRank($b); if ($rankA !== $rankB) { return $rankA <=> $rankB; } return strtotime((string)($a['planned_at'] ?? '9999-12-31')) <=> strtotime((string)($b['planned_at'] ?? '9999-12-31')); }); } } ?>

Всего: Новые: В работе: На проверке: Завершено: Просрочено:
Код:
Таблица Канбан Плитки + Новая задача
Сбросить
0 && $lastCommentId > $lastReadCommentId; $badgeClass = $isUnread ? 'bg-primary' : 'bg-secondary'; $statusClass = match ($task['status']) { 'NEW' => 'bg-secondary', 'IN_PROGRESS' => 'bg-primary', 'REVIEW' => 'bg-warning text-dark', 'DONE' => 'bg-success', 'CANCELED' => 'bg-dark', 'OVERDUE' => 'bg-danger', default => 'bg-secondary', }; $priorityClass = match ($task['priority']) { 'LOW' => 'bg-light text-dark', 'MEDIUM' => 'bg-secondary', 'HIGH' => 'bg-warning text-dark', 'CRITICAL' => 'bg-danger', default => 'bg-secondary', }; ?>
ID CRM ID Постановщик Ответственный Наименование Статус Приоритет Комментарии Дата план
Нет задач
0 && $lastCommentId > $lastReadCommentId; $statusBadgeClass = match ($task['status']) { 'NEW' => 'bg-secondary text-white', 'IN_PROGRESS' => 'bg-info text-white', 'REVIEW' => 'bg-warning text-dark', 'DONE' => 'bg-success text-white', 'CANCELED' => 'bg-dark text-white', 'OVERDUE' => 'bg-danger text-white', default => 'bg-secondary text-white', }; $cardBorderClass = match ($task['status']) { 'NEW' => 'border-secondary', 'IN_PROGRESS' => 'border-info', 'REVIEW' => 'border-warning', 'DONE' => 'border-success', 'CANCELED' => 'border-dark', 'OVERDUE' => 'border-danger', default => 'border-secondary', }; $priorityClass = match ($task['priority']) { 'LOW' => 'bg-light text-dark', 'MEDIUM' => 'bg-primary text-white', 'HIGH' => 'bg-warning text-dark', 'CRITICAL' => 'bg-danger text-white', default => 'bg-primary text-white', }; ?>

Постановщик:
Ответственный:
Поставщик:
Дата план:
Дата факт:
Дата постановки:
Приоритет:
Нет задач
$column): ?>
Нет задач
0 && $lastCommentId > $lastReadCommentId; $badgeClass = $isUnread ? 'bg-primary' : 'bg-secondary'; $priorityClass = match ($task['priority']) { 'LOW' => 'text-bg-light', 'MEDIUM' => 'text-bg-secondary', 'HIGH' => 'text-bg-warning', 'CRITICAL' => 'text-bg-danger', default => 'text-bg-secondary', }; $isDone = (($task['status'] ?? '') === 'DONE'); ?>
CRM:
Постановщик:
Ответственный:
Дата план:
Комментарии:
Редактирование доски:

>
>

>

Кастомных полей пока нет