diff --git a/AdminPanel/client/public/images/favicon.ico b/AdminPanel/client/public/images/favicon.ico index fc55efad..dc87d1a8 100644 Binary files a/AdminPanel/client/public/images/favicon.ico and b/AdminPanel/client/public/images/favicon.ico differ diff --git a/AdminPanel/client/src/components/Menu/Menu.js b/AdminPanel/client/src/components/Menu/Menu.js index d4afc213..642a76d5 100644 --- a/AdminPanel/client/src/components/Menu/Menu.js +++ b/AdminPanel/client/src/components/Menu/Menu.js @@ -1,18 +1,17 @@ -import {useSelector, useDispatch} from 'react-redux'; +import {useDispatch} from 'react-redux'; import {useLocation, useNavigate} from 'react-router-dom'; -import {selectIsAuthenticated} from '../../store/slices/userSlice'; import {clearConfig} from '../../store/slices/configSlice'; import {logout} from '../../api'; import MenuItem from './MenuItem/MenuItem'; import AppMenuLogo from '../../assets/AppMenuLogo.svg'; import {menuItems} from '../../config/menuItems'; import styles from './Menu.module.scss'; +import FileIcon from '../../assets/File.svg'; function Menu() { const location = useLocation(); const navigate = useNavigate(); const dispatch = useDispatch(); - const isAuthenticated = useSelector(selectIsAuthenticated); const handleLogout = async () => { try { @@ -49,17 +48,16 @@ function Menu() {
{menuItems.map(item => ( - handleMenuItemClick(item)} /> + handleMenuItemClick(item)} + icon={FileIcon} + /> ))} +
- - {isAuthenticated && ( -
- -
- )} ); diff --git a/AdminPanel/client/src/components/Menu/Menu.module.scss b/AdminPanel/client/src/components/Menu/Menu.module.scss index 10e36d3e..731c36d6 100644 --- a/AdminPanel/client/src/components/Menu/Menu.module.scss +++ b/AdminPanel/client/src/components/Menu/Menu.module.scss @@ -60,7 +60,7 @@ } &__logoutContainer { - margin-top: auto; + margin-left: 48px; } &__logoutButton { diff --git a/AdminPanel/client/src/components/Menu/MenuItem/MenuItem.js b/AdminPanel/client/src/components/Menu/MenuItem/MenuItem.js index aef29477..c914cbdc 100644 --- a/AdminPanel/client/src/components/Menu/MenuItem/MenuItem.js +++ b/AdminPanel/client/src/components/Menu/MenuItem/MenuItem.js @@ -1,10 +1,9 @@ -import FileIcon from '../../../assets/File.svg'; import styles from './MenuItem.module.scss'; -function MenuItem({label, isActive, onClick}) { +function MenuItem({label, isActive, onClick, icon}) { return (
- + {icon ? :
} {label}
); diff --git a/AdminPanel/client/src/components/SaveButton/SaveButton.module.scss b/AdminPanel/client/src/components/SaveButton/SaveButton.module.scss index d4349cd1..9ef5367f 100644 --- a/AdminPanel/client/src/components/SaveButton/SaveButton.module.scss +++ b/AdminPanel/client/src/components/SaveButton/SaveButton.module.scss @@ -20,7 +20,7 @@ } &--disabled { - background: #ff865c; + background: #ffd4c5; cursor: not-allowed; } diff --git a/AdminPanel/client/src/pages/Expiration/Expiration.js b/AdminPanel/client/src/pages/Expiration/Expiration.js index 522ac93b..ec54e9be 100644 --- a/AdminPanel/client/src/pages/Expiration/Expiration.js +++ b/AdminPanel/client/src/pages/Expiration/Expiration.js @@ -137,34 +137,34 @@ function Expiration() {
handleFieldChange('filesCron', value)} placeholder='0 0 */2 * * *' - description='Cron expression for file cleanup schedule (6 fields: second minute hour day month day_of_week)' + description='Cron expression for cleaning up expired cached files and temporary data (6 fields: second minute hour day month day_of_week)' error={getFieldError(CONFIG_PATHS.filesCron)} />
handleFieldChange('documentsCron', value)} placeholder='0 0 */2 * * *' - description='Cron expression for document cleanup schedule (6 fields: second minute hour day month day_of_week)' + description='Cron expression for auto-saving documents with pending changes and cleaning up expired user presence data (6 fields: second minute hour day month day_of_week)' error={getFieldError(CONFIG_PATHS.documentsCron)} />
handleFieldChange('files', value)} placeholder='3600' - description='Time in seconds after which files expire and can be cleaned up' + description='How long to keep cached files before marking them as expired and eligible for cleanup (default: 86400 = 24 hours)' min='0' error={getFieldError(CONFIG_PATHS.files)} /> diff --git a/AdminPanel/client/src/pages/Login/LoginPage.js b/AdminPanel/client/src/pages/Login/LoginPage.js index dae9d841..d1423255 100644 --- a/AdminPanel/client/src/pages/Login/LoginPage.js +++ b/AdminPanel/client/src/pages/Login/LoginPage.js @@ -46,6 +46,7 @@ export default function Login() { onChange={setTenantName} placeholder='Enter your tenant name' description='The name of your tenant organization' + error={error} onKeyDown={handleKeyDown} />
diff --git a/AdminPanel/server/sources/server.js b/AdminPanel/server/sources/server.js index 54e392e7..f743d963 100644 --- a/AdminPanel/server/sources/server.js +++ b/AdminPanel/server/sources/server.js @@ -107,3 +107,6 @@ app.use((err, req, res, _next) => { server.listen(port, () => { operationContext.global.logger.warn('AdminPanel server listening on port %d', port); }); + +//after all required modules in all files +moduleReloader.finalizeConfigWithRuntime(); diff --git a/Common/sources/moduleReloader.js b/Common/sources/moduleReloader.js index 47c1390b..4426cc35 100644 --- a/Common/sources/moduleReloader.js +++ b/Common/sources/moduleReloader.js @@ -50,6 +50,10 @@ function reloadNpmModule(moduleName) { } } +// Backup original NODE_CONFIG to avoid growing environment +const prevNodeConfig = process.env.NODE_CONFIG; +let nodeConfigOverridden = false; + /** * Requires config module with runtime configuration support. * Temporarily sets NODE_CONFIG for reload, then restores environment to prevent E2BIG. @@ -59,10 +63,6 @@ function reloadNpmModule(moduleName) { function requireConfigWithRuntime(opt_additionalConfig) { let config = require('config'); - // Backup original NODE_CONFIG to avoid growing environment - const prevNodeConfig = process.env.NODE_CONFIG; - let nodeConfigOverridden = false; - try { const configFilePath = config.get('runtimeConfig.filePath'); if (configFilePath) { @@ -88,20 +88,23 @@ function requireConfigWithRuntime(opt_additionalConfig) { if (err.code !== 'ENOENT') { console.error('Failed to load runtime config: %s', err.stack); } - } finally { - // Restore original NODE_CONFIG to keep env small and avoid E2BIG on Windows/pkg - if (nodeConfigOverridden) { - if (typeof prevNodeConfig === 'undefined') { - delete process.env.NODE_CONFIG; - } else { - process.env.NODE_CONFIG = prevNodeConfig; - } - } } return config; } +function finalizeConfigWithRuntime() { + // Restore original NODE_CONFIG to keep env small and avoid E2BIG on Windows/pkg + if (nodeConfigOverridden) { + if (typeof prevNodeConfig === 'undefined') { + delete process.env.NODE_CONFIG; + } else { + process.env.NODE_CONFIG = prevNodeConfig; + } + } +} + module.exports = { reloadNpmModule, - requireConfigWithRuntime + requireConfigWithRuntime, + finalizeConfigWithRuntime }; diff --git a/DocService/sources/server.js b/DocService/sources/server.js index 4bdbb4b4..5c55ddb8 100644 --- a/DocService/sources/server.js +++ b/DocService/sources/server.js @@ -509,3 +509,6 @@ process.on('uncaughtException', err => { process.exit(1); }); }); + +//after all required modules in all files +moduleReloader.finalizeConfigWithRuntime(); diff --git a/DocService/sources/utilsDocService.js b/DocService/sources/utilsDocService.js index 3d748f81..10eed828 100644 --- a/DocService/sources/utilsDocService.js +++ b/DocService/sources/utilsDocService.js @@ -66,7 +66,7 @@ function initializeSharp() { } }); } - + if (sharp) { // todo test. // Set concurrency to 2 for better performance diff --git a/FileConverter/sources/convertermaster.js b/FileConverter/sources/convertermaster.js index ce3e9809..62571f32 100644 --- a/FileConverter/sources/convertermaster.js +++ b/FileConverter/sources/convertermaster.js @@ -33,10 +33,10 @@ 'use strict'; const cluster = require('cluster'); -const logger = require('./../../Common/sources/logger'); -const operationContext = require('./../../Common/sources/operationContext'); const moduleReloader = require('./../../Common/sources/moduleReloader'); const config = moduleReloader.requireConfigWithRuntime(); +const logger = require('./../../Common/sources/logger'); +const operationContext = require('./../../Common/sources/operationContext'); if (cluster.isMaster) { const fs = require('fs'); @@ -104,3 +104,6 @@ process.on('uncaughtException', err => { process.exit(1); }); }); + +//after all required modules in all files +moduleReloader.finalizeConfigWithRuntime();