6e2ad108de
После правки 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>
24 lines
1.1 KiB
TypeScript
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 МСК.`;
|
|
}
|