Compare commits

..

No commits in common. "79bf3231b943332fad11e977294c11e62cfd4db9" and "022aa7b186c11bef7327e539b4ab5bb1651c4f97" have entirely different histories.

3 changed files with 114 additions and 171 deletions

View File

@ -134,11 +134,6 @@ const RealtimeTable = ({ formType, formId, sheetName, direction, year }) => {
return () => document.removeEventListener('mousedown', handleDocumentClick); return () => document.removeEventListener('mousedown', handleDocumentClick);
}, [selectedColumnId]); }, [selectedColumnId]);
const handleCellUpdateError = useCallback((rowId, columnId, error) => {
console.error(`Error updating cell ${rowId}_${columnId}:`, error);
toast.error('Ошибка обновления ячейки');
}, []);
const columns = useMemo(() => { const columns = useMemo(() => {
if (!columnsConfig || !columnsConfig.columns) return []; if (!columnsConfig || !columnsConfig.columns) return [];
try { try {
@ -148,160 +143,128 @@ const RealtimeTable = ({ formType, formId, sheetName, direction, year }) => {
columnsConfig, columnsConfig,
onCellUpdate: handleUpdateCell, onCellUpdate: handleUpdateCell,
onCellNumberClick: handleClickRowCell, onCellNumberClick: handleClickRowCell,
onCellUpdateError: handleCellUpdateError, onCellUpdateError: (rowId, columnId, error) => {
console.error(`Error updating cell ${rowId}_${columnId}:`, error);
toast.error('Ошибка обновления ячейки')
}
}); });
} catch (error) { } catch (error) {
console.error('Error creating columns:', error); console.error('Error creating columns:', error);
return []; return [];
} }
}, [columnsConfig, handleUpdateCell, handleClickRowCell, handleCellUpdateError]); }, [columnsConfig, handleUpdateCell, handleClickRowCell]);
const selectedColumnIdRef = useRef(selectedColumnId);
useEffect(() => {
selectedColumnIdRef.current = selectedColumnId;
}, [selectedColumnId]);
const tableMeta = useMemo(() => ({ const tableMeta = useMemo(() => ({
updateCell: handleUpdateCell, updateCell: handleUpdateCell,
getSelectedColumnId: () => selectedColumnIdRef.current, selectedColumnId,
}), [handleUpdateCell]); }), [handleUpdateCell, selectedColumnId]);
const ROW_VIRTUALIZER_OPTIONS = { // Конфигурация таблицы
overscan: 30, const tableConfig = useMemo(
scrollPaddingStart: 0, () => ({
scrollPaddingEnd: 0, ...BASE_TABLE_CONFIG,
estimateSize: () => TABLE_ROW_HEIGHT, columns,
measureElement: (el) => el?.offsetHeight || TABLE_ROW_HEIGHT, data: data,
}; enableRowVirtualization: true,
enableColumnVirtualization: true,
const createTableConfig = ({ rowVirtualizerInstanceRef: rowVirtualizerRef,
columns, rowVirtualizerOptions: {
data, overscan: 30,
columnSizing, scrollPaddingStart: 0,
columnPinning, scrollPaddingEnd: 0,
columnVisibility, estimateSize: () => TABLE_ROW_HEIGHT,
globalFilter, measureElement: (el) => el?.offsetHeight || TABLE_ROW_HEIGHT,
showColumnFilters, },
rowSelection, onEditingCellChange: (cell) => {
containerRef, if (cell) {
tableMeta, if (editingCell) return;
setColumnSizing, contextStartEditing?.(cell.row, cell.column);
setColumnPinning,
editingCell,
contextStartEditing,
}) => ({
...BASE_TABLE_CONFIG,
columns,
data,
enableRowVirtualization: true,
enableColumnVirtualization: true,
rowVirtualizerInstanceRef: rowVirtualizerRef,
rowVirtualizerOptions: ROW_VIRTUALIZER_OPTIONS,
onEditingCellChange: (cell) => {
if (cell && !editingCell) {
contextStartEditing?.(cell.row, cell.column);
}
},
columnVirtualizerOptions: ({ table }) => ({
overscan: 10,
measureElement: (el) => {
if (!el) return 150;
const index = Number(el?.getAttribute?.('data-index'));
const isPinned = Boolean(el?.getAttribute?.('data-pinned'));
if (isPinned) {
const colId = table.getState().columnPinning.left[index];
const column = table.getColumn(colId);
return column?.getSize() ?? 150;
} }
const allCols = [...table.getLeftVisibleLeafColumns(), ...table.getCenterVisibleLeafColumns()] },
return allCols[index]?.getSize() ?? 150; columnVirtualizerOptions: ({ table }) => ({
overscan: 10,
measureElement: (el) => {
if (!el) return 150;
const index = Number(el?.getAttribute?.('data-index'));
const isPinned = Boolean(el?.getAttribute?.('data-pinned'));
if (isPinned) {
const colId = table.getState().columnPinning.left[index];
const column = table.getColumn(colId);
return column?.getSize() ?? 150;
}
const allCols = [...table.getLeftVisibleLeafColumns(), ...table.getCenterVisibleLeafColumns()]
return allCols[index]?.getSize() ?? 150;
},
}),
enableRowSelection: true,
onRowSelectionChange: setRowSelection,
onColumnSizingChange: setColumnSizing,
onColumnPinningChange: setColumnPinning,
onGlobalFilterChange: handleGlobalFilterChange,
state: {
columnSizing,
columnPinning,
columnVisibility,
globalFilter,
showColumnFilters,
rowSelection,
editingCell,
},
initialState: {
expanded: true,
},
meta: tableMeta,
muiTableHeadCellProps: {
sx: { boxSizing: 'border-box' },
},
muiTableBodyCellProps: getTableBodyCellProps,
muiTableHeadProps: {
sx: {
display: 'table-header-group',
height: '1px',
minHeight: '1px',
maxHeight: '1px',
visibility: 'hidden',
'& svg': {
height: '1px',
minHeight: '1px',
maxHeight: '1px',
visibility: 'hidden',
}
},
},
muiTablePaperProps: getTablePaperStyles(),
muiTableContainerProps: {
ref: containerRef,
sx: {
position: 'relative',
contain: 'layout',
minHeight: '100%',
'& .MuiTable-root': { position: 'relative' },
},
},
muiTableHeadCellFilterTextFieldProps: {
placeholder: 'Поиск...',
size: 'small',
}, },
}), }),
enableRowSelection: true, [
onRowSelectionChange: setRowSelection, columns,
onColumnSizingChange: setColumnSizing, data,
onColumnPinningChange: setColumnPinning, setColumnSizing,
onGlobalFilterChange: handleGlobalFilterChange, setColumnPinning,
state: {
columnSizing, columnSizing,
columnPinning, columnPinning,
columnVisibility, columnVisibility,
globalFilter, globalFilter,
showColumnFilters, showColumnFilters,
containerRef,
tableMeta,
rowSelection, rowSelection,
editingCell, editingCell
}, ],
initialState: { );
expanded: true,
},
meta: tableMeta,
muiTableHeadCellProps: {
sx: { boxSizing: 'border-box' },
},
muiTableBodyCellProps: getTableBodyCellProps,
muiTableHeadProps: {
sx: {
display: 'table-header-group',
height: '1px',
minHeight: '1px',
maxHeight: '1px',
visibility: 'hidden',
'& svg': {
height: '1px',
minHeight: '1px',
maxHeight: '1px',
visibility: 'hidden',
}
},
},
muiTablePaperProps: getTablePaperStyles(),
muiTableContainerProps: {
ref: containerRef,
sx: {
position: 'relative',
contain: 'layout',
minHeight: '100%',
'& .MuiTable-root': { position: 'relative' },
},
},
muiTableHeadCellFilterTextFieldProps: {
placeholder: 'Поиск...',
size: 'small',
},
});
// Конфигурация таблицы
const tableConfig = useMemo(() => createTableConfig({
columns,
data,
columnSizing,
columnPinning,
columnVisibility,
globalFilter,
showColumnFilters,
rowSelection,
containerRef,
tableMeta,
setColumnSizing,
setColumnPinning,
editingCell,
contextStartEditing,
}), [
columns,
data,
columnSizing,
columnPinning,
columnVisibility,
globalFilter,
showColumnFilters,
rowSelection,
containerRef,
tableMeta,
setColumnSizing,
setColumnPinning,
editingCell,
]);
const table = useMaterialReactTable(tableConfig); const table = useMaterialReactTable(tableConfig);
@ -379,17 +342,6 @@ const RealtimeTable = ({ formType, formId, sheetName, direction, year }) => {
setRowSelection({}); setRowSelection({});
}, [rowSelection, table]) }, [rowSelection, table])
useEffect(() => {
return () => {
setData([]);
setRowSelection({});
setEditingCell(null);
if (rowVirtualizerRef.current) {
rowVirtualizerRef.current = null;
}
};
}, []);
return ( return (
<> <>
<SettingsPanel <SettingsPanel

View File

@ -84,6 +84,7 @@ export function updateCells(data, newRows) {
Object.keys(newData).forEach((key) => { Object.keys(newData).forEach((key) => {
if (row.data && row.data[key]) { if (row.data && row.data[key]) {
if (typeof row.data[key] === "object") { if (typeof row.data[key] === "object") {
console.log(newData[key], row.data[key], key, newData);
row.data[key] = deepMerge(row.data[key], newData[key]); row.data[key] = deepMerge(row.data[key], newData[key]);
} else { } else {
row.data[key] = newData[key]; row.data[key] = newData[key];
@ -131,30 +132,24 @@ export function insertCell(data, newRow, expense_item_id) {
return updatedRows; return updatedRows;
} }
let adding = false;
function findAndUpdate(rows) { function findAndUpdate(rows) {
for (let i = 0; i < rows.length; i++) { for (let i = 0; i < rows.length; i++) {
const row = rows[i]; const row = rows[i];
if ( if (row.data.header.expense_item_id === expense_item_id) {
(row.sort_order >= newRowObject.sort_order) &
(row.data.line_id != newRowObject.data.line_id)
) {
row.sort_order = row.sort_order + 1;
}
if (!adding & (row.data.header.expense_item_id === expense_item_id)) {
if (!("subRows" in row)) { if (!("subRows" in row)) {
row.subRows = []; row.subRows = [];
} }
row.subRows.push(newRowObject); row.subRows.push(newRowObject);
adding = true; return true;
} }
if (row.subRows && Array.isArray(row.subRows) && row.subRows.length > 0) { if (row.subRows && Array.isArray(row.subRows) && row.subRows.length > 0) {
const found = findAndUpdate(row.subRows); const found = findAndUpdate(row.subRows);
if (found) return true;
} }
} }
return false;
} }
findAndUpdate(updatedRows); findAndUpdate(updatedRows);
return updatedRows; return updatedRows;
@ -163,25 +158,21 @@ export function insertCell(data, newRow, expense_item_id) {
export function deleteRow(data, lineId) { export function deleteRow(data, lineId) {
const updatedRows = JSON.parse(JSON.stringify(data)); const updatedRows = JSON.parse(JSON.stringify(data));
let rowDeleteSortOrder = false;
function findAndDelete(rows) { function findAndDelete(rows) {
for (let i = 0; i < rows.length; i++) { for (let i = 0; i < rows.length; i++) {
const row = rows[i]; const row = rows[i];
if (row.data.line_id == lineId) { if (row.data.line_id == lineId) {
rowDeleteSortOrder = row.sort_order;
rows.splice(i, 1); rows.splice(i, 1);
i--; return true;
}
if ((rowDeleteSortOrder > 0) & (row.sort_order >= rowDeleteSortOrder)) {
row.sort_order = row.sort_order - 1;
} }
if (row.subRows && Array.isArray(row.subRows) && row.subRows.length > 0) { if (row.subRows && Array.isArray(row.subRows) && row.subRows.length > 0) {
const found = findAndDelete(row.subRows); const found = findAndDelete(row.subRows);
if (found) return true;
} }
} }
return false;
} }
findAndDelete(updatedRows); findAndDelete(updatedRows);
return updatedRows; return updatedRows;

View File

@ -71,8 +71,8 @@ const AuditLogsPage = () => {
user_id: selectedUser?.id, user_id: selectedUser?.id,
org_unit_id: selectedSsp?.id, org_unit_id: selectedSsp?.id,
event: selectedEventType?.id, event: selectedEventType?.id,
date_from: dateFrom ? dateFrom.toISOString().slice(0, 10) : undefined, date_from: dateFrom ? dateFrom.toISOString() : undefined,
date_to: dateTo ? dateTo.toISOString().slice(0, 10) : undefined, date_to: dateTo ? dateTo.toISOString() : undefined,
task_id: taskId ? taskId : undefined, task_id: taskId ? taskId : undefined,
form_id: formId ? formId : undefined, form_id: formId ? formId : undefined,
}; };