Bläddra i källkod

salvataggio offline v1

FabioFratini 1 år sedan
förälder
incheckning
f77ff4273f
2 ändrade filer med 139 tillägg och 11 borttagningar
  1. 68 11
      app/Http/Livewire/Report.php
  2. 71 0
      resources/views/livewire/report.blade.php

+ 68 - 11
app/Http/Livewire/Report.php

@@ -310,6 +310,11 @@ class Report extends Component
         'particolarita_strada.required' => 'Il campo particolarità strada è obbligatorio ai fini della validazione del verbale',
     ];
 
+    protected $listeners = [
+        'process-offline-reports' => 'processOfflineReports'
+    ];
+
+
     public function resetFields()
     {
         $this->name = '';
@@ -589,10 +594,7 @@ class Report extends Component
     public function add()
     {
         try {
-            $this->protocollo_num = DB::table('fcf_reports_reports')
-                ->where('protocollo_anno', date('Y'))
-                ->max('protocollo_num') + 1;
-
+            $this->protocollo_num = $this->getNextProtocolloNum();
             $this->protocollo_anno = date('Y');
             $this->name = $this->protocollo_num . "/" . $this->protocollo_anno;
 
@@ -624,18 +626,73 @@ class Report extends Component
                 'particolarita_strada' => $this->particolarita_strada,
             ];
 
-            Log::info('Creating report with data:', $reportData);
-
-            $record = \App\Models\Report::create($reportData);
-
-            session()->flash('success', 'Record creato');
-            $this->closeModal();
-            $this->edit($record->id);
+            if ($this->isOnline()) {
+                Log::info('Creating report with data:', $reportData);
+                $record = \App\Models\Report::create($reportData);
+                session()->flash('success', 'Record creato');
+                $this->closeModal();
+                $this->edit($record->id);
+            } else {
+                $this->saveOffline($reportData);
+                session()->flash('success', 'Record salvato offline. Verrà sincronizzato quando sarai online.');
+                $this->closeModal();
+            }
         } catch (\Exception $ex) {
             session()->flash('error', 'Errore in fase di salvataggio (' . $ex->getMessage() . ')');
         }
     }
 
+    protected function getNextProtocolloNum()
+    {
+        if ($this->isOnline()) {
+            return DB::table('fcf_reports_reports')
+                ->where('protocollo_anno', date('Y'))
+                ->max('protocollo_num') + 1;
+        } else {
+            return 9999;
+        }
+    }
+
+    protected function isOnline()
+    {
+        return @fsockopen("www.google.com", 80);
+    }
+
+    protected function saveOffline($reportData)
+    {
+        $this->dispatchBrowserEvent('save-offline-report', [
+            'report' => $reportData
+        ]);
+    }
+
+    protected function getOfflineReports()
+    {
+        return [];
+    }
+
+    public function syncOfflineData()
+    {
+        $this->dispatchBrowserEvent('get-offline-reports');
+    }
+
+    public function processOfflineReports($reports)
+    {
+        try {
+            if (!is_array($reports) || empty($reports)) {
+                session()->flash('warning', 'Nessun record da sincronizzare');
+                return;
+            }
+
+            foreach ($reports as $reportData) {
+                \App\Models\Report::create($reportData);
+            }
+
+            session()->flash('success', count($reports) . ' record(i) sincronizzati con successo');
+        } catch (\Exception $e) {
+            Log::error('Sync error: ' . $e->getMessage());
+            session()->flash('error', 'Errore durante la sincronizzazione');
+        }
+    }
     public function store()
     {
         $this->validate();

+ 71 - 0
resources/views/livewire/report.blade.php

@@ -10,6 +10,9 @@
                     style="max-width:150px">
                     Aggiungi
                 </button>
+                <button wire:click="syncOfflineData()" type="button" class="btn btn-warning float-right mr-2" style="max-width:150px">
+                    Sincronizza <i class="fas fa-sync"></i>
+                </button>
             @endif
         </div>
     </div>
@@ -5515,6 +5518,74 @@
             });
         });
 
+        function setupAutoSync() {
+            console.log('Auto-sync initialized');
+
+            setInterval(() => {
+                const reports = JSON.parse(localStorage.getItem('offline_reports') || '[]');
+                console.log('Auto-sync check:', {
+                    reportsCount: reports.length,
+                    isOnline: navigator.onLine,
+                    timestamp: new Date().toISOString()
+                });
+
+                if (reports.length > 0 && navigator.onLine) {
+                    console.log('Attempting to sync reports');
+                    Livewire.emit('process-offline-reports', reports);
+                }
+            }, 5 * 60 * 1000);
+        }
+
+        document.addEventListener('DOMContentLoaded', setupAutoSync);
+
+        window.addEventListener('online', () => {
+            console.log('Connection restored - checking for reports');
+            const reports = JSON.parse(localStorage.getItem('offline_reports') || '[]');
+            if (reports.length > 0) {
+                Livewire.emit('process-offline-reports', reports);
+            }
+        });
+
+        window.addEventListener('load', function() {
+            window.addEventListener('online', function() {
+                Livewire.emit('syncOfflineData');
+            });
+
+            window.addEventListener('storage', function(e) {
+                if (e.key === 'offline_reports') {
+                    Livewire.emit('offlineDataChanged');
+                }
+            });
+        });
+
+        function checkStorageQuota() {
+            let total = 0;
+            for (let x in localStorage) {
+                let amount = (localStorage[x].length * 2) / 1024 / 1024;
+                total += amount;
+            }
+            return total.toFixed(2);
+        }
+
+        window.addEventListener('save-offline-report', event => {
+            let reports = JSON.parse(localStorage.getItem('offline_reports') || '[]');
+            reports.push(event.detail.report);
+            localStorage.setItem('offline_reports', JSON.stringify(reports));
+        });
+
+        window.addEventListener('get-offline-reports', () => {
+            const reports = JSON.parse(localStorage.getItem('offline_reports') || '[]');
+            if (reports.length > 0) {
+                const reportsWithMeta = reports.map(report => ({
+                    ...report,
+                    sync_attempt: Date.now(),
+                    sync_status: 'pending'
+                }));
+                localStorage.setItem('offline_reports', JSON.stringify(reportsWithMeta));
+                Livewire.emit('process-offline-reports', reportsWithMeta);
+            }
+        });
+
         Livewire.on('load-check', () => {
 
             $("input[data-bootstrap-switch]").each(function () {