Skip to content

feat(filter-dialog): shared launcher, tree-editor refinements, 800px dialog - #86

Merged
alvachien merged 4 commits into
mainfrom
chroe/keepimprv-1
Sep 5, 2026
Merged

feat(filter-dialog): shared launcher, tree-editor refinements, 800px dialog#86
alvachien merged 4 commits into
mainfrom
chroe/keepimprv-1

Conversation

@alvachien

Copy link
Copy Markdown
Owner

Summary

  • Extract the filter-dialog open contract into one shared launcher (openFilterDialog() + FILTER_DIALOG_CONFIG) and migrate all four list pages (vocabulary, knowledge, Chinese, translate) to it — removes the byte-identical seed/Cancel-guard wiring duplicated per page (review M4)
  • Rework the model and editor around the filter hierarchy contract: the tree root holds a single node (case 1 condition / case 2 group), the toolbar's three buttons are armed by the selected node's kind, delete returns selection to the parent group, and a "new filter" dialog scaffolds one blank selected condition (case 0 stays with the Clear Filter button)
  • Dialog width 1100px → 800px; panes keep their percentage split so the splitter ratio is unchanged
  • actslib 0.6.81 → 0.6.83; new i18n keys for tree/splitter actions (en + zh-CN)
  • Version bump to 1.9.5 (releasedate 2026-09-05)

Docs

  • docs/reusable-filter-dialog-design.md and docs/vocabulary-exercises-architecture.md refreshed to as-built
  • New: docs/filter-hierarchy-contract.md (the tree contract) and docs/filter-dialog-review.md (review findings & status)

Test plan

  • ng test — 1852 tests / 72 specs green (incl. new launcher, model, and component specs)
  • ng build --configuration development clean
  • ng build --configuration production clean (published via publish-learning-all.ps1 -SkipLearningAPI -SkipIdServer)
  • Manual smoke on http://localhost:29800 — open the filter dialog on each of the four list pages, edit tree/toolbar/splitter, Submit/Cancel

🤖 Generated with Claude Code

alvachien and others added 4 commits August 30, 2026 20:15
- Angular 21.2 → 22.1.x, TypeScript ~6.0, angular-auth-oidc-client 22,
  angular-eslint 22 (recommended template configs now ship in the
  umbrella `angular-eslint` package)
- Adapt code and specs to the new toolchain (Eager changeDetection on
  AppComponent, withXhr() for HttpClient, tsconfig extendedDiagnostics
  suppressions, spec updates)
- Drop the Angular 21-era `overrides` block: every floor is now met by
  plain resolution, four entries match no package at all, and
  @babel/core ^7.29.7 was silently downgrading Angular 22's exact 8.0.1
  pin
- Remove @types/dompurify (deps) and @types/marked (devDeps):
  dompurify 3.4 and marked 17 bundle their own types, so the stubs
  were shadowed and unused
- Bump version to 1.9.1 (package.json + both environment files)

Co-Authored-By: Claude Code <noreply@anthropic.com>
…dialog

- Extract openFilterDialog() + FILTER_DIALOG_CONFIG into one shared launcher
  and migrate all four list pages (vocabulary, knowledge, Chinese, translate)
- Rework the model/editor around the hierarchy contract: single-node root,
  selection-driven three-button toolbar, splitter-sized panes; dialog width
  now 800px (percentage split keeps the pane ratio)
- docs: refresh design + vocabulary architecture notes; add
  filter-hierarchy-contract.md and filter-dialog-review.md
- actslib 0.6.81 -> 0.6.83; i18n keys for tree/splitter actions
- bump version to 1.9.5 (releasedate 2026-09-05)

Co-Authored-By: Claude Code <noreply@anthropic.com>
The spec set window.Howl = MockHowl, but AudioService constructs real
Howl instances through the root-provided HOWL_FACTORY token — so under
jsdom real-howler internals stayed alive across test boundaries, and
the two async tests' wall-clock setTimeout waits stalled past the 5s
CI timeout under load (flaky on PR #86: same commit passed the push
run, failed the pull_request run).

Provide HOWL_FACTORY/HOWLER_GLOBAL mocks in TestBed (same pattern as
the extended spec) and make both tests synchronous: BehaviorSubject
completion is a synchronous notification and the mocked Howl reports
'loaded' immediately, so the awaits only added stall surface.

Co-Authored-By: Claude Code <noreply@anthropic.com>
NavigationFocusService focuses inside a real setTimeout(100) after
NavigationEnd, and the tests' whenStable() does not reliably wait for
it — under CI worker starvation the focus assertion ran before the
timer fired (document.activeElement still <body>), failing
"should focus on component then relinquish focus" on the pull_request
run of PR #86.

Scope setTimeout/clearTimeout fakes to the two navigation tests and
advance the focus timer deterministically — the same pattern (and the
same root flake) the navbar specs already adopted.

Co-Authored-By: Claude Code <noreply@anthropic.com>
@alvachien
alvachien merged commit 5a3417a into main Sep 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant