refactor(ssr): Phase 6b — migrate Transaction Rule wizard onto the session engine; de-cursor
Proves the Phase-6a wizard engine against a real 2-step modal: the Transaction Rule wizard (edit step + read-only test/preview step) now runs on wizard2 / wizard-state, fully de-cursored. What changed - Wizard machinery removed: deleted the EditModal / TestModal / TransactionRuleWizard defrecords (mm/ModalWizardStep + LinearModalWizard), MultiStepFormState, the EDN snapshot, and the step-params[...] prefix. Replaced with a data-driven `transaction-rule-wizard-config` (two steps + init-fn + done-fn) driven by the engine. - De-cursored the whole edit form (82 fc/ refs -> 0): every field reads explicit data + path->name2; errors via a bound *errors* / ferr. The account row's Alpine cross-field dispatch wiring (clientId -> accountId -> location) is preserved verbatim — only the data plumbing moved off the cursor. - The test step's :render reads :all-data (the engine's get-all), so the formtools "combine at the end" mechanism feeds the preview table. - Routes 4 -> 2: open-rule-wizard (new + edit), save-step (every transition via the engine's `direction` field). The dedicated `navigate` route is deleted. - decode-rule-form select-keys to the schema's known keys so the engine's nav fields (wizard-id/current-step/direction) don't leak into the upserted entity. Scorecard (admin/transaction_rules.clj): fc/ 82->0, mm/ 20->0, defrecords 3->0, LOC 1000->964, routes 4->2. Scope note: the de-cursored edit step keeps com/* Hiccup leaf components (not yet sc/* Selmer); the value here was removing fc/ + mm/ and proving the engine, not re-templating the conditional/Alpine-cross-field layout. Hiccup-in-render is a documented partial; the com/ -> sc/ swap is a mechanical follow-up. Verification: rule spec 4/4 (new + edit dialogs, advance-to-test preview, save); full Playwright suite 55/55; cljfmt clean. Skill fed: scorecard row + narrative (engine's first real modal; generalizes for a one-data-step wizard); gotchas (strip engine nav fields in decode, new-row temp-id, direction-button nav). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -52,7 +52,7 @@ async function addAccount(page: any, accountId: string) {
|
||||
}
|
||||
|
||||
async function fillDescription(page: any, desc: string) {
|
||||
await page.locator('#wizard-form input[name*="[transaction-rule/description]"]').first().fill(desc);
|
||||
await page.locator('#wizard-form input[name="transaction-rule/description"]').first().fill(desc);
|
||||
}
|
||||
|
||||
// Approval status is required to advance/save; the radio-card's first option is "Approved".
|
||||
@@ -89,7 +89,7 @@ test.describe('Transaction Rule wizard (characterization)', () => {
|
||||
test('Edit dialog pre-populates the seeded rule', async ({ page }) => {
|
||||
await navigateToRules(page);
|
||||
await openEditDialog(page);
|
||||
const desc = page.locator('#wizard-form input[name*="[transaction-rule/description]"]').first();
|
||||
const desc = page.locator('#wizard-form input[name="transaction-rule/description"]').first();
|
||||
await expect(desc).toHaveValue('ZZRULEMATCH');
|
||||
});
|
||||
|
||||
@@ -116,8 +116,8 @@ test.describe('Transaction Rule wizard (characterization)', () => {
|
||||
await addAccount(page, info.accounts['test-account'].toString());
|
||||
await selectApproved(page);
|
||||
await clickTest(page);
|
||||
// Save from the test step
|
||||
await page.locator('#wizard-form button:has-text("Save"), #wizard-form button[type="submit"]').first().click();
|
||||
// Save from the test step (the precise Save button, not Back which is also submit)
|
||||
await page.locator('#wizard-form button:has-text("Save")').first().click();
|
||||
await page.waitForTimeout(1000);
|
||||
// modal closed + a new rule row added
|
||||
await expect(page.locator('#wizard-form')).toBeHidden();
|
||||
|
||||
Reference in New Issue
Block a user