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',
];