Finished the planner end to end.
Corrected rollover and yearly accounting, recurring targets, savings 
rules, and targeted dormant restorations.
Added editing/deletion for income, expenses, targets, and categories.
Rebuilt dashboard, analytics, calendar, settings, exports, 
authentication, and responsive mobile UI.
Added original artwork at 
[financial-flow.png](/Users/tyemeclifford/Documents/GH/budget/public/assets/images/financial-flow.png), 
generated with built-in Imagegen using an abstract financial-momentum 
landscape prompt.
Added 
[self-test.php](/Users/tyemeclifford/Documents/GH/budget/scripts/self-test.php).
Verification passed: automated accounting/export tests, full browser 
workflow, responsive 390px layout, light/dark themes, and no console 
errors. Tested with FrankenPHP v1.12.4. Live Mailgun delivery was not 
attempted without credentials.
This commit is contained in:
Ty Clifford
2026-06-15 10:33:55 -04:00
parent b7eaa81501
commit 51ee4ecb5a
18 changed files with 1568 additions and 559 deletions
+9
View File
@@ -0,0 +1,9 @@
<?php $fieldItem = $editingItem ?? []; ?>
<div class="form-grid">
<label class="span-2">Name<input type="text" name="name" required placeholder="Internet, rent, groceries…" value="<?= h($fieldItem['name'] ?? '') ?>"></label>
<label>Target amount<div class="money-input"><span><?= h($symbol) ?></span><input type="number" name="planned_amount" min="0" step="0.01" required value="<?= h((string) ($fieldItem['planned_amount'] ?? '')) ?>"></div></label>
<label>Category<select name="category_id"><option value="">Uncategorized</option><?php foreach ($categories as $category): ?><option value="<?= (int) $category['id'] ?>" <?= (int) ($fieldItem['category_id'] ?? 0) === (int) $category['id'] ? 'selected' : '' ?>><?= h($category['name']) ?></option><?php endforeach; ?></select></label>
<label>Due date<input type="date" name="due_date" value="<?= h((string) ($fieldItem['due_date'] ?? $month . '-01')) ?>"></label>
<label>Repeat<select name="recurrence"><option value="none" <?= ($fieldItem['recurrence'] ?? 'none') === 'none' ? 'selected' : '' ?>>One time</option><option value="monthly" <?= ($fieldItem['recurrence'] ?? '') === 'monthly' ? 'selected' : '' ?>>Monthly</option><option value="yearly" <?= ($fieldItem['recurrence'] ?? '') === 'yearly' ? 'selected' : '' ?>>Yearly</option></select></label>
<label class="span-2">Notes<textarea name="notes" rows="2" placeholder="Optional details"><?= h($fieldItem['notes'] ?? '') ?></textarea></label>
</div>