tries sales changes
This commit is contained in:
@@ -0,0 +1,145 @@
|
||||
# Inline Account Editing in Sales Summary Wizard
|
||||
|
||||
## Problem
|
||||
|
||||
The current edit wizard for sales summaries renders every item in a flat data-grid with a full typeahead component per row for account assignment. This requires heavy scrolling and makes it hard to see the debit/credit structure at a glance.
|
||||
|
||||
## Solution
|
||||
|
||||
Redesign the wizard's MainStep to mirror the embedded grid's two-column layout (debits / credits), and replace the always-visible typeahead with a click-to-swap inline editing pattern powered by HTMX.
|
||||
|
||||
## Current Flow
|
||||
|
||||
1. Click pencil icon on a grid row → opens full modal wizard
|
||||
2. Wizard renders a data-grid where every row has: category (hidden or text input), account (typeahead), debit, credit
|
||||
3. Every row initializes a typeahead component, even if the user only needs to edit one account
|
||||
4. Heavy scrolling due to tall rows
|
||||
|
||||
## New Flow
|
||||
|
||||
1. Click pencil icon on a grid row → opens modal wizard showing two columns (debits / credits) matching the embedded grid layout
|
||||
2. Each item's account cell renders in **display mode**: account name text + hidden input holding the account ID + pencil icon. If no account is assigned, shows a red "Missing acct" pill + pencil icon.
|
||||
3. Click pencil on an account cell → `hx-get` to `::route/edit-item-account` → server returns **edit mode** (typeahead + confirm/cancel buttons), replacing just that cell via `hx-swap "innerHTML"`
|
||||
4. User selects an account in the typeahead → clicks confirm → `hx-put` to `::route/save-item-account` → server returns **display mode** (updated account name text + updated hidden input + pencil icon)
|
||||
5. Click cancel → `hx-get` to `::route/cancel-item-account` → server returns original display mode
|
||||
6. When the user submits the entire wizard form, all hidden inputs (including updated account IDs) are collected by the existing multi-form-state decode and saved in a single DB transaction
|
||||
|
||||
### Key Constraint
|
||||
|
||||
HTMX routes only manage interactivity (swapping cells). No DB writes happen until the wizard form is submitted via the existing submit handler.
|
||||
|
||||
## New Routes
|
||||
|
||||
| Route Key | Method | Purpose |
|
||||
|---|---|---|
|
||||
| `::route/edit-item-account` | GET | Returns typeahead + confirm/cancel for one account cell |
|
||||
| `::route/save-item-account` | PUT | Returns display mode with updated hidden input value |
|
||||
| `::route/cancel-item-account` | GET | Returns display mode with original hidden input value |
|
||||
|
||||
### Route Parameters
|
||||
|
||||
All three routes receive:
|
||||
- `item-index` — the index of the sales-summary/item in the vector (to construct the correct field name prefix)
|
||||
- `client-id` — for the typeahead search URL
|
||||
- The form-cursor field name prefix is derived from `item-index` so the returned hidden input has the correct `name` attribute (e.g. `step-params[sales-summary/items][2][ledger-mapped/account]`)
|
||||
|
||||
Additionally:
|
||||
- `edit-item-account` and `cancel-item-account` receive the `current-account-id` as a query param so cancel can restore the original value
|
||||
- `save-item-account` receives the selected account ID from the typeahead's form submission in the request body
|
||||
|
||||
## Wizard MainStep Changes
|
||||
|
||||
### Layout
|
||||
|
||||
Replace the current flat data-grid with a two-column layout mirroring the embedded grid:
|
||||
|
||||
```
|
||||
+-------------------------------------------+
|
||||
| Debits | Credits |
|
||||
|-------------------------------------------|
|
||||
| Category Acct Amt | Category Acct Amt |
|
||||
| ... | ... |
|
||||
|-------------------------------------------|
|
||||
| Total: $X,XXX.XX | Total: $X,XXX.XX |
|
||||
| Delta: $XX.XX | Delta: $XX.XX |
|
||||
+-------------------------------------------+
|
||||
| [+ New Summary Item] |
|
||||
+-------------------------------------------+
|
||||
```
|
||||
|
||||
### Item Rendering (Display Mode)
|
||||
|
||||
For each item (non-manual):
|
||||
- **Category**: text label + hidden input
|
||||
- **Account**: account name text (or "Missing acct" pill) + hidden input with account ID + pencil icon with `hx-get`
|
||||
- **Amount**: formatted dollar amount (debit or credit column)
|
||||
|
||||
### Item Rendering (Edit Mode — account cell only)
|
||||
|
||||
When the pencil is clicked, only the account cell swaps to:
|
||||
- Typeahead component (same `account-typeahead*` as current)
|
||||
- Confirm button (small check icon) with `hx-put`
|
||||
- Cancel button (small X icon) with `hx-get`
|
||||
|
||||
### Manual Items
|
||||
|
||||
Same as current: category text input, account typeahead, debit/credit money inputs, delete button. The "New Summary Item" button remains. Manual items are always in "edit mode" since they have editable fields beyond just account.
|
||||
|
||||
### Hidden Inputs
|
||||
|
||||
Every item row must include hidden inputs for:
|
||||
- `db/id`
|
||||
- `sales-summary-item/category` (for non-manual items)
|
||||
- `sales-summary-item/manual?` (for manual items)
|
||||
- `ledger-mapped/account` — this is the key one that gets updated by the inline edit flow
|
||||
|
||||
When the typeahead swaps in (edit mode), the old hidden input for `ledger-mapped/account` is replaced by the typeahead's own hidden input. On confirm, the server returns the updated hidden input. On cancel, the server returns the original hidden input.
|
||||
|
||||
### Total / Unbalanced Rows
|
||||
|
||||
Same as current: `summary-total-row*` and `unbalanced-row*` with live recalculation via `hx-put` to `::route/expense-account-total`.
|
||||
|
||||
## Handler Implementation
|
||||
|
||||
### `edit-item-account` handler
|
||||
|
||||
1. Parse query params: item index, client-id, current field name prefix
|
||||
2. Render the typeahead + confirm/cancel buttons
|
||||
3. The typeahead uses the same `account-typeahead*` pattern
|
||||
4. Confirm button: `hx-put` to `::route/save-item-account`, `hx-target "closest td"`, `hx-swap "innerHTML"`
|
||||
5. Cancel button: `hx-get` to `::route/cancel-item-account`, `hx-target "closest td"`, `hx-swap "innerHTML"`
|
||||
|
||||
### `save-item-account` handler
|
||||
|
||||
1. Parse form body: selected account ID, item index, client-id, field name prefix
|
||||
2. Resolve account name from DB using `d-accounts/clientize`
|
||||
3. Return display mode HTML: account name text + hidden input (with new account ID) + pencil icon
|
||||
|
||||
### `cancel-item-account` handler
|
||||
|
||||
1. Parse query params: item index, client-id, current field name prefix, original account ID
|
||||
2. Resolve account name from DB (if account ID exists)
|
||||
3. Return display mode HTML: account name text (or "Missing acct" pill) + hidden input (with original account ID) + pencil icon
|
||||
|
||||
## Route Definitions
|
||||
|
||||
Add to `routes.cljc`:
|
||||
|
||||
```clojure
|
||||
"/edit/item-account" ::edit-item-account
|
||||
"/edit/save-item-account" ::save-item-account
|
||||
"/edit/cancel-item-account" ::cancel-item-account
|
||||
```
|
||||
|
||||
## Files Changed
|
||||
|
||||
| File | Change |
|
||||
|---|---|
|
||||
| `src/cljc/auto_ap/routes/pos/sales_summaries.cljc` | Add 3 new route keys |
|
||||
| `src/clj/auto_ap/ssr/pos/sales_summaries.clj` | Rewrite MainStep render-step, add 3 handlers, add helper fns for account display/edit cells |
|
||||
|
||||
## Out of Scope
|
||||
|
||||
- Changes to the embedded grid table (already redesigned)
|
||||
- Changes to how the wizard submit handler works
|
||||
- Adding the missing `::route/expense-account-total` route (pre-existing bug, separate fix)
|
||||
Reference in New Issue
Block a user