Files
kakebo/templates/pages/expenses/partials/week_content.html
Andros Fenollosa acc7b3cb18 Update subcategory dropdown when changing category in Week edit
- Add update_week_subcategories LiveView handler
- Category select triggers handler on change
- Subcategory dropdown re-renders with filtered options
2026-03-29 10:52:13 +02:00

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 %}