update
This commit is contained in:
@@ -82,6 +82,18 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
setDefaultDate();
|
||||
checkCurrentLogo();
|
||||
|
||||
// *** FIX 3: Gespeicherten Tab wiederherstellen (oder 'quotes' als Default) ***
|
||||
const savedTab = localStorage.getItem('activeTab') || 'quotes';
|
||||
showTab(savedTab);
|
||||
|
||||
// Hash-basierte Tab-Navigation (z.B. nach OAuth Redirect /#settings)
|
||||
if (window.location.hash) {
|
||||
const hashTab = window.location.hash.replace('#', '');
|
||||
if (['quotes', 'invoices', 'customers', 'settings'].includes(hashTab)) {
|
||||
showTab(hashTab);
|
||||
}
|
||||
}
|
||||
|
||||
// Setup form handlers
|
||||
document.getElementById('customer-form').addEventListener('submit', handleCustomerSubmit);
|
||||
document.getElementById('quote-form').addEventListener('submit', handleQuoteSubmit);
|
||||
@@ -108,6 +120,9 @@ function showTab(tabName) {
|
||||
document.getElementById(`${tabName}-tab`).classList.remove('hidden');
|
||||
document.getElementById(`tab-${tabName}`).classList.add('bg-blue-800');
|
||||
|
||||
// *** FIX 3: Tab-Auswahl persistieren ***
|
||||
localStorage.setItem('activeTab', tabName);
|
||||
|
||||
if (tabName === 'quotes') {
|
||||
loadQuotes();
|
||||
} else if (tabName === 'invoices') {
|
||||
@@ -1113,6 +1128,7 @@ function viewInvoicePDF(id) {
|
||||
window.open(`/api/invoices/${id}/pdf`, '_blank');
|
||||
}
|
||||
|
||||
// *** FIX 2: Verbesserte Erfolgsmeldung mit QBO DocNumber ***
|
||||
async function exportToQBO(id) {
|
||||
if (!confirm('Rechnung wirklich an QuickBooks Online senden?')) return;
|
||||
|
||||
@@ -1127,8 +1143,8 @@ async function exportToQBO(id) {
|
||||
const result = await response.json();
|
||||
|
||||
if (response.ok) {
|
||||
alert(`✅ Erfolg! QBO ID: ${result.qbo_id}`);
|
||||
// Optional: Liste neu laden um Status zu aktualisieren
|
||||
alert(`✅ Erfolg! QBO ID: ${result.qbo_id}, Rechnungsnr: ${result.qbo_doc_number}`);
|
||||
// Liste neu laden um aktualisierte invoice_number anzuzeigen
|
||||
loadInvoices();
|
||||
} else {
|
||||
alert(`❌ Fehler: ${result.error}`);
|
||||
|
||||
@@ -147,7 +147,38 @@
|
||||
|
||||
<div id="upload-status" class="mt-4"></div>
|
||||
|
||||
<hr class="my-8 border-gray-200">
|
||||
<hr class="my-8 border-gray-200">
|
||||
|
||||
<h3 class="text-xl font-semibold mb-4 text-gray-800">QuickBooks Online Authorization</h3>
|
||||
<p class="text-gray-600 mb-4">
|
||||
Wenn der Token abgelaufen ist oder die Verbindung fehlschlägt,
|
||||
hier neu autorisieren. Du wirst zu Intuit weitergeleitet.
|
||||
</p>
|
||||
|
||||
<div class="flex items-center space-x-4 mb-4">
|
||||
<a href="/auth/qbo"
|
||||
class="bg-green-600 hover:bg-green-700 text-white px-6 py-2 rounded-lg font-semibold shadow-md inline-flex items-center">
|
||||
🔑 Authorize QBO
|
||||
</a>
|
||||
<span id="qbo-status" class="text-sm text-gray-500">Checking...</span>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// QBO Status beim Laden prüfen
|
||||
fetch('/api/qbo/status')
|
||||
.then(r => r.json())
|
||||
.then(data => {
|
||||
const el = document.getElementById('qbo-status');
|
||||
if (data.connected) {
|
||||
el.innerHTML = '<span class="text-green-600">✅ Connected (Realm: ' + data.realmId + ')</span>';
|
||||
} else {
|
||||
el.innerHTML = '<span class="text-red-600">❌ Not connected — please authorize</span>';
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
document.getElementById('qbo-status').innerHTML = '<span class="text-gray-400">Status unknown</span>';
|
||||
});
|
||||
</script>
|
||||
|
||||
<h3 class="text-xl font-semibold mb-4 text-gray-800">QuickBooks Online Connection Test</h3>
|
||||
<p class="text-gray-600 mb-4">Test the connection and token refresh logic by fetching a report of overdue invoices (> 30 days) directly from QBO.</p>
|
||||
|
||||
Reference in New Issue
Block a user