/
Francuz
/
DailyPort
Обзор
Документация
Войти
/
Francuz
/
DailyPort
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/TaskStatus.php
166 строк
7 KB
Francuz
fix: API корректно передаёт row_num при добавлении статуса и позволяет обновлять только цвет
16 июн 2026, 19:42
16 июн 2026, 19:42
1d6d5a1
Код
Авторство
О чём код?
<?php /** * Класс TaskStatus — модель статуса задачи (столбец на канбан-доске). * * Статусы группируются по строкам (row_num) для визуальной организации: * - строка 1: Новые, В процессе, Тест * - строка 2: Завершённые, Отменённые * * Каждый статус имеет: * - name — название (отображается в заголовке столбца) * - color — цвет (для визуального выделения) * - sort_order — порядок внутри строки * - row_num — номер строки */ class TaskStatus { private Database $db; public function __construct(Database $db) { $this->db = $db; } /** * Получить все статусы страницы (плоский список). * * @param int $pageId ID страницы * @return array Статусы, отсортированные по строке и порядку */ public function getByProject(int $projectId): array { $projectId = $this->db->escape((string)$projectId); $result = $this->db->query("SELECT * FROM task_statuses WHERE project_id = $projectId ORDER BY row_num ASC, sort_order ASC"); return $result->fetch_all(MYSQLI_ASSOC); } public function getByPage(int $pageId): array { $pageId = $this->db->escape((string)$pageId); $result = $this->db->query("SELECT * FROM task_statuses WHERE page_id = $pageId ORDER BY row_num ASC, sort_order ASC"); return $result->fetch_all(MYSQLI_ASSOC); } /** * Получить статусы, сгруппированные по строкам. * * @param int $pageId ID страницы * @return array [row_num => [status, status, ...]] */ public function getGroupedByRow(int $pageId): array { $statuses = $this->getByPage($pageId); $grouped = []; foreach ($statuses as $s) { $grouped[$s['row_num']][] = $s; } ksort($grouped); return $grouped; } /** Найти статус по ID */ public function find(int $id): ?array { $id = $this->db->escape((string)$id); $result = $this->db->query("SELECT * FROM task_statuses WHERE id = $id"); return $result->fetch_assoc() ?: null; } /** * Создать новый статус. * * @param int $pageId ID страницы * @param string $name Название статуса * @param string $color Цвет (HEX, например #0d6efd) * @param int $rowNum Номер строки (по умолчанию 1) * @return int ID созданного статуса */ public function create(int $pageId, string $name, string $color = '#6c757d', int $rowNum = 1, ?int $projectId = null): int { $pageId = $this->db->escape((string)$pageId); $name = $this->db->escape($name); $color = $this->db->escape($color); $rowNum = $this->db->escape((string)$rowNum); $projectId = $projectId !== null ? $this->db->escape((string)$projectId) : 'NULL'; $maxOrder = $this->db->query("SELECT COALESCE(MAX(sort_order), 0) + 1 AS next_order FROM task_statuses WHERE page_id = $pageId AND row_num = $rowNum AND project_id = $projectId")->fetch_assoc(); $order = $maxOrder['next_order']; $this->db->query("INSERT INTO task_statuses (page_id, name, color, sort_order, row_num, project_id) VALUES ($pageId, '$name', '$color', $order, $rowNum, $projectId)"); return (int)$this->db->query("SELECT LAST_INSERT_ID() AS id")->fetch_assoc()['id']; } /** Обновить название и цвет статуса */ public function update(int $id, string $name = '', string $color = ''): bool { $id = $this->db->escape((string)$id); $sets = []; if ($name !== '') { $sets[] = "name = '" . $this->db->escape($name) . "'"; } if ($color !== '') { $sets[] = "color = '" . $this->db->escape($color) . "'"; } if (empty($sets)) return false; $this->db->query("UPDATE task_statuses SET " . implode(', ', $sets) . " WHERE id = $id"); return true; } /** * Переместить статус в другую строку. * * @param int $id ID статуса * @param int $rowNum Новый номер строки */ public function updateRow(int $id, int $rowNum): bool { $id = $this->db->escape((string)$id); $rowNum = $this->db->escape((string)$rowNum); $this->db->query("UPDATE task_statuses SET row_num = $rowNum WHERE id = $id"); return true; } /** Удалить статус (задачи с этим статусом НЕ удаляются каскадно) */ public function delete(int $id): bool { $id = $this->db->escape((string)$id); $this->db->query("DELETE FROM task_statuses WHERE id = $id"); return true; } /** Переместить статус в другую строку */ public function moveToRow(int $id, int $newRowNum): bool { $id = $this->db->escape((string)$id); $newRowNum = $this->db->escape((string)$newRowNum); $this->db->query("UPDATE task_statuses SET row_num = $newRowNum WHERE id = $id"); return true; } /** Обновить порядок статусов в строке */ public function updateSortOrder(array $orderedIds): bool { foreach ($orderedIds as $position => $id) { $id = $this->db->escape((string)$id); $this->db->query("UPDATE task_statuses SET sort_order = $position WHERE id = $id"); } return true; } /** * Создать дефолтные статусы для новой таск-страницы. * * Статусы распределяются по строкам: * - строка 1: Новые (#0d6efd), В процессе (#ffc107), Тест (#17a2b8) * - строка 2: Завершённые (#28a745), Отменённые (#dc3545) */ public function createDefaults(int $pageId): void { $defaults = [ ['Новые', '#0d6efd'], ['В процессе', '#ffc107'], ['Тест', '#17a2b8'], ['Завершённые', '#28a745'], ['Отменённые', '#dc3545'], ]; foreach ($defaults as $i => [$name, $color]) { $this->create($pageId, $name, $color); } } }