diff --git a/web/src/utils/formatDeletionHint.js b/web/src/utils/formatDeletionHint.js new file mode 100644 index 0000000..0583511 --- /dev/null +++ b/web/src/utils/formatDeletionHint.js @@ -0,0 +1,22 @@ +const pad = (n) => String(n).padStart(2, '0'); + +const formatDateTime = (value) => { + if (!value) return ''; + const d = new Date(value); + if (Number.isNaN(d.getTime())) return ''; + return `${pad(d.getDate())}.${pad(d.getMonth() + 1)}.${d.getFullYear()} ${pad(d.getHours())}:${pad(d.getMinutes())}`; +}; + +/** Текст подсказки для чипа «На удаление»: когда и кем задача отправлена на удаление. */ +export const formatDeletionHint = (task, usersById) => { + const parts = ['Отправлена на удаление']; + const when = formatDateTime(task?.deleted_at); + if (when) parts[0] += ` ${when}`; + const userId = task?.deleted_by; + if (userId !== null && userId !== undefined && userId !== '') { + const user = usersById?.[userId]; + const name = user?.full_name?.trim() || user?.username || `Пользователь #${userId}`; + parts.push(name); + } + return parts.join(' — '); +}; diff --git a/web/src/utils/formatDeletionHint.test.js b/web/src/utils/formatDeletionHint.test.js new file mode 100644 index 0000000..ad33e98 --- /dev/null +++ b/web/src/utils/formatDeletionHint.test.js @@ -0,0 +1,35 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { formatDeletionHint } from './formatDeletionHint.js'; + +const at = new Date(2026, 10, 5, 9, 7).toISOString(); +const users = { 7: { id: 7, full_name: ' Иванов Иван ', username: 'ivanov' } }; + +test('дата и ФИО', () => { + assert.equal( + formatDeletionHint({ deleted_at: at, deleted_by: 7 }, users), + 'Отправлена на удаление 05.11.2026 09:07 — Иванов Иван', + ); +}); + +test('без deleted_by', () => { + assert.equal(formatDeletionHint({ deleted_at: at, deleted_by: null }, users), 'Отправлена на удаление 05.11.2026 09:07'); +}); + +test('без deleted_at', () => { + assert.equal(formatDeletionHint({ deleted_by: 7 }, users), 'Отправлена на удаление — Иванов Иван'); +}); + +test('без даты и пользователя', () => { + assert.equal(formatDeletionHint({}, users), 'Отправлена на удаление'); + assert.equal(formatDeletionHint(null, null), 'Отправлена на удаление'); +}); + +test('deleted_by нет в справочнике', () => { + assert.equal(formatDeletionHint({ deleted_at: at, deleted_by: 99 }, users), 'Отправлена на удаление 05.11.2026 09:07 — Пользователь #99'); + assert.equal(formatDeletionHint({ deleted_by: 99 }, undefined), 'Отправлена на удаление — Пользователь #99'); +}); + +test('нет full_name — username; невалидная дата игнорируется', () => { + assert.equal(formatDeletionHint({ deleted_at: 'мусор', deleted_by: 8 }, { 8: { username: 'petrov' } }), 'Отправлена на удаление — petrov'); +});