Workspace Commands
Przegląd
Dział zatytułowany „Przegląd”Workspace (Pracownia) to centralny hub do pracy z wieloma wizytami naraz. W odróżnieniu od VisitsHubView (edycja pojedynczej wizyty), Workspace agreguje:
- Notes - szkice wizyt (draft SOAP + internal notes)
- Transcripts - transkrypcje audio (pending + archiwum)
- Saved - zapisane notatki
- Reminders - zadania/przypomnienia w trybie Pracownia
src/components/workspace/├── WorkspaceView.tsx # Entry point├── WorkspaceDraftsPanel.tsx # Tab: Notes├── WorkspaceTranscripts.tsx # Tab: Transcripts├── WorkspaceSavedNotes.tsx # Tab: Saved└── WorkspaceReminders.tsx # Tab: RemindersArchitecture
Dział zatytułowany „Architecture”flowchart TB subgraph WorkspaceView Tabs[Tab Navigation] Tabs --> Notes[Notes Panel] Tabs --> Transcripts[Transcripts Panel] Tabs --> Saved[Saved Notes Panel] Tabs --> Reminders[Reminders Panel] end
subgraph Hooks useWorkspaceData --> Notes useWorkspaceData --> Transcripts useNotes --> Saved useTasks --> Reminders useAiTaskSuggestions --> Reminders end
subgraph Backend visitApi[visitApi.getWithDetailsPaginated] audioApi[audioApi.saveFile] tasksService[tasksService CRUD] end
useWorkspaceData --> visitApi useWorkspaceData --> audioApi Reminders --> tasksServiceMain Hook: useWorkspaceData
Dział zatytułowany „Main Hook: useWorkspaceData”Plik: src/hooks/workspace/useWorkspaceData.ts
Loading Visits
Dział zatytułowany „Loading Visits”// Ładowanie wizyt z ostatnich 7 dnivisitApi.getWithDetailsPaginated( { page, page_size: 8, sort_by: 'updated_at', sort_order: 'desc' }, { statuses: ['draft', 'sent', 'finalized'], days: 7 })Retention Policy
Dział zatytułowany „Retention Policy”Przed zapisaniem do stanu, hook stosuje lokalną retencję:
- Jeśli audio/transkrypt starsze niż
AUDIO_RETENTION_HOURS/TRANSCRIPT_RETENTION_HOURS - Czyści pola audio/transkrypt w stanie FE (bez kasowania w DB)
WorkspaceItem Conversion
Dział zatytułowany „WorkspaceItem Conversion”| Builder | Type | Zawartość |
|---|---|---|
buildDraftItem(visit) | 'draft' | SOAP fields, internal notes, AI suggestions |
buildTranscriptItem(visit) | 'transcript' | transcript + pending, preview, tags |
buildArchivedTranscriptItem(archive) | 'transcript' | Archiwum z tagiem ARCHIWUM |
Tauri Events
Dział zatytułowany „Tauri Events”// Event listeners w useWorkspaceData'transcription_completed' → fetchVisits()'ai_suggestions_generated' → fetchVisits()'visit-processing-timeout' → fetchVisits()Operations
Dział zatytułowany „Operations”| Funkcja | Opis | Backend Call |
|---|---|---|
updateSection(id, section, value) | Lokalna aktualizacja SOAP | - |
persistInternalVisitNotes(id, value) | Zapis internal notes | visitApi.update |
persistSection(id, section, value) | Zapis sekcji SOAP | visitApi.update |
attachAudio(id, payload) | Attach + transkrypcja | audioApi.saveFile, transcribeAndSaveToVisit |
mergePendingTranscript(id) | Merge pending do głównego | merge_pending_transcript |
dismissPendingTranscript(id) | Odrzuć + archiwizuj | dismiss_pending_transcript |
saveDraft(id, overrides?) | Zapisz jako draft | visitApi.update |
Tab: Notes (WorkspaceDraftsPanel)
Dział zatytułowany „Tab: Notes (WorkspaceDraftsPanel)”Panel pracy nad szkicami wizyt z ostatnich 7 dni.
interface WorkspaceDraftsPanelProps { drafts: WorkspaceItem[]; transcripts: WorkspaceItem[]; loading: boolean; error: Error | null;
// Operations updateSection: (id, section, value) => void; persistInternalVisitNotes: (id, value) => Promise<void>; persistSection: (id, section, value) => Promise<void>; attachAudio: (id, payload) => Promise<void>; saveDraft: (id, overrides?) => Promise<void>;
// Transcript actions runTranscriptAction: (...) => Promise<void>; getTranscriptActionState: (...) => ActionState;
// Navigation onOpenPatientProfile: (patientId) => void; onOpenPatientHistory: (patientId) => void;}User Actions
Dział zatytułowany „User Actions”- Widzi listę szkiców wizyt (SOAP + internal notes)
- Koryguje sekcje SOAP →
persistSection→visitApi.update - Edytuje wewnętrzne notatki →
persistInternalVisitNotes - Podpina audio →
attachAudio→ zapis i transkrypcja - Zapisuje całą notatkę →
saveDraft
AI Suggestions
Dział zatytułowany „AI Suggestions”Jeśli backend zapisze ai_sugestie dla wizyty, parseAiSuggestions mapuje je na pola interview/exam/diagnosis/plan i panel pokazuje je jako propozycje.
Tab: Transcripts (WorkspaceTranscripts)
Dział zatytułowany „Tab: Transcripts (WorkspaceTranscripts)”Hook: useWorkspaceTranscriptsPanel
Dział zatytułowany „Hook: useWorkspaceTranscriptsPanel”const { filteredTranscripts, // Po czasie i search expandedTranscripts, // Rozwinięte karty pagination,
// Delete lifecycle pendingTranscript, isDeletingTranscript, handleConfirmDeleteTranscript, handleCancelDeleteTranscript,} = useWorkspaceTranscriptsPanel(transcripts);Filtering
Dział zatytułowany „Filtering”- Time range:
getDefaultRangeForTab('transcripts')→ domyślnie 48h - Search: pacjent, tagi, tekst transkryptu
Actions
Dział zatytułowany „Actions”| Action | Opis |
|---|---|
| Expand/Collapse | Rozwijanie kart transkryptów |
| Merge | runTranscriptAction → merge pending |
| Dismiss | runTranscriptAction → dismiss + archiwum |
| Copy | handleCopyTranscript → clipboard + toast |
| Delete | Confirmation flow → usunięcie |
Audio Attached Event
Dział zatytułowany „Audio Attached Event”// WorkspaceView nasłuchuje'vista.workspace.audioAttached' → { visitId, durationSec }
// Pokazuje toast"Audio X:YY przypięte do [Pacjent]"Tab: Saved (WorkspaceSavedNotes)
Dział zatytułowany „Tab: Saved (WorkspaceSavedNotes)”Hook: useWorkspaceSavedNotesPanel
Dział zatytułowany „Hook: useWorkspaceSavedNotesPanel”const { sortedNotes, // sortowane po createdAt desc filteredNotes, // po search paginatedNotes,
// Operations handleCopySavedNote, // clipboard + recordRoamEvent handlePinSavedNote, // pinNote() handleRemoveSavedNote, // removeSaved() handleUpdateSavedNote, // updateSaved() z walidacją} = useWorkspaceSavedNotesPanel();Data Source
Dział zatytułowany „Data Source”const { saved } = useNotes();// sortuje po createdAt desc// filtruje po tekście notatki// paginuje z DEFAULT_LIST_PAGE_SIZETab: Reminders (WorkspaceReminders)
Dział zatytułowany „Tab: Reminders (WorkspaceReminders)”Zadania i przypomnienia w kontekście Pracowni.
Data Flow
Dział zatytułowany „Data Flow”flowchart LR useTasks["useTasks({ pollIntervalMs: 120_000 })"] --> workspaceTasks workspaceTasks --> filteredWorkspaceTasks
subgraph Filters taskFilter["all | completed | system | user"] classifyTaskOwnership isTaskOpen end
Filters --> filteredWorkspaceTasksHook: useWorkspaceRemindersPanel
Dział zatytułowany „Hook: useWorkspaceRemindersPanel”const { reminderFilter, // 'mine' | 'vista' | 'all' | 'completed' searchQuery, selectedTags,
// Operations completeTaskAndNotify, handlePriorityChange, // low → medium → high (cyclic) handleTitleChange, handleDescriptionChange, handleTagsChange,
// CRUD handleAddTask, // opens TaskCreateDialog handleCreateTask, // buildManualUserTaskCreateInput → create_task handlePatientAssign, // update_task with patient_id handleDeleteTask, // confirm → delete_task} = useWorkspaceRemindersPanel();Creating Tasks
Dział zatytułowany „Creating Tasks”// handleCreateTask flowconst payload = buildManualUserTaskCreateInput({ title, description, priority, patientId, // optional});
await tasksService.create(payload); // → create_taskrefreshWorkspaceTasks();AI Task Suggestions
Dział zatytułowany „AI Task Suggestions”// lastAiVisitId z localStorageconst lastAiVisitId = localStorage.getItem('vista.ai.lastVisitId');
// Event aktualizujący'vista-open-workspace-ai-suggestions' → updates lastAiVisitId
// Hookconst { aiSuggestions, aiLoading, aiAccept, aiDismiss } = useAiTaskSuggestions(aiTasksEnabled ? lastAiVisitId : null);
// Przekazane do paneluonAiAccept(ids) → aiAccept(ids) + refreshWorkspaceTasks()onAiDismiss(ids) → aiDismiss(ids)Workspace vs Visits Comparison
Dział zatytułowany „Workspace vs Visits Comparison”| Aspekt | Workspace | VisitsHubView |
|---|---|---|
| Scope | Wiele wizyt (7 dni) | Pojedyncza wizyta |
| Primary Use | Przegląd, transkrypcje, notatki | Edycja SOAP, finalizacja |
| AI | Task suggestions | SOAP generation |
| Tabs | Notes/Transcripts/Saved/Reminders | Visit tabs |
| Entry Point | WorkspaceView.tsx | VisitsWorkspaceView.tsx → VisitsHubView.tsx |
Powiązane dokumenty
Dział zatytułowany „Powiązane dokumenty”- Visits Commands - CRUD wizyt, SOAP, finalizacja
- Tasks Commands - Pełne API zadań
- Audio Commands - Recording i transcription pipeline