feat: complete workspace, triage, outliner and sharing overhaul (tasks 1-26)
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 57s

This commit is contained in:
sandrodach committed 2026-10-27 19:46:46 +01:00
1 parent df2f2bac67
commit d39d1d1122
17 files changed
+1173 -501

No files matched your search

+20 -11
View File
@@ -127,6 +127,7 @@ export const App: React.FC = () => {
const [activeTab, setActiveTab] = useState<ActiveTab>('triage');
const [previousTab, setPreviousTab] = useState<ActiveTab>('triage');
const [selectedDocId, setSelectedDocId] = useState<string | null>(null);
const [selectedBlockId, setSelectedBlockId] = useState<string | null>(null);
const [captureFocusCount, setCaptureFocusCount] = useState(0);
const [refreshRevision, setRefreshRevision] = useState(0);
@@ -143,6 +144,7 @@ export const App: React.FC = () => {
const [mobileVoiceActive, setMobileVoiceActive] = useState(false);
const [isVoiceCaptured, setIsVoiceCaptured] = useState(false);
const mobileRecognitionRef = useRef<any>(null);
const mobileBaseVoiceRef = useRef('');
const toggleMobileVoice = () => {
const SpeechRecognition =
@@ -157,6 +159,7 @@ export const App: React.FC = () => {
return;
}
try {
mobileBaseVoiceRef.current = mobileTriageContent.replace(/\s*\[…\]$/, '').trim();
const recognition = new SpeechRecognition();
recognition.lang = 'de-DE';
recognition.continuous = false;
@@ -170,10 +173,8 @@ export const App: React.FC = () => {
for (let i = 0; i < event.results.length; i++) {
transcript += event.results[i][0].transcript;
}
setMobileTriageContent((prev) => {
const base = prev.replace(/\s*\[…\]$/, '').trim();
return base ? `${base} ${transcript}` : transcript;
});
const base = mobileBaseVoiceRef.current;
setMobileTriageContent(base ? `${base} ${transcript}` : transcript);
setIsVoiceCaptured(true);
};
recognition.onerror = () => setMobileVoiceActive(false);
@@ -549,8 +550,9 @@ export const App: React.FC = () => {
refreshAll();
};
const handleOpenDocument = (docId: string) => {
const handleOpenDocument = (docId: string, blockId?: string) => {
setSelectedDocId(docId);
setSelectedBlockId(blockId || null);
setActiveTab('workspace');
};
@@ -636,9 +638,12 @@ export const App: React.FC = () => {
<Brain className="w-4 h-4" />
</div>
<div className="flex items-center gap-1.5">
<span className="font-bold text-base text-main tracking-tight">
{authStatus.instanceName || 'MindSift'}
</span>
<div className="flex flex-col">
<span className="font-bold text-base text-main tracking-tight leading-none">
{authStatus.instanceName || 'MindSift'}
</span>
<span className="text-[9px] text-muted font-mono leading-tight mt-0.5">v0.1</span>
</div>
<span className="text-[11px] font-semibold text-accent bg-accent/15 px-1.5 py-0.5 rounded-md">
{activeTabLabelMap[activeTab]}
</span>
@@ -698,9 +703,12 @@ export const App: React.FC = () => {
<div className="w-7 h-7 bg-accent text-on-accent rounded-btn flex items-center justify-center">
<Brain className="w-4 h-4" />
</div>
<span className="font-bold text-sm sm:text-base text-main tracking-tight leading-none">
{authStatus.instanceName || 'MindSift'}
</span>
<div className="flex flex-col">
<span className="font-bold text-sm sm:text-base text-main tracking-tight leading-none">
{authStatus.instanceName || 'MindSift'}
</span>
<span className="text-[10px] text-muted font-mono leading-tight mt-0.5">v0.1</span>
</div>
</div>
{/* Quick-Capture Input Bubble directly in Header (above Tabs) */}
@@ -961,6 +969,7 @@ export const App: React.FC = () => {
<WorkspaceView
currentUser={user}
initialDocId={selectedDocId}
initialBlockId={selectedBlockId}
onStatsChange={refreshAll}
/>
)}