feat(tasks): formatDeletionHint — текст подсказки пометки на удаление (AURORA-1882)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-11-11 16:35:17 +04:00
parent 5a91f35ab2
commit f8d14194f9
2 changed files with 57 additions and 0 deletions

View File

@ -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(' — ');
};

View File

@ -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');
});