{
- 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 fa3e42bae6..7cd034edd7 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 f25aaedfcb..9ee11cbd26 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 a1f66480b8..36dd4dfcd2 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 6209fb4b6d..3d07338ac6 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')}
)}
-