Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion languages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -1525,7 +1525,15 @@
"calc.history_desc": "Ausgeführte Rechnungen werden hier für Hausaufgaben & Nachvollziehbarkeit archiviert.",
"lang_modal.auto_detect_banner_title": "⚡ Automatische Übernahme von Sprachdateien & Flaggen",
"lang_modal.auto_detect_banner_desc": "Sobald eine Sprachdatei (.json) im Ordner languages/ aktualisiert wird, übernimmt SOCDOF diese direkt. Eigene Flaggenbilder können im Unterordner flags/ hinterlegt werden; standardmäßig wird das Länder-Emoji oder die Flagge mit Fragezeichen verwendet.",
"lang_modal.languages_available": "verfügbar"
"lang_modal.languages_available": "verfügbar",
"therapy.integrations": "Verknüpfte Arbeitsabläufe",
"therapy.integrationsDesc": "Klienten verwenden die gemeinsame Kontaktliste. Termine verwenden den gemeinsamen Kalender. Die Abrechnung öffnet den bestehenden Rechnungsablauf.",
"therapy.openCalendar": "Kalender öffnen",
"therapy.openBilling": "Abrechnung öffnen",
"therapy.contactPicker": "Bestehenden Kontakt verwenden",
"therapy.searchContacts": "Kontakte suchen...",
"therapy.noContacts": "Keine Kontakte vorhanden.",
"therapy.appointmentPrefix": "Therapietermin"
},
"therapy_practice": {
"title": "Praxis & Therapie"
Expand Down
10 changes: 9 additions & 1 deletion languages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -1525,7 +1525,15 @@
"calc.history_desc": "Executed calculations are archived here for homework and reference.",
"lang_modal.auto_detect_banner_title": "⚡ Automatic sync of language files & flags",
"lang_modal.auto_detect_banner_desc": "As soon as a language file (.json) in the languages/ folder is updated, SOCDOF immediately loads it. Custom flag images can be placed in the flags/ subfolder; by default, the country emoji or fallback flag with a question mark is displayed.",
"lang_modal.languages_available": "available"
"lang_modal.languages_available": "available",
"therapy.integrations": "Connected workflows",
"therapy.integrationsDesc": "Clients use the shared Contacts list. Appointments use the shared Calendar. Billing opens the existing invoice workflow.",
"therapy.openCalendar": "Open calendar",
"therapy.openBilling": "Open billing",
"therapy.contactPicker": "Use an existing contact",
"therapy.searchContacts": "Search contacts...",
"therapy.noContacts": "No contacts available.",
"therapy.appointmentPrefix": "Therapy appointment"
},
"therapy_practice": {
"title": "Practice & Therapy"
Expand Down
10 changes: 9 additions & 1 deletion languages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -1524,7 +1524,15 @@
"calc.history_desc": "Los cálculos se archivan aquí para tareas y seguimiento.",
"lang_modal.auto_detect_banner_title": "⚡ Sincronización automática de archivos de idioma y banderas",
"lang_modal.auto_detect_banner_desc": "Tan pronto como se actualice un archivo de idioma (.json) en la carpeta languages/, SOCDOF lo carga directamente. Las imágenes de banderas personalizadas se pueden colocar en la subcarpeta flags/; por defecto, se utiliza el emoji del país o la bandera de reserva con signo de interrogación.",
"lang_modal.languages_available": "disponibles"
"lang_modal.languages_available": "disponibles",
"therapy.integrations": "Flujos conectados",
"therapy.integrationsDesc": "Los clientes usan la lista de contactos compartida. Las citas usan el calendario compartido. La facturación abre el flujo de facturas existente.",
"therapy.openCalendar": "Abrir calendario",
"therapy.openBilling": "Abrir facturación",
"therapy.contactPicker": "Usar un contacto existente",
"therapy.searchContacts": "Buscar contactos...",
"therapy.noContacts": "No hay contactos disponibles.",
"therapy.appointmentPrefix": "Cita de terapia"
},
"therapy_practice": {
"title": "Consulta y terapia"
Expand Down
10 changes: 9 additions & 1 deletion languages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -1524,7 +1524,15 @@
"calc.history_desc": "Les calculs sont archivés ici pour les devoirs et le suivi.",
"lang_modal.auto_detect_banner_title": "⚡ Synchronisation automatique des fichiers de langue et drapeaux",
"lang_modal.auto_detect_banner_desc": "Dès qu'un fichier de langue (.json) du dossier languages/ est mis à jour, SOCDOF le charge directement. Les images de drapeaux peuvent être placées dans le sous-dossier flags/ ; par défaut, l'émoji du pays ou le drapeau de secours avec un point d'interrogation est utilisé.",
"lang_modal.languages_available": "disponibles"
"lang_modal.languages_available": "disponibles",
"therapy.integrations": "Flux de travail connectés",
"therapy.integrationsDesc": "Les clients utilisent la liste de contacts commune. Les rendez-vous utilisent le calendrier commun. La facturation ouvre le processus de facture existant.",
"therapy.openCalendar": "Ouvrir le calendrier",
"therapy.openBilling": "Ouvrir la facturation",
"therapy.contactPicker": "Utiliser un contact existant",
"therapy.searchContacts": "Rechercher des contacts...",
"therapy.noContacts": "Aucun contact disponible.",
"therapy.appointmentPrefix": "Rendez-vous thérapeutique"
},
"therapy_practice": {
"title": "Cabinet & Thérapie"
Expand Down
8 changes: 8 additions & 0 deletions src/components/CalendarModule.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,13 @@ export const CalendarModule: React.FC<CalendarModuleProps> = ({
setMiniCalendarMonth(new Date(focusedDate.getFullYear(), focusedDate.getMonth(), 1));
}, [focusedDate]);

// Refresh when another module creates or removes a shared local calendar event.
useEffect(() => {
const handleCalendarUpdated = () => refreshUnifiedEvents();
window.addEventListener('socdof:calendar-updated', handleCalendarUpdated);
return () => window.removeEventListener('socdof:calendar-updated', handleCalendarUpdated);
}, [refreshUnifiedEvents]);

// Subscribe to Auth and Sync changes
useEffect(() => {
const unsubAuth = subscribeToGoogleAuth((user, token) => {
Expand Down Expand Up @@ -781,6 +788,7 @@ export const CalendarModule: React.FC<CalendarModuleProps> = ({
};
const existing = getStoredCustomCalendarEvents();
saveStoredCustomCalendarEvents([...existing, newLocalEvent]);
window.dispatchEvent(new Event('socdof:calendar-updated'));
sounds.playSuccess();
setStatusNotification({
text: `Lokaler Termin "${newEventTitle}" gespeichert.`,
Expand Down
10 changes: 8 additions & 2 deletions src/components/DesktopWindowWorkspace.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
Check,
Headphones,
User,
Briefcase,
Plus,
StickyNote,
Zap
Expand Down Expand Up @@ -1648,7 +1649,7 @@
purchases: { title: t('module.purchases', currentLang, 'Einkauf'), subtitle: t('desc.purchases', currentLang, 'Lieferantenbestellungen'), icon: ShoppingCart, color: 'bg-gradient-to-br from-orange-500 to-amber-600' },
calendar: { title: t('module.calendar', currentLang, 'Kalender'), subtitle: t('desc.calendar', currentLang, 'Google Live Sync & Termine'), icon: Calendar, color: 'bg-gradient-to-br from-blue-500 to-sky-600' },
calculator: { title: t('module.calculator', currentLang, 'Taschenrechner'), subtitle: t('desc.calculator', currentLang, 'Einfach & Wissenschaftlich'), icon: Calculator, color: 'bg-gradient-to-br from-emerald-500 to-teal-700' },
therapy_practice: { title: t('module.therapy_practice', currentLang, 'Praxis'), subtitle: t('desc.therapy_practice', currentLang, 'Therapie & Beratung'), icon: User, color: 'bg-gradient-to-br from-slate-600 to-indigo-700' },
therapy_practice: { title: t('module.therapy_practice', currentLang, 'Praxis'), subtitle: t('desc.therapy_practice', currentLang, 'Therapie & Beratung'), icon: Briefcase, color: 'bg-gradient-to-br from-slate-600 to-indigo-700' },
widgets: { title: t('module.widgets', currentLang, 'Widgets'), subtitle: t('desc.widgets', currentLang, 'Desktop-Widgets & Notizen'), icon: WidgetsIcon, color: 'bg-gradient-to-br from-violet-500 to-purple-600' },
appstore: { title: t('module.appstore', currentLang, 'App Store'), subtitle: t('desc.appstore', currentLang, 'Module verwalten'), icon: Package, color: 'bg-gradient-to-br from-fuchsia-500 to-pink-600' },
docs: { title: t('module.docs', currentLang, 'Handbuch'), subtitle: t('desc.docs', currentLang, 'Dokumentation & Hilfe'), icon: BookOpen, color: 'bg-gradient-to-br from-sky-500 to-blue-600' },
Expand Down Expand Up @@ -2924,7 +2925,12 @@
)}

{win.module === 'therapy_practice' && (
<TherapyPracticeModule />
<TherapyPracticeModule
contacts={contacts}
invoices={invoices}
onOpenCalendar={() => openWindow('calendar', t('module.calendar', currentLang, 'Kalender'))}
onOpenInvoice={(contactId) => openWindow('invoices', contactId ? `Rechnung für Kontakt` : undefined, { isCreateOpen: true, contactId })}
/>
)}

{win.module === 'calculator' && (
Expand Down Expand Up @@ -3213,7 +3219,7 @@
? t('desktop.start_admin_settings', currentLang, 'Benutzer & Konten')
: t('desktop.start_account_settings', currentLang, 'Kontoeinstellungen')}
className="flex items-center gap-2.5 min-w-0 px-2.5 py-1.5 rounded-xl hover:bg-slate-100 dark:hover:bg-slate-800 transition text-left cursor-pointer group"
>

Check failure on line 3222 in src/components/DesktopWindowWorkspace.tsx

View workflow job for this annotation

GitHub Actions / typecheck-and-build

')' expected.
<div className="w-8 h-8 rounded-full text-white flex items-center justify-center font-bold text-xs flex-shrink-0 shadow-xs group-hover:scale-105 transition-transform overflow-hidden" style={{ backgroundColor: 'var(--accent, #4f46e5)' }}>
{currentAuthUser?.avatar?.startsWith('data:image/')
? <img src={currentAuthUser.avatar} alt="" className="w-full h-full object-cover" />
Expand Down Expand Up @@ -4394,9 +4400,9 @@
invoices={invoices}
isDark={isDark}
onToggleTheme={onToggleTheme}
isMuted={isMuted}

Check failure on line 4403 in src/components/DesktopWindowWorkspace.tsx

View workflow job for this annotation

GitHub Actions / typecheck-and-build

Declaration or statement expected.
onToggleSound={onToggleSound}

Check failure on line 4404 in src/components/DesktopWindowWorkspace.tsx

View workflow job for this annotation

GitHub Actions / typecheck-and-build

Expression expected.
onOpenLanguageModal={() => setIsLanguageModalOpen(true)}

Check failure on line 4405 in src/components/DesktopWindowWorkspace.tsx

View workflow job for this annotation

GitHub Actions / typecheck-and-build

Declaration or statement expected.
currency={company.currency || 'EUR'}
onToggleFullscreen={handleToggleFullscreen}
isFullscreen={isFullscreen}
Expand Down
Loading
Loading