// Ключ явного сброса мемоизации ячеек MRT (memoMode: 'cells') в таблице листа. // Обоснование и контракт: openspec/changes/aurora-1839-cell-memo/ (design.md D1, D2; specs/sheet-table; после архивации — openspec/specs/sheet-table/spec.md). // Новое состояние, которое меняет определения колонок или стили закрепления, добавляется сюда и в cellMemoReset.test.js. const getPinnedSide = (ids, columnVisibility, columnSizing) => (ids ?? []).filter((id) => columnVisibility?.[id] !== false).map((id) => [id, columnSizing?.[id] ?? null]); // left закреплённой колонки — сумма ширин закреплённых левее, поэтому в ключ входят только // видимые закреплённые колонки и их ширины. Незакреплённые колонки меняют ширину через CSS-переменные MRT. export const getPinnedLayoutKey = ({ columnPinning, columnVisibility, columnSizing }) => JSON.stringify([ getPinnedSide(columnPinning?.left, columnVisibility, columnSizing), getPinnedSide(columnPinning?.right, columnVisibility, columnSizing), ]); // Порядок фильтров в массиве не важен: пары сортируются по id. Значение диапазона — массив [min, max]. export const getFilterResetKey = ({ globalFilter, columnFilters }) => { const filters = (columnFilters ?? []).map(({ id, value }) => [String(id), value ?? null]).sort(([a], [b]) => a.localeCompare(b)); return JSON.stringify([globalFilter ?? '', filters]); }; export const getCellMemoResetKey = (state) => JSON.stringify([getPinnedLayoutKey(state), getFilterResetKey(state)]); // Пока ширину тянут, ключ раскладки строится по ширинам на момент нажатия мыши: // сброс по ширине закреплённой колонки происходит один раз, по отпусканию (design.md, решение 3). export const pickSettledSizing = ({ previous, current, isResizing }) => (isResizing ? previous : current);