feat(filter-dialog): shared launcher, tree-editor refinements, 800px dialog - #86
Merged
Conversation
- 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
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)Docs
docs/reusable-filter-dialog-design.mdanddocs/vocabulary-exercises-architecture.mdrefreshed to as-builtdocs/filter-hierarchy-contract.md(the tree contract) anddocs/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 developmentcleanng build --configuration productionclean (published viapublish-learning-all.ps1 -SkipLearningAPI -SkipIdServer)🤖 Generated with Claude Code