Skip to content

feat/operation-browser-critical-journey-notifications-a11y-cursor - #73

Merged
BigDella merged 1 commit into
Parcel-Protocol:mainfrom
nasarajoe:feat/operation-browser-critical-journey-notifications-a11y-cursor
Sep 25, 2026
Merged

BigDella merged 1 commit into
Parcel-Protocol:mainfrom
nasarajoe:feat/operation-browser-critical-journey-notifications-a11y-cursor

Conversation

@nasarajoe

Copy link
Copy Markdown
Contributor

Summary

Hardens the public account-history journey end to end: it now has a deterministic
Playwright spec (#49), a first-class notification centre with recipient isolation and
redaction (#56), verified keyboard/screen-reader behaviour plus documented manual
checks (#57), and stable cursor pagination shared by exports and the operation browser
(#58).

  • Utix: Create end-to-end test coverage for the highest-risk user journey #49 — critical journey E2E (tests/e2e/critical-journey.spec.ts,
    package.json): five deterministic Playwright scenarios with Horizon mocked at the
    network edge — successful load plus a cursor hop to an older page, empty input that
    never contacts Horizon, missing account, rate limiting, and a transient transport
    failure that recovers via Try again. npm run test:e2e:critical runs only this spec.
  • Utix: Implement notification system for critical lifecycle and recovery events #56 — notifications (core/notifications/): typed events
    (failure, approval_required, completed, recovery, retry), a storage-backed
    store with per-recipient isolation, deterministic ids, dedupe, bounded history
    (50), read/unread state, internal-link-only hrefs, runtime validation of persisted
    payloads and secret-shaped redaction (S…) in title, message, href and dedupe key.
    NotificationProvider publishes and restores state; NotificationCenter renders an
    accessible bell, badge, event labels, deep links, mark-read/all and clear. Wired into
    AppShell/AppHeader and the shared renderFeature test wrapper. The operation
    browser publishes failure, retry, completed and recovery events with a recovery
    transition on the next successful request.
  • Utix: Add accessibility remediation for primary workflow screens #57 — accessibility: query-string account prefill for deep links, focus moved to
    the invalid field on submit errors, aria-busy on the form and pager, an sr-only
    polite live region announcing “N operations shown on page M”, a labelled results
    list, and manual keyboard/screen-reader/200 %-zoom guidance in README.md. Two
    axe states still report zero WCAG 2.1 A/AA violations.
  • Utix: Implement stable pagination and filtering for rapidly changing datasets #58 — stable cursor pagination (core/pagination/cursor.ts): opaque
    utix1:<offset>:<key> cursors that anchor on a record key, so records inserted
    before the anchor neither repeat nor skip a page, with an offset fallback and
    nextCursor/hasMore. Wired into core/export/exporter.ts (scope filtering happens
    before cursor keys are generated, so a cursor can never cross an authorization scope)
    and into the operation browser, which now dedupes by the composite operation identity
    (id, pagingToken, transactionHash, type) and appends older pages without
    duplicating records. Documented in docs/EXPORTS.md.

Fixes found while validating: older pages were merged into the previous page while the
page index advanced (page 2 rendered empty), and Input did not expose ref in its
prop type, so error focus was untyped.

Closes #49
Closes #56
Closes #57
Closes #58

Feature directory: features/operation-browser/ (plus core/notifications/,
core/pagination/, core/export/, core/layout/, core/testing/, tests/e2e/)

  • This work spans the slices required by the four issues
  • Product changes stay inside the operation-browser slice and the shared core modules it needs
  • This work does not require another open issue or unmerged pull request
  • No generated registry file or shared navigation/route list was edited

How to Test

  1. Go to http://localhost:3000/tools/operation-browser (testnet, default)
  2. Enter a public G… account address and click Browse operations
  3. See the account summary, “20 loaded operations”, the type filter and a Load more
    button; Load more shows “Page 2 of 2” with older records and a failed transaction
    badged Failed in transaction
  4. Validation failure: submit empty → “Enter an account address” and focus lands in the field
  5. Transport failure: switch to a network that cannot reach Horizon → “Could not reach
    Horizon” with Try again; the retry succeeds and a “Recovered” notification appears
  6. Open the bell in the header to read, mark or clear notifications for that account

Checklist

  • Logic returns Result<T, Code> for every expected failure
  • Every error code has actionable copy in copy.ts
  • Idle, loading, success and error states are implemented
  • Network requests are tested through MSW, not internal-module mocks
  • Accessibility tests cover at least two states with zero WCAG 2.1 A/AA violations
  • No secret key is accepted, rendered, stored, logged or transmitted
  • README.md records the non-obvious technical decisions (critical journey, manual a11y checks)
  • npm run check passes locally — blocked by pre-existing breakage outside this slice

@drips-wave

drips-wave Bot commented Sep 25, 2026

Copy link
Copy Markdown

@nasarajoe Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@BigDella
BigDella merged commit 0415a33 into Parcel-Protocol:main Sep 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants