}+K!7S
zBRF03DyE<1qJ3u}&b%s*^`)bZM{a7WAASNMW1ozH|%=Q)JTfHP9;ambgkVWoF7?2z+**19IfH*e?Oo=%^sLt>T7
zZDcK+NSuy|6J^xC3!Yp#?ctpSKEu2fbsSFl{yMgH*M5r=6p4A&d(5d-PsQV)@{dmiANZ}UC90L`(b*tOG05}5
z++k|*#%WttYX!&!X$O3_ieIO4#jw2$-oxPFPS|D}-3d9H+)paIjOQ7Shw+=*)D9;c
z)c8fDSm>LvJBnkE^-KFbUYs`Z4tRiU`WfQncz9bu_%v)+HsF2J!>xZ6Vel?FNzRdL
zdb+U!$D#N>Ew!jS%
z_;Hr!4AbwVu;hzT6S&r6xPCGVbq&-qOGah~l-e
zC&1yoes5hLgx8<5mwZ0^EvMP%@|K-Ow4#k!vGTM2FWZBMm%=*(-x|~T=nBvcq%;$z
z@bA=zV;h0$-Sei`P1JXUILC~*m`Fe^&*S!jIF~EuuTid{pLuU1UFd(lbLxs>GzeDB
z!<{~=9+KM3-+BI>cGCYKZl=GK%+V|P_u&XFeLbq(^l!m;-@RB&W<-=e7lXLpj#1TlM`{d7bjWYC4wS2L6dRRSpjlG-hdoP
z`G1AD{~JF2!Kkb2mwEjH&*mh)zxI^Q#~(_wzzq>D0n6fz(N~4$vvMq9%j(R=g1B3Z
zI)Qr3mgRq|dySR#qJxQqA}IGb!H!oY+7#2SkTT$;9NGv1lLg>ISD28%%L0hF1
zYO!?ekiKho_c{KsF+MsMo0~c2UzMKPyno7*P=f!E)K#?(L%h~3TjkE-(TSQoVYqHJ
zTf0*On38js?e>6STlWQdi5l_W-~C_c9XTF67UVnap1gV!_Z=aY@#wbS{Vf4Lsa=JT
zi^%r^#6m+LO)+HscEC0tG~_xC-KpO+(ajcs7nKCa3rk}!ae<-|q8IY`iO)mEczE2r
zYHroA#~?J11iI3sw`#w0{$OoAV4DTnT64JqK_reLYb|W;h*ETqJWl599HBLXu8o!VzJaEA@bFA{g0ok*3L$ZsAN2uhwph7cHkWSQ8sf?s4Xs
zfl@E5@mMC
z3t5TQoc@x0>e$7bpQ9*+3L#F&1AfC#a#9Zct>vpq2xYlc6Myl7#>n0e7GdMkkZZ^n
z5f{{p>7{~lVOK}cv7Bz`0tf0IkUr7jg=|1;W?fJzraxkLM06=Y3?-*Q(qxK&rE29*
zXUSO`6n0^l)T#kJEx&Pne1qAWN36+&d@8NQ#!%h*FW$sg6WN^w+x7T-{X}V6F|W^#
z%-X!R$9ECYN~biLm3-n*EBfg1-9+1hij~~^yArl2YG
zc*X`rg(vXRTxHQZk?Z(ESuuk$3tTW@>Ym`xWoVVd@M`+_-ld*mC$4KQLENG-Q
z_-VM|8K1Tz>>sLyf3zS}*JEt&fO)Yayou1FO&q|Ch8fleJ8Nq2PdY{i?kEV3Jzt}m
ziLfpglB3txiz~aPw)hg+d?l}Imoda>8_dtrNScS=z2C~5{VIBa<^E2CfYZvm9a|a^cpaG!uQ9J6$5vK_8b-ZC5@q+UBXxK%RbS>E!9UTjn<^
z`<EqA{<$^zDB=NoYO2vj
zf76yo`4W3MNBgGGZZeABlAg(qHl)fl9+N1)rHfG5$=^Oq@GQM&6k|9}5F
aJFjz2q?ldh(5nyMk6D=57=Jv05B)#XI~864
literal 0
HcmV?d00001
diff --git a/frontend/public/branding/old/favicon.svg b/frontend/public/branding/old/favicon.svg
new file mode 100644
index 000000000..0fef4393a
--- /dev/null
+++ b/frontend/public/branding/old/favicon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/public/locales/en-GB/translation.json b/frontend/public/locales/en-GB/translation.json
index 9cfe5380b..8c93539c6 100644
--- a/frontend/public/locales/en-GB/translation.json
+++ b/frontend/public/locales/en-GB/translation.json
@@ -3177,6 +3177,7 @@
"rememberme": "Remember me",
"invalid": "Invalid username or password.",
"locked": "Your account has been locked.",
+ "sessionExpired": "Your session has expired. Please sign in again.",
"signinTitle": "Please sign in",
"ssoSignIn": "Login via Single Sign-on",
"oAuth2AutoCreateDisabled": "OAUTH2 Auto-Create User Disabled",
@@ -3681,6 +3682,12 @@
"saveSuccess": "Settings saved successfully",
"save": "Save Changes",
"restartRequired": "Restart Required",
+ "loginRequired": "Login mode must be enabled to modify admin settings",
+ "loginDisabled": {
+ "title": "Login Mode Required",
+ "message": "Login mode must be enabled to modify admin settings. Please set SECURITY_ENABLELOGIN=true in your environment or security.enableLogin: true in settings.yml, then restart the server.",
+ "readOnly": "The settings below show example values for reference. Enable login mode to view and edit actual configuration."
+ },
"restart": {
"title": "Restart Required",
"message": "Settings have been saved successfully. A server restart is required for the changes to take effect.",
@@ -3751,6 +3758,12 @@
"description": "Default producer for PDF metadata"
}
},
+ "logoStyle": {
+ "label": "Logo Style",
+ "description": "Choose between the modern minimalist logo or the classic S icon",
+ "classic": "Classic",
+ "modern": "Modern"
+ },
"customPaths": {
"label": "Custom Paths",
"description": "Configure custom file system paths for pipeline processing and external tools",
diff --git a/frontend/src/core/components/shared/AppConfigModal.tsx b/frontend/src/core/components/shared/AppConfigModal.tsx
index f9937f775..e7ddf0f0e 100644
--- a/frontend/src/core/components/shared/AppConfigModal.tsx
+++ b/frontend/src/core/components/shared/AppConfigModal.tsx
@@ -143,16 +143,15 @@ const AppConfigModal: React.FC = ({ opened, onClose }) => {
{
- if (!isDisabled) {
- setActive(item.key);
- navigate(`/settings/${item.key}`);
- }
+ // Allow navigation even when disabled - the content inside will be disabled
+ setActive(item.key);
+ navigate(`/settings/${item.key}`);
}}
className={`modal-nav-item ${isMobile ? 'mobile' : ''}`}
style={{
background: isActive ? colors.navItemActiveBg : 'transparent',
- opacity: isDisabled ? 0.5 : 1,
- cursor: isDisabled ? 'not-allowed' : 'pointer',
+ opacity: isDisabled ? 0.6 : 1,
+ cursor: 'pointer',
}}
data-tour={`admin-${item.key}-nav`}
>
diff --git a/frontend/src/core/components/shared/FirstLoginModal.tsx b/frontend/src/core/components/shared/FirstLoginModal.tsx
index fa3e42bae..7cd034edd 100644
--- a/frontend/src/core/components/shared/FirstLoginModal.tsx
+++ b/frontend/src/core/components/shared/FirstLoginModal.tsx
@@ -52,7 +52,7 @@ export default function FirstLoginModal({ opened, onPasswordChanged, username }:
setLoading(true);
setError('');
- await accountService.changePassword(currentPassword, newPassword);
+ await accountService.changePasswordOnLogin(currentPassword, newPassword);
alert({
alertType: 'success',
diff --git a/frontend/src/core/components/shared/LandingPage.tsx b/frontend/src/core/components/shared/LandingPage.tsx
index f25aaedfc..9ee11cbd2 100644
--- a/frontend/src/core/components/shared/LandingPage.tsx
+++ b/frontend/src/core/components/shared/LandingPage.tsx
@@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next';
import { useFileHandler } from '@app/hooks/useFileHandler';
import { useFilesModalContext } from '@app/contexts/FilesModalContext';
import { BASE_PATH } from '@app/constants/app';
+import { useLogoPath } from '@app/hooks/useLogoPath';
const LandingPage = () => {
const { addFiles } = useFileHandler();
@@ -14,6 +15,7 @@ const LandingPage = () => {
const { t } = useTranslation();
const { openFilesModal } = useFilesModalContext();
const [isUploadHover, setIsUploadHover] = React.useState(false);
+ const logoPath = useLogoPath();
const handleFileDrop = async (files: File[]) => {
await addFiles(files);
@@ -72,7 +74,7 @@ const LandingPage = () => {
}}
>

}
+ title={t('admin.settings.loginDisabled.title', 'Login Mode Required')}
+ color="blue"
+ variant="light"
+ styles={{
+ root: {
+ borderLeft: '4px solid var(--mantine-color-blue-6)'
+ }
+ }}
+ >
+
+ {t('admin.settings.loginDisabled.message', 'Login mode must be enabled to modify admin settings. Please set SECURITY_ENABLELOGIN=true in your environment or security.enableLogin: true in settings.yml, then restart the server.')}
+
+
+ {t('admin.settings.loginDisabled.readOnly', 'The settings below show example values for reference. Enable login mode to view and edit actual configuration.')}
+
+
+ );
+}
diff --git a/frontend/src/core/components/shared/config/configNavSections.tsx b/frontend/src/core/components/shared/config/configNavSections.tsx
index a1f66480b..36dd4dfcd 100644
--- a/frontend/src/core/components/shared/config/configNavSections.tsx
+++ b/frontend/src/core/components/shared/config/configNavSections.tsx
@@ -2,18 +2,6 @@ import React from 'react';
import { NavKey } from '@app/components/shared/config/types';
import HotkeysSection from '@app/components/shared/config/configSections/HotkeysSection';
import GeneralSection from '@app/components/shared/config/configSections/GeneralSection';
-import AdminGeneralSection from '@app/components/shared/config/configSections/AdminGeneralSection';
-import AdminSecuritySection from '@app/components/shared/config/configSections/AdminSecuritySection';
-import AdminConnectionsSection from '@app/components/shared/config/configSections/AdminConnectionsSection';
-import AdminPrivacySection from '@app/components/shared/config/configSections/AdminPrivacySection';
-import AdminDatabaseSection from '@app/components/shared/config/configSections/AdminDatabaseSection';
-import AdminAdvancedSection from '@app/components/shared/config/configSections/AdminAdvancedSection';
-import AdminLegalSection from '@app/components/shared/config/configSections/AdminLegalSection';
-import AdminPremiumSection from '@app/components/shared/config/configSections/AdminPremiumSection';
-import AdminFeaturesSection from '@app/components/shared/config/configSections/AdminFeaturesSection';
-import AdminEndpointsSection from '@app/components/shared/config/configSections/AdminEndpointsSection';
-import AdminAuditSection from '@app/components/shared/config/configSections/AdminAuditSection';
-import AdminUsageSection from '@app/components/shared/config/configSections/AdminUsageSection';
export interface ConfigNavItem {
key: NavKey;
@@ -40,8 +28,8 @@ export interface ConfigColors {
}
export const createConfigNavSections = (
- isAdmin: boolean = false,
- runningEE: boolean = false,
+ _isAdmin: boolean = false,
+ _runningEE: boolean = false,
_loginEnabled: boolean = false
): ConfigNavSection[] => {
const sections: ConfigNavSection[] = [
@@ -64,112 +52,5 @@ export const createConfigNavSections = (
},
];
- // Add Admin sections if user is admin
- if (isAdmin) {
- // Configuration
- sections.push({
- title: 'Configuration',
- items: [
- {
- key: 'adminGeneral',
- label: 'System Settings',
- icon: 'settings-rounded',
- component:
- },
- {
- key: 'adminFeatures',
- label: 'Features',
- icon: 'extension-rounded',
- component:
- },
- {
- key: 'adminEndpoints',
- label: 'Endpoints',
- icon: 'api-rounded',
- component:
- },
- {
- key: 'adminDatabase',
- label: 'Database',
- icon: 'storage-rounded',
- component:
- },
- {
- key: 'adminAdvanced',
- label: 'Advanced',
- icon: 'tune-rounded',
- component:
- },
- ],
- });
-
- // Security & Authentication
- sections.push({
- title: 'Security & Authentication',
- items: [
- {
- key: 'adminSecurity',
- label: 'Security',
- icon: 'shield-rounded',
- component:
- },
- {
- key: 'adminConnections',
- label: 'Connections',
- icon: 'link-rounded',
- component:
- },
- ],
- });
-
- // Licensing & Analytics
- sections.push({
- title: 'Licensing & Analytics',
- items: [
- {
- key: 'adminPremium',
- label: 'Premium',
- icon: 'star-rounded',
- component:
- },
- {
- key: 'adminAudit',
- label: 'Audit',
- icon: 'fact-check-rounded',
- component:
,
- disabled: !runningEE,
- disabledTooltip: 'Requires Enterprise license'
- },
- {
- key: 'adminUsage',
- label: 'Usage Analytics',
- icon: 'analytics-rounded',
- component:
,
- disabled: !runningEE,
- disabledTooltip: 'Requires Enterprise license'
- },
- ],
- });
-
- // Policies & Privacy
- sections.push({
- title: 'Policies & Privacy',
- items: [
- {
- key: 'adminLegal',
- label: 'Legal',
- icon: 'gavel-rounded',
- component:
- },
- {
- key: 'adminPrivacy',
- label: 'Privacy',
- icon: 'visibility-rounded',
- component:
- },
- ],
- });
- }
-
return sections;
};
diff --git a/frontend/src/core/components/shared/config/configSections/ProviderCard.tsx b/frontend/src/core/components/shared/config/configSections/ProviderCard.tsx
index 6209fb4b6..3d07338ac 100644
--- a/frontend/src/core/components/shared/config/configSections/ProviderCard.tsx
+++ b/frontend/src/core/components/shared/config/configSections/ProviderCard.tsx
@@ -10,6 +10,7 @@ interface ProviderCardProps {
settings?: Record
;
onSave?: (settings: Record) => void;
onDisconnect?: () => void;
+ disabled?: boolean;
}
export default function ProviderCard({
@@ -18,6 +19,7 @@ export default function ProviderCard({
settings = {},
onSave,
onDisconnect,
+ disabled = false,
}: ProviderCardProps) {
const { t } = useTranslation();
const [expanded, setExpanded] = useState(false);
@@ -39,6 +41,7 @@ export default function ProviderCard({
};
const handleFieldChange = (key: string, value: any) => {
+ if (disabled) return; // Block changes when disabled
setLocalSettings((prev) => ({ ...prev, [key]: value }));
};
@@ -63,6 +66,7 @@ export default function ProviderCard({
handleFieldChange(field.key, e.target.checked)}
+ disabled={disabled}
/>
);
@@ -76,6 +80,7 @@ export default function ProviderCard({
placeholder={field.placeholder}
value={value}
onChange={(e) => handleFieldChange(field.key, e.target.value)}
+ disabled={disabled}
/>
);
@@ -88,6 +93,7 @@ export default function ProviderCard({
placeholder={field.placeholder}
value={value}
onChange={(e) => handleFieldChange(field.key, e.target.value)}
+ disabled={disabled}
/>
);
@@ -100,6 +106,7 @@ export default function ProviderCard({
placeholder={field.placeholder}
value={value}
onChange={(e) => handleFieldChange(field.key, e.target.value)}
+ disabled={disabled}
/>
);
}
@@ -174,11 +181,12 @@ export default function ProviderCard({
color="red"
size="sm"
onClick={onDisconnect}
+ disabled={disabled}
>
{t('admin.settings.connections.disconnect', 'Disconnect')}
)}
-