- Add update_week_subcategories LiveView handler - Category select triggers handler on change - Subcategory dropdown re-renders with filtered options
116 lines
7.2 KiB
HTML
116 lines
7.2 KiB
HTML
{% load money %}
|
|
{% for entry in categories_data %}
|
|
<div class="card bg-base-100 shadow-sm mb-4">
|
|
<div class="card-body p-4">
|
|
<h2 class="card-title text-lg mb-2">{{ entry.category.name }}</h2>
|
|
<div class="overflow-x-auto">
|
|
<table class="table table-sm">
|
|
<thead>
|
|
<tr>
|
|
<th>Date</th>
|
|
<th>Concept</th>
|
|
<th class="text-right">Amount</th>
|
|
<th class="text-right w-16">Actions</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for expense in entry.expenses %}
|
|
{% if editing_id == expense.id %}
|
|
<tr>
|
|
<td colspan="4" class="p-0">
|
|
<form data-liveview-function="save_expense"
|
|
data-action="submit->page#run"
|
|
class="flex flex-wrap gap-2 items-center p-2">
|
|
<input type="hidden" name="expense_id" value="{{ expense.id }}">
|
|
<input type="hidden" name="offset" value="{{ offset }}">
|
|
<input type="text" name="expense_concept" value="{{ expense.concept }}" class="input input-bordered input-sm flex-[2] min-w-[8rem]" required>
|
|
<select name="expense_category"
|
|
data-liveview-function="update_week_subcategories"
|
|
data-action="change->page#run"
|
|
data-data-expense-id="{{ expense.id }}"
|
|
class="select select-bordered select-sm flex-1 min-w-[7rem]">
|
|
{% for cat in user_categories %}
|
|
<option value="{{ cat.id }}" {% if cat.id == expense.category_id %}selected{% endif %}>{{ cat.name }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
<div id="week-subcategory-wrapper">
|
|
<select name="expense_subcategory" class="select select-bordered select-sm flex-1 min-w-[7rem]">
|
|
{% for sub in user_subcategories %}
|
|
<option value="{{ sub.id }}" {% if sub.id == expense.subcategory_id %}selected{% endif %}>{{ sub.name }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
</div>
|
|
<input type="text" name="expense_amount" inputmode="decimal" value="{{ expense.amount|money }}" class="input input-bordered input-sm w-24 text-right" required>
|
|
<button type="submit" class="btn btn-primary btn-sm">Save</button>
|
|
<a data-liveview-function="cancel_edit_expense"
|
|
data-action="click->page#run"
|
|
data-data-offset="{{ offset }}"
|
|
class="btn btn-ghost btn-sm">Cancel</a>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{% else %}
|
|
<tr>
|
|
<td class="whitespace-nowrap">{{ expense.created_at|date:"D d" }}</td>
|
|
<td>{{ expense.concept }} <span class="text-sm text-base-content/50">({{ expense.subcategory }})</span></td>
|
|
<td class="text-right whitespace-nowrap">{{ expense.amount|money }} €</td>
|
|
<td class="text-right">
|
|
<div class="dropdown dropdown-end">
|
|
<label tabindex="0" class="btn btn-ghost btn-sm">
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 5v.01M12 12v.01M12 19v.01"/>
|
|
</svg>
|
|
</label>
|
|
<ul tabindex="0" class="dropdown-content menu bg-base-100 rounded-box w-40 p-2 shadow z-50">
|
|
<li>
|
|
<a data-liveview-function="edit_expense"
|
|
data-action="click->page#run"
|
|
data-data-id="{{ expense.id }}"
|
|
data-data-offset="{{ offset }}">Edit</a>
|
|
</li>
|
|
<li>
|
|
<a data-liveview-function="delete_expense"
|
|
data-action="click->page#run"
|
|
data-data-id="{{ expense.id }}"
|
|
data-data-offset="{{ offset }}"
|
|
class="text-error">Delete</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{% endif %}
|
|
{% endfor %}
|
|
</tbody>
|
|
<tfoot>
|
|
{% for sub_entry in entry.subcategory_totals.values %}
|
|
<tr class="text-base-content/60">
|
|
<td colspan="3" class="text-right">{{ sub_entry.subcategory.name }}</td>
|
|
<td class="text-right">{{ sub_entry.total|money }} €</td>
|
|
</tr>
|
|
{% endfor %}
|
|
<tr class="font-bold">
|
|
<td colspan="3" class="text-right">{{ entry.category.name }} total</td>
|
|
<td class="text-right">{{ entry.total|money }} €</td>
|
|
</tr>
|
|
</tfoot>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% empty %}
|
|
<div class="text-center py-12 text-base-content/50">
|
|
<p class="text-lg mb-2">No expenses this week</p>
|
|
<p>Add your first expense to see it here</p>
|
|
</div>
|
|
{% endfor %}
|
|
|
|
{% if categories_data %}
|
|
<div class="card card-total text-white shadow-sm">
|
|
<div class="card-body p-4 flex-row justify-between items-center">
|
|
<span class="text-lg font-bold">Week total</span>
|
|
<span class="text-lg font-bold">{{ total|money }} €</span>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|