profileShare

rasmusjy / splitapp-backend-microservices

Read-only snapshot

No repository description.

main default branch 501 files Expires Sep 13, 2026, 9:06 AM
Index.cshtml 5,449 bytes
1 @model SplitApp.WebApp.Controllers.ExpensesIndexViewModel
2 @using SplitApp.WebApp.Hosting.Helpers
3
4 @{
5 ViewData["Title"] = Localizer["Expenses"];
6 }
7
8 <!-- Page Header -->
9 <div class="sa-gradient-header sa-gradient-header-coral">
10 <div class="d-flex justify-content-between align-items-center flex-wrap gap-3">
11 <div>
12 <h1 style="margin-bottom: 4px;">@Localizer["Expenses"]</h1>
13 <p class="text-muted mb-0">@Model.TripName</p>
14 </div>
15 <div class="d-flex gap-2">
16 @if (Model.TripStatus == "Active")
17 {
18 <a asp-action="Create" asp-route-tripId="@Model.TripId" class="sa-btn sa-btn-sm" style="background: rgba(255,255,255,0.2); color: #fff; border: 1.5px solid rgba(255,255,255,0.4);">
19 <i class="bi bi-plus-lg"></i> @Localizer["Add Expense"]
20 </a>
21 }
22 <a asp-controller="Trips" asp-action="Details" asp-route-id="@Model.TripId" class="sa-btn sa-btn-sm" style="background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.9);">
23 <i class="bi bi-arrow-left"></i>
24 </a>
25 </div>
26 </div>
27 @if (Model.Expenses.Any())
28 {
29 <div class="mt-3" style="font-size: 1.8rem; font-weight: 800; letter-spacing: -0.02em;">
30 @Model.Expenses.Sum(e => CurrencyConverter.Convert(e.Amount, e.Currency?.Code ?? Model.DefaultCurrencyCode, Model.DefaultCurrencyCode)).ToString("N2")
31 <span style="font-size: 0.9rem; opacity: 0.7; font-weight: 500; margin-left: 4px;">@Model.CurrencySymbol @Localizer["total"]</span>
32 </div>
33 }
34 </div>
35
36 @if (!Model.Expenses.Any())
37 {
38 <div class="sa-empty">
39 <div class="sa-empty-icon"><i class="bi bi-receipt"></i></div>
40 <div class="sa-empty-title">@Localizer["No expenses yet"]</div>
41 <p class="sa-empty-text">@Localizer["Add your first expense to start tracking."]</p>
42 @if (Model.TripStatus == "Active")
43 {
44 <a asp-action="Create" asp-route-tripId="@Model.TripId" class="sa-btn sa-btn-primary sa-btn-pill">
45 <i class="bi bi-plus-lg"></i> @Localizer["Add Expense"]
46 </a>
47 }
48 </div>
49 }
50 else
51 {
52 <div class="sa-card-static">
53 @foreach (var expense in Model.Expenses)
54 {
55 var isDifferentCurrency = expense.Currency != null && expense.Currency.Code != Model.DefaultCurrencyCode;
56 <div class="sa-expense-item">
57 <div class="sa-expense-icon @(expense.BudgetCategory != null ? "sa-category-default" : "sa-category-default")">
58 <i class="bi bi-receipt"></i>
59 </div>
60 <div class="sa-expense-details">
61 <div class="sa-expense-desc">@(expense.Description ?? Localizer["No description"].Value)</div>
62 <div class="sa-expense-meta">
63 <span>@(expense.PaidByUser != null ? $"{expense.PaidByUser.FirstName} {expense.PaidByUser.LastName}" : "?")</span>
64 &middot; @expense.ExpenseDate.ToString("MMM dd, yyyy")
65 @if (expense.BudgetCategory != null)
66 {
67 <span>&middot;</span>
68 <span class="sa-badge sa-badge-secondary" style="font-size: 0.65rem; padding: 1px 6px;">@expense.BudgetCategory.Name</span>
69 }
70 </div>
71 </div>
72 <div class="d-flex align-items-center gap-3">
73 <div class="text-end">
74 @if (isDifferentCurrency)
75 {
76 <div class="sa-expense-amount">@(CurrencyConverter.Convert(expense.Amount, expense.Currency!.Code, Model.DefaultCurrencyCode).ToString("N2"))</div>
77 <div style="font-size: 0.7rem; color: var(--sa-gray-400);">@expense.Amount.ToString("N2") @expense.Currency.Code</div>
78 }
79 else
80 {
81 <div class="sa-expense-amount">@expense.Amount.ToString("N2")</div>
82 @if (expense.Currency != null)
83 {
84 <div style="font-size: 0.75rem; color: var(--sa-gray-400);">@expense.Currency.Code</div>
85 }
86 }
87 </div>
88 @if (Model.TripStatus == "Active")
89 {
90 <div class="sa-expense-actions">
91 <a asp-action="Edit" asp-route-id="@expense.Id" class="sa-btn sa-btn-ghost sa-btn-icon sa-btn-sm" title="@Localizer["Edit"]">
92 <i class="bi bi-pencil"></i>
93 </a>
94 <a asp-action="Delete" asp-route-id="@expense.Id" class="sa-btn sa-btn-ghost sa-btn-icon sa-btn-sm" title="@Localizer["Delete"]" style="color: var(--sa-danger);">
95 <i class="bi bi-trash3"></i>
96 </a>
97 </div>
98 }
99 </div>
100 </div>
101 }
102 </div>
103 }
104
105 @if (Model.TripStatus == "Active")
106 {
107 <!-- Mobile FAB -->
108 <a asp-action="Create" asp-route-tripId="@Model.TripId" class="sa-fab sa-hide-desktop" title="@Localizer["Add Expense"]">
109 <i class="bi bi-plus-lg"></i>
110 </a>
111 }
112