diff --git a/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx b/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx index 07f4601..6798e72 100644 --- a/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx +++ b/web/src/components/RealtimeTable/Cell/Cell/Cell.jsx @@ -68,7 +68,9 @@ const INTEGER_COLUMN_IDS = new Set([ const getColorBrightness = (hexColor) => { if (!hexColor) return 255; const color = hexColor.replace('#', ''); - let r, g, b; + let r; + let g; + let b; if (color.length === 3) { r = Number.parseInt(color[0] + color[0], 16); g = Number.parseInt(color[1] + color[1], 16); @@ -86,7 +88,7 @@ const getColorBrightness = (hexColor) => { const formatNumber = (value, asInteger = false) => { if (value === null || value === undefined || value === '') return String(value || ''); const num = Number(value); - if (isNaN(num)) return String(value); + if (Number.isNaN(num)) return String(value); return num.toLocaleString('ru-RU', { minimumFractionDigits: asInteger ? 0 : 1, maximumFractionDigits: asInteger ? 0 : 1, @@ -146,7 +148,7 @@ const CellComponent = ({ // Мемоизация значения const { rawValue, displayValue, isNumeric } = useMemo(() => { const value = cell.getValue(); - const isNum = !isNaN(Number(value)) && value !== null && value !== undefined && value !== ''; + const isNum = value !== null && value !== undefined && value !== '' && !Number.isNaN(Number(value)); let display = String(value || ''); if (isNum) { @@ -191,7 +193,8 @@ const CellComponent = ({ }, [isLocked, onClick]); return ( -
+ // biome-ignore lint/a11y/useKeyWithClickEvents: +
{highlightedContent} {lockBadge}
diff --git a/web/src/components/RealtimeTable/constants/FORM_4/SMETA.js b/web/src/components/RealtimeTable/constants/FORM_4/SMETA.js index 479b376..8e4eafb 100644 --- a/web/src/components/RealtimeTable/constants/FORM_4/SMETA.js +++ b/web/src/components/RealtimeTable/constants/FORM_4/SMETA.js @@ -1,853 +1,568 @@ -import { greenColumn } from '../columnColors'; +import { greenColumn } from "../columnColors"; export const config = { config: { colors: { - 'data.section_code': { + "data.section_code": { color_type: greenColumn, - accessorKey: 'data.section_code', + accessorKey: "data.section_code", }, - 'data.name': { + "data.name": { color_type: greenColumn, - accessorKey: 'data.name', + accessorKey: "data.name", }, - 'data.plan.support.q1': { + "data.plan.support.q1": { color_type: greenColumn, - accessorKey: 'data.plan.support.q1', + accessorKey: "data.plan.support.q1", }, - 'data.plan.support.q2': { + "data.plan.support.q2": { color_type: greenColumn, - accessorKey: 'data.plan.support.q2', + accessorKey: "data.plan.support.q2", }, - 'data.plan.support.q3': { + "data.plan.support.q3": { color_type: greenColumn, - accessorKey: 'data.plan.support.q3', + accessorKey: "data.plan.support.q3", }, - 'data.plan.support.q4': { + "data.plan.support.q4": { color_type: greenColumn, - accessorKey: 'data.plan.support.q4', + accessorKey: "data.plan.support.q4", }, - 'data.plan.support.year': { + "data.plan.support.year": { color_type: greenColumn, - accessorKey: 'data.plan.support.year', + accessorKey: "data.plan.support.year", }, - 'data.plan.development.q1': { + "data.plan.development.q1": { color_type: greenColumn, - accessorKey: 'data.plan.development.q1', + accessorKey: "data.plan.development.q1", }, - 'data.plan.development.q2': { + "data.plan.development.q2": { color_type: greenColumn, - accessorKey: 'data.plan.development.q2', + accessorKey: "data.plan.development.q2", }, - 'data.plan.development.q3': { + "data.plan.development.q3": { color_type: greenColumn, - accessorKey: 'data.plan.development.q3', + accessorKey: "data.plan.development.q3", }, - 'data.plan.development.q4': { + "data.plan.development.q4": { color_type: greenColumn, - accessorKey: 'data.plan.development.q4', + accessorKey: "data.plan.development.q4", }, - 'data.plan.development.year': { + "data.plan.development.year": { color_type: greenColumn, - accessorKey: 'data.plan.development.year', + accessorKey: "data.plan.development.year", }, itogo_2026_field_field_field: { color_type: greenColumn, - accessorKey: 'itogo_2026_field_field_field', + accessorKey: "itogo_2026_field_field_field", }, - 'data.approved.support.q1': { + "data.approved.support.q1": { color_type: greenColumn, - accessorKey: 'data.approved.support.q1', + accessorKey: "data.approved.support.q1", }, - 'data.approved.support.q2': { + "data.approved.support.q2": { color_type: greenColumn, - accessorKey: 'data.approved.support.q2', + accessorKey: "data.approved.support.q2", }, - 'data.approved.support.q3': { + "data.approved.support.q3": { color_type: greenColumn, - accessorKey: 'data.approved.support.q3', + accessorKey: "data.approved.support.q3", }, - 'data.approved.support.q4': { + "data.approved.support.q4": { color_type: greenColumn, - accessorKey: 'data.approved.support.q4', + accessorKey: "data.approved.support.q4", }, - 'data.approved.support.year': { + "data.approved.support.year": { color_type: greenColumn, - accessorKey: 'data.approved.support.year', + accessorKey: "data.approved.support.year", }, - 'data.approved.development.q1': { + "data.approved.development.q1": { color_type: greenColumn, - accessorKey: 'data.approved.development.q1', + accessorKey: "data.approved.development.q1", }, - 'data.approved.development.q2': { + "data.approved.development.q2": { color_type: greenColumn, - accessorKey: 'data.approved.development.q2', + accessorKey: "data.approved.development.q2", }, - 'data.approved.development.q3': { + "data.approved.development.q3": { color_type: greenColumn, - accessorKey: 'data.approved.development.q3', + accessorKey: "data.approved.development.q3", }, - 'data.approved.development.q4': { + "data.approved.development.q4": { color_type: greenColumn, - accessorKey: 'data.approved.development.q4', + accessorKey: "data.approved.development.q4", }, - 'data.approved.development.year': { + "data.approved.development.year": { color_type: greenColumn, - accessorKey: 'data.approved.development.year', + accessorKey: "data.approved.development.year", }, - 'data.fact.support.q1': { + "data.fact.support.q1": { color_type: greenColumn, - accessorKey: 'data.fact.support.q1', + accessorKey: "data.fact.support.q1", }, - 'data.fact.support.q2': { + "data.fact.support.q2": { color_type: greenColumn, - accessorKey: 'data.fact.support.q2', + accessorKey: "data.fact.support.q2", }, - 'data.fact.support.q3': { + "data.fact.support.q3": { color_type: greenColumn, - accessorKey: 'data.fact.support.q3', + accessorKey: "data.fact.support.q3", }, - 'data.fact.support.q4': { + "data.fact.support.q4": { color_type: greenColumn, - accessorKey: 'data.fact.support.q4', + accessorKey: "data.fact.support.q4", }, - 'data.fact.support.year': { + "data.fact.support.year": { color_type: greenColumn, - accessorKey: 'data.fact.support.year', + accessorKey: "data.fact.support.year", }, - 'data.fact.development.q1': { + "data.fact.development.q1": { color_type: greenColumn, - accessorKey: 'data.fact.development.q1', + accessorKey: "data.fact.development.q1", }, - 'data.fact.development.q2': { + "data.fact.development.q2": { color_type: greenColumn, - accessorKey: 'data.fact.development.q2', + accessorKey: "data.fact.development.q2", }, - 'data.fact.development.q3': { + "data.fact.development.q3": { color_type: greenColumn, - accessorKey: 'data.fact.development.q3', + accessorKey: "data.fact.development.q3", }, - 'data.fact.development.q4': { + "data.fact.development.q4": { color_type: greenColumn, - accessorKey: 'data.fact.development.q4', + accessorKey: "data.fact.development.q4", }, - 'data.fact.development.year': { + "data.fact.development.year": { color_type: greenColumn, - accessorKey: 'data.fact.development.year', + accessorKey: "data.fact.development.year", }, - 'data.corrected.support.q2': { + "data.corrected.support.q2": { color_type: greenColumn, - accessorKey: 'data.corrected.support.q2', + accessorKey: "data.corrected.support.q2", }, - 'data.corrected.support.q3': { + "data.corrected.support.q3": { color_type: greenColumn, - accessorKey: 'data.corrected.support.q3', + accessorKey: "data.corrected.support.q3", }, - 'data.corrected.support.q4': { + "data.corrected.support.q4": { color_type: greenColumn, - accessorKey: 'data.corrected.support.q4', + accessorKey: "data.corrected.support.q4", }, - 'data.corrected.development.q2': { + "data.corrected.development.q2": { color_type: greenColumn, - accessorKey: 'data.corrected.development.q2', + accessorKey: "data.corrected.development.q2", }, - 'data.corrected.development.q3': { + "data.corrected.development.q3": { color_type: greenColumn, - accessorKey: 'data.corrected.development.q3', + accessorKey: "data.corrected.development.q3", }, - 'data.corrected.development.q4': { + "data.corrected.development.q4": { color_type: greenColumn, - accessorKey: 'data.corrected.development.q4', + accessorKey: "data.corrected.development.q4", }, }, columns: [ { - header: '№ п/п', - accessorKey: 'pp', + header: "№ п/п", + accessorKey: "pp", columns: [ { - header: '', - accessorKey: 'pp_field', + header: "", + accessorKey: "pp_field", columns: [ { - header: '', - accessorKey: 'data.section_code', - columnLetter: 'B', + header: "", + accessorKey: "data.section_code", + columnLetter: "B", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'Перечень расходов и затрат', - accessorKey: 'perechen_raskhodov_i_zatrat', + header: "Перечень расходов и затрат", + accessorKey: "perechen_raskhodov_i_zatrat", columns: [ { - header: '', - accessorKey: 'perechen_raskhodov_i_zatrat_field', + header: "", + accessorKey: "perechen_raskhodov_i_zatrat_field", columns: [ { - header: '', - accessorKey: 'data.name', - columnLetter: 'C', + header: "", + accessorKey: "data.name", + columnLetter: "C", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'Расходы, планируемые ССП на 2026 год', - accessorKey: 'raskhody_planiruemye_ssp_na_2026_god', + header: "Расходы, планируемые ССП на 2026 год", + accessorKey: "raskhody_planiruemye_ssp_na_2026_god", columns: [ { - header: 'Поддержка', - accessorKey: 'raskhody_planiruemye_ssp_na_2026_god_podderzhka', + header: "Развитие", + accessorKey: "raskhody_planiruemye_ssp_na_2026_god_razvitie", columns: [ { - header: 'I квартал', - accessorKey: 'raskhody_planiruemye_ssp_na_2026_god_podderzhka_i_kvartal', - accessorKey: 'data.plan.support.q1', - columnLetter: 'D', + header: "I квартал", + accessorKey: "data.plan.development.q1", + columnLetter: "I", size: 150, + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'II квартал', - accessorKey: 'raskhody_planiruemye_ssp_na_2026_god_podderzhka_ii_kvartal', - accessorKey: 'data.plan.support.q2', - columnLetter: 'E', + header: "II квартал", + accessorKey: "data.plan.development.q2", + columnLetter: "J", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'III квартал', - accessorKey: 'raskhody_planiruemye_ssp_na_2026_god_podderzhka_iii_kvartal', - accessorKey: 'data.plan.support.q3', - columnLetter: 'F', + header: "III квартал", + accessorKey: "data.plan.development.q3", + columnLetter: "K", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'IV квартал', - - accessorKey: 'data.plan.support.q4', - columnLetter: 'G', + header: "IV квартал", + accessorKey: "data.plan.development.q4", + columnLetter: "L", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'ИТОГО Поддержка', - - accessorKey: 'data.plan.support.year', - columnLetter: 'H', + header: "ИТОГО Развитие", + accessorKey: "data.plan.development.year", + columnLetter: "M", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'Развитие', - accessorKey: 'raskhody_planiruemye_ssp_na_2026_god_razvitie', - columns: [ - { - header: 'I квартал', - accessorKey: 'data.plan.development.q1', - columnLetter: 'I', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'II квартал', - accessorKey: 'data.plan.development.q2', - columnLetter: 'J', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'III квартал', - accessorKey: 'data.plan.development.q3', - columnLetter: 'K', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'IV квартал', - accessorKey: 'data.plan.development.q4', - columnLetter: 'L', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'ИТОГО Развитие', - accessorKey: 'data.plan.development.year', - columnLetter: 'M', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'Утвержденные базовые расходы на 2026 год', - accessorKey: 'utverzhdennye_bazovye_raskhody_na_2026_god', + header: "Утвержденные базовые расходы на 2026 год", + accessorKey: "utverzhdennye_bazovye_raskhody_na_2026_god", columns: [ { - header: 'Поддержка', - accessorKey: 'utverzhdennye_bazovye_raskhody_na_2026_god_podderzhka', + header: "Развитие", + accessorKey: "utverzhdennye_bazovye_raskhody_na_2026_god_razvitie", columns: [ { - header: 'I квартал', - accessorKey: 'data.approved.support.q1', - columnLetter: 'P', + header: "I квартал", + accessorKey: "data.approved.development.q1", + columnLetter: "U", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'II квартал', - accessorKey: 'data.approved.support.q2', - columnLetter: 'Q', + header: "II квартал", + accessorKey: "data.approved.development.q2", + columnLetter: "V", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'III квартал', - accessorKey: 'data.approved.support.q3', - columnLetter: 'R', + header: "III квартал", + accessorKey: "data.approved.development.q3", + columnLetter: "W", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'IV квартал', - accessorKey: 'data.approved.support.q4', - columnLetter: 'S', + header: "IV квартал", + accessorKey: "data.approved.development.q4", + columnLetter: "X", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'ИТОГО Поддержка', - accessorKey: 'data.approved.support.year', - columnLetter: 'T', + header: "ИТОГО Развитие", + accessorKey: "data.approved.development.year", + columnLetter: "Y", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'Развитие', - accessorKey: 'utverzhdennye_bazovye_raskhody_na_2026_god_razvitie', - columns: [ - { - header: 'I квартал', - accessorKey: 'data.approved.development.q1', - columnLetter: 'U', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'II квартал', - accessorKey: 'data.approved.development.q2', - columnLetter: 'V', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'III квартал', - accessorKey: 'data.approved.development.q3', - columnLetter: 'W', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'IV квартал', - accessorKey: 'data.approved.development.q4', - columnLetter: 'X', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'ИТОГО Развитие', - accessorKey: 'data.approved.development.year', - columnLetter: 'Y', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'Фактические расходы за 2026 год', - accessorKey: 'fakticheskie_raskhody_za_2026_god', + header: "Фактические расходы за 2026 год", + accessorKey: "fakticheskie_raskhody_za_2026_god", columns: [ { - header: 'Поддержка', - accessorKey: 'fakticheskie_raskhody_za_2026_god_podderzhka', + header: "Развитие", + accessorKey: "fakticheskie_raskhody_za_2026_god_razvitie", columns: [ { - header: 'I квартал', - accessorKey: 'data.fact.support.q1', - columnLetter: 'AB', + header: "I квартал", + accessorKey: "data.fact.development.q1", + columnLetter: "AG", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'II квартал', - accessorKey: 'data.fact.support.q2', - columnLetter: 'AC', + header: "II квартал", + accessorKey: "data.fact.development.q2", + columnLetter: "AH", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'III квартал', - accessorKey: 'data.fact.support.q3', - columnLetter: 'AD', + header: "III квартал", + accessorKey: "data.fact.development.q3", + columnLetter: "AI", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'IV квартал', - accessorKey: 'data.fact.support.q4', - columnLetter: 'AE', + header: "IV квартал", + accessorKey: "data.fact.development.q4", + columnLetter: "AJ", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'ИТОГО Поддержка', - accessorKey: 'data.fact.support.year', - columnLetter: 'AF', + header: "ИТОГО Развитие", + accessorKey: "data.fact.development.year", + columnLetter: "AK", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'Развитие', - accessorKey: 'fakticheskie_raskhody_za_2026_god_razvitie', - columns: [ - { - header: 'I квартал', - accessorKey: 'data.fact.development.q1', - columnLetter: 'AG', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'II квартал', - accessorKey: 'data.fact.development.q2', - columnLetter: 'AH', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'III квартал', - accessorKey: 'data.fact.development.q3', - columnLetter: 'AI', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'IV квартал', - accessorKey: 'data.fact.development.q4', - columnLetter: 'AJ', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'ИТОГО Развитие', - accessorKey: 'data.fact.development.year', - columnLetter: 'AK', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'Скорректированная смета расходов на 2026 год', - accessorKey: 'skorrektirovannaya_smeta_raskhodov_na_2026_god', + header: "Скорректированная смета расходов на 2026 год", + accessorKey: "skorrektirovannaya_smeta_raskhodov_na_2026_god", columns: [ { - header: 'Поддержка', - accessorKey: 'skorrektirovannaya_smeta_raskhodov_na_2026_god_podderzhka', + header: "Развитие", + accessorKey: + "skorrektirovannaya_smeta_raskhodov_na_2026_god_razvitie", columns: [ { - header: 'II квартал', - accessorKey: 'data.corrected.support.q2', - columnLetter: 'AN', + header: "II квартал", + accessorKey: "data.corrected.development.q2", + columnLetter: "AQ", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'III квартал', - accessorKey: 'data.corrected.support.q3', - columnLetter: 'AO', + header: "III квартал", + accessorKey: "data.corrected.development.q3", + columnLetter: "AR", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, { - header: 'IV квартал', - accessorKey: 'data.corrected.support.q4', - columnLetter: 'AP', + header: "IV квартал", + accessorKey: "data.corrected.development.q4", + columnLetter: "AS", size: 150, - filterFn: 'contains', + filterFn: "contains", muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'Развитие', - accessorKey: 'skorrektirovannaya_smeta_raskhodov_na_2026_god_razvitie', - columns: [ - { - header: 'II квартал', - accessorKey: 'data.corrected.development.q2', - columnLetter: 'AQ', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'III квартал', - accessorKey: 'data.corrected.development.q3', - columnLetter: 'AR', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - { - header: 'IV квартал', - accessorKey: 'data.corrected.development.q4', - columnLetter: 'AS', - size: 150, - filterFn: 'contains', - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', - }, - }, - }, - ], - muiTableHeadCellProps: { - sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, ], muiTableHeadCellProps: { sx: { - backgroundColor: '#BFBFBF', - color: '#000000', + backgroundColor: "#BFBFBF", + color: "#000000", }, }, }, diff --git a/web/src/components/RealtimeTable/constants/columnConfig.js b/web/src/components/RealtimeTable/constants/columnConfig.js index 39929be..53ca647 100644 --- a/web/src/components/RealtimeTable/constants/columnConfig.js +++ b/web/src/components/RealtimeTable/constants/columnConfig.js @@ -1,6 +1,10 @@ +import { blueColumn, greenColumn, orangeColumn } from "./columnColors"; + export const columnPinningDefault = { left: ['mrt-row-expand', 'sort_order'], right: [], }; export const columnVisibilityDefault = { 'mrt-row-select': false }; + +export const sectionCodeColor = { 1: greenColumn, 3: orangeColumn, 4: blueColumn} diff --git a/web/src/components/RealtimeTable/tableColumns.jsx b/web/src/components/RealtimeTable/tableColumns.jsx index 8a321f3..2e578aa 100644 --- a/web/src/components/RealtimeTable/tableColumns.jsx +++ b/web/src/components/RealtimeTable/tableColumns.jsx @@ -2,6 +2,8 @@ import React, { useEffect, useRef, useState, useMemo, useCallback } from 'react' import { createPortal } from 'react-dom'; import { useParams } from 'react-router'; import { useRealtime } from './contexts/RealtimeContext'; +import { sectionCodeColor } from './constants/columnConfig'; +import { blueColumn, greenColumn } from './constants/columnColors'; const EditCellPortal = React.memo(({ cell, @@ -76,6 +78,13 @@ const EditCellPortal = React.memo(({ ); }); +function getColorCell(colors, column, row) { + if (row.original.data.section_code){ + const section_code = row.original.data.section_code[0]; + return (sectionCodeColor[section_code] || blueColumn)[row.original?.row_type || row.row_type]; + } + return colors[column.id]?.color_type?.[row.original?.row_type || row.row_type]; +} export const getTableColumns = ({ Cell, @@ -121,7 +130,7 @@ export const getTableColumns = ({ globalFilter, columnFilter, isEditable: row.original?.row_type === 'INPUT' || false, - backgroundColor: columnColors[column.id]?.color_type?.[row.original?.row_type || row.row_type], + backgroundColor: getColorCell(columnColors, column, row), isUpdating: table.options.meta?.updatingCells?.[`${row.id}_${column.id}`], isInvalid, value, @@ -154,7 +163,7 @@ export const getTableColumns = ({ // Оптимизированная функция processColumns const processColumns = (columns) => { - columns.forEach((col) => { + for (const col of columns) { col.Cell = ({ cell, table, column, row }) => { const props = getCachedCellProps(row, column, table); @@ -163,7 +172,7 @@ export const getTableColumns = ({ column, cell, ...props, - }), [row.id, column.id, cell.getValue(), props._hash]); + }), [row, column, cell, props]); return ; }; @@ -187,7 +196,7 @@ export const getTableColumns = ({ if (col.columns?.length) { processColumns(col.columns); } - }); + } }; processColumns(columns); @@ -201,8 +210,7 @@ export const getTableColumns = ({ const handleClick = useCallback(() => { onCellNumberClick(row.id); }, [row.id, onCellNumberClick]); - - return ; + return ; }, }; diff --git a/web/src/components/Stages/AddStagesModal.jsx b/web/src/components/Stages/AddStagesModal.jsx index bf302d1..944674f 100644 --- a/web/src/components/Stages/AddStagesModal.jsx +++ b/web/src/components/Stages/AddStagesModal.jsx @@ -1,6 +1,6 @@ import { Box, Button, Divider, FormControl, FormLabel, IconButton, MenuItem, Select, Stack, TextField } from '@mui/material'; import { useEffect, useState } from 'react'; -import { STAGE_ROLE_RUSSIAN_NAME } from '../../constants/constants'; +import { STAGE_ROLE_RUSSIAN_NAME, DIRECTION_TRANSLATE } from '../../constants/constants'; import { formatDateForApi } from '../../utils/formatDate'; import { collectLeafColumns } from '../RealtimeTable/utils/columnUtils'; import CollapsibleTree from '../common/CollapsibleTree'; @@ -27,6 +27,7 @@ export const AddStagesModal = ({ const [endDate, setEndDate] = useState(null); const [stageName, setStageName] = useState(''); const [selectedSheet, setSelectedSheet] = useState(defaultSheet); + const [selectedDirection, setSelectedDirection] = useState(''); const [selectedRole, setSelectedRole] = useState(); const [columnsConfig, setColumnsConfig] = useState({ columns: [], colors: {} }); const [selectedColumns, setSelectedColumns] = useState([]); @@ -34,7 +35,7 @@ export const AddStagesModal = ({ useEffect(() => { const loadColumnsConfig = async () => { if (!selectedSheet) return; - const sheetObj = sheetOptions.find((s) => s.value == selectedSheet); + const sheetObj = sheetOptions.find((s) => s.value === selectedSheet); try { const { config } = await import(`../RealtimeTable/constants/${formType}/${sheetObj.sheet}.js`); @@ -54,13 +55,15 @@ export const AddStagesModal = ({ setEndDate(stage.closes_at ?? null); setStageName(stage.phase_code ?? ''); setSelectedSheet(stage.sheet ?? null); + setSelectedDirection(stage.direction ?? ''); setSelectedRole(stage.role ?? null); - setSelectedColumns(stage.column_keys.map((c) => 'data.' + c)); + setSelectedColumns(stage.column_keys.map((c) => `data.${c}`)); } else { setStartDate(null); setEndDate(null); setStageName(''); setSelectedSheet(defaultSheet); + setSelectedDirection(''); setSelectedRole(); setSelectedColumns([]); } @@ -69,12 +72,12 @@ export const AddStagesModal = ({ const handleSave = () => { const opensAt = formatDateForApi(startDate); const closesAt = formatDateForApi(endDate); - const sheetObj = sheetOptions.find((s) => s.value == selectedSheet); + const sheetObj = sheetOptions.find((s) => s.value === selectedSheet); const stageData = { phase_code: stageName, sheet: sheetObj.sheet, - direction: sheetObj.direction, + direction: selectedDirection, role: selectedRole, opens_at: opensAt, closes_at: closesAt, @@ -101,6 +104,7 @@ export const AddStagesModal = ({ setEndDate(null); setStageName(''); setSelectedSheet(defaultSheet); + setSelectedDirection(''); setSelectedRole(); setSelectedColumns([]); onClose(); @@ -115,6 +119,7 @@ export const AddStagesModal = ({ const handleSheetChange = (event) => { setSelectedSheet(event.target.value); setSelectedColumns([]); + setSelectedDirection(''); // Сбрасываем direction при смене листа }; const handleColumnsSelect = (column, isSelect) => { @@ -129,7 +134,7 @@ export const AddStagesModal = ({ } }; - const isFormValid = startDate && endDate && stageName.trim() && selectedSheet; + const isFormValid = startDate && endDate && stageName.trim() && selectedSheet && selectedDirection; if (!isOpen) return null; @@ -138,6 +143,10 @@ export const AddStagesModal = ({ const columnTree = columnsConfig.columns || []; + // Проверяем, нужно ли показывать выбор направления (для AHR CAP) + const sheetObj = sheetOptions.find((s) => s.value === selectedSheet); + const showDirectionSelect = sheetObj?.direction; + return ( @@ -187,6 +196,31 @@ export const AddStagesModal = ({ + + {/* Выбор направления (только для AHR CAP) */} + {showDirectionSelect && ( + + + Направление + + + + )} + {selectedSheet && columnTree.length > 0 && ( @@ -258,4 +292,4 @@ export const AddStagesModal = ({ ); -}; +}; \ No newline at end of file diff --git a/web/src/components/Stages/constants.js b/web/src/components/Stages/constants.js index 3950aad..a32dba4 100644 --- a/web/src/components/Stages/constants.js +++ b/web/src/components/Stages/constants.js @@ -7,5 +7,5 @@ export const stageColumnsHiddenFromPicker = [ 'data.header.internal_order', 'data.header.vsp_id', 'data.header.section_code', - 'data.header.justification', + // 'data.header.justification', ];