diff --git a/web/src/components/RealtimeTable/contexts/RealtimeContext.js b/web/src/components/RealtimeTable/contexts/RealtimeContext.js index c56e894..cce0cb6 100644 --- a/web/src/components/RealtimeTable/contexts/RealtimeContext.js +++ b/web/src/components/RealtimeTable/contexts/RealtimeContext.js @@ -1,6 +1,7 @@ import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'; import { toast } from 'react-toastify'; import { useWebSocket } from '../hooks/useWebSocket'; +import { buildCellUpdatedMessage } from '../utils/messageUtils'; import { getRowId } from '../utils/rowUtils'; const RealtimeActionsContext = createContext(null); @@ -310,15 +311,7 @@ export const RealtimeProvider = ({ children, formId, sheetName, direction, year, const lineId = getRowId(row); const columnKey = getColumnRequestKey(column); - const message = { - event: 'cell_updated', - data: { - line_id: lineId, - line_id_code: row.id, - column: columnKey, - value: value, - }, - }; + const message = buildCellUpdatedMessage({ lineId, lineIdCode: row.id, column: columnKey, value }); const sent = sendMessage(message); if (!sent) { diff --git a/web/src/components/RealtimeTable/utils/messageUtils.js b/web/src/components/RealtimeTable/utils/messageUtils.js new file mode 100644 index 0000000..5e305ed --- /dev/null +++ b/web/src/components/RealtimeTable/utils/messageUtils.js @@ -0,0 +1,10 @@ +// value всегда присутствует: сервер читает event_data["value"], AURORA-1848 D5.2 +export const buildCellUpdatedMessage = ({ lineId, lineIdCode, column, value }) => ({ + event: 'cell_updated', + data: { + line_id: lineId, + line_id_code: lineIdCode, + column, + value: value === undefined ? null : value, + }, +}); diff --git a/web/src/components/RealtimeTable/utils/messageUtils.test.js b/web/src/components/RealtimeTable/utils/messageUtils.test.js new file mode 100644 index 0000000..2e7bb6c --- /dev/null +++ b/web/src/components/RealtimeTable/utils/messageUtils.test.js @@ -0,0 +1,17 @@ +import assert from 'node:assert/strict'; +import { test } from 'node:test'; +import { buildCellUpdatedMessage } from './messageUtils.js'; + +const msg = (value) => buildCellUpdatedMessage({ lineId: 1, lineIdCode: '0.1', column: 'q1.m1', value }); + +test('buildCellUpdatedMessage: undefined → null, ключ value есть после JSON.stringify', () => { + const m = msg(undefined); + assert.deepEqual(m, { event: 'cell_updated', data: { line_id: 1, line_id_code: '0.1', column: 'q1.m1', value: null } }); + assert.match(JSON.stringify(m), /"value":null/); +}); + +test('buildCellUpdatedMessage: прочие значения не меняются', () => { + for (const v of [null, 0, '', '1.5', 42, 'текст']) { + assert.equal(msg(v).data.value, v); + } +});