Админка, настройки, логин, кабинеты преподавателя и студента полностью переведены на React 19 (модель strangler, docs/REACT_MIGRATION.md). - 15 вкладок админки: lazy-загрузка, общий error boundary, сервисный слой - Удалены legacy-views и переходный слой LegacyTabView (45 файлов) - Сборка esbuild (frontend/scripts/build-react.mjs) с бюджетами gzip на чанки - CSP-хэши, кэширование: chunk'и immutable, CSS/HTML no-cache (react-cache.conf) - Фиксы: lazy-импорт именованных экспортов (краш после авторизации), растяжение #admin-root/#settings-root на всю ширину, возврат subjects/lessonTypes из справочников (краш просмотра расписаний), отказ от заведомо широкого поиска расписания без выбранной цели, центрирование карточки логина - Тесты: 237/237 (npm run check), регрессионные на lazy-вкладки и ширину - Документация: REACT_MIGRATION.md, REACT_MIGRATION_RESULT.md, FRONTEND.md
34 lines
1.4 KiB
JavaScript
34 lines
1.4 KiB
JavaScript
import assert from 'node:assert/strict';
|
||
import test from 'node:test';
|
||
import { readFile } from 'node:fs/promises';
|
||
|
||
import { calculateVisualContextMenuPosition } from '../react/admin/schedule-service.js';
|
||
|
||
test('меню пары открывается справа от кнопки с тремя точками', () => {
|
||
assert.deepEqual(calculateVisualContextMenuPosition({
|
||
anchorRect: { left: 100, right: 120, top: 80, bottom: 100 },
|
||
menuWidth: 220,
|
||
menuHeight: 120,
|
||
viewportWidth: 1280,
|
||
viewportHeight: 720
|
||
}), { left: 128, top: 80 });
|
||
});
|
||
|
||
test('у края экрана меню раскрывается влево и остаётся в viewport', () => {
|
||
assert.deepEqual(calculateVisualContextMenuPosition({
|
||
anchorRect: { left: 1240, right: 1260, top: 680, bottom: 700 },
|
||
menuWidth: 220,
|
||
menuHeight: 160,
|
||
viewportWidth: 1280,
|
||
viewportHeight: 720
|
||
}), { left: 1012, top: 540 });
|
||
});
|
||
|
||
test('контекстное меню больше не центрируется стилями', async () => {
|
||
const styles = await readFile(new URL('../admin/css/components.css', import.meta.url), 'utf8');
|
||
const menuRule = styles.match(/\.schedule-visual-context-menu\s*\{([\s\S]*?)\}/)?.[1] || '';
|
||
|
||
assert.doesNotMatch(menuRule, /translate\(-50%,\s*-50%\)/);
|
||
assert.match(menuRule, /position:\s*fixed/);
|
||
});
|