feat(tasks): formatDeletionHint — текст подсказки пометки на удаление (AURORA-1882)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
5a91f35ab2
commit
f8d14194f9
22
web/src/utils/formatDeletionHint.js
Normal file
22
web/src/utils/formatDeletionHint.js
Normal 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(' — ');
|
||||
};
|
||||
35
web/src/utils/formatDeletionHint.test.js
Normal file
35
web/src/utils/formatDeletionHint.test.js
Normal 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');
|
||||
});
|
||||
Loading…
x
Reference in New Issue
Block a user