of {{ count }} selected
- {% if sa.last_sync_date %}· Last sync: {{ sa.last_sync_date.strftime('%b %d, %Y') }}{% endif %}
+
+
+
+
{{ sa.account_name }} ({{ sa.account_number_display }})
+
+ Mapped to: {{ sa.pfm_account.name }} ·
+ {{ count }} of {{ count }} selected
+ {% if sa.last_sync_date %}· Last sync: {{ sa.last_sync_date.strftime('%b %d, %Y') }}{% endif %}
+
+
+
+
Cancel
+
-
-
Cancel
-
@@ -35,7 +57,7 @@
Description |
Schwab Type |
PFM Type |
-
Category |
+
Category |
Amount |
@@ -61,12 +83,14 @@
-
- {% if txn.category_id and txn.category_id in cat_map %}
- {{ cat_map[txn.category_id] }}
- {% else %}
- Uncategorised
- {% endif %}
+ |
+
|
cb.addEventListener('change', updateCount));
+ function applyTypeStyle(sel) {
+ const isIncome = sel.value === 'income';
+ sel.style.borderColor = isIncome ? '#10b981' : '#ef4444';
+ sel.style.color = isIncome ? '#10b981' : '#ef4444';
+ const row = sel.closest('.preview-row');
+ const cell = row.querySelector('.amount-cell');
+ const sign = row.querySelector('.sign');
+ cell.classList.toggle('text-income', isIncome);
+ cell.classList.toggle('text-expense', !isIncome);
+ sign.textContent = isIncome ? '+' : '-';
+ }
+
document.querySelectorAll('.type-select').forEach(sel => {
- sel.addEventListener('change', function () {
- const isIncome = this.value === 'income';
- this.style.borderColor = isIncome ? '#10b981' : '#ef4444';
- this.style.color = isIncome ? '#10b981' : '#ef4444';
- const row = this.closest('.preview-row');
- const cell = row.querySelector('.amount-cell');
- const sign = row.querySelector('.sign');
- cell.classList.toggle('text-income', isIncome);
- cell.classList.toggle('text-expense', !isIncome);
- sign.textContent = isIncome ? '+' : '-';
+ sel.addEventListener('change', function () { applyTypeStyle(this); });
+ });
+
+ // Bulk: set type
+ document.getElementById('bulkExpense').addEventListener('click', () => {
+ document.querySelectorAll('.row-check:checked').forEach(cb => {
+ const sel = cb.closest('.preview-row').querySelector('.type-select');
+ sel.value = 'expense';
+ applyTypeStyle(sel);
});
});
+ document.getElementById('bulkIncome').addEventListener('click', () => {
+ document.querySelectorAll('.row-check:checked').forEach(cb => {
+ const sel = cb.closest('.preview-row').querySelector('.type-select');
+ sel.value = 'income';
+ applyTypeStyle(sel);
+ });
+ });
+
+ // Bulk: set category
+ document.getElementById('bulkApplyCat').addEventListener('click', () => {
+ const catId = document.getElementById('bulkCategory').value;
+ if (!catId) return;
+ document.querySelectorAll('.row-check:checked').forEach(cb => {
+ const sel = cb.closest('.preview-row').querySelector('.cat-select');
+ if (sel) sel.value = catId;
+ });
+ document.getElementById('bulkCategory').value = '';
+ });
})();
{% endblock %}
diff --git a/app/templates/teller/preview.html b/app/templates/teller/preview.html
index 3d80ab0..e91fb32 100644
--- a/app/templates/teller/preview.html
+++ b/app/templates/teller/preview.html
@@ -7,20 +7,42 @@
|
-
- {% if txn.category_id and txn.category_id in cat_map %}
- {{ cat_map[txn.category_id] }}
- {% else %}
- Uncategorised
- {% endif %}
+ |
+
|
{
const cb = row.querySelector('.row-check');
row.style.opacity = cb.checked ? '1' : '0.4';
});
- // Sync select-all state
selectAll.indeterminate = n > 0 && n < checks.length;
selectAll.checked = n === checks.length;
}
@@ -123,24 +145,51 @@
checks.forEach(cb => { cb.checked = selectAll.checked; });
updateCount();
});
-
checks.forEach(cb => cb.addEventListener('change', updateCount));
- // Update type-select color + amount sign on change
- document.querySelectorAll('.type-select').forEach(sel => {
- sel.addEventListener('change', function () {
- const isIncome = this.value === 'income';
- this.style.borderColor = isIncome ? '#10b981' : '#ef4444';
- this.style.color = isIncome ? '#10b981' : '#ef4444';
+ // Type-select color + amount sign
+ function applyTypeStyle(sel) {
+ const isIncome = sel.value === 'income';
+ sel.style.borderColor = isIncome ? '#10b981' : '#ef4444';
+ sel.style.color = isIncome ? '#10b981' : '#ef4444';
+ const row = sel.closest('.preview-row');
+ const cell = row.querySelector('.amount-cell');
+ const sign = row.querySelector('.sign');
+ cell.classList.toggle('text-income', isIncome);
+ cell.classList.toggle('text-expense', !isIncome);
+ sign.textContent = isIncome ? '+' : '-';
+ }
- const row = this.closest('.preview-row');
- const cell = row.querySelector('.amount-cell');
- const sign = row.querySelector('.sign');
- cell.classList.toggle('text-income', isIncome);
- cell.classList.toggle('text-expense', !isIncome);
- sign.textContent = isIncome ? '+' : '-';
+ document.querySelectorAll('.type-select').forEach(sel => {
+ sel.addEventListener('change', function () { applyTypeStyle(this); });
+ });
+
+ // Bulk: set type
+ document.getElementById('bulkExpense').addEventListener('click', () => {
+ document.querySelectorAll('.row-check:checked').forEach(cb => {
+ const sel = cb.closest('.preview-row').querySelector('.type-select');
+ sel.value = 'expense';
+ applyTypeStyle(sel);
});
});
+ document.getElementById('bulkIncome').addEventListener('click', () => {
+ document.querySelectorAll('.row-check:checked').forEach(cb => {
+ const sel = cb.closest('.preview-row').querySelector('.type-select');
+ sel.value = 'income';
+ applyTypeStyle(sel);
+ });
+ });
+
+ // Bulk: set category
+ document.getElementById('bulkApplyCat').addEventListener('click', () => {
+ const catId = document.getElementById('bulkCategory').value;
+ if (!catId) return;
+ document.querySelectorAll('.row-check:checked').forEach(cb => {
+ const sel = cb.closest('.preview-row').querySelector('.cat-select');
+ if (sel) sel.value = catId;
+ });
+ document.getElementById('bulkCategory').value = '';
+ });
})();
{% endblock %}
|