- {/* Pending invitation notice */}
{hasPendingInvitation && !successMessage && (
@@ -165,8 +139,8 @@ function Register() {
)}
- {getErrorMessage() && (
-
{getErrorMessage()}
+ {_getErrorMessage() && (
+
{_getErrorMessage()}
)}
{successMessage && (
@@ -203,22 +177,6 @@ function Register() {
- {registrationType === 'company' && (
-
- setCompanyName(e.target.value)}
- onFocus={() => setCompanyNameFocused(true)}
- onBlur={() => setCompanyNameFocused(false)}
- className={`${styles.input} ${companyNameFocused || companyName ? styles.focused : ''}`}
- />
-
-
- )}
-
- {isLoading ? "Registrierung läuft..." : isChecking ? "Benutzername wird geprüft..." : registrationType === 'company' ? 'Unternehmenskonto erstellen' : 'Kostenlos testen'}
+ {isLoading ? "Registrierung läuft..." : isChecking ? "Benutzername wird geprüft..." : 'Kostenlos registrieren'}
>
)}
diff --git a/src/pages/admin/wizards/AdminMandateWizardPage.tsx b/src/pages/admin/wizards/AdminMandateWizardPage.tsx
index 43814f8..1597127 100644
--- a/src/pages/admin/wizards/AdminMandateWizardPage.tsx
+++ b/src/pages/admin/wizards/AdminMandateWizardPage.tsx
@@ -236,6 +236,7 @@ export const AdminMandateWizardPage: React.FC = () => {
if (billingSaved) {
showSuccess('Erstellt', 'Mandant inkl. Abrechnung gespeichert');
}
+ window.dispatchEvent(new CustomEvent('features-changed'));
await loadMandates();
} catch (err: unknown) {
const e = err as { response?: { data?: { detail?: string } }; message?: string };
diff --git a/src/pages/views/workspace/WorkspaceInput.tsx b/src/pages/views/workspace/WorkspaceInput.tsx
index 9bc03a8..7138661 100644
--- a/src/pages/views/workspace/WorkspaceInput.tsx
+++ b/src/pages/views/workspace/WorkspaceInput.tsx
@@ -5,6 +5,7 @@
import React, { useState, useCallback, useRef, useEffect } from 'react';
import { ProviderMultiSelect } from '../../../components/ProviderSelector';
+import type { ProviderSelection } from '../../../components/ProviderSelector';
import { getPageIcon } from '../../../config/pageRegistry';
import { useVoiceStream } from '../../../hooks/useSpeechAudioCapture';
import type { WorkspaceFile, DataSource, FeatureDataSource } from './useWorkspace';
@@ -48,8 +49,8 @@ interface WorkspaceInputProps {
onRemovePendingFile?: (fileId: string) => void;
onFileUploadClick?: () => void;
uploading?: boolean;
- selectedProviders?: string[];
- onProvidersChange?: (providers: string[]) => void;
+ providerSelection?: ProviderSelection;
+ onProviderSelectionChange?: (selection: ProviderSelection) => void;
isMobile?: boolean;
onTreeItemsDrop?: (items: TreeItemDrop[]) => void;
onPasteAsFile?: (file: File) => void;
@@ -69,8 +70,8 @@ export const WorkspaceInput: React.FC = ({
onRemovePendingFile,
onFileUploadClick,
uploading = false,
- selectedProviders = [],
- onProvidersChange,
+ providerSelection,
+ onProviderSelectionChange,
isMobile = false,
onTreeItemsDrop,
onPasteAsFile,
@@ -653,12 +654,11 @@ export const WorkspaceInput: React.FC = ({
)}
- {onProvidersChange && (
+ {onProviderSelectionChange && providerSelection && (
)}
diff --git a/src/pages/views/workspace/WorkspacePage.tsx b/src/pages/views/workspace/WorkspacePage.tsx
index 01f965b..d333bd5 100644
--- a/src/pages/views/workspace/WorkspacePage.tsx
+++ b/src/pages/views/workspace/WorkspacePage.tsx
@@ -19,6 +19,9 @@ import { ToolActivityLog } from './ToolActivityLog';
import { UnifiedDataBar } from '../../../components/UnifiedDataBar';
import type { UdbContext, UdbTab } from '../../../components/UnifiedDataBar';
import api from '../../../api';
+import { _defaultProviderSelection, _toBackendProviders } from '../../../components/ProviderSelector';
+import type { ProviderSelection } from '../../../components/ProviderSelector';
+import { useBilling } from '../../../hooks/useBilling';
function _useResizable(initialWidth: number, minWidth: number, maxWidth: number) {
const [width, setWidth] = useState(initialWidth);
@@ -81,7 +84,8 @@ export const WorkspacePage: React.FC
= ({ persistentInstance
const [udbTab, setUdbTab] = useState('chats');
const [selectedFileId, setSelectedFileId] = useState(null);
const [pendingFiles, setPendingFiles] = useState([]);
- const [selectedProviders, setSelectedProviders] = useState([]);
+ const [providerSelection, setProviderSelection] = useState(_defaultProviderSelection());
+ const { allowedProviders } = useBilling();
const [isDragOver, setIsDragOver] = useState(false);
const [draftAppend, setDraftAppend] = useState('');
const dragCounterRef = useRef(0);
@@ -414,7 +418,8 @@ export const WorkspacePage: React.FC = ({ persistentInstance
instanceId={instanceId}
onSend={(prompt, fileIds, dataSourceIds, featureDataSourceIds, options) => {
const allFileIds = [...new Set([...pendingFiles.map(f => f.fileId), ...(fileIds || [])])];
- workspace.sendMessage(prompt, allFileIds, dataSourceIds, selectedProviders, featureDataSourceIds, options);
+ const resolvedProviders = _toBackendProviders(providerSelection, allowedProviders);
+ workspace.sendMessage(prompt, allFileIds, dataSourceIds, resolvedProviders, featureDataSourceIds, options);
setPendingFiles([]);
}}
isProcessing={workspace.isProcessing}
@@ -426,8 +431,8 @@ export const WorkspacePage: React.FC = ({ persistentInstance
onRemovePendingFile={_handleRemovePendingFile}
onFileUploadClick={() => fileInputRef.current?.click()}
uploading={fileOps.uploadingFile}
- selectedProviders={selectedProviders}
- onProvidersChange={setSelectedProviders}
+ providerSelection={providerSelection}
+ onProviderSelectionChange={setProviderSelection}
isMobile={isMobile}
onTreeItemsDrop={_handleTreeItemsDrop}
onPasteAsFile={_uploadAndAttach}