стили

This commit is contained in:
PotapovaA 2026-05-21 11:09:31 +03:00
parent 188189534b
commit b8a1427cf6
29 changed files with 3847 additions and 4022 deletions

View File

@ -1,13 +1,31 @@
<!DOCTYPE html>
<html lang="ru-RU">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<title>Пример React-приложения</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ДФиП/ССП — Табличный редактор</title>
<script>
(function () {
const isLocal =
window.location.hostname === 'localhost' ||
window.location.hostname === '127.0.0.1' ||
window.location.hostname.includes('local') ||
window.location.port === '3000';
if (isLocal) {
const base = document.createElement('base');
base.href = '/';
document.head.insertBefore(base, document.head.firstChild);
}
})();
</script>
</head>
<body>
<div id="root"></div>
</body>
</html>

View File

@ -3,7 +3,7 @@ import api from './client';
export const FormsSheetApi = {
get(form, sheetName) {
return api
.get(`/form/${4}/sheet/${sheetName}?direction=Support`)
.get(`/form/${4}/sheet/${sheetName}`)
// .get(`/forms/${form}/sheet/${sheetName}`)
.then((r) => r.data);
},

View File

@ -18,7 +18,7 @@ export const FormsApi = {
.then((r) => r.data);
},
formsList() {
return api.get('/forms/all').then((r) => r.data.result);
return api.get('/form/').then((r) => r.data.result);
},
formTablesList(formId, isTemplate) {
return api

View File

@ -2,10 +2,10 @@ import api from './client';
export const TasksApi = {
list(params = {}) {
return api.get('/tasks/', { params }).then((r) => r.data.result);
return api.get('/form/', { params }).then((r) => r.data);
},
getTask(taskId) {
return api.get(`/tasks/${taskId}`).then((r) => r.data);
getSheets(taskId) {
return api.get(`/form/${taskId}/sheets`).then((r) => r.data);
},
getTaskStages(taskId) {
return api.get(`/tasks/${taskId}/stages`).then((r) => r.data);

View File

@ -25,8 +25,7 @@ export const PrivateRoute = () => {
<CircularProgress />;
}
// return isAuthenticated ? <Outlet /> : <Navigate to="/login" replace />;
return <Outlet />;
return isAuthenticated ? <Outlet /> : <Navigate to="/login" replace />;
};
export const AppRoutes = () => {

View File

@ -22,6 +22,7 @@ import {
const RealtimeTable = ({ form, sheetName }) => {
const { data, setData } = useRealtimeData(form, sheetName);
const [isLoading, setIsLoading] = useState(true);
const [globalFilter, setGlobalFilter] = useState('');
const [showColumnFilters, setShowColumnFilters] = useState(false);
const [selectedColumn, setSelectedColumn] = useState();
@ -40,10 +41,11 @@ const RealtimeTable = ({ form, sheetName }) => {
handleToggleColumnVisibility,
} = useColumnSettings();
const { sizeMult, setSizeMult, tableScaleStyle, tableWrapperStyle } =
useTableScale();
const { headerPortalRef, containerRef } = useHeaderPortal();
const { sizeMult, setSizeMult, tableScaleStyle, tableWrapperStyle } =
useTableScale(containerRef);
const [columnsConfig, setColumnsConfig] = useState(null);
useEffect(() => {

View File

@ -3,11 +3,11 @@ import { GroupByObjectTitle } from './GroupByObject.style';
export const GroupByObject = ({ title, children }) => {
return (
<>
<Stack direction="column" spacing={0.375}>
<GroupByObjectTitle>{title}</GroupByObjectTitle>
<Stack direction="row" sx={{ gap: '.75rem' }}>
<Stack direction="row" sx={{gap: ".75rem"}}>
{children}
</Stack>
</>
</Stack>
);
};

View File

@ -114,7 +114,13 @@ const HeaderCell = ({ header, table, onClick, hightlight, onChangeWidth }) => {
const isPinned = isColumnPin(table, header);
const leftOffset = calculateLeftOffset(table, header);
const backgroundColor = hightlight ? '#cbccce' : 'rgba(243, 244, 246, 1)';
// Получаем цвет из muiTableHeadCellProps
const customBgColor = column.columnDef?.muiTableHeadCellProps?.sx?.backgroundColor;
// Определяем итоговый цвет: если есть кастомный - используем его, иначе стандартный
const backgroundColor = customBgColor
? customBgColor
: (hightlight ? '#cbccce' : 'rgba(243, 244, 246, 1)');
const handleChangeWidth = (deltaWidth) => {
const size = header.getSize();
@ -178,6 +184,7 @@ const HeaderCell = ({ header, table, onClick, hightlight, onChangeWidth }) => {
textAlign: 'center',
position: 'sticky',
left: getTextLeftOffset(),
right: 0,
paddingRight: '0.5rem',
paddingLeft: '0.5rem',
backgroundColor: backgroundColor,

File diff suppressed because it is too large Load Diff

View File

@ -1,259 +1,263 @@
import {
greenColumn,
whiteColumn,
orangeColumn,
yellowColumn,
redColumn,
blueColumn,
} from '../columnColors';
export const config = {
"config":{
"colors":{
"n_pp_n_pp":{
"color_type":whiteColumn,
"accessorKey":"n_pp_n_pp"
import {
greenColumn,
whiteColumn,
orangeColumn,
yellowColumn,
redColumn,
blueColumn,
} from "../columnColors";
export const config = {
config: {
colors: {
n_pp_n_pp: {
color_type: whiteColumn,
accessorKey: "n_pp_n_pp",
},
"id_stati_gruppy_nomenklatury_id_stati_gruppy_nomenklatury":{
"color_type":whiteColumn,
"accessorKey":"id_stati_gruppy_nomenklatury_id_stati_gruppy_nomenklatury"
id_stati_gruppy_nomenklatury_id_stati_gruppy_nomenklatury: {
color_type: whiteColumn,
accessorKey:
"id_stati_gruppy_nomenklatury_id_stati_gruppy_nomenklatury",
},
"naimenovanie_statey_raskhodov_naimenovanie_statey_raskhodov":{
"color_type":whiteColumn,
"accessorKey":"naimenovanie_statey_raskhodov_naimenovanie_statey_raskhodov"
naimenovanie_statey_raskhodov_naimenovanie_statey_raskhodov: {
color_type: whiteColumn,
accessorKey:
"naimenovanie_statey_raskhodov_naimenovanie_statey_raskhodov",
},
"normiruemaya_edinitsa_normiruemaya_edinitsa":{
"color_type":whiteColumn,
"accessorKey":"normiruemaya_edinitsa_normiruemaya_edinitsa"
normiruemaya_edinitsa_normiruemaya_edinitsa: {
color_type: whiteColumn,
accessorKey: "normiruemaya_edinitsa_normiruemaya_edinitsa",
},
"limit_v_rubs_uchetom_nds_limit_v_rubs_uchetom_nds":{
"color_type":whiteColumn,
"accessorKey":"limit_v_rubs_uchetom_nds_limit_v_rubs_uchetom_nds"
limit_v_rubs_uchetom_nds_limit_v_rubs_uchetom_nds: {
color_type: whiteColumn,
accessorKey: "limit_v_rubs_uchetom_nds_limit_v_rubs_uchetom_nds",
},
"limit_v_rubbez_ucheta_nds_limit_v_rubbez_ucheta_nds":{
"color_type":whiteColumn,
"accessorKey":"limit_v_rubbez_ucheta_nds_limit_v_rubbez_ucheta_nds"
limit_v_rubbez_ucheta_nds_limit_v_rubbez_ucheta_nds: {
color_type: whiteColumn,
accessorKey: "limit_v_rubbez_ucheta_nds_limit_v_rubbez_ucheta_nds",
},
"i_kvartal_2026_g_kolichestvov_sht":{
"color_type":whiteColumn,
"accessorKey":"i_kvartal_2026_g_kolichestvov_sht"
i_kvartal_2026_g_kolichestvov_sht: {
color_type: whiteColumn,
accessorKey: "i_kvartal_2026_g_kolichestvov_sht",
},
"i_kvartal_2026_g_raskhody_v_smetu_v_rublyakh":{
"color_type":whiteColumn,
"accessorKey":"i_kvartal_2026_g_raskhody_v_smetu_v_rublyakh"
i_kvartal_2026_g_raskhody_v_smetu_v_rublyakh: {
color_type: whiteColumn,
accessorKey: "i_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
},
"ii_kvartal_2026_g_kolichestvov_sht":{
"color_type":whiteColumn,
"accessorKey":"ii_kvartal_2026_g_kolichestvov_sht"
ii_kvartal_2026_g_kolichestvov_sht: {
color_type: whiteColumn,
accessorKey: "ii_kvartal_2026_g_kolichestvov_sht",
},
"ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh":{
"color_type":whiteColumn,
"accessorKey":"ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh"
ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh: {
color_type: whiteColumn,
accessorKey: "ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
},
"iii_kvartal_2026_g_kolichestvov_sht":{
"color_type":whiteColumn,
"accessorKey":"iii_kvartal_2026_g_kolichestvov_sht"
iii_kvartal_2026_g_kolichestvov_sht: {
color_type: whiteColumn,
accessorKey: "iii_kvartal_2026_g_kolichestvov_sht",
},
"iii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh":{
"color_type":whiteColumn,
"accessorKey":"iii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh"
iii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh: {
color_type: whiteColumn,
accessorKey: "iii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
},
"iv_kvartal_2026_g_kolichestvov_sht":{
"color_type":whiteColumn,
"accessorKey":"iv_kvartal_2026_g_kolichestvov_sht"
iv_kvartal_2026_g_kolichestvov_sht: {
color_type: whiteColumn,
accessorKey: "iv_kvartal_2026_g_kolichestvov_sht",
},
iv_kvartal_2026_g_raskhody_v_smetu_v_rublyakh: {
color_type: whiteColumn,
accessorKey: "iv_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
},
"iv_kvartal_2026_g_raskhody_v_smetu_v_rublyakh":{
"color_type":whiteColumn,
"accessorKey":"iv_kvartal_2026_g_raskhody_v_smetu_v_rublyakh"
}
},
"columns":[
columns: [
{
"header":"N п\\/п",
"accessorKey":"n_pp",
"columns":[
header: "N п/п",
accessorKey: "n_pp",
columns: [
{
"header":"N п\\/п",
"accessorKey":"n_pp_n_pp",
"exampleValue":"1",
"size":150,
"filterFn":"contains"
}
]
header: "N п/п",
accessorKey: "n_pp_n_pp",
exampleValue: "1",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"ID статьи \\/ группы номенклатуры",
"accessorKey":"id_stati_gruppy_nomenklatury",
"columns":[
header: "ID статьи / группы номенклатуры",
accessorKey: "id_stati_gruppy_nomenklatury",
columns: [
{
"header":"ID статьи \\/ группы номенклатуры",
"accessorKey":"id_stati_gruppy_nomenklatury_id_stati_gruppy_nomenklatury",
"size":150,
"filterFn":"contains"
}
]
header: "ID статьи / группы номенклатуры",
accessorKey:
"id_stati_gruppy_nomenklatury_id_stati_gruppy_nomenklatury",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"Наименование статей расходов",
"accessorKey":"naimenovanie_statey_raskhodov",
"columns":[
header: "Наименование статей расходов",
accessorKey: "naimenovanie_statey_raskhodov",
columns: [
{
"header":"Наименование статей расходов",
"accessorKey":"naimenovanie_statey_raskhodov_naimenovanie_statey_raskhodov",
"exampleValue":"Телефонные, почтовые, телеграфные расходы и др. услуги связи",
"size":150,
"filterFn":"contains"
}
]
header: "Наименование статей расходов",
accessorKey:
"naimenovanie_statey_raskhodov_naimenovanie_statey_raskhodov",
exampleValue:
"Телефонные, почтовые, телеграфные расходы и др. услуги связи",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"Нормируемая единица",
"accessorKey":"normiruemaya_edinitsa",
"columns":[
header: "Нормируемая единица",
accessorKey: "normiruemaya_edinitsa",
columns: [
{
"header":"Нормируемая единица",
"accessorKey":"normiruemaya_edinitsa_normiruemaya_edinitsa",
"size":150,
"filterFn":"contains"
}
]
header: "Нормируемая единица",
accessorKey: "normiruemaya_edinitsa_normiruemaya_edinitsa",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"Лимит, в руб.\\n(с учетом НДС)",
"accessorKey":"limit_v_rubs_uchetom_nds",
"columns":[
header: "Лимит, в руб.(с учетом НДС)",
accessorKey: "limit_v_rubs_uchetom_nds",
columns: [
{
"header":"Лимит, в руб.\\n(с учетом НДС)",
"accessorKey":"limit_v_rubs_uchetom_nds_limit_v_rubs_uchetom_nds",
"size":150,
"filterFn":"contains"
}
]
header: "Лимит, в руб.(с учетом НДС)",
accessorKey: "limit_v_rubs_uchetom_nds_limit_v_rubs_uchetom_nds",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"Лимит, в руб.\\n(без учета НДС)",
"accessorKey":"limit_v_rubbez_ucheta_nds",
"columns":[
header: "Лимит, в руб.(без учета НДС)",
accessorKey: "limit_v_rubbez_ucheta_nds",
columns: [
{
"header":"Лимит, в руб.\\n(без учета НДС)",
"accessorKey":"limit_v_rubbez_ucheta_nds_limit_v_rubbez_ucheta_nds",
"size":150,
"filterFn":"contains"
}
]
header: "Лимит, в руб.(без учета НДС)",
accessorKey: "limit_v_rubbez_ucheta_nds_limit_v_rubbez_ucheta_nds",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"I квартал 2026 г.",
"accessorKey":"i_kvartal_2026_g",
"columns":[
header: "I квартал 2026 г.",
accessorKey: "i_kvartal_2026_g",
columns: [
{
"header":"Количество,\\nв шт.",
"accessorKey":"i_kvartal_2026_g_kolichestvov_sht",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5"
}
}
header: "Количество,в шт.",
accessorKey: "i_kvartal_2026_g_kolichestvov_sht",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#FFFFFF",
},
},
},
{
"header":"Расходы в смету, \\nв рублях",
"accessorKey":"i_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5"
}
}
}
]
header: "Расходы в смету, в рублях",
accessorKey: "i_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#FFFFFF",
},
},
},
],
},
{
"header":"II квартал 2026 г.",
"accessorKey":"ii_kvartal_2026_g",
"columns":[
header: "II квартал 2026 г.",
accessorKey: "ii_kvartal_2026_g",
columns: [
{
"header":"Количество,\\nв шт.",
"accessorKey":"ii_kvartal_2026_g_kolichestvov_sht",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5"
}
}
header: "Количество,в шт.",
accessorKey: "ii_kvartal_2026_g_kolichestvov_sht",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#FFFFFF",
},
},
},
{
"header":"Расходы в смету, \\nв рублях",
"accessorKey":"ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5"
}
}
}
]
header: "Расходы в смету, в рублях",
accessorKey: "ii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#FFFFFF",
},
},
},
],
},
{
"header":"III квартал 2026 г.",
"accessorKey":"iii_kvartal_2026_g",
"columns":[
header: "III квартал 2026 г.",
accessorKey: "iii_kvartal_2026_g",
columns: [
{
"header":"Количество,\\nв шт.",
"accessorKey":"iii_kvartal_2026_g_kolichestvov_sht",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5"
}
}
header: "Количество,в шт.",
accessorKey: "iii_kvartal_2026_g_kolichestvov_sht",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#FFFFFF",
},
},
},
{
"header":"Расходы в смету, \\nв рублях",
"accessorKey":"iii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5"
}
}
}
]
header: "Расходы в смету, в рублях",
accessorKey: "iii_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#FFFFFF",
},
},
},
],
},
{
"header":"IV квартал 2026 г.",
"accessorKey":"iv_kvartal_2026_g",
"columns":[
header: "IV квартал 2026 г.",
accessorKey: "iv_kvartal_2026_g",
columns: [
{
"header":"Количество,\\nв шт.",
"accessorKey":"iv_kvartal_2026_g_kolichestvov_sht",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5"
}
}
header: "Количество,в шт.",
accessorKey: "iv_kvartal_2026_g_kolichestvov_sht",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#FFFFFF",
},
},
},
{
"header":"Расходы в смету, \\nв рублях",
"accessorKey":"iv_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#A5A5A5"
}
}
}
]
}
]
}
}
header: "Расходы в смету, в рублях",
accessorKey: "iv_kvartal_2026_g_raskhody_v_smetu_v_rublyakh",
size: 150,
filterFn: "contains",
muiTableHeadCellProps: {
sx: {
backgroundColor: "#FFFFFF",
},
},
},
],
},
],
},
};

View File

@ -125,19 +125,19 @@
},
"columns":[
{
"header":"№ п\\/п",
"header":"№ п/п",
"accessorKey":"pp",
"columns":[
{
"header":"№ п\\/п",
"header":"№ п/п",
"accessorKey":"pp_pp",
"columns":[
{
"header":"№ п\\/п",
"header":"№ п/п",
"accessorKey":"pp_pp_pp",
"columns":[
{
"header":"№ п\\/п",
"header":"№ п/п",
"accessorKey":"pp_pp_pp_pp",
"size":150,
"filterFn":"contains"
@ -161,13 +161,13 @@
"accessorKey":"adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya",
"columns":[
{
"header":"(заполняется авто из табл. \\"INFO\\" в зависимости от выбранного объекта)",
"header":"(заполняется авто из табл. \"INFO\" в зависимости от выбранного объекта)",
"accessorKey":"adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya_adres_arenduemogo_pomescheniya_zapolnyaetsya_avto_iz_tabl_info_v_zavisimosti_ot_vybrannogo_obekta",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -196,7 +196,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -225,7 +225,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -248,13 +248,13 @@
"accessorKey":"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora",
"columns":[
{
"header":"в формате \\"месяц.год\\"",
"header":"в формате \"месяц.год\"",
"accessorKey":"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_v_formate_mesyatsgod",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -399,7 +399,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -482,7 +482,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -565,7 +565,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -648,7 +648,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}

View File

@ -121,19 +121,19 @@
},
"columns":[
{
"header":"№ п\\/п",
"header":"№ п/п",
"accessorKey":"pp",
"columns":[
{
"header":"№ п\\/п",
"header":"№ п/п",
"accessorKey":"pp_pp",
"columns":[
{
"header":"№ п\\/п",
"header":"№ п/п",
"accessorKey":"pp_pp_pp",
"columns":[
{
"header":"№ п\\/п",
"header":"№ п/п",
"accessorKey":"pp_pp_pp_pp",
"size":150,
"filterFn":"contains"
@ -157,13 +157,13 @@
"accessorKey":"adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta",
"columns":[
{
"header":"(заполняется авто из табл. \\"INFO\\" в зависимости от выбранного объекта)",
"header":"(заполняется авто из табл. \"INFO\" в зависимости от выбранного объекта)",
"accessorKey":"adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta_adres_okhranyaemogo_obekta_zapolnyaetsya_avto_iz_tabl_info_v_zavisimosti_ot_vybrannogo_obekta",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -192,7 +192,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -243,13 +243,13 @@
"accessorKey":"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora",
"columns":[
{
"header":"в формате \\"месяц.год\\"",
"header":"в формате \"месяц.год\"",
"accessorKey":"srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_srok_okonchaniya_dogovora_v_formate_mesyatsgod",
"size":150,
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -366,7 +366,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -449,7 +449,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -532,7 +532,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}
@ -615,7 +615,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#D8D8D8"
"backgroundColor":"#FFFFFF"
}
}
}

View File

@ -1,463 +1,514 @@
import {
greenColumn,
whiteColumn,
orangeColumn,
yellowColumn,
redColumn,
blueColumn,
} from '../columnColors';
export const config = {
"config":{
"colors":{
"pp_pp_pp":{
"color_type":whiteColumn,
"accessorKey":"pp_pp_pp"
import {
greenColumn,
whiteColumn,
orangeColumn,
yellowColumn,
redColumn,
blueColumn,
} from "../columnColors";
export const config = {
config: {
colors: {
pp_pp_pp: {
color_type: whiteColumn,
accessorKey: "pp_pp_pp",
},
"perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat":{
"color_type":whiteColumn,
"accessorKey":"perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat"
perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat:
{
color_type: whiteColumn,
accessorKey:
"perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat",
},
raskhody_planiruemye_rf_na_2026_god_i_kvartal_i_kvartal: {
color_type: whiteColumn,
accessorKey: "raskhody_planiruemye_rf_na_2026_god_i_kvartal_i_kvartal",
},
"raskhody_planiruemye_rf_na_2026_god_i_kvartal_i_kvartal":{
"color_type":whiteColumn,
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_i_kvartal_i_kvartal"
raskhody_planiruemye_rf_na_2026_god_ii_kvartal_ii_kvartal: {
color_type: whiteColumn,
accessorKey:
"raskhody_planiruemye_rf_na_2026_god_ii_kvartal_ii_kvartal",
},
"raskhody_planiruemye_rf_na_2026_god_ii_kvartal_ii_kvartal":{
"color_type":whiteColumn,
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_ii_kvartal_ii_kvartal"
raskhody_planiruemye_rf_na_2026_god_iii_kvartal_iii_kvartal: {
color_type: whiteColumn,
accessorKey:
"raskhody_planiruemye_rf_na_2026_god_iii_kvartal_iii_kvartal",
},
"raskhody_planiruemye_rf_na_2026_god_iii_kvartal_iii_kvartal":{
"color_type":whiteColumn,
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_iii_kvartal_iii_kvartal"
raskhody_planiruemye_rf_na_2026_god_iv_kvartal_iv_kvartal: {
color_type: whiteColumn,
accessorKey:
"raskhody_planiruemye_rf_na_2026_god_iv_kvartal_iv_kvartal",
},
"raskhody_planiruemye_rf_na_2026_god_iv_kvartal_iv_kvartal":{
"color_type":whiteColumn,
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_iv_kvartal_iv_kvartal"
v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka_itogopodderzhka:
{
color_type: whiteColumn,
accessorKey:
"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka_itogopodderzhka",
},
v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka_itogopodderzhka:
{
color_type: whiteColumn,
accessorKey:
"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka_itogopodderzhka",
},
v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka_itogopodderzhka:
{
color_type: whiteColumn,
accessorKey:
"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka_itogopodderzhka",
},
v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal_iv_kvartal:
{
color_type: whiteColumn,
accessorKey:
"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal_iv_kvartal",
},
utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal_i_kvartal: {
color_type: whiteColumn,
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal_i_kvartal",
},
"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka_itogopodderzhka":{
"color_type":whiteColumn,
"accessorKey":"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka_itogopodderzhka"
utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal_ii_kvartal: {
color_type: whiteColumn,
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal_ii_kvartal",
},
"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka_itogopodderzhka":{
"color_type":whiteColumn,
"accessorKey":"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka_itogopodderzhka"
utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal_iii_kvartal: {
color_type: whiteColumn,
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal_iii_kvartal",
},
"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka_itogopodderzhka":{
"color_type":whiteColumn,
"accessorKey":"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka_itogopodderzhka"
utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal_iv_kvartal: {
color_type: whiteColumn,
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal_iv_kvartal",
},
"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal_iv_kvartal":{
"color_type":whiteColumn,
"accessorKey":"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal_iv_kvartal"
fakticheskie_raskhody_za_2026_god_i_kvartal_i_kvartal: {
color_type: whiteColumn,
accessorKey: "fakticheskie_raskhody_za_2026_god_i_kvartal_i_kvartal",
},
"utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal_i_kvartal":{
"color_type":whiteColumn,
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal_i_kvartal"
fakticheskie_raskhody_za_2026_god_ii_kvartal_ii_kvartal: {
color_type: whiteColumn,
accessorKey: "fakticheskie_raskhody_za_2026_god_ii_kvartal_ii_kvartal",
},
"utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal_ii_kvartal":{
"color_type":whiteColumn,
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal_ii_kvartal"
fakticheskie_raskhody_za_2026_god_iii_kvartal_iii_kvartal: {
color_type: whiteColumn,
accessorKey:
"fakticheskie_raskhody_za_2026_god_iii_kvartal_iii_kvartal",
},
"utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal_iii_kvartal":{
"color_type":whiteColumn,
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal_iii_kvartal"
fakticheskie_raskhody_za_2026_god_iv_kvartal_iv_kvartal: {
color_type: whiteColumn,
accessorKey: "fakticheskie_raskhody_za_2026_god_iv_kvartal_iv_kvartal",
},
"utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal_iv_kvartal":{
"color_type":whiteColumn,
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal_iv_kvartal"
skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal_ii_kvartal: {
color_type: whiteColumn,
accessorKey:
"skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal_ii_kvartal",
},
"fakticheskie_raskhody_za_2026_god_i_kvartal_i_kvartal":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_2026_god_i_kvartal_i_kvartal"
skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal_iii_kvartal: {
color_type: whiteColumn,
accessorKey:
"skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal_iii_kvartal",
},
"fakticheskie_raskhody_za_2026_god_ii_kvartal_ii_kvartal":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_2026_god_ii_kvartal_ii_kvartal"
},
"fakticheskie_raskhody_za_2026_god_iii_kvartal_iii_kvartal":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_2026_god_iii_kvartal_iii_kvartal"
},
"fakticheskie_raskhody_za_2026_god_iv_kvartal_iv_kvartal":{
"color_type":whiteColumn,
"accessorKey":"fakticheskie_raskhody_za_2026_god_iv_kvartal_iv_kvartal"
},
"skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal_ii_kvartal":{
"color_type":whiteColumn,
"accessorKey":"skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal_ii_kvartal"
},
"skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal_iii_kvartal":{
"color_type":whiteColumn,
"accessorKey":"skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal_iii_kvartal"
}
},
"columns":[
columns: [
{
"header":" ",
"columns":[
header: " ",
columns: [
{
"header":"№ п\\/п",
"accessorKey":"pp",
"columns":[
header: "№ п/п",
accessorKey: "pp",
columns: [
{
"header":"№ п\\/п",
"accessorKey":"pp_pp",
"columns":[
header: "№ п/п",
accessorKey: "pp_pp",
columns: [
{
"header":"№ п\\/п",
"accessorKey":"pp_pp_pp",
"size":150,
"filterFn":"contains"
}
]
}
]
}
header: "№ п/п",
accessorKey: "pp_pp_pp",
size: 150,
filterFn: "contains",
},
],
},
],
},
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#f5f5f5"
}
}
muiTableHeadCellProps: {
sx: {
backgroundColor: "#f5f5f5",
},
},
},
{
"header":" ",
"columns":[
header: " ",
columns: [
{
"header":"Перечень расходов и затрат",
"accessorKey":"perechen_raskhodov_i_zatrat",
"columns":[
header: "Перечень расходов и затрат",
accessorKey: "perechen_raskhodov_i_zatrat",
columns: [
{
"header":"Перечень расходов и затрат",
"accessorKey":"perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat",
"columns":[
header: "Перечень расходов и затрат",
accessorKey:
"perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat",
columns: [
{
"header":"Перечень расходов и затрат",
"accessorKey":"perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat",
"size":150,
"filterFn":"contains"
}
]
}
]
}
header: "Перечень расходов и затрат",
accessorKey:
"perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat_perechen_raskhodov_i_zatrat",
size: 150,
filterFn: "contains",
},
],
},
],
},
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#f5f5f5"
}
}
muiTableHeadCellProps: {
sx: {
backgroundColor: "#f5f5f5",
},
},
},
{
"header":" ",
"columns":[
header: " ",
columns: [
{
"header":"Расходы, планируемые РФ на 2026 год",
"accessorKey":"raskhody_planiruemye_rf_na_2026_god",
"columns":[
header: "Расходы, планируемые РФ на 2026 год",
accessorKey: "raskhody_planiruemye_rf_na_2026_god",
columns: [
{
"header":"I квартал",
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_i_kvartal",
"columns":[
header: "I квартал",
accessorKey: "raskhody_planiruemye_rf_na_2026_god_i_kvartal",
columns: [
{
"header":"I квартал",
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_i_kvartal_i_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "I квартал",
accessorKey:
"raskhody_planiruemye_rf_na_2026_god_i_kvartal_i_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"II квартал",
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_ii_kvartal",
"columns":[
header: "II квартал",
accessorKey: "raskhody_planiruemye_rf_na_2026_god_ii_kvartal",
columns: [
{
"header":"II квартал",
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_ii_kvartal_ii_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "II квартал",
accessorKey:
"raskhody_planiruemye_rf_na_2026_god_ii_kvartal_ii_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"III квартал",
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_iii_kvartal",
"columns":[
header: "III квартал",
accessorKey: "raskhody_planiruemye_rf_na_2026_god_iii_kvartal",
columns: [
{
"header":"III квартал",
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_iii_kvartal_iii_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "III квартал",
accessorKey:
"raskhody_planiruemye_rf_na_2026_god_iii_kvartal_iii_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"IV квартал",
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_iv_kvartal",
"columns":[
header: "IV квартал",
accessorKey: "raskhody_planiruemye_rf_na_2026_god_iv_kvartal",
columns: [
{
"header":"IV квартал",
"accessorKey":"raskhody_planiruemye_rf_na_2026_god_iv_kvartal_iv_kvartal",
"size":150,
"filterFn":"contains"
}
]
}
]
}
header: "IV квартал",
accessorKey:
"raskhody_planiruemye_rf_na_2026_god_iv_kvartal_iv_kvartal",
size: 150,
filterFn: "contains",
},
],
},
],
},
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#f5f5f5"
}
}
muiTableHeadCellProps: {
sx: {
backgroundColor: "#f5f5f5",
},
},
},
{
"header":"в тыс. рублей",
"accessorKey":"v_tys_rubley",
"columns":[
header: "в тыс. рублей",
accessorKey: "v_tys_rubley",
columns: [
{
"header":"Расходы, планируемые РФ на 2026 год",
"accessorKey":"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god",
"columns":[
header: "Расходы, планируемые РФ на 2026 год",
accessorKey: "v_tys_rubley_raskhody_planiruemye_rf_na_2026_god",
columns: [
{
"header":"ИТОГО\\nПоддержка",
"accessorKey":"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka",
"columns":[
header: "ИТОГОПоддержка",
accessorKey:
"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka",
columns: [
{
"header":"ИТОГО\\nПоддержка",
"accessorKey":"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka_itogopodderzhka",
"size":150,
"filterFn":"contains"
}
]
}
]
header: "ИТОГОПоддержка",
accessorKey:
"v_tys_rubley_raskhody_planiruemye_rf_na_2026_god_itogopodderzhka_itogopodderzhka",
size: 150,
filterFn: "contains",
},
],
},
],
},
{
"header":"Утвержденные базовые расходы на 2026 год",
"accessorKey":"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god",
"columns":[
header: "Утвержденные базовые расходы на 2026 год",
accessorKey:
"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god",
columns: [
{
"header":"ИТОГО\\nПоддержка",
"accessorKey":"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka",
"columns":[
header: "ИТОГОПоддержка",
accessorKey:
"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka",
columns: [
{
"header":"ИТОГО\\nПоддержка",
"accessorKey":"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka_itogopodderzhka",
"size":150,
"filterFn":"contains"
}
]
}
]
header: "ИТОГОПоддержка",
accessorKey:
"v_tys_rubley_utverzhdennye_bazovye_raskhody_na_2026_god_itogopodderzhka_itogopodderzhka",
size: 150,
filterFn: "contains",
},
],
},
],
},
{
"header":"Фактические расходы за 2026 год",
"accessorKey":"v_tys_rubley_fakticheskie_raskhody_za_2026_god",
"columns":[
header: "Фактические расходы за 2026 год",
accessorKey: "v_tys_rubley_fakticheskie_raskhody_za_2026_god",
columns: [
{
"header":"ИТОГО\\nПоддержка",
"accessorKey":"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka",
"columns":[
header: "ИТОГОПоддержка",
accessorKey:
"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka",
columns: [
{
"header":"ИТОГО\\nПоддержка",
"accessorKey":"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka_itogopodderzhka",
"size":150,
"filterFn":"contains"
}
]
}
]
header: "ИТОГОПоддержка",
accessorKey:
"v_tys_rubley_fakticheskie_raskhody_za_2026_god_itogopodderzhka_itogopodderzhka",
size: 150,
filterFn: "contains",
},
],
},
],
},
{
"header":"Скорректированная смета расходов на 2026 год",
"accessorKey":"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god",
"columns":[
header: "Скорректированная смета расходов на 2026 год",
accessorKey:
"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god",
columns: [
{
"header":"IV квартал",
"accessorKey":"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal",
"columns":[
header: "IV квартал",
accessorKey:
"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal",
columns: [
{
"header":"IV квартал",
"accessorKey":"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal_iv_kvartal",
"size":150,
"filterFn":"contains"
}
]
}
]
}
]
header: "IV квартал",
accessorKey:
"v_tys_rubley_skorrektirovannaya_smeta_raskhodov_na_2026_god_iv_kvartal_iv_kvartal",
size: 150,
filterFn: "contains",
},
],
},
],
},
],
},
{
"header":" ",
"columns":[
header: " ",
columns: [
{
"header":"Утвержденные базовые расходы на 2026 год",
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god",
"columns":[
header: "Утвержденные базовые расходы на 2026 год",
accessorKey: "utverzhdennye_bazovye_raskhody_na_2026_god",
columns: [
{
"header":"I квартал",
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal",
"columns":[
header: "I квартал",
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal",
columns: [
{
"header":"I квартал",
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal_i_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "I квартал",
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_i_kvartal_i_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"II квартал",
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal",
"columns":[
header: "II квартал",
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal",
columns: [
{
"header":"II квартал",
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal_ii_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "II квартал",
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_ii_kvartal_ii_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"III квартал",
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal",
"columns":[
header: "III квартал",
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal",
columns: [
{
"header":"III квартал",
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal_iii_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "III квартал",
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_iii_kvartal_iii_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"IV квартал",
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal",
"columns":[
header: "IV квартал",
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal",
columns: [
{
"header":"IV квартал",
"accessorKey":"utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal_iv_kvartal",
"size":150,
"filterFn":"contains"
}
]
}
]
}
header: "IV квартал",
accessorKey:
"utverzhdennye_bazovye_raskhody_na_2026_god_iv_kvartal_iv_kvartal",
size: 150,
filterFn: "contains",
},
],
},
],
},
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#f5f5f5"
}
}
muiTableHeadCellProps: {
sx: {
backgroundColor: "#f5f5f5",
},
},
},
{
"header":" ",
"columns":[
header: " ",
columns: [
{
"header":"Фактические расходы за 2026 год",
"accessorKey":"fakticheskie_raskhody_za_2026_god",
"columns":[
header: "Фактические расходы за 2026 год",
accessorKey: "fakticheskie_raskhody_za_2026_god",
columns: [
{
"header":"I квартал",
"accessorKey":"fakticheskie_raskhody_za_2026_god_i_kvartal",
"columns":[
header: "I квартал",
accessorKey: "fakticheskie_raskhody_za_2026_god_i_kvartal",
columns: [
{
"header":"I квартал",
"accessorKey":"fakticheskie_raskhody_za_2026_god_i_kvartal_i_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "I квартал",
accessorKey:
"fakticheskie_raskhody_za_2026_god_i_kvartal_i_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"II квартал",
"accessorKey":"fakticheskie_raskhody_za_2026_god_ii_kvartal",
"columns":[
header: "II квартал",
accessorKey: "fakticheskie_raskhody_za_2026_god_ii_kvartal",
columns: [
{
"header":"II квартал",
"accessorKey":"fakticheskie_raskhody_za_2026_god_ii_kvartal_ii_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "II квартал",
accessorKey:
"fakticheskie_raskhody_za_2026_god_ii_kvartal_ii_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"III квартал",
"accessorKey":"fakticheskie_raskhody_za_2026_god_iii_kvartal",
"columns":[
header: "III квартал",
accessorKey: "fakticheskie_raskhody_za_2026_god_iii_kvartal",
columns: [
{
"header":"III квартал",
"accessorKey":"fakticheskie_raskhody_za_2026_god_iii_kvartal_iii_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "III квартал",
accessorKey:
"fakticheskie_raskhody_za_2026_god_iii_kvartal_iii_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"IV квартал",
"accessorKey":"fakticheskie_raskhody_za_2026_god_iv_kvartal",
"columns":[
header: "IV квартал",
accessorKey: "fakticheskie_raskhody_za_2026_god_iv_kvartal",
columns: [
{
"header":"IV квартал",
"accessorKey":"fakticheskie_raskhody_za_2026_god_iv_kvartal_iv_kvartal",
"size":150,
"filterFn":"contains"
}
]
}
]
}
header: "IV квартал",
accessorKey:
"fakticheskie_raskhody_za_2026_god_iv_kvartal_iv_kvartal",
size: 150,
filterFn: "contains",
},
],
},
],
},
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#f5f5f5"
}
}
muiTableHeadCellProps: {
sx: {
backgroundColor: "#f5f5f5",
},
},
},
{
"header":" ",
"columns":[
header: " ",
columns: [
{
"header":"Скорректированная смета расходов на 2026 год",
"accessorKey":"skorrektirovannaya_smeta_raskhodov_na_2026_god",
"columns":[
header: "Скорректированная смета расходов на 2026 год",
accessorKey: "skorrektirovannaya_smeta_raskhodov_na_2026_god",
columns: [
{
"header":"II квартал",
"accessorKey":"skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal",
"columns":[
header: "II квартал",
accessorKey:
"skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal",
columns: [
{
"header":"II квартал",
"accessorKey":"skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal_ii_kvartal",
"size":150,
"filterFn":"contains"
}
]
header: "II квартал",
accessorKey:
"skorrektirovannaya_smeta_raskhodov_na_2026_god_ii_kvartal_ii_kvartal",
size: 150,
filterFn: "contains",
},
],
},
{
"header":"III квартал",
"accessorKey":"skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal",
"columns":[
header: "III квартал",
accessorKey:
"skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal",
columns: [
{
"header":"III квартал",
"accessorKey":"skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal_iii_kvartal",
"size":150,
"filterFn":"contains"
}
]
}
]
}
header: "III квартал",
accessorKey:
"skorrektirovannaya_smeta_raskhodov_na_2026_god_iii_kvartal_iii_kvartal",
size: 150,
filterFn: "contains",
},
],
},
],
},
],
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#f5f5f5"
}
}
}
]
}
}
muiTableHeadCellProps: {
sx: {
backgroundColor: "#f5f5f5",
},
},
},
],
},
};

File diff suppressed because it is too large Load Diff

View File

@ -15,87 +15,87 @@
"accessorKey":"eslilevsimvb1713b17eslid170stsepitc17_d17c17"
},
"kod_razdela_kod_razdela_kod_razdela":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"kod_razdela_kod_razdela_kod_razdela"
},
"id_stati_id_stati_id_stati":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"id_stati_id_stati_id_stati"
},
"id_gruppy_nomenklatury_id_gruppy_nomenklatury_id_gruppy_nomenklatury":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"id_gruppy_nomenklatury_id_gruppy_nomenklatury_id_gruppy_nomenklatury"
},
"naimenovanie_oborudovaniya_naimenovanie_oborudovaniya_naimenovanie_oborudovaniya":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"naimenovanie_oborudovaniya_naimenovanie_oborudovaniya_naimenovanie_oborudovaniya"
},
"60401_60404_vkhodyaschiy_ostatok_kol_vo_sht":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60401_60404_vkhodyaschiy_ostatok_kol_vo_sht"
},
"60401_60404_vkhodyaschiy_ostatok_summa_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60401_60404_vkhodyaschiy_ostatok_summa_tys_rub"
},
"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht"
},
"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60401_60404_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub"
},
"60401_60404_vybytie_v_otchetnom_mesyatse_kol_vo_sht":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60401_60404_vybytie_v_otchetnom_mesyatse_kol_vo_sht"
},
"60401_60404_vybytie_v_otchetnom_mesyatse_summa_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60401_60404_vybytie_v_otchetnom_mesyatse_summa_tys_rub"
},
"60415_vkhodyaschiy_ostatok_kol_vo_sht":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60415_vkhodyaschiy_ostatok_kol_vo_sht"
},
"60415_vkhodyaschiy_ostatok_summa_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60415_vkhodyaschiy_ostatok_summa_tys_rub"
},
"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_kol_vo_sht"
},
"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60415_fakticheski_priobreteno_v_otchetnom_mesyatse_summa_tys_rub"
},
"60415_pereneseno_na_bschet_604_kol_vo_sht":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60415_pereneseno_na_bschet_604_kol_vo_sht"
},
"60415_pereneseno_na_bschet_604_summa_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"60415_pereneseno_na_bschet_604_summa_tys_rub"
},
"itogo_fakticheski_priobreteno_v_otchetnom_mesyatse_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"itogo_fakticheski_priobreteno_v_otchetnom_mesyatse_tys_rub"
},
"itogo_sredstva_tolko_po_balansuiz_go_so_znakom_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"itogo_sredstva_tolko_po_balansuiz_go_so_znakom_tys_rub"
},
"itogo_vybytie_v_otchetnom_mesyatse_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"itogo_vybytie_v_otchetnom_mesyatse_tys_rub"
},
"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_kol_vo_sht":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_kol_vo_sht"
},
"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_summa_tys_rub":{
"color_type":orangeColumn,
"color_type":whiteColumn,
"accessorKey":"itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_itogo_osnovnye_sredstva_na_balanse_na_otchetnuyu_datu_summa_tys_rub"
}
},
@ -107,11 +107,16 @@
"header":" ",
"columns":[
{
"header":"=ЕСЛИ(ЛЕВСИМВ(B17;1)=\\"3\\";B17;ЕСЛИ(D17<>0;СЦЕПИТЬ(C17;\\"_\\";D17);C17))",
"header":"=ЕСЛИ(ЛЕВСИМВ(B17;1)="3";B17;ЕСЛИ(D17<>0;СЦЕПИТЬ(C17;"_";D17);C17))",
"accessorKey":"eslilevsimvb1713b17eslid170stsepitc17_d17c17",
"exampleValue":"3.00.",
"size":150,
"filterFn":"contains"
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FFFFFF"
}
}
}
],
"exampleValue":"3.00.",
@ -222,7 +227,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
},
@ -233,7 +238,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
}
@ -250,7 +255,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
},
@ -261,7 +266,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
}
@ -278,7 +283,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
},
@ -289,7 +294,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
}
@ -312,7 +317,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
},
@ -323,7 +328,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
}
@ -340,7 +345,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
},
@ -351,14 +356,14 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
}
]
},
{
"header":"Перенесено на б\\/счет 604",
"header":"Перенесено на б/счет 604",
"accessorKey":"60415_pereneseno_na_bschet_604",
"columns":[
{
@ -368,7 +373,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
},
@ -379,7 +384,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
}
@ -402,14 +407,14 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
}
]
},
{
"header":"средства только по балансу\\n(из ГО) со знаком \\" - \\"",
"header":"средства только по балансу(из ГО) со знаком " - "",
"accessorKey":"itogo_sredstva_tolko_po_balansuiz_go_so_znakom",
"columns":[
{
@ -436,7 +441,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
}
@ -459,7 +464,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
},
@ -470,7 +475,7 @@
"filterFn":"contains",
"muiTableHeadCellProps":{
"sx":{
"backgroundColor":"#FABF8F"
"backgroundColor":"#FFFFFF"
}
}
}

View File

@ -1,47 +1,47 @@
export const greenColumn = {
ROOT: '#C2D59A',
GROUP: '#D7E3BC',
ITEM: '#EAF0DD',
SUB_ITEM: '#FFFFFF',
INPUT: '#FFFFFF',
ROOT: "#C2D59A",
GROUP: "#D7E3BC",
ITEM: "#EAF0DD",
SUB_ITEM: "#FFFFFF",
INPUT: "#FFFFFF",
};
export const orangeColumn = {
ROOT: '#F1C297',
GROUP: '#F6D6B9',
ITEM: '#FAEBDC',
SUB_ITEM: '#FFFFFF',
INPUT: '#FFFFFF',
ROOT: "#F1C297",
GROUP: "#F6D6B9",
ITEM: "#FAEBDC",
SUB_ITEM: "#FFFFFF",
INPUT: "#FFFFFF",
};
export const whiteColumn = {
ROOT: '#FFFFFF',
GROUP: '#FFFFFF',
ITEM: '#FFFFFF',
SUB_ITEM: '#FFFFFF',
INPUT: '#FFFFFF',
ROOT: "#FFFFFF",
GROUP: "#FFFFFF",
ITEM: "#FFFFFF",
SUB_ITEM: "#FFFFFF",
INPUT: "#FFFFFF",
};
export const redColumn = {
ROOT: '#FFFFFF',
GROUP: '#FFFFFF',
ITEM: '#FFFFFF',
SUB_ITEM: '#FFFFFF',
INPUT: '#FFFFFF',
ROOT: "#933634", // самый темный
GROUP: "#D89493", // средний
ITEM: "#E5B7B6", // самый светлый
SUB_ITEM: "#FFFFFF",
INPUT: "#FFFFFF",
};
export const blueColumn = {
ROOT: '#FFFFFF',
GROUP: '#FFFFFF',
ITEM: '#FFFFFF',
SUB_ITEM: '#FFFFFF',
INPUT: '#FFFFFF',
ROOT: "#538DD4", // самый темный
GROUP: "#8DB3E2", // средний
ITEM: "#C5D8F0", // самый светлый
SUB_ITEM: "#FFFFFF",
INPUT: "#FFFFFF",
};
export const yellowColumn = {
ROOT: '#FFFFFF',
GROUP: '#FFFFFF',
ITEM: '#FFFFFF',
SUB_ITEM: '#FFFFFF',
INPUT: '#FFFFFF',
ROOT: "#FFFF66",
GROUP: "#FFFF99",
ITEM: "#FFFFCC",
SUB_ITEM: "#FFFFFF",
INPUT: "#FFFFFF",
};

View File

@ -1,23 +1,25 @@
import { useState, useMemo, useEffect } from 'react';
import { loadFromStorage, saveToStorage } from '../utils/localStorageUtils';
import { useState, useMemo, useEffect } from "react";
import { loadFromStorage, saveToStorage } from "../utils/localStorageUtils";
export const useTableScale = () => {
export const useTableScale = (tableRef, isLoading) => {
const [sizeMult, setSizeMult] = useState(() =>
loadFromStorage('sizeMult', 1.5),
loadFromStorage("sizeMult", 1.5),
);
useEffect(() => {
saveToStorage('sizeMult', sizeMult);
saveToStorage("sizeMult", sizeMult);
}, [sizeMult]);
const tableScaleStyle = useMemo(
() => ({
transform: `scale(${sizeMult})`,
transformOrigin: 'top left',
transition: 'transform 0.2s ease-in-out',
willChange: 'transform',
display: 'flex',
flexDirection: 'column',
transformOrigin: "top left",
transition: "transform 0.2s ease-in-out",
willChange: "transform",
display: "flex",
flexDirection: "column",
flex: 1,
width: `${100 / sizeMult}%`,
height: `${100 / sizeMult}%`,
@ -29,15 +31,15 @@ export const useTableScale = () => {
const tableWrapperStyle = useMemo(() => {
return {
overflow: 'visible',
overflowX: sizeMult > 1.2 ? 'auto' : 'visible',
overflowY: sizeMult > 1.2 ? 'auto' : 'visible',
display: 'flex',
flexDirection: 'column',
height: '92%',
maxHeight: '92%',
minHeight: '92%',
padding: '1rem',
overflow: "visible",
overflowX: sizeMult > 1.2 ? "auto" : "visible",
overflowY: sizeMult > 1.2 ? "auto" : "visible",
display: "flex",
flexDirection: "column",
height: "92%",
maxHeight: "92%",
minHeight: "92%",
padding: "1rem",
};
}, [sizeMult]);

View File

@ -48,21 +48,40 @@ function EditCellPortal({ cell, table, EditCell, onChange }) {
}
export const getTableColumns = ({ Cell, EditCell, columnsConfig }) => {
const columnColors = {...columnsConfig.colors};
const columns = [...config.config.columns];
const columnColors = { ...columnsConfig.colors };
console.log(columnColors)
const columns = [...columnsConfig.columns];
// for (const col of columns) {
// const childTheme = col.columns[0].columns[0].accessorKey;
// for (const c of col.columns) {
// c['muiTableHeadCellProps'] = { sx: { backgroundColor: columnColors[childTheme].color_type.ROOT } }
// console.log(c);
// for (const cc of c.columns) {
// cc['muiTableHeadCellProps'] = { sx: { backgroundColor: columnColors[childTheme].color_type.ROOT } }
// }
// }
// // col['muiTableHeadCellProps'] = {sx:{backgroundColor: "#B0A2C4"}}
// }
// console.log(JSON.stringify(columns))
// console.log(columns)
const processColumns = (columns, EditCell, Cell) => {
columns.forEach((col) => {
col.Cell = ({ cell, table, column, row }) => (
<Cell
cell={cell}
globalFilter={
table.getState().globalFilter || column.getFilterValue()
}
// color={columnColors[column.id][row.original.row_type]}
/>
<>
<Cell
cell={cell}
globalFilter={
table.getState().globalFilter || column.getFilterValue()
}
color={columnColors[column.id] ? columnColors[column.id].color_type[row.original.row_type] : 'black'}
/>
</>
);
col.Edit = ({ cell, table, row, column }) => (
<EditCellPortal

View File

@ -1,6 +1,6 @@
import { useState, useEffect, useCallback } from 'react';
import { dataMock } from '../../mocks/mockTable';
import { FormsSheetApi } from '../../api/form_sheet';
import { useState, useEffect, useCallback } from "react";
import { dataMock } from "../../mocks/mockTable";
import { FormsSheetApi } from "../../api/form_sheet";
const useRealtimeData = (form, sheetName) => {
const [data, setData] = useState([]);
@ -25,9 +25,9 @@ const useRealtimeData = (form, sheetName) => {
}, []);
useEffect(() => {
const loadInitialData = async() => {
const mockData = await FormsSheetApi.get(form, sheetName);
console.log(mockData);
const loadInitialData = async () => {
const res = await FormsSheetApi.get(form, sheetName);
const mockData = res.result;
const maxDepth = mockData.reduce((prev, current) => {
return prev.depth > current.depth ? prev : current;
}).depth;

View File

@ -14,7 +14,7 @@ const TableCard = ({ table, onNavigate }) => {
};
return (
<div key={table.id}>
<div key={table}>
<Section onClick={handleClick}>
<SectionStartPart>
<div className="for-img-table">

View File

@ -8,6 +8,7 @@ const TablesList = ({
projects,
query,
basePath = '/table',
formInfo
}) => {
const navigate = useNavigate();
@ -16,11 +17,12 @@ const TablesList = ({
};
const renderTableCard = (table) => {
console.log(table)
const path = `${basePath}/${table.id}`;
return (
<TableCard
key={table.id}
key={table}
onNavigate={() => handleNavigate(path)}
table={table}
/>
@ -29,50 +31,32 @@ const TablesList = ({
return (
<Box
overflow="auto"
display="flex"
flexDirection="column"
gap="1rem"
maxHeight="calc(100vh - 14rem)"
sx={{
overflow: 'auto',
display: 'flex',
flexDirection: 'column',
gap: '1rem',
maxHeight: 'calc(100vh - 14rem)'
}}
>
{filteredTables.length === 0 && (
<div className="text-sm text-gray-500">
<Box
sx={{
fontSize: '0.875rem',
color: '#6B7280' // gray-500 equivalent
}}
>
{query
? 'Ничего не найдено'
: 'Нет таблиц. Создайте новую, чтобы начать.'}
</div>
</Box>
)}
{filteredTables.map(
(table) => table.project_id === null && renderTableCard(table),
(table) => renderTableCard(table),
)}
{projects.map((project) => {
const projectTables = filteredTables.filter(
(t) => t.project_id === project.id,
);
if (projectTables.length === 0) return null;
return (
<Stack key={`project_group_${project.id}`} spacing=".75rem" mt="1rem">
<Typography
sx={{
fontWeight: 400,
fontSize: '.88rem',
lineHeight: '143%',
color: '#1F1F1F',
marginBottom: '.25rem',
}}
>
{project.name || 'Без названия'}
</Typography>
{projectTables.map((table) => renderTableCard(table))}
</Stack>
);
})}
</Box>
);
};
export default TablesList;
export default TablesList;

View File

@ -95,14 +95,14 @@ export const TaskCardComponent = ({
onAddForExport,
}) => {
const navigate = useNavigate();
const { id, title, name, start_date, end_date, tables_count, ssp } = taskForm;
const { id, title, name, start_date, end_date, tables_count, ssp, form_type_code } = taskForm;
const [isEditModalOpen, setEditModalOpen] = useState(false);
const [editedTitle, setEditedTitle] = useState('');
const [currentTitle, setCurrentTitle] = useState(title || name || '');
const [currentTitle, setCurrentTitle] = useState(form_type_code ||'');
const [isChecked, setIsChecked] = useState(false);
const initialTitle = title || name || '';
const initialTitle = form_type_code ||'';
useEffect(() => {
setCurrentTitle(initialTitle);
@ -200,7 +200,7 @@ export const TaskCardComponent = ({
}}
key={id}
>
<Box width="100%">
<Box sx={{ width: "100%" }}>
<CardHeader>
<TaskId>ID: {id}</TaskId>
{/* TODO: вернется, когда будут реализованы статусы на бэке */}
@ -222,19 +222,19 @@ export const TaskCardComponent = ({
width={'100%'}
alignItems={'end'}
>
{!isForm && (
<CardBody>
<IconWithContent icon={<DateIcon />}>
{formattedDateRange}
</IconWithContent>
<IconWithContent icon={<UserIcon />}>
<Chip>{ssp.title}</Chip>
</IconWithContent>
<IconWithContent icon={<TableIcon />}>
Таблиц: {tables_count}
</IconWithContent>
</CardBody>
)}
<CardBody>
<IconWithContent icon={<DateIcon />}>
{formattedDateRange}
</IconWithContent>
<IconWithContent icon={<UserIcon />}>
{/* <Chip>{ssp.title}</Chip> */}
</IconWithContent>
<IconWithContent icon={<TableIcon />}>
Таблиц: {tables_count}
</IconWithContent>
</CardBody>
{exportMode && (
<div>

View File

@ -28,3 +28,15 @@ export const EDIT_ACCESS_RUSSIAN = {
2: 'Только просмотр',
3: 'Просмотр и редактирование',
};
export const SHEET_NAME = {
"AHR": "АХР",
"CAP": "КВП",
"OPER": "Операц",
"AHR_LIMIT": "АХР Лимиты",
"AHR_RENT": "АХР Аренда",
"AHR_UTILITY": "АХР Коммунальные услуги",
"AHR_SECURITY": "АХР Безопасность",
"OTCH9F": "Отчет 9ф",
"SMETA": "Смета"
};

View File

@ -254,10 +254,12 @@ export default function FormPage() {
if (!form) {
return (
<Box
display="flex"
flexDirection="column"
alignItems="center"
paddingTop={'2.5rem'}
sx={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
paddingTop: '2.5rem'
}}
>
Эта форма не существует
</Box>
@ -268,13 +270,15 @@ export default function FormPage() {
<>
{form && <FormInfo form={form} />}
<Box
display="flex"
flexDirection="column"
alignItems="center"
paddingTop={'2.5rem'}
sx={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
paddingTop: '2.5rem'
}}
>
<Box display="flex" gap="1rem" flexDirection="column" width="50rem">
<Box display="flex" gap="1rem">
<Box sx={{ display: 'flex', gap: '1rem', flexDirection: 'column', width: '50rem' }}>
<Box sx={{ display: 'flex', gap: '1rem' }}>
<span>Таблицы</span>
<Chip>
<IconWithContent icon={<TableIcon />}>
@ -283,8 +287,8 @@ export default function FormPage() {
</Chip>
</Box>
<Box display="flex" justifyContent="space-between">
<Box display="flex" gap="1rem">
<Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
<Box sx={{ display: 'flex', gap: '1rem' }}>
<SearchComponent
placeholder="Поиск по названию таблицы"
value={query}
@ -327,14 +331,14 @@ export default function FormPage() {
<Button
variant="grey"
onClick={handleCancel}
style={{ height: '2.5rem' }}
sx={{ height: '2.5rem' }}
>
Отменить
</Button>
<Button
variant="contained"
onClick={handleCreateTable}
style={{ height: '2.5rem' }}
sx={{ height: '2.5rem' }}
>
Создать
</Button>
@ -349,22 +353,26 @@ export default function FormPage() {
value={newTableName}
onChange={(e) => setNewTableName(e.target.value)}
/>
<div
className="flex items-center gap-3"
style={{ marginTop: '1rem' }}
<Box
sx={{
display: 'flex',
alignItems: 'center',
gap: '0.75rem',
marginTop: '1rem'
}}
>
<CustomCheckbox
checked={newTableIsProject}
onChange={(e) => {
setNewTableIsProject(e.target.checked ? true : false);
}}
></CustomCheckbox>
<div style={{ fontSize: '1rem', color: '#1F1F1F' }}>
/>
<Box sx={{ fontSize: '1rem', color: '#1F1F1F' }}>
Проектная таблица
</div>
</div>
</Box>
</Box>
</FormControl>
</Modal>
</>
);
}
}

View File

@ -7,7 +7,7 @@ const PageContainer = styled.div`
flex-direction: column;
gap: 1.5rem;
background-color: Grey Light;
/* height: calc(100vh - 3.75rem); */
height: 100%;
`;
const TasksContainer = styled.div`

View File

@ -22,6 +22,7 @@ import { ModalCreateProject } from './ModalCreateProject';
import { downloadFile } from '../../utils/downloadFile';
import { ExportWithTextButton } from '../../components/common/Buttons/ButtonsActions';
import TablesList from '../../components/common/TableList/TableList';
import { SHEET_NAME } from '../../constants';
const TaskInfo = ({ task }) => {
const formattedDateRange = `${formatDate(task.start_date)}${formatDate(task.end_date)}`;
@ -58,41 +59,11 @@ export default function TaskPage() {
const [projects, setProjects] = useState([]);
useEffect(() => {
if (!task) return;
const fetchProjects = async () => {
try {
const { success, result } = await FormsApi.getProjects(task.form_id);
success
? setTempProjects(result)
: toast.error('Ошибка получения проекта');
} catch {
toast.error('Ошибка получения проекта');
}
};
fetchProjects();
}, [task]);
useEffect(() => {
if (!taskId) return;
const fetchProjects = async () => {
try {
const { success, result } = await TasksApi.getProjects(taskId);
success ? setProjects(result) : toast.error('Ошибка получения проекта');
} catch {
toast.error('Ошибка получения проекта');
}
};
fetchProjects();
}, [taskId]);
useEffect(() => {
const getTaskInfo = async () => {
const getSheets = async () => {
setIsLoading(true);
try {
const data = await TasksApi.getTask(id);
setTask(data);
const data = await TasksApi.getSheets(id);
setTables(data.result.sheets.map(table => ({ name: SHEET_NAME[table], sheet: table })));
} catch (error) {
toast.error(
error?.response?.data?.detail || 'Ошибка получения данных задачи',
@ -104,54 +75,17 @@ export default function TaskPage() {
};
if (Number.isFinite(id)) {
getTaskInfo();
getSheets();
}
}, [id]);
useEffect(() => {
const loadTaskTables = async () => {
setIsLoading(true);
try {
const data = await TablesApi.listByTask(id);
setTables(data.tables);
} catch (error) {
toast.error(
error?.response?.data?.detail || 'Ошибка загрузки таблиц задачи',
);
} finally {
setIsLoading(false);
}
};
if (task) {
loadTaskTables();
}
}, [task, id]);
const handleCreateProject = (projectData) => {
TasksApi.createProjectTable(taskId, {
form_id: task.form_id,
id: tempProjects[0].id,
//если есть в projectData есть Название проекта то записываем в name
name: projectData['Название проекта'] || 'Проект задачи',
add_projects_data: { ...projectData },
})
.then((data) => {
if (data.success) {
setProjects((prev) => [...prev, data.result.project]);
setTables((prev) => [...prev, ...data.result.tables]);
return;
}
toast.error('ошибка при создании проекта');
})
.catch(() => {
toast.error('ошибка при создании проекта');
});
};
// Фильтруем таблицы по query
const filteredTables = tables.filter((item) =>
item.name?.toLowerCase().includes(query.toLowerCase()),
item.name.toLowerCase().includes(query.toLowerCase()),
);
if (isLoading) {
@ -162,19 +96,6 @@ export default function TaskPage() {
);
}
if (!task) {
return (
<Box
display="flex"
flexDirection="column"
alignItems="center"
paddingTop={'2.5rem'}
>
Задачи не существует
</Box>
);
}
const handleExport = async () => {
try {
const response = await TasksApi.exportTask(taskId);
@ -186,15 +107,17 @@ export default function TaskPage() {
return (
<>
<TaskInfo task={task} />
{/* <TaskInfo task={task} /> */}
<Box
display="flex"
flexDirection="column"
alignItems="center"
paddingTop={'2.5rem'}
sx={{
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
paddingTop: '2.5rem'
}}
>
<Box display="flex" gap={2} flexDirection="column" width="50rem">
<Box display="flex" gap={2}>
<Box sx={{ display: 'flex', gap: 2, flexDirection: 'column', width: '50rem' }}>
<Box sx={{ display: 'flex', gap: 2 }}>
<span>Выберите таблицу</span>
<Chip>
<IconWithContent icon={<TableIcon />}>
@ -203,32 +126,14 @@ export default function TaskPage() {
</Chip>
</Box>
<Box display="flex" gap={2} justifyContent="space-between">
<Box sx={{ display: 'flex', gap: 2, justifyContent: 'space-between' }}>
<SearchComponent
placeholder="Поиск по названию таблицы"
value={query}
onChange={setQuery}
/>
<Stack direction={'row'} spacing={'.5rem'} justifyContent={'end'}>
{tempProjects.length > 0 && (
<>
<PrimaryOutlinedButton
onClick={() => {
setModalProjectOpen(true);
}}
>
Добавить проект
</PrimaryOutlinedButton>
<ModalCreateProject
open={modalProjectOpen}
onClose={() => {
setModalProjectOpen(false);
}}
config={tempProjects[0].add_projects_data}
onCreate={handleCreateProject}
/>
</>
)}
<Stack sx={{ flexDirection: 'row', spacing: '.5rem', justifyContent: 'end' }}>
<ExportWithTextButton onClick={handleExport} />
<PrimaryOutlinedButton
@ -246,55 +151,12 @@ export default function TaskPage() {
</Stack>
</Box>
{/* <Box
overflow="auto"
display="flex"
flexDirection="column"
gap="1rem"
maxHeight="calc(100vh - 14rem)"
>
{filteredTables.length === 0 && (
<div className="text-sm text-gray-500">
{query
? 'Ничего не найдено'
: 'Нет таблиц. Создайте новую, чтобы начать.'}
</div>
)}
{filteredTables.map(
(table) => table.project_id === null && renderTableCard(table),
)}
{projects.map((project) => {
return (
<Stack
key={`project_group_${project.id}`}
spacing={'.75rem'}
mt={'1rem'}
>
<Typography
key={`project_${project.id}`}
sx={{
fontWeight: 400,
fontSize: '.88rem',
lineHeight: '143%',
color: '#1F1F1F',
marginBottom: '.25rem',
}}
>
{project.add_projects_data['Название проекта'] ||
'Без названия'}
</Typography>
{filteredTables
.filter((t) => t.project_id == project.id)
.map((table) => renderTableCard(table))}
</Stack>
);
})}
</Box> */}
<TablesList
query={query}
projects={projects}
filteredTables={filteredTables}
basePath="/table"
formInfo={task}
/>
</Box>
</Box>

View File

@ -119,24 +119,17 @@ export default function TasksPage() {
try {
const skip = (currentPage - 1) * currentLimit;
const params = {
skip: skip,
offset: skip,
limit: currentLimit,
};
const data = await TasksApi.list(params);
const res = await TasksApi.list(params);
const data = res.result;
setItems(data);
setTotalCount(res.count);
setItems((prev) => {
if (prev.length < currentLimit * currentPage) {
return [...prev, ...data];
}
return prev;
});
if (data.length !== currentLimit) {
setTotalCount((prev) => data.length + prev - currentLimit);
setisLoadAll(true);
} else {
setTotalCount(data.length + currentLimit * currentPage);
}
} catch (error) {
toast.error('Ошибка загрузки задач');
} finally {
@ -183,11 +176,6 @@ export default function TasksPage() {
setExportList([]);
}, [exportMode]);
// Фильтруем задачи по query
// const filteredItems = items.filter((item) =>
// item.title?.toLowerCase().includes(query.toLowerCase()),
// );
const handleChangeToExportList = (taskId, checked) => {
if (checked) {
setExportList((prev) => [...prev, taskId]);
@ -219,7 +207,6 @@ export default function TasksPage() {
<PageContainer>
<HeaderSwitch />
<Box sx={{ display: 'flex', justifyContent: 'space-between' }}>
<SwitchFormTask />
{exportMode && <span>Выделено задач: {exportList.length}</span>}
</Box>
<Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 2 }}>
@ -268,14 +255,7 @@ export default function TasksPage() {
<CardsSkeleton count={limit} />
) : (
<>
{/* {filteredItems.length === 0 && (
<div className="text-sm text-gray-500">
{query
? 'Ничего не найдено'
: 'Нет задач. Создайте новую, чтобы начать.'}
</div>
)} */}
{items.slice((page - 1) * limit, page * limit).map((t) => (
{items.map((t) => (
<TaskCardComponent
exportMode={exportMode}
isLoadingFile={exportMode ? isLoadingFile : false}
@ -380,12 +360,12 @@ export default function TasksPage() {
<div className="space-y-4">
<FormControl fullWidth>
<FormLabel required>Название задачи</FormLabel>
<TextField
{/* <TextField
size="small"
placeholder="Укажите название задачи"
value={formData.title}
onChange={(e) => handleFormChange('title', e.target.value)}
/>
/> */}
</FormControl>
<FormControl fullWidth size="small">
@ -394,7 +374,7 @@ export default function TasksPage() {
size="small"
options={forms}
noOptionsText="Не найдено"
getOptionLabel={(option) => option.title || option.name || ''}
getOptionLabel={(option) => option.title || option.name || option.form_type_code || ''}
value={forms.find((f) => f.id === formData.formId) || null}
onChange={(event, newValue) => {
handleFormChange('formId', newValue ? newValue.id : '');
@ -428,7 +408,7 @@ export default function TasksPage() {
<FormControl fullWidth size="small">
<FormLabel required>ССП/Региональный филиал</FormLabel>
<Autocomplete
{/* <Autocomplete
multiple
size="small"
options={sspList}
@ -460,7 +440,7 @@ export default function TasksPage() {
size: 'small',
},
}}
/>
/> */}
</FormControl>
</div>
</Modal>