Режимы отображения
List, Flow и Grid — как работает каждый режим отображения блоков
Каждый контейнерный блок может отображать своих дочерних блоков в одном из трёх режимов. Режим выбирается пользователем и хранится в поле layoutData.mode родительского блока.
Система запоминает настройки для всех трёх режимов одновременно. При переключении между режимами позиции и настройки каждого сохраняются — ничего не теряется.
Ключевое правило: родительский контроль
Позиции дочерних блоков (где они находятся на полотне) хранятся в родительском блоке в поле layoutData, а не в самих дочерних блоках. Дочерние блоки ничего не знают о своём расположении.
При изменении позиции — запрос идёт к родителю, а не к дочернему блоку.
List
Простой вертикальный список. Блоки расположены один под другим в заданном порядке.
Когда использовать: задачи, заметки, линейные документы, todo-листы.
Компонент: BlockList
Перестановка блоков — drag & drop по вертикали, обновляет массив order.
Flow
Свободное холст-позиционирование на базе React Flow. Блоки можно свободно перемещать, соединять стрелками, зумировать.
Когда использовать: майндмэпы, связи между концепциями, диаграммы зависимостей, brainstorming.
Компонент: BlockFlowView
Компонент BlockFlowView инкапсулирует только логику React Flow. Вся остальная логика (загрузка данных, сохранение позиций, управление блоками) передаётся через пропсы снаружи.
Grid
Сетка с настраиваемыми размерами на базе react-grid-layout. Каждый блок занимает прямоугольную область, размер которой можно менять перетаскиванием.
Когда использовать: дашборды, рабочие столы, виджеты с разными размерами.
Компонент: BlockGrid
Хук: useGridEditMode
Поле i в каждом элементе — это ID блока.
Режим редактирования Grid
По умолчанию Grid работает в режиме просмотра. Для изменения позиций нужно включить режим редактирования через useGridEditMode:
В режиме редактирования блоки можно перетаскивать и изменять размер. При выходе из режима изменения сохраняются.
Переключение режимов
useViewSettings автоматически сохраняет выбранный режим и синхронизирует его между вкладками браузера.
Правила разработки компонентов режимов
- Изоляция библиотеки — компонент режима работает только с логикой своей библиотеки (ReactFlow, GridLayout). Всё остальное — через пропсы.
- Никакой бизнес-логики — никаких
useEffectс данными, никакого прямого обращения к API. - Простота — максимум 300–400 строк на компонент.