Files
whereismymoney/internal/views/accounts.templ
T
Matthias Hinrichs 189e7a2329 first commit
2025-08-26 03:17:49 +02:00

266 lines
11 KiB
Plaintext

package views
import (
"whereismymoney/internal/models"
"fmt"
)
templ Accounts(userName string, bankAccounts []models.BankAccount, depots []models.Depot) {
@Layout("Konten & Depots - WhereIsMyMoney") {
@Navigation(userName)
<!-- Main Content -->
<div class="min-h-screen bg-gray-50">
<div class="max-w-7xl mx-auto py-6 sm:px-6 lg:px-8">
<div class="px-4 py-6 sm:px-0">
<!-- Page Header -->
<div class="mb-8">
<h1 class="text-3xl font-bold text-gray-900">Konten & Depots</h1>
<p class="mt-2 text-gray-600">Verwalte deine Bankkonten und Wertpapierdepots</p>
</div>
<!-- Action Buttons -->
<div class="mb-6 flex flex-wrap gap-4">
<button
onclick="showModal('bankAccountModal')"
class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg font-medium flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"/>
</svg>
Bankkonto hinzufügen
</button>
<button
onclick="showModal('depotModal')"
class="bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded-lg font-medium flex items-center gap-2">
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"/>
</svg>
Depot hinzufügen
</button>
</div>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
<!-- Bankkonten Section -->
<div>
<h2 class="text-xl font-semibold text-gray-900 mb-4">Bankkonten</h2>
if len(bankAccounts) == 0 {
<div class="bg-white rounded-lg shadow p-6 text-center">
<svg class="mx-auto h-12 w-12 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z"/>
</svg>
<h3 class="mt-4 text-lg font-medium text-gray-900">Keine Bankkonten</h3>
<p class="mt-2 text-gray-500">Füge dein erstes Bankkonto hinzu, um zu beginnen.</p>
</div>
} else {
<div class="space-y-4">
for _, account := range bankAccounts {
<div class="bg-white rounded-lg shadow p-6">
<div class="flex justify-between items-start">
<div>
<h3 class="text-lg font-medium text-gray-900">{ account.Name }</h3>
<p class="text-sm text-gray-500">{ account.Bank }</p>
<p class="text-sm text-gray-500 capitalize">{ account.AccountType }</p>
if account.IBAN != "" {
<p class="text-sm text-gray-400 mt-1">{ account.IBAN }</p>
}
</div>
<div class="text-right">
<p class="text-2xl font-bold text-gray-900">
{ fmt.Sprintf("%.2f", account.Balance) } €
</p>
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800">
Aktiv
</span>
</div>
</div>
<div class="mt-4 flex justify-end space-x-2">
<button class="text-blue-600 hover:text-blue-800 text-sm font-medium">
Bearbeiten
</button>
<button class="text-red-600 hover:text-red-800 text-sm font-medium">
Löschen
</button>
</div>
</div>
}
</div>
}
</div>
<!-- Depots Section -->
<div>
<h2 class="text-xl font-semibold text-gray-900 mb-4">Depots</h2>
if len(depots) == 0 {
<div class="bg-white rounded-lg shadow p-6 text-center">
<svg class="mx-auto h-12 w-12 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"/>
</svg>
<h3 class="mt-4 text-lg font-medium text-gray-900">Keine Depots</h3>
<p class="mt-2 text-gray-500">Füge dein erstes Depot hinzu, um zu beginnen.</p>
</div>
} else {
<div class="space-y-4">
for _, depot := range depots {
<div class="bg-white rounded-lg shadow p-6">
<div class="flex justify-between items-start">
<div>
<h3 class="text-lg font-medium text-gray-900">{ depot.Name }</h3>
<p class="text-sm text-gray-500">{ depot.Broker }</p>
if depot.DepotNumber != "" {
<p class="text-sm text-gray-400 mt-1">Depot: { depot.DepotNumber }</p>
}
</div>
<div class="text-right">
<p class="text-2xl font-bold text-gray-900">
{ fmt.Sprintf("%.2f", depot.TotalValue) } €
</p>
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800">
Aktiv
</span>
</div>
</div>
<div class="mt-4 flex justify-end space-x-2">
<button class="text-blue-600 hover:text-blue-800 text-sm font-medium">
Bearbeiten
</button>
<button class="text-red-600 hover:text-red-800 text-sm font-medium">
Löschen
</button>
</div>
</div>
}
</div>
}
</div>
</div>
</div>
</div>
</div>
<!-- Bank Account Modal -->
<div id="bankAccountModal" class="fixed inset-0 bg-gray-600 bg-opacity-50 hidden z-50">
<div class="flex items-center justify-center min-h-screen px-4">
<div class="bg-white rounded-lg shadow-xl max-w-md w-full">
<div class="px-6 py-4 border-b border-gray-200">
<h3 class="text-lg font-medium text-gray-900">Bankkonto hinzufügen</h3>
</div>
<form action="/accounts/bank" method="POST" class="px-6 py-4">
<div class="space-y-4">
<div>
<label for="bank-name" class="block text-sm font-medium text-gray-700">Kontoname</label>
<input type="text" id="bank-name" name="name" required
class="mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500"
placeholder="z.B. Hauptkonto">
</div>
<div>
<label for="bank-bank-name" class="block text-sm font-medium text-gray-700">Bankname</label>
<input type="text" id="bank-bank-name" name="bank_name" required
class="mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500"
placeholder="z.B. Sparkasse">
</div>
<div>
<label for="bank-account-type" class="block text-sm font-medium text-gray-700">Kontotyp</label>
<select id="bank-account-type" name="account_type" required
class="mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500">
<option value="">Wähle einen Typ</option>
<option value="checking">Girokonto</option>
<option value="savings">Sparkonto</option>
<option value="credit">Kreditkonto</option>
</select>
</div>
<div>
<label for="bank-iban" class="block text-sm font-medium text-gray-700">IBAN (optional)</label>
<input type="text" id="bank-iban" name="iban"
class="mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500"
placeholder="DE89 3704 0044 0532 0130 00">
</div>
<div>
<label for="bank-balance" class="block text-sm font-medium text-gray-700">Aktueller Kontostand</label>
<input type="number" id="bank-balance" name="balance" step="0.01"
class="mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500"
placeholder="0.00">
</div>
</div>
<div class="mt-6 flex justify-end space-x-3">
<button type="button" onclick="hideModal('bankAccountModal')"
class="bg-gray-300 hover:bg-gray-400 text-gray-800 px-4 py-2 rounded-md">
Abbrechen
</button>
<button type="submit"
class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md">
Hinzufügen
</button>
</div>
</form>
</div>
</div>
</div>
<!-- Depot Modal -->
<div id="depotModal" class="fixed inset-0 bg-gray-600 bg-opacity-50 hidden z-50">
<div class="flex items-center justify-center min-h-screen px-4">
<div class="bg-white rounded-lg shadow-xl max-w-md w-full">
<div class="px-6 py-4 border-b border-gray-200">
<h3 class="text-lg font-medium text-gray-900">Depot hinzufügen</h3>
</div>
<form action="/accounts/depot" method="POST" class="px-6 py-4">
<div class="space-y-4">
<div>
<label for="depot-name" class="block text-sm font-medium text-gray-700">Depotname</label>
<input type="text" id="depot-name" name="name" required
class="mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500"
placeholder="z.B. Hauptdepot">
</div>
<div>
<label for="depot-broker-name" class="block text-sm font-medium text-gray-700">Broker</label>
<input type="text" id="depot-broker-name" name="broker_name" required
class="mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500"
placeholder="z.B. Trade Republic">
</div>
<div>
<label for="depot-number" class="block text-sm font-medium text-gray-700">Depotnummer (optional)</label>
<input type="text" id="depot-number" name="depot_number"
class="mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500"
placeholder="123456789">
</div>
<div>
<label for="depot-value" class="block text-sm font-medium text-gray-700">Aktueller Gesamtwert</label>
<input type="number" id="depot-value" name="total_value" step="0.01"
class="mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500"
placeholder="0.00">
</div>
</div>
<div class="mt-6 flex justify-end space-x-3">
<button type="button" onclick="hideModal('depotModal')"
class="bg-gray-300 hover:bg-gray-400 text-gray-800 px-4 py-2 rounded-md">
Abbrechen
</button>
<button type="submit"
class="bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded-md">
Hinzufügen
</button>
</div>
</form>
</div>
</div>
</div>
<script>
function showModal(modalId) {
document.getElementById(modalId).classList.remove('hidden');
}
function hideModal(modalId) {
document.getElementById(modalId).classList.add('hidden');
}
// Close modal when clicking outside
document.addEventListener('click', function(event) {
if (event.target.classList.contains('bg-opacity-50')) {
event.target.classList.add('hidden');
}
});
</script>
}
}