fix(realtime): пустая правка уходит как value: null, а не без ключа (AURORA-1848)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
b0e11d1cd0
commit
a5282f1c86
@ -1,6 +1,7 @@
|
|||||||
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
|
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
|
||||||
import { toast } from 'react-toastify';
|
import { toast } from 'react-toastify';
|
||||||
import { useWebSocket } from '../hooks/useWebSocket';
|
import { useWebSocket } from '../hooks/useWebSocket';
|
||||||
|
import { buildCellUpdatedMessage } from '../utils/messageUtils';
|
||||||
import { getRowId } from '../utils/rowUtils';
|
import { getRowId } from '../utils/rowUtils';
|
||||||
|
|
||||||
const RealtimeActionsContext = createContext(null);
|
const RealtimeActionsContext = createContext(null);
|
||||||
@ -310,15 +311,7 @@ export const RealtimeProvider = ({ children, formId, sheetName, direction, year,
|
|||||||
|
|
||||||
const lineId = getRowId(row);
|
const lineId = getRowId(row);
|
||||||
const columnKey = getColumnRequestKey(column);
|
const columnKey = getColumnRequestKey(column);
|
||||||
const message = {
|
const message = buildCellUpdatedMessage({ lineId, lineIdCode: row.id, column: columnKey, value });
|
||||||
event: 'cell_updated',
|
|
||||||
data: {
|
|
||||||
line_id: lineId,
|
|
||||||
line_id_code: row.id,
|
|
||||||
column: columnKey,
|
|
||||||
value: value,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
const sent = sendMessage(message);
|
const sent = sendMessage(message);
|
||||||
|
|
||||||
if (!sent) {
|
if (!sent) {
|
||||||
|
|||||||
10
web/src/components/RealtimeTable/utils/messageUtils.js
Normal file
10
web/src/components/RealtimeTable/utils/messageUtils.js
Normal file
@ -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,
|
||||||
|
},
|
||||||
|
});
|
||||||
17
web/src/components/RealtimeTable/utils/messageUtils.test.js
Normal file
17
web/src/components/RealtimeTable/utils/messageUtils.test.js
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
});
|
||||||
Loading…
x
Reference in New Issue
Block a user