new stage

This commit is contained in:
PotapovaA 2026-06-18 15:55:15 +03:00
parent 70bf9fa5b5
commit 10909a1122
13 changed files with 601 additions and 300 deletions

511
web/package-lock.json generated
View File

@ -12,14 +12,15 @@
"@emotion/styled": "^11.14.1", "@emotion/styled": "^11.14.1",
"@mui/material": "^9.0.1", "@mui/material": "^9.0.1",
"@mui/x-tree-view": "^9.1.0", "@mui/x-tree-view": "^9.1.0",
"axios": "^1.16.1", "axios": "^1.9.0",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"material-react-table": "^3.2.1", "material-react-table": "^3.2.1",
"react": "^18.3.1", "react": "^18.3.1",
"react-daisyui": "^5.0.5", "react-daisyui": "^5.0.5",
"react-dom": "^18.3.1", "react-dom": "^18.2.0",
"react-router-dom": "^7.15.1", "react-router": "^6.30.0",
"react-toastify": "^11.1.0" "react-router-dom": "^6.30.0",
"react-toastify": "^11.0.5"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "1.9.4", "@biomejs/biome": "1.9.4",
@ -45,12 +46,12 @@
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.29.0", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
"integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-validator-identifier": "^7.28.5", "@babel/helper-validator-identifier": "^7.29.7",
"js-tokens": "^4.0.0", "js-tokens": "^4.0.0",
"picocolors": "^1.1.1" "picocolors": "^1.1.1"
}, },
@ -59,13 +60,13 @@
} }
}, },
"node_modules/@babel/generator": { "node_modules/@babel/generator": {
"version": "7.29.1", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz",
"integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/parser": "^7.29.0", "@babel/parser": "^7.29.7",
"@babel/types": "^7.29.0", "@babel/types": "^7.29.7",
"@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28", "@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2" "jsesc": "^3.0.2"
@ -75,52 +76,52 @@
} }
}, },
"node_modules/@babel/helper-globals": { "node_modules/@babel/helper-globals": {
"version": "7.28.0", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
"integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-module-imports": { "node_modules/@babel/helper-module-imports": {
"version": "7.28.6", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
"integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/traverse": "^7.28.6", "@babel/traverse": "^7.29.7",
"@babel/types": "^7.28.6" "@babel/types": "^7.29.7"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-string-parser": { "node_modules/@babel/helper-string-parser": {
"version": "7.27.1", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/helper-validator-identifier": { "node_modules/@babel/helper-validator-identifier": {
"version": "7.28.5", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.29.3", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz",
"integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/types": "^7.29.0" "@babel/types": "^7.29.7"
}, },
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
@ -130,40 +131,40 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.29.2", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
"integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/template": { "node_modules/@babel/template": {
"version": "7.28.6", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
"integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.28.6", "@babel/code-frame": "^7.29.7",
"@babel/parser": "^7.28.6", "@babel/parser": "^7.29.7",
"@babel/types": "^7.28.6" "@babel/types": "^7.29.7"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "7.29.0", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz",
"integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/code-frame": "^7.29.0", "@babel/code-frame": "^7.29.7",
"@babel/generator": "^7.29.0", "@babel/generator": "^7.29.7",
"@babel/helper-globals": "^7.28.0", "@babel/helper-globals": "^7.29.7",
"@babel/parser": "^7.29.0", "@babel/parser": "^7.29.7",
"@babel/template": "^7.28.6", "@babel/template": "^7.29.7",
"@babel/types": "^7.29.0", "@babel/types": "^7.29.7",
"debug": "^4.3.1" "debug": "^4.3.1"
}, },
"engines": { "engines": {
@ -171,22 +172,22 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "7.29.0", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz",
"integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-string-parser": "^7.27.1", "@babel/helper-string-parser": "^7.29.7",
"@babel/helper-validator-identifier": "^7.28.5" "@babel/helper-validator-identifier": "^7.29.7"
}, },
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@base-ui/utils": { "node_modules/@base-ui/utils": {
"version": "0.2.8", "version": "0.2.9",
"resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.8.tgz", "resolved": "https://registry.npmjs.org/@base-ui/utils/-/utils-0.2.9.tgz",
"integrity": "sha512-jvOi+c+ftGlGotNcKnzPVg2IhCaDTB6/6R3JeqdjdXktuAJi3wKH9T7+svuaKh1mmfVU11UWzUZVH74JDfi/wQ==", "integrity": "sha512-x/PDDCYzoqPpjrdyb3VcyylTI2IjUXEtYDGi5foh7KsnmNJIIaVwA2GLgDH1dps1GgXiJbA60hM+AyuTfQzIvw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.2",
@ -370,21 +371,21 @@
} }
}, },
"node_modules/@emnapi/core": { "node_modules/@emnapi/core": {
"version": "1.10.0", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
"integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@emnapi/wasi-threads": "1.2.1", "@emnapi/wasi-threads": "1.2.2",
"tslib": "^2.4.0" "tslib": "^2.4.0"
} }
}, },
"node_modules/@emnapi/runtime": { "node_modules/@emnapi/runtime": {
"version": "1.10.0", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
"integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
@ -393,9 +394,9 @@
} }
}, },
"node_modules/@emnapi/wasi-threads": { "node_modules/@emnapi/wasi-threads": {
"version": "1.2.1", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
"integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
@ -650,9 +651,9 @@
} }
}, },
"node_modules/@mui/core-downloads-tracker": { "node_modules/@mui/core-downloads-tracker": {
"version": "9.0.1", "version": "9.1.1",
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-9.1.1.tgz",
"integrity": "sha512-GzamIIhZ1bH77dq7eKaeyRgJdkypsxin4jBFq2EMs4lBWRR0LFO1CSVMsoebn/VvjcNrnrOrjy48MkrkQUK2iw==", "integrity": "sha512-AupmMICbdJHqAh6FfOMaaiiIr7dfEgZJn5DFfiPuGNrbs+ZZy9cD1APwO0TSVBz5j08MJEEY6n7iC76/2wjMEA==",
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
@ -660,9 +661,9 @@
} }
}, },
"node_modules/@mui/icons-material": { "node_modules/@mui/icons-material": {
"version": "9.0.1", "version": "9.1.1",
"resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-9.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-9.1.1.tgz",
"integrity": "sha512-5PRpQjVLTNLyV/2J9J53Yz4R0tVbodG0BQDN2zQI1QBG1OPYM25ar+4N20eyFOfJT6zKglLzsnU70+zdVLaTkw==", "integrity": "sha512-OXhm9DajemStb58AumM06DuPhHTa3XD36TFD4yf6WtJyNRO5DfEZbbnHlBg/US2Y2oOXwM/XurMTBOD6L/YYZw==",
"license": "MIT", "license": "MIT",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
@ -676,7 +677,7 @@
"url": "https://opencollective.com/mui-org" "url": "https://opencollective.com/mui-org"
}, },
"peerDependencies": { "peerDependencies": {
"@mui/material": "^9.0.1", "@mui/material": "^9.1.1",
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0" "react": "^17.0.0 || ^18.0.0 || ^19.0.0"
}, },
@ -687,22 +688,22 @@
} }
}, },
"node_modules/@mui/material": { "node_modules/@mui/material": {
"version": "9.0.1", "version": "9.1.1",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-9.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/material/-/material-9.1.1.tgz",
"integrity": "sha512-voyCpeUxcSWLN7KPZuq0pGCIt726T9K6kiVM3XUcywZDAlZSarLHaUxJVQpospbjjOzN53hwyjo8s6KoWl6utw==", "integrity": "sha512-Wv+gInjrpf99l1Q0oHe0eOWGTnlbkzs5nowClX65KCT/2fyPMwcbFEEkUsOHdpcHhB5UAbz/d7jlwt5ajWVvlA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.2",
"@mui/core-downloads-tracker": "^9.0.1", "@mui/core-downloads-tracker": "^9.1.1",
"@mui/system": "^9.0.1", "@mui/system": "^9.1.1",
"@mui/types": "^9.0.0", "@mui/types": "^9.1.1",
"@mui/utils": "^9.0.1", "@mui/utils": "^9.1.1",
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"@types/react-transition-group": "^4.4.12", "@types/react-transition-group": "^4.4.12",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"csstype": "^3.2.3", "csstype": "^3.2.3",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react-is": "^19.2.4", "react-is": "^19.2.6",
"react-transition-group": "^4.4.5" "react-transition-group": "^4.4.5"
}, },
"engines": { "engines": {
@ -715,7 +716,7 @@
"peerDependencies": { "peerDependencies": {
"@emotion/react": "^11.5.0", "@emotion/react": "^11.5.0",
"@emotion/styled": "^11.3.0", "@emotion/styled": "^11.3.0",
"@mui/material-pigment-css": "^9.0.1", "@mui/material-pigment-css": "^9.1.1",
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
@ -736,13 +737,13 @@
} }
}, },
"node_modules/@mui/private-theming": { "node_modules/@mui/private-theming": {
"version": "9.0.1", "version": "9.1.1",
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-9.1.1.tgz",
"integrity": "sha512-pSIGq4Yw749KHEwlkYZWVERgHgwJELP6ODtBNUfV8V4oIb5H+h7IQDFXuk/b2oQccODK1enJAtiEzlgLZmq+8g==", "integrity": "sha512-oH6c+d6sJ1CZT0Vg2/fHdUQ5zvo9Pn+f+WWk0tlQliHqqIRdN32DZ7UxjalW3LUj4OkHbdWR31biWuLxK9i7Cg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.2",
"@mui/utils": "^9.0.1", "@mui/utils": "^9.1.1",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
}, },
"engines": { "engines": {
@ -763,9 +764,9 @@
} }
}, },
"node_modules/@mui/styled-engine": { "node_modules/@mui/styled-engine": {
"version": "9.0.0", "version": "9.1.1",
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-9.0.0.tgz", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-9.1.1.tgz",
"integrity": "sha512-9RLGdX4Jg0aQPRuvqh/OLzYSPlgd5zyEw5/1HIRfdavSiOd03WtUaGZH9/w1RoTYuRKwpgy0hpIFaMHIqPVIWg==", "integrity": "sha512-neaYKdJfvEG54q8efHLJR7swpHG/gfSv9xGqW5iTSMsubD7yPCPFrhVBt284j1DOF3uZaaDJSHQL7gz6jGF21Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.2",
@ -797,16 +798,16 @@
} }
}, },
"node_modules/@mui/system": { "node_modules/@mui/system": {
"version": "9.0.1", "version": "9.1.1",
"resolved": "https://registry.npmjs.org/@mui/system/-/system-9.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/system/-/system-9.1.1.tgz",
"integrity": "sha512-WvlioaLxk6ewUIOfh0StxUvOPDS1mCfzaulcudsL1brZNXuh0N9FMk7RpH7ImJKjEz412SEy/V/yvqmtxbqxCQ==", "integrity": "sha512-q+aqNa58QZUwmmyUvJKKrStrej+4BcWFw4M0Ug+zRylPIQgR64cqvBnE3QTfLZm4OXulydp8Hl3zwKxMayrdsA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.2",
"@mui/private-theming": "^9.0.1", "@mui/private-theming": "^9.1.1",
"@mui/styled-engine": "^9.0.0", "@mui/styled-engine": "^9.1.1",
"@mui/types": "^9.0.0", "@mui/types": "^9.1.1",
"@mui/utils": "^9.0.1", "@mui/utils": "^9.1.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"csstype": "^3.2.3", "csstype": "^3.2.3",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
@ -837,9 +838,9 @@
} }
}, },
"node_modules/@mui/types": { "node_modules/@mui/types": {
"version": "9.0.0", "version": "9.1.1",
"resolved": "https://registry.npmjs.org/@mui/types/-/types-9.0.0.tgz", "resolved": "https://registry.npmjs.org/@mui/types/-/types-9.1.1.tgz",
"integrity": "sha512-i1cuFCAWN44b3AJWO7mh7tuh1sqbQSeVr/94oG0TX5uXivac8XalgE4/6fQZcmGZigzbQ35IXxj/4jLpRIBYZg==", "integrity": "sha512-Zjt7u8wNvDg40rPTGoL+TnfkpuSKjwubsNSFRH1KAVZLcaV4I3AFNHIFbvH7p4F3alEibSbdd90xAgn5Rnfndg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2" "@babel/runtime": "^7.29.2"
@ -854,17 +855,17 @@
} }
}, },
"node_modules/@mui/utils": { "node_modules/@mui/utils": {
"version": "9.0.1", "version": "9.1.1",
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.1.1.tgz",
"integrity": "sha512-f3UO3jNN1pYg5zxqXC81Bvv8hx5ACcYc0387382ZI7M5ono1heIwHYLrKsz85myguWdeVKPRZGmDdynWUBjK2g==", "integrity": "sha512-qSNfnkzZMptaaWFFklpDf4NPJztgwsMDVfM/sSDt+wq4ssYSBhLYwwjuB6eS/+p2IUYbeRzHluzXbw0Zn7aI4A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.2",
"@mui/types": "^9.0.0", "@mui/types": "^9.1.1",
"@types/prop-types": "^15.7.15", "@types/prop-types": "^15.7.15",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react-is": "^19.2.4" "react-is": "^19.2.6"
}, },
"engines": { "engines": {
"node": ">=14.0.0" "node": ">=14.0.0"
@ -884,13 +885,13 @@
} }
}, },
"node_modules/@mui/x-date-pickers": { "node_modules/@mui/x-date-pickers": {
"version": "9.2.0", "version": "9.5.0",
"resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-9.2.0.tgz", "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-9.5.0.tgz",
"integrity": "sha512-4GMal3xvHSKs+Ajv1PwbakWas79DDh6KlsSr9sjJhSINaST6dAPsIQblX5mSOmR7c4Du1Aemhqeiwo3L0CwNzQ==", "integrity": "sha512-Pzd8gU2qOoIAUMMesjbrq3gFs6akWXcSsEkFIHVA4dtuoh6SeWISu+WR+ymq/sBOcn2tk9IBIjqRQkqLhkm+tg==",
"license": "MIT", "license": "MIT",
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.7",
"@mui/utils": "9.0.1", "@mui/utils": "9.0.1",
"@mui/x-internals": "^9.1.0", "@mui/x-internals": "^9.1.0",
"@types/react-transition-group": "^4.4.12", "@types/react-transition-group": "^4.4.12",
@ -950,6 +951,37 @@
} }
} }
}, },
"node_modules/@mui/x-date-pickers/node_modules/@mui/utils": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.0.1.tgz",
"integrity": "sha512-f3UO3jNN1pYg5zxqXC81Bvv8hx5ACcYc0387382ZI7M5ono1heIwHYLrKsz85myguWdeVKPRZGmDdynWUBjK2g==",
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.29.2",
"@mui/types": "^9.0.0",
"@types/prop-types": "^15.7.15",
"clsx": "^2.1.1",
"prop-types": "^15.8.1",
"react-is": "^19.2.4"
},
"engines": {
"node": ">=14.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui-org"
},
"peerDependencies": {
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
}
}
},
"node_modules/@mui/x-internals": { "node_modules/@mui/x-internals": {
"version": "9.1.0", "version": "9.1.0",
"resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-9.1.0.tgz", "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-9.1.0.tgz",
@ -1003,14 +1035,14 @@
} }
}, },
"node_modules/@mui/x-tree-view": { "node_modules/@mui/x-tree-view": {
"version": "9.1.0", "version": "9.4.0",
"resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-9.1.0.tgz", "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-9.4.0.tgz",
"integrity": "sha512-Pht6/VS5cmKBCKr7MfbvS+XY4vPKpzDEKZVaSpUiv4ClnSsm9kJeSbzziA1MM1yeEmJx40XyNqZKUCslLO76kw==", "integrity": "sha512-tJ4txQCwadY7Yj1LDhgtV4gjc0KCHdTWTPh/ynUj7BJ7aKqOzblXZzur0GLjyLJUhauBvotaF4LpzRxrjsPu5g==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.7",
"@base-ui/utils": "^0.2.8", "@base-ui/utils": "^0.2.9",
"@mui/utils": "9.0.0", "@mui/utils": "9.0.1",
"@mui/x-internals": "^9.1.0", "@mui/x-internals": "^9.1.0",
"@types/react-transition-group": "^4.4.12", "@types/react-transition-group": "^4.4.12",
"clsx": "^2.1.1", "clsx": "^2.1.1",
@ -1042,9 +1074,9 @@
} }
}, },
"node_modules/@mui/x-tree-view/node_modules/@mui/utils": { "node_modules/@mui/x-tree-view/node_modules/@mui/utils": {
"version": "9.0.0", "version": "9.0.1",
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.0.0.tgz", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-9.0.1.tgz",
"integrity": "sha512-bQcqyg/gjULUqTuyUjSAFr6LQGLvtkNtDbJerAtoUn9kGZ0hg5QJiN1PLHMLbeFpe3te1831uq7GFl2ITokGdg==", "integrity": "sha512-f3UO3jNN1pYg5zxqXC81Bvv8hx5ACcYc0387382ZI7M5ono1heIwHYLrKsz85myguWdeVKPRZGmDdynWUBjK2g==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.2",
@ -1129,6 +1161,15 @@
"url": "https://opencollective.com/popperjs" "url": "https://opencollective.com/popperjs"
} }
}, },
"node_modules/@remix-run/router": {
"version": "1.23.3",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz",
"integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@rsbuild/core": { "node_modules/@rsbuild/core": {
"version": "1.7.5", "version": "1.7.5",
"resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.7.5.tgz", "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.7.5.tgz",
@ -1169,28 +1210,28 @@
} }
}, },
"node_modules/@rspack/binding": { "node_modules/@rspack/binding": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.7.12.tgz",
"integrity": "sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==", "integrity": "sha512-f4HHuLbvuld8Ba4iB/4ibse5XrKxFrgmM3S4P2AOKnPlekAFlBjmltCuaTL/W2ggYvILaVY+YcFXrEH1rrKeQA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"optionalDependencies": { "optionalDependencies": {
"@rspack/binding-darwin-arm64": "1.7.11", "@rspack/binding-darwin-arm64": "1.7.12",
"@rspack/binding-darwin-x64": "1.7.11", "@rspack/binding-darwin-x64": "1.7.12",
"@rspack/binding-linux-arm64-gnu": "1.7.11", "@rspack/binding-linux-arm64-gnu": "1.7.12",
"@rspack/binding-linux-arm64-musl": "1.7.11", "@rspack/binding-linux-arm64-musl": "1.7.12",
"@rspack/binding-linux-x64-gnu": "1.7.11", "@rspack/binding-linux-x64-gnu": "1.7.12",
"@rspack/binding-linux-x64-musl": "1.7.11", "@rspack/binding-linux-x64-musl": "1.7.12",
"@rspack/binding-wasm32-wasi": "1.7.11", "@rspack/binding-wasm32-wasi": "1.7.12",
"@rspack/binding-win32-arm64-msvc": "1.7.11", "@rspack/binding-win32-arm64-msvc": "1.7.12",
"@rspack/binding-win32-ia32-msvc": "1.7.11", "@rspack/binding-win32-ia32-msvc": "1.7.12",
"@rspack/binding-win32-x64-msvc": "1.7.11" "@rspack/binding-win32-x64-msvc": "1.7.12"
} }
}, },
"node_modules/@rspack/binding-darwin-arm64": { "node_modules/@rspack/binding-darwin-arm64": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.12.tgz",
"integrity": "sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==", "integrity": "sha512-rbFprJaJiqrmfy8SHth8EsoRS0wg4bXcucwj9NiMzpGFq14Opw8c04iQ6H9BECYzgmN0PKZ9rh41LdVvhdZe4A==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1202,9 +1243,9 @@
] ]
}, },
"node_modules/@rspack/binding-darwin-x64": { "node_modules/@rspack/binding-darwin-x64": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.12.tgz",
"integrity": "sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==", "integrity": "sha512-jnOp+/UXOJa9xqUb8KXH03sysoO2e4Ij6tw6MqDdmdj8n/A8PQENRPUbW9AwXpPtVDJPus9r4fi7b3+6e4B8Hg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1216,9 +1257,9 @@
] ]
}, },
"node_modules/@rspack/binding-linux-arm64-gnu": { "node_modules/@rspack/binding-linux-arm64-gnu": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.12.tgz",
"integrity": "sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==", "integrity": "sha512-C8owWG+yvo7X0oVLIXetkoJhIFBP1LYNcAQqtgLmJnQLQDklGuP83dKC+zISGQWpjawHfZ1ER96vLgoTrxKZdw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1230,9 +1271,9 @@
] ]
}, },
"node_modules/@rspack/binding-linux-arm64-musl": { "node_modules/@rspack/binding-linux-arm64-musl": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.12.tgz",
"integrity": "sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==", "integrity": "sha512-i51WWI64aRpsfSki6rN0aepPqXkVfS+vZM7+4bWDcmnhUmdMvhIPcYg0QRk3DtyJnu33jqNLM0WHY78k00NyfA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1244,9 +1285,9 @@
] ]
}, },
"node_modules/@rspack/binding-linux-x64-gnu": { "node_modules/@rspack/binding-linux-x64-gnu": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.12.tgz",
"integrity": "sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==", "integrity": "sha512-MSos0FuPEefqo9V92ULd5hggKG29EkSNg1zDcypy0OkpsKh5pfjVxTLYFXgTcVyFoUQQbdG8zFBzYbwmJ8V4ew==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1258,9 +1299,9 @@
] ]
}, },
"node_modules/@rspack/binding-linux-x64-musl": { "node_modules/@rspack/binding-linux-x64-musl": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.12.tgz",
"integrity": "sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==", "integrity": "sha512-JcAMVKXOnjfpC3coWjCFPWD3Yl8RBw6a+IXQQ8mfRlHaHMIiOv8IfZqx15XRxMUn49CtP7Z0Na8iiAg2aKrcfw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1272,9 +1313,9 @@
] ]
}, },
"node_modules/@rspack/binding-wasm32-wasi": { "node_modules/@rspack/binding-wasm32-wasi": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.12.tgz",
"integrity": "sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==", "integrity": "sha512-n+ZqP6ZMc0nhOgvadg5VhEs9ojtbES80AcWeFnmGkbzIszvGSO63GKNiRkXtjJ9KFuRzytbbmsCqkUVH+Tywxg==",
"cpu": [ "cpu": [
"wasm32" "wasm32"
], ],
@ -1286,9 +1327,9 @@
} }
}, },
"node_modules/@rspack/binding-win32-arm64-msvc": { "node_modules/@rspack/binding-win32-arm64-msvc": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.12.tgz",
"integrity": "sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==", "integrity": "sha512-8+h5fYDXYdmugbdfZ+D1y8IQ3rv2EhSfyGP7vBe+bjNyaMa4jWrpucmZbtxojUL1AzaeuHbvMdj9UO/gelk/+g==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -1300,9 +1341,9 @@
] ]
}, },
"node_modules/@rspack/binding-win32-ia32-msvc": { "node_modules/@rspack/binding-win32-ia32-msvc": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.12.tgz",
"integrity": "sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==", "integrity": "sha512-cDMGwTRSa2p9fNBVe1wTRkF2AEXZ9ARWW36QeC5CkLaI0Ezz8lvhF2+CSOPnhaQ1O1qtn0L0SF+lFnrY+I7xGQ==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -1314,9 +1355,9 @@
] ]
}, },
"node_modules/@rspack/binding-win32-x64-msvc": { "node_modules/@rspack/binding-win32-x64-msvc": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.12.tgz",
"integrity": "sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==", "integrity": "sha512-wIqFvlgFqrgUyj/6S/FJcvShnkZOmIeXTfqvheLY67MGq8qd8jb1YimQVKAIrmWB3yuJKUFACI3Ag1UBtEedEA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -1328,14 +1369,14 @@
] ]
}, },
"node_modules/@rspack/core": { "node_modules/@rspack/core": {
"version": "1.7.11", "version": "1.7.12",
"resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.11.tgz", "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.7.12.tgz",
"integrity": "sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==", "integrity": "sha512-6CwFIHlhRmXfZoMj3v9MZ1SMTPBn+cHVXeMIeaGp5sufqinKsISbsqHu6ZMJu2wDSmZLdmQJX6zLxkhcAUlhkQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@module-federation/runtime-tools": "0.22.0", "@module-federation/runtime-tools": "0.22.0",
"@rspack/binding": "1.7.11", "@rspack/binding": "1.7.12",
"@rspack/lite-tapable": "1.1.0" "@rspack/lite-tapable": "1.1.0"
}, },
"engines": { "engines": {
@ -1350,13 +1391,20 @@
} }
} }
}, },
"node_modules/@rspack/lite-tapable": { "node_modules/@rspack/core/node_modules/@rspack/lite-tapable": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz",
"integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@rspack/lite-tapable": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.2.tgz",
"integrity": "sha512-1OnyWChLGE46YzWyjlmYJssOu/Y0STAnnr2ueKPqDCYTf63GJMs0mxNnCul4dNiVqHYPKv3/fxrTY3IpqoVwZQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@rspack/plugin-react-refresh": { "node_modules/@rspack/plugin-react-refresh": {
"version": "1.6.2", "version": "1.6.2",
"resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.2.tgz", "resolved": "https://registry.npmjs.org/@rspack/plugin-react-refresh/-/plugin-react-refresh-1.6.2.tgz",
@ -1377,9 +1425,9 @@
} }
}, },
"node_modules/@swc/helpers": { "node_modules/@swc/helpers": {
"version": "0.5.21", "version": "0.5.23",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz",
"integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
@ -1486,9 +1534,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/react": { "node_modules/@types/react": {
"version": "18.3.28", "version": "18.3.31",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz",
"integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/prop-types": "*", "@types/prop-types": "*",
@ -1558,9 +1606,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/axios": { "node_modules/axios": {
"version": "1.16.1", "version": "1.18.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz",
"integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"follow-redirects": "^1.16.0", "follow-redirects": "^1.16.0",
@ -1711,19 +1759,6 @@
"integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/cookie": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
"integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
"node_modules/core-js": { "node_modules/core-js": {
"version": "3.47.0", "version": "3.47.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz",
@ -1809,9 +1844,9 @@
} }
}, },
"node_modules/date-fns": { "node_modules/date-fns": {
"version": "4.1.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz",
"integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==",
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"type": "github", "type": "github",
@ -1918,9 +1953,9 @@
} }
}, },
"node_modules/es-object-atoms": { "node_modules/es-object-atoms": {
"version": "1.1.1", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"es-errors": "^1.3.0" "es-errors": "^1.3.0"
@ -2038,16 +2073,16 @@
} }
}, },
"node_modules/form-data": { "node_modules/form-data": {
"version": "4.0.5", "version": "4.0.6",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"asynckit": "^0.4.0", "asynckit": "^0.4.0",
"combined-stream": "^1.0.8", "combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0", "es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2", "hasown": "^2.0.4",
"mime-types": "^2.1.12" "mime-types": "^2.1.35"
}, },
"engines": { "engines": {
"node": ">= 6" "node": ">= 6"
@ -2165,9 +2200,9 @@
} }
}, },
"node_modules/hasown": { "node_modules/hasown": {
"version": "2.0.3", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
"integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"function-bind": "^1.1.2" "function-bind": "^1.1.2"
@ -2581,9 +2616,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.14", "version": "8.5.15",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz",
"integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -2600,7 +2635,7 @@
], ],
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"nanoid": "^3.3.11", "nanoid": "^3.3.12",
"picocolors": "^1.1.1", "picocolors": "^1.1.1",
"source-map-js": "^1.2.1" "source-map-js": "^1.2.1"
}, },
@ -2676,9 +2711,9 @@
} }
}, },
"node_modules/postcss-selector-parser": { "node_modules/postcss-selector-parser": {
"version": "6.1.2", "version": "6.1.4",
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"cssesc": "^3.0.0", "cssesc": "^3.0.0",
@ -2778,9 +2813,9 @@
} }
}, },
"node_modules/react-is": { "node_modules/react-is": {
"version": "19.2.6", "version": "19.2.7",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.6.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz",
"integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/react-refresh": { "node_modules/react-refresh": {
@ -2794,41 +2829,35 @@
} }
}, },
"node_modules/react-router": { "node_modules/react-router": {
"version": "7.15.1", "version": "6.30.4",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.15.1.tgz", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz",
"integrity": "sha512-R8rl9HhgikFYoPJymnUtPXWbnDb3oget6lQnfIoupbt61aT9aOhRkDsY2XRhZRyX1Z/8a5sL74fXmFNm3NRK5A==", "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"cookie": "^1.0.1", "@remix-run/router": "1.23.3"
"set-cookie-parser": "^2.6.0"
}, },
"engines": { "engines": {
"node": ">=20.0.0" "node": ">=14.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"react": ">=18", "react": ">=16.8"
"react-dom": ">=18"
},
"peerDependenciesMeta": {
"react-dom": {
"optional": true
}
} }
}, },
"node_modules/react-router-dom": { "node_modules/react-router-dom": {
"version": "7.15.1", "version": "6.30.4",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.15.1.tgz", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz",
"integrity": "sha512-AzF62gjY6U9rkMq4RfP/r2EVtQ7DMfNMjyOp/flLTCrtRylLiK4wT4pSq6O8rOXZ2eXdZYJPEYe+ifomiv+Igg==", "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"react-router": "7.15.1" "@remix-run/router": "1.23.3",
"react-router": "6.30.4"
}, },
"engines": { "engines": {
"node": ">=20.0.0" "node": ">=14.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"react": ">=18", "react": ">=16.8",
"react-dom": ">=18" "react-dom": ">=16.8"
} }
}, },
"node_modules/react-toastify": { "node_modules/react-toastify": {
@ -2888,9 +2917,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/reselect": { "node_modules/reselect": {
"version": "5.1.1", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz",
"integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/resolve": { "node_modules/resolve": {
@ -2965,12 +2994,6 @@
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
} }
}, },
"node_modules/set-cookie-parser": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
"integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
"license": "MIT"
},
"node_modules/source-map": { "node_modules/source-map": {
"version": "0.5.7", "version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
@ -3163,9 +3186,9 @@
} }
}, },
"node_modules/tinyglobby": { "node_modules/tinyglobby": {
"version": "0.2.16", "version": "0.2.17",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
"integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"fdir": "^6.5.0", "fdir": "^6.5.0",

View File

@ -13,14 +13,15 @@
"@emotion/styled": "^11.14.1", "@emotion/styled": "^11.14.1",
"@mui/material": "^9.0.1", "@mui/material": "^9.0.1",
"@mui/x-tree-view": "^9.1.0", "@mui/x-tree-view": "^9.1.0",
"axios": "^1.16.1", "axios": "^1.9.0",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"material-react-table": "^3.2.1", "material-react-table": "^3.2.1",
"react": "^18.3.1", "react": "^18.3.1",
"react-daisyui": "^5.0.5", "react-daisyui": "^5.0.5",
"react-dom": "^18.3.1", "react-dom": "^18.2.0",
"react-router-dom": "^7.15.1", "react-router": "^6.30.0",
"react-toastify": "^11.1.0" "react-router-dom": "^6.30.0",
"react-toastify": "^11.0.5"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "1.9.4", "@biomejs/biome": "1.9.4",

View File

@ -1,8 +1,8 @@
import api from './client'; import api from "./client";
export const StagesApi = { export const StagesApi = {
createStage(formId, payload) { createStage(formId, payload) {
return api.post(`/stages/form/${formId}`, [payload]).then((r) => r.data); return api.post(`/stages/form/${formId}`, payload).then((r) => r.data);
}, },
updateStage(payload) { updateStage(payload) {
const { budget_form_id, sheet, phase_code, opens_at, closes_at } = payload; const { budget_form_id, sheet, phase_code, opens_at, closes_at } = payload;

View File

@ -14,7 +14,7 @@ import {
RemoveLine, RemoveLine,
Search, Search,
} from '../../common/icons/icons'; } from '../../common/icons/icons';
import CollapsibleTree from './CollapsibleTree'; import CollapsibleTree from '../../common/CollapsibleTree';
import ZoomSlider from './ZoomSlider'; import ZoomSlider from './ZoomSlider';
import SearchComponent from '../../common/SearchComponent'; import SearchComponent from '../../common/SearchComponent';
import { ExportDefaultButton } from '../../common/Buttons/ButtonsActions'; import { ExportDefaultButton } from '../../common/Buttons/ButtonsActions';

View File

@ -105,7 +105,7 @@
"accessorKey":"field", "accessorKey":"field",
"columns":[ "columns":[
{ {
"header":"=ЕСЛИ(ЛЕВСИМВ(B17;1)="3";B17;ЕСЛИ(D17<>0;СЦЕПИТЬ(C17;"_";D17);C17))", "header":" ",
"accessorKey":"field_eslilevsimvb1713b17eslid170stsepitc17_d17c17", "accessorKey":"field_eslilevsimvb1713b17eslid170stsepitc17_d17c17",
"columns":[ "columns":[
{ {

View File

@ -12,8 +12,8 @@ export const getLeafColumns = (targetColumn) => {
// Сбор всех листовых колонок из иерархии // Сбор всех листовых колонок из иерархии
export const collectLeafColumns = (column) => { export const collectLeafColumns = (column) => {
if (column.columns?.length === 0) return [column]; if (column.columns?.length === 0 || !column.columns) return [column];
if (column.columns?.length > 0 && column.columns[0]?.columns?.length === 0) { if (column.columns?.length > 0 && (column.columns[0]?.columns?.length === 0 || !column.columns)) {
return column.columns; return column.columns;
} }
return ( return (

View File

@ -8,6 +8,9 @@ import {
IconButton, IconButton,
Stack, Stack,
TextField, TextField,
Select,
MenuItem,
Autocomplete,
} from '@mui/material'; } from '@mui/material';
import { import {
ModalBackdrop, ModalBackdrop,
@ -20,6 +23,9 @@ import { Cancel } from '../common/icons/icons';
import { getStageStatus, getStatusColors } from './StagesTable/utils'; import { getStageStatus, getStatusColors } from './StagesTable/utils';
import { StageStatusChip } from './StageStatusChip'; import { StageStatusChip } from './StageStatusChip';
import { formatDateForApi } from './utils'; import { formatDateForApi } from './utils';
import CollapsibleTree from '../common/CollapsibleTree';
import { collectLeafColumns } from '../RealtimeTable/utils/columnUtils';
import { STAGE_ROLE_RUSSIAN_NAME } from '../../constants';
export const AddStagesModal = ({ export const AddStagesModal = ({
isOpen, isOpen,
@ -29,34 +35,89 @@ export const AddStagesModal = ({
updateStage, updateStage,
isTaskMode = false, isTaskMode = false,
isSaving = false, isSaving = false,
sheetOptions = [], // [{ value: 'sheet1', label: 'Лист 1' }]
formType = '',
defaultSheet = '',
defaultRole,
}) => { }) => {
const [startDate, setStartDate] = useState(null); const [startDate, setStartDate] = useState(null);
const [endDate, setEndDate] = useState(null); const [endDate, setEndDate] = useState(null);
const [stageName, setStageName] = useState('');
const [selectedSheet, setSelectedSheet] = useState(defaultSheet);
const [selectedRole, setSelectedRole] = useState(defaultRole);
const [columnsConfig, setColumnsConfig] = useState({ columns: [], colors: {} });
const [selectedColumns, setSelectedColumns] = useState([]);
useEffect(() => {
const loadColumnsConfig = async () => {
if (!selectedSheet) return;
const sheetObj = sheetOptions.find(s => s.value == selectedSheet);
try {
const { config } = await import(`../RealtimeTable/constants/${formType}/${sheetObj.sheet}.js`);
setColumnsConfig(config.config);
// Если есть сохраненные выбранные колонки для этого листа
if (stage?.column_keys) {
setSelectedColumns(stage.column_keys);
} else {
setSelectedColumns([]);
}
} catch (error) {
console.error(`Failed to load config for ${formType}/${selectedSheet}:`, error);
setColumnsConfig({ columns: [], colors: {} });
setSelectedColumns([]);
}
};
loadColumnsConfig();
}, [selectedSheet, formType, stage]);
useEffect(() => { useEffect(() => {
if (stage !== null) { if (stage !== null) {
setStartDate(stage.opens_at ?? null); setStartDate(stage.opens_at ?? null);
setEndDate(stage.closes_at ?? null); setEndDate(stage.closes_at ?? null);
setStageName(stage.phase_code ?? '');
setSelectedSheet(stage.sheet ?? null);
setSelectedRole(stage.role ?? null);
if (stage.column_keys) {
setSelectedColumns(stage.column_keys.map(c => 'data.' + c));
}
} else { } else {
setStartDate(null); setStartDate(null);
setEndDate(null); setEndDate(null);
setStageName('');
setSelectedSheet(defaultSheet);
setSelectedRole(defaultRole);
setSelectedColumns([]);
} }
}, [stage, isOpen]); }, [stage, isOpen, defaultSheet, defaultRole]);
const handleSave = () => { const handleSave = () => {
const opensAt = formatDateForApi(startDate); const opensAt = formatDateForApi(startDate);
const closesAt = formatDateForApi(endDate); const closesAt = formatDateForApi(endDate);
const sheetObj = sheetOptions.find(s => s.value == selectedSheet);
const stageData = {
phase_code: stageName,
sheet: sheetObj.sheet,
direction: sheetObj.direction,
role: selectedRole,
opens_at: opensAt,
closes_at: closesAt,
column_keys: selectedColumns.map(c => c.slice(5)),
};
if (stage === null) { if (stage === null) {
if (!createStage) return; if (!createStage) return;
createStage(opensAt, closesAt)?.then(() => { createStage(stageData)?.then(() => {
handleCancel(); handleCancel();
}); });
} else { } else {
updateStage({ updateStage({
...stage, ...stage,
opens_at: opensAt, ...stageData,
closes_at: closesAt,
})?.then(() => { })?.then(() => {
handleCancel(); handleCancel();
}); });
@ -66,6 +127,10 @@ export const AddStagesModal = ({
const handleCancel = () => { const handleCancel = () => {
setStartDate(null); setStartDate(null);
setEndDate(null); setEndDate(null);
setStageName('');
setSelectedSheet(defaultSheet);
setSelectedRole(defaultRole);
setSelectedColumns([]);
onClose(); onClose();
}; };
@ -75,13 +140,33 @@ export const AddStagesModal = ({
} }
}; };
const isFormValid = startDate && endDate; const handleSheetChange = (event) => {
setSelectedSheet(event.target.value);
setSelectedColumns([]);
};
const handleColumnsSelect = (column, isSelect) => {
const leafCols = collectLeafColumns(column).reduce((acc, item) => {
acc.push(item.accessorKey)
return acc;
}, []);
if (!isSelect) {
setSelectedColumns(prev => ([...prev, ...leafCols]));
}
else {
setSelectedColumns(prev => (prev.filter(c => !leafCols.includes(c))));
}
};
const isFormValid = startDate && endDate && stageName.trim() && selectedSheet;
if (!isOpen) return null; if (!isOpen) return null;
const stageStatus = stage ? getStageStatus(stage) : null; const stageStatus = stage ? getStageStatus(stage) : null;
const statusColors = stageStatus ? getStatusColors(stageStatus) : null; const statusColors = stageStatus ? getStatusColors(stageStatus) : null;
const columnTree = columnsConfig.columns || [];
return ( return (
<ModalBackdrop isOpen={isOpen} onClick={handleBackdropClick}> <ModalBackdrop isOpen={isOpen} onClick={handleBackdropClick}>
<ModalContainer> <ModalContainer>
@ -107,6 +192,78 @@ export const AddStagesModal = ({
<Box> <Box>
<Divider sx={{ marginBottom: '0.75rem' }} /> <Divider sx={{ marginBottom: '0.75rem' }} />
{/* Название этапа */}
<Stack sx={{ marginBottom: '0.75rem', width: '100%' }}>
<FormControl fullWidth>
<FormLabel>Название этапа</FormLabel>
<TextField
value={stageName}
onChange={(e) => setStageName(e.target.value)}
placeholder="Введите название этапа"
fullWidth
size="small"
/>
</FormControl>
</Stack>
{/* Выбор листа */}
<Stack sx={{ marginBottom: '0.75rem', width: '100%' }}>
<FormControl fullWidth>
<FormLabel>Выбор листа</FormLabel>
<Select
value={selectedSheet}
onChange={handleSheetChange}
displayEmpty
size="small"
>
<MenuItem value="" disabled>
Выберите лист
</MenuItem>
{sheetOptions.map((option) => (
<MenuItem key={option.value} value={option.value}>
{option.label}
</MenuItem>
))}
</Select>
</FormControl>
</Stack>
{selectedSheet && columnTree.length > 0 && (
<Stack sx={{ marginBottom: '0.75rem', width: '100%' }}>
<FormControl fullWidth>
<FormLabel>Выбор колонок</FormLabel>
<CollapsibleTree
columnTree={columnTree}
placeholder="Выбрать столбцы"
placeholderSelect="Выбрано столбцов: "
selectedIds={selectedColumns}
onSelectNode={handleColumnsSelect}
/>
</FormControl>
</Stack>
)}
<Stack sx={{ marginBottom: '0.75rem', width: '100%' }}>
<FormControl fullWidth>
<FormLabel>Роль</FormLabel>
<Select
value={selectedRole}
onChange={(e) => setSelectedRole(e.target.value)}
displayEmpty
size="small"
>
{Object.entries(STAGE_ROLE_RUSSIAN_NAME).map(([key, label]) => (
<MenuItem key={key} value={key}>
{label}
</MenuItem>
))}
</Select>
</FormControl>
</Stack>
{/* Даты */}
<Stack <Stack
direction="row" direction="row"
spacing={1} spacing={1}
@ -118,7 +275,6 @@ export const AddStagesModal = ({
<CalendarInput <CalendarInput
value={startDate} value={startDate}
onChange={(newValue) => setStartDate(newValue)} onChange={(newValue) => setStartDate(newValue)}
isTaskMode={isTaskMode}
/> />
</FormControl> </FormControl>
</Stack> </Stack>
@ -128,7 +284,6 @@ export const AddStagesModal = ({
<CalendarInput <CalendarInput
value={endDate} value={endDate}
onChange={(newValue) => setEndDate(newValue)} onChange={(newValue) => setEndDate(newValue)}
isTaskMode={isTaskMode}
/> />
</FormControl> </FormControl>
</Stack> </Stack>

View File

@ -20,6 +20,7 @@ import {
} from '@mui/material'; } from '@mui/material';
import CloseIcon from '@mui/icons-material/Close'; import CloseIcon from '@mui/icons-material/Close';
import { StagesTable } from './StagesTable/StagesTable'; import { StagesTable } from './StagesTable/StagesTable';
import { PrimaryButton } from '../common/Buttons/Buttons';
export const SettingModal = ({ export const SettingModal = ({
isOpen = true, isOpen = true,
@ -27,9 +28,10 @@ export const SettingModal = ({
formId, formId,
taskId, taskId,
mode = 'form', // 'form' | 'task' mode = 'form', // 'form' | 'task'
formTypeCode = '',
sheets,
}) => { }) => {
const formStages = useStages(mode === 'form' ? formId : null); const taskStages = useTaskStages(taskId);
const taskStages = useTaskStages(mode === 'task' ? taskId : null);
const { const {
deleteStage, deleteStage,
@ -38,10 +40,10 @@ export const SettingModal = ({
createStage, createStage,
updateStage, updateStage,
isSaving, isSaving,
} = mode === 'task' ? taskStages : formStages; } = taskStages;
const isTaskMode = mode === 'task'; const isTaskMode = mode === 'task';
const entityId = mode === 'task' ? taskId : formId; const entityId = taskId;
useEffect(() => { useEffect(() => {
if (isOpen && entityId) { if (isOpen && entityId) {
@ -53,6 +55,7 @@ export const SettingModal = ({
const [stageForEdit, setStageForEdit] = useState(null); const [stageForEdit, setStageForEdit] = useState(null);
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
const [stageToDelete, setStageToDelete] = useState(null); const [stageToDelete, setStageToDelete] = useState(null);
const [sheetOptions, setSheetOptions] = useState([]);
const handleAddStage = () => { const handleAddStage = () => {
setStageForEdit(null); setStageForEdit(null);
@ -72,6 +75,50 @@ export const SettingModal = ({
setStageForEdit(stage); setStageForEdit(stage);
setIsAddEditModalOpen(true); setIsAddEditModalOpen(true);
}; };
const transformToSheetOptions = (data) => {
const sheetMap = new Map();
data.forEach(item => {
const key = item.direction ? `${item.sheet}_${item.direction}` : item.sheet;
if (!sheetMap.has(key)) {
sheetMap.set(key, {
sheet: item.sheet,
direction: item.direction,
names: []
});
}
const entry = sheetMap.get(key);
if (!entry.names.includes(item.name)) {
entry.names.push(item.name);
}
});
const sheetOptions = [];
sheetMap.forEach((value) => {
let label = value.names.join(' / ');
if (value.direction) {
label += ` (${value.direction})`;
}
sheetOptions.push({
value: value.direction ? `${value.sheet}_${value.direction}` : value.sheet,
label: label,
sheet: value.sheet,
direction: value.direction
});
});
return sheetOptions;
};
useEffect(() => {
if (!sheets || sheets.length === 0) return;
setSheetOptions(transformToSheetOptions(sheets))
}, [sheets])
if (!isOpen) { if (!isOpen) {
return null; return null;
@ -100,15 +147,14 @@ export const SettingModal = ({
sx={{ width: '100%', justifyContent: 'space-between' }} sx={{ width: '100%', justifyContent: 'space-between' }}
> >
<Typography fontWeight="bold">Этапы</Typography> <Typography fontWeight="bold">Этапы</Typography>
{!isTaskMode && (
<Button <PrimaryButton
variant="contained" onClick={handleAddStage}
onClick={handleAddStage} startIcon={<WhitePlus />}
startIcon={<WhitePlus />} >
> Добавить этап
Добавить этап </PrimaryButton>
</Button>
)}
</Stack> </Stack>
{stagesInfo.isLoading ? ( {stagesInfo.isLoading ? (
@ -138,6 +184,8 @@ export const SettingModal = ({
updateStage={updateStage} updateStage={updateStage}
isTaskMode={isTaskMode} isTaskMode={isTaskMode}
isSaving={isSaving} isSaving={isSaving}
sheetOptions={sheetOptions}
formType={formTypeCode}
/> />
{!isTaskMode && ( {!isTaskMode && (
<DeleteStageModal <DeleteStageModal

View File

@ -20,7 +20,7 @@ import {
import { getStageStatus, getStatusColors } from './utils'; import { getStageStatus, getStatusColors } from './utils';
import { formatDate } from '../../../utils/formatDate'; import { formatDate } from '../../../utils/formatDate';
import { StageStatusChip } from '../StageStatusChip'; import { StageStatusChip } from '../StageStatusChip';
import { ROLES_NAME_ID, STAGE_ROLE_RUSSIAN_NAME } from '../../../constants'; import { ROLES_NAME_ID, SHEET_NAME, STAGE_ROLE_RUSSIAN_NAME } from '../../../constants';
import { useAuth } from '../../../app/context/AuthProvider'; import { useAuth } from '../../../app/context/AuthProvider';
export const StagesTable = ({ stages, onEdit, onDelete }) => { export const StagesTable = ({ stages, onEdit, onDelete }) => {
@ -85,7 +85,7 @@ export const StagesTable = ({ stages, onEdit, onDelete }) => {
return ( return (
<StyledTableRow key={rowKey}> <StyledTableRow key={rowKey}>
<TableCell> <TableCell>
<Typography variant="body2">{stage.sheet}</Typography> <Typography variant="body2">{SHEET_NAME[stage.sheet]} - {stage.phase_code}</Typography>
<Typography <Typography
variant="caption" variant="caption"
color="text.secondary" color="text.secondary"

View File

@ -18,8 +18,9 @@ import {
const CollapsibleTree = ({ const CollapsibleTree = ({
columnTree, columnTree,
placeholder = 'Скрыть столбцы', placeholder = 'Скрыть столбцы',
placeholderSelect = 'Скрыто столбцов: ',
selectedIds = [], selectedIds = [],
onSelectNode: onHideColumns, onSelectNode,
}) => { }) => {
const [expandedItems, setExpandedItems] = useState([]); const [expandedItems, setExpandedItems] = useState([]);
const [anchorEl, setAnchorEl] = useState(null); const [anchorEl, setAnchorEl] = useState(null);
@ -35,25 +36,39 @@ const CollapsibleTree = ({
const handleSelectAll = (isSelected) => { const handleSelectAll = (isSelected) => {
for (const col of columnTree) { for (const col of columnTree) {
onHideColumns?.(col, !isSelected); onSelectNode?.(col, !isSelected);
} }
}; };
const getChildrenIds = (node) => { const getChildrenIds = (node) => {
const getLeafColumn = (col) => { const getLeafColumn = (col) => {
if (col.columns.length == 0) return [col]; const hasColumns = col.columns && Array.isArray(col.columns);
if (col.columns.length > 0 && col.columns[0].columns.length == 0) {
if (!hasColumns || col.columns.length === 0) {
return [col];
}
const allChildrenAreLeaves = col.columns.every(
child => !child.columns || !Array.isArray(child.columns) || child.columns.length === 0
);
if (allChildrenAreLeaves) {
return col.columns; return col.columns;
} }
return col.columns.flatMap((childCol) => getLeafColumn(childCol)); return col.columns.flatMap((childCol) => getLeafColumn(childCol));
}; };
return getLeafColumn(node).map((c) => c.id);
const leafColumns = getLeafColumn(node);
return leafColumns.map((c) => c.id || c.accessorKey);
}; };
const isNodeChecked = (node) => { const isNodeChecked = (node) => {
const childrenIds = getChildrenIds(node); const childrenIds = getChildrenIds(node);
const selectedChildren = childrenIds.filter((id) => const selectedChildren = childrenIds.filter((id) =>
selectedNodes.includes(id), selectedNodes.includes(id)
,
); );
if (selectedChildren.length === 0) return false; if (selectedChildren.length === 0) return false;
@ -62,7 +77,7 @@ const CollapsibleTree = ({
}; };
const handleNodeCheck = (node, isSelected) => { const handleNodeCheck = (node, isSelected) => {
onHideColumns?.(node, !isSelected); onSelectNode?.(node, !isSelected);
}; };
const getId = (column) => { const getId = (column) => {
@ -71,7 +86,7 @@ const CollapsibleTree = ({
let current = column; let current = column;
while (current) { while (current) {
ancestors.unshift(current.id); ancestors.unshift(current.id || current.accessorKey);
current = current.parent; current = current.parent;
} }
@ -85,10 +100,9 @@ const CollapsibleTree = ({
return nodes.map((node) => { return nodes.map((node) => {
const checkStatus = isNodeChecked(node); const checkStatus = isNodeChecked(node);
return ( return (
<TreeItem <TreeItem
key={node.id} key={node.id || node.accessorKey}
itemId={String(getId(node))} itemId={String(getId(node))}
label={ label={
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}> <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
@ -107,7 +121,7 @@ const CollapsibleTree = ({
indeterminateIcon={<IndeterminateCheckBox />} indeterminateIcon={<IndeterminateCheckBox />}
/> />
<Typography variant="body2"> <Typography variant="body2">
{node.columnDef?.header || node.name || 'Без названия'} {node.columnDef?.header || node.name || node.header || 'Без названия'}
</Typography> </Typography>
</Box> </Box>
} }
@ -149,7 +163,7 @@ const CollapsibleTree = ({
if (selectedCount === 0) { if (selectedCount === 0) {
return ''; return '';
} }
return `Скрыто столбцов: ${selectedCount}`; return `${placeholderSelect} ${selectedCount}`;
}; };
return ( return (
@ -157,7 +171,7 @@ const CollapsibleTree = ({
<Box <Box
sx={{ sx={{
position: 'relative', position: 'relative',
width: '25rem', width: '100%',
}} }}
> >
<TextField <TextField

View File

@ -62,10 +62,68 @@ export const useTaskStages = (taskId) => {
[taskId], [taskId],
); );
const createStage = useCallback(
(payload) => {
if (!taskId) return Promise.reject('Нет taskId');
setIsSaving(true);
return StagesApi.createStage(taskId, payload)
.then((data) => {
setStagesInfo((prev) => ({
...prev,
stages: [...prev.stages, data.result],
}));
toast.success('Этап добавлен');
return data;
})
.catch((error) => {
toast.error(
error?.response?.data?.detail || 'Ошибка добавления этапа ',
);
throw error;
})
.finally(() => {
setIsSaving(false);
});
},
[taskId],
);
const deleteStage = useCallback(
(stage) => {
const { sheet, phase_code, budget_form_id } = stage;
if (!budget_form_id || !sheet || !phase_code) return;
StagesApi.deleteStage(budget_form_id, sheet, phase_code)
.then(() => {
setStagesInfo((prev) => ({
...prev,
stages: prev.stages.filter(
(curStage) =>
!(
curStage.sheet === sheet &&
curStage.phase_code === phase_code
),
),
}));
toast.success('Этап успешно удален');
})
.catch((error) => {
toast.error(
error?.response?.data?.detail || 'Ошибка при удалении этапа',
);
});
},
[taskId],
);
return { return {
stagesInfo, stagesInfo,
getStages, getStages,
updateStage, updateStage,
isSaving, isSaving,
createStage,
deleteStage,
}; };
}; };

View File

@ -15,7 +15,7 @@ export const EVENT_CONFIGS = {
notes: 'Примечания', notes: 'Примечания',
location_form: 'Форма расположения ВСП', location_form: 'Форма расположения ВСП',
numbers: 'Штатная численность ВСП', numbers: 'Штатная численность ВСП',
area: 'Площадь помещений ВСП', total_area: 'Площадь помещений ВСП',
rent_contract_num: 'Номер договора аренды', rent_contract_num: 'Номер договора аренды',
rent_end_date: 'Срок окончания договора аренды', rent_end_date: 'Срок окончания договора аренды',
system_code: 'Код РФ', system_code: 'Код РФ',
@ -33,7 +33,7 @@ export const EVENT_CONFIGS = {
notes: 'Примечания', notes: 'Примечания',
location_form: 'Форма расположения ВСП', location_form: 'Форма расположения ВСП',
numbers: 'Штатная численность ВСП', numbers: 'Штатная численность ВСП',
area: 'Площадь помещений ВСП', total_area: 'Площадь помещений ВСП',
rent_contract_num: 'Номер договора аренды', rent_contract_num: 'Номер договора аренды',
rent_end_date: 'Срок окончания договора аренды', rent_end_date: 'Срок окончания договора аренды',
system_code: 'Код РФ', system_code: 'Код РФ',

View File

@ -151,14 +151,16 @@ export default function TaskPage() {
> >
<span>Этапы</span> <span>Этапы</span>
</PrimaryOutlinedButton> </PrimaryOutlinedButton>
{modalStageOpen && (
<SettingStageModal <SettingStageModal
isOpen={modalStageOpen} isOpen={modalStageOpen}
onClose={() => setModalStageOpen(false)} onClose={() => setModalStageOpen(false)}
taskId={taskId} taskId={taskId}
mode="task" mode="task"
/> formTypeCode={task?.form_type_code || ''}
)} sheets={tables}
/>
</Stack> </Stack>
</Box> </Box>