Files
portal/app/resources/js/composables/appliesFromMessage.ts
T
Дмитрий 6e2ad108de feat(slepok): Task 2.11 UI — applies_from toast «вступит в силу N.21:00 МСК»
После правки slepok-чувствительных полей проекта (regions / delivery_days_mask /
daily_limit_target / источник) backend возвращает ProjectResource.applies_from
= N.21:00 МСК (Task 2.11 backend slice, commit dd5954d8). Клиент Лидерры
теперь видит расширенный тост: «Сохранено. Изменения вступят в силу
DD.MM.YYYY в 21:00 МСК.» Когда правка не затронула slepok — обычное
«Сохранено.».

Изменения:
- composables/appliesFromMessage.ts — чистый форматтер (Moscow tz, не локаль клиента).
- ProjectDetailsDrawer / NewProjectDialog / EditProjectDialog — emit('saved', appliesFrom).
- ProjectsView — v-snackbar + onSaved/onDrawerSaved обработчики.
- tests/Frontend/appliesFromMessage.spec.ts — 5 invariant-кейсов.

Plan §Task 2.11 Step 5-6. Spec §4.2.5 UX block. R-15 + R-06..R-08 UX closure.
Vitest worktree-only 944/3sk GREEN, vue-tsc 3 pre-existing errors (вне диффа),
ESLint clean на затронутых файлах.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 09:52:42 +03:00

24 lines
1.1 KiB
TypeScript

/**
* Форматирует сообщение для тоста после сохранения slepok-чувствительных
* правок проекта.
*
* Бизнес-инвариант: applies_from = N.21:00 МСК — час, когда поставщик
* фиксирует свой slepok (см. docs/superpowers/specs/2026-05-26-slepok-routing-protection-design.md).
* Поэтому в UI всегда показываем «21:00 МСК», а календарную дату берём
* по часовому поясу Москвы — независимо от локали браузера клиента.
*/
const moscowDateFmt = new Intl.DateTimeFormat('ru-RU', {
timeZone: 'Europe/Moscow',
day: '2-digit',
month: '2-digit',
year: 'numeric',
});
export function formatAppliesFromMessage(appliesFrom: string | null | undefined): string {
if (!appliesFrom) {
return 'Сохранено.';
}
const date = moscowDateFmt.format(new Date(appliesFrom));
return `Сохранено. Изменения вступят в силу ${date} в 21:00 МСК.`;
}