From 9ac9a1cb447a5e03b53f1a59cd91bfe887e56fad Mon Sep 17 00:00:00 2001 From: frakarr Date: Thu, 11 Dec 2025 23:37:42 +0100 Subject: [PATCH] Update Settings.tsx --- pages/Settings.tsx | 93 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 8 deletions(-) diff --git a/pages/Settings.tsx b/pages/Settings.tsx index 53c1231..daf9874 100644 --- a/pages/Settings.tsx +++ b/pages/Settings.tsx @@ -7,7 +7,7 @@ import { AlertTriangle, User as UserIcon, Server, Bell, Clock, FileText, Lock, Megaphone, CheckCircle2, Info, Hammer, Link as LinkIcon, Eye, Calendar, List, UserCog, Mail, Power, MapPin, CreditCard, - ToggleLeft, ToggleRight, LayoutGrid, PieChart, Users, Send + ToggleLeft, ToggleRight, LayoutGrid, PieChart, Users, Send, Cloud, HardDrive } from 'lucide-react'; export const SettingsPage: React.FC = () => { @@ -16,7 +16,7 @@ export const SettingsPage: React.FC = () => { const isPrivileged = currentUser?.role === 'admin' || currentUser?.role === 'poweruser'; // Tab configuration - type TabType = 'profile' | 'features' | 'general' | 'condos' | 'families' | 'users' | 'notices' | 'alerts'; + type TabType = 'profile' | 'features' | 'general' | 'condos' | 'families' | 'users' | 'notices' | 'alerts' | 'storage'; const [activeTab, setActiveTab] = useState(isPrivileged ? 'general' : 'profile'); const [loading, setLoading] = useState(true); @@ -240,7 +240,7 @@ export const SettingsPage: React.FC = () => { setSaving(true); try { await CondoService.updateSettings(globalSettings); - setSuccessMsg('Funzionalità salvate!'); + setSuccessMsg('Configurazione salvata!'); setTimeout(() => setSuccessMsg(''), 3000); window.location.reload(); } catch(e) { @@ -282,6 +282,18 @@ export const SettingsPage: React.FC = () => { } }; + const handleStorageSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!globalSettings) return; + setSaving(true); + try { + await CondoService.updateSettings(globalSettings); + setSuccessMsg('Configurazione Storage salvata!'); + setTimeout(() => setSuccessMsg(''), 3000); + } catch (e) { console.error(e); } + finally { setSaving(false); } + }; + const handleNewYear = async () => { if (!globalSettings) return; const nextYear = globalSettings.currentYear + 1; @@ -300,7 +312,7 @@ export const SettingsPage: React.FC = () => { } }; - // CRUD Handlers + // CRUD Handlers (omitted repeated code for brevity, logic is same as before) const openAddCondoModal = () => { setEditingCondo(null); setCondoForm({ name: '', address: '', streetNumber: '', city: '', province: '', zipCode: '', notes: '', paypalClientId: '', defaultMonthlyQuota: 100, dueDay: 10 }); @@ -572,7 +584,8 @@ export const SettingsPage: React.FC = () => { tabs.push({ id: 'notices', label: 'Bacheca', icon: }); } tabs.push( - { id: 'alerts', label: 'Avvisi Email', icon: } + { id: 'alerts', label: 'Avvisi Email', icon: }, + { id: 'storage', label: 'Cloud & Storage', icon: } ); } @@ -648,6 +661,10 @@ export const SettingsPage: React.FC = () => {

Gestione Tickets

Abilita il sistema di segnalazione guasti.

+
+

Gestione Documenti

Archivio digitale con tag e upload.

+ +

Pagamenti PayPal

Permetti ai condomini di pagare online.

@@ -664,8 +681,6 @@ export const SettingsPage: React.FC = () => {

Spese Straordinarie

Gestione lavori e preventivi.

- - {/* NEW TOGGLE for Condo Financials View */}

Visualizza Spese Condominiali agli Utenti

@@ -682,6 +697,67 @@ export const SettingsPage: React.FC = () => {
)} + {/* STORAGE CONFIG TAB */} + {isPrivileged && activeTab === 'storage' && globalSettings?.storageConfig && ( +
+

Configurazione Storage

+

Scegli dove salvare i documenti caricati.

+ +
+
+ + +
+ + {globalSettings.storageConfig.provider === 'local_db' && ( +
+

Modalità Demo Attiva

+

I file vengono salvati direttamente nel database (Base64). Non raccomandato per produzione o file grandi.

+
+ )} + + {globalSettings.storageConfig.provider === 's3' && ( +
+

Configurazione S3

+ setGlobalSettings({...globalSettings, storageConfig: {...globalSettings.storageConfig!, bucket: e.target.value}})}/> + setGlobalSettings({...globalSettings, storageConfig: {...globalSettings.storageConfig!, region: e.target.value}})}/> + setGlobalSettings({...globalSettings, storageConfig: {...globalSettings.storageConfig!, apiKey: e.target.value}})}/> + setGlobalSettings({...globalSettings, storageConfig: {...globalSettings.storageConfig!, apiSecret: e.target.value}})}/> +
+ )} + + {(globalSettings.storageConfig.provider === 'google_drive' || globalSettings.storageConfig.provider === 'dropbox' || globalSettings.storageConfig.provider === 'onedrive') && ( +
+

Autenticazione API

+

Inserisci le credenziali dell'applicazione sviluppatore.

+ setGlobalSettings({...globalSettings, storageConfig: {...globalSettings.storageConfig!, apiKey: e.target.value}})}/> + setGlobalSettings({...globalSettings, storageConfig: {...globalSettings.storageConfig!, apiSecret: e.target.value}})}/> +
+ )} + +
+ {successMsg} + +
+
+
+ )} + {/* GENERAL TAB */} {isPrivileged && activeTab === 'general' && (
@@ -837,12 +913,13 @@ export const SettingsPage: React.FC = () => {
)} - {/* Condo Modal (Aggiornato con dueDay) */} + {/* Condo Modal */} {showCondoModal && (

{editingCondo ? 'Modifica Condominio' : 'Nuovo Condominio'}

+ {/* Form fields same as before... omitted for brevity */}
setCondoForm({...condoForm, name: e.target.value})} required />