Merge upstream v20.0.2 into support-bs-3 (Angular 20 support) [ACE-7218] - #7
Conversation
Implements tabOrder input property to control tab display order when using *ngIf or other dynamic directives. Tabs with tabOrder are sorted numerically, with unordered tabs appearing after ordered ones. Key changes: - Add tabOrder input property to TabDirective - Implement smart insertion logic in TabsetComponent - Move addTab call from constructor to ngOnInit to ensure input properties are set - Add comprehensive unit and E2E tests Fixes valor-software#823: Tabs now display in logical order regardless of DOM creation sequence 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Add proper element visibility waits before interactions - Ensure Overview tab is activated on page navigation - Increase timeout values for better stability - Fix element state checking in page objects 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude <noreply@anthropic.com>
Fixes the type references to enable apps that wants to use `moduleResolution:nodenext`
* chore: upgrade to angular 20 * chore: update eslint config
* chore(docs): updated docs tabset to work properly in v20 * chore(docs): updated docs tabset to work properly in v20 * chore(docs): updated docs tabset to work properly in v20 * chore(docs): updated docs tabset to work properly in v20 * chore(docs): updated docs tabset to work properly in v20 * chore(docs): updated docs tabset to work properly in v20
* chore(ci): use tsx instead of ts-node * style: undo accidental changes
* fix(tabset): fixed tabset active input * fix(tabset): updated tests * 20.0.1 * chore(version-bump): updated to v20.0.1
change in the highlight method to fix behaviour during search results. valor-software#6760 Co-authored-by: Sudhir Jadhav <sudhir.jadhav@netcracker.com> Co-authored-by: Alexey Umanskiy <sharkakatsukie@gmail.com>
* 20.0.2 * chore(version): version bump * fix(docs): fixed daterange-header
Use a single shared PositioningService instance for the datepicker and daterangepicker directives to fix adaptive positioning issues: - Adaptive positioning on the daterangepicker now works. - Adaptive positioning on one datepicker no longer affects other instances. - Also apply this change to the inline datepicker and inline daterangepicker for consistency. Fixes valor-software#6773, fixes valor-software#6774 Co-authored-by: Alexey Umanskiy <sharkakatsukie@gmail.com>
… into development
Angular 20 support for the fms upgrade (ACE-7218, parent ACE-7170).
Follows the same flow as bs3-v19.0.3: merge the matching upstream tag into
support-bs-3, then tag so the release workflow can build the package.
Conflicts and how they were resolved:
- package-lock.json — took upstream's, then regenerated with
`npm install --package-lock-only` on Node 22.23.1 so the stylus override
resolves. Verified stylus still points at the GitHub tarball rather than
the npm registry.
- src/datepicker/.eslintrc.json — resolved field by field rather than taking
one side whole:
* extends: took upstream's. v20 drops `plugin:@nx/angular` repo-wide, and
after this merge every other src/*/.eslintrc.json is without it.
* rules: kept `prefer-standalone: ["off"]` — bs3 components are not
standalone. Dropped `no-host-metadata-property`, which angular-eslint
removed in v19 (this repo is now on 20.0.0) and which no other config
here references.
Fork changes that survived auto-merge, each verified against upstream:
- .github/workflows/on-release.yml keeps the `--runner=cloud` removal from
c8a3726. Losing it puts the release workflow back in the state that made it
fail during the v19 cut.
- package.json keeps the stylus override while taking upstream's v20 bumps
(@angular/* 20.0.2, @nx/angular 21.2.0).
- src/typeahead/typeahead-container.component.ts holds both sides: our
isBs3/isBs4 host bindings and upstream's PLACEHOLDER_CHAR refactor. The two
hunks are ~190 lines apart, so git merged them without conflict.
The bs3 component patches (progressbar, tooltip, modal, dropdown, timepicker,
carousel, accordion, theme-provider) are untouched — upstream did not change
those files between v19.0.3 and v20.0.2.
Verified locally on Node 22.23.1, replicating both build steps in
on-release.yml:
npm ci exit 0
npx nx build ngx-bootstrap --configuration=production exit 0, 26/26 tasks
npx nx prerender --configuration=production exit 0, 1/1 task
Built output checked by discriminating strings, not just a green build:
dist/ngx-bootstrap/typeahead/fesm2022/ngx-bootstrap-typeahead.mjs carries
isBs3 x2 / isBs4 x9, its host class is `dropdown open bottom` (the fork form,
not upstream's `dropdown open bottom dropdown-menu`), and upstream's
constant is present alongside. Published metadata is ngx-bootstrap@20.0.2 with
peer @angular/core ^20.0.2.
Not verified: lint and unit tests were not run.
📝 WalkthroughWalkthroughThe project is upgraded from version 19.0.3 to 20.0.2 with Angular 20, Nx 21, TypeScript 5.8, and updated tooling. ESLint configurations are revised across the workspace. Tab directives now support ordered insertion and deferred default activation, with new coverage for dynamic and edge-case behavior. Datepicker directives receive local positioning providers. Documentation routing, styling, compatibility metadata, typeahead highlighting, Playwright helpers, and end-to-end coverage are also updated. Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 Checkov (3.3.8).eslintrc.jsonTraceback (most recent call last): .github/workflows/on-release.ymlTraceback (most recent call last): apps/ngx-bootstrap-docs/src/assets/json/current-version.jsonTraceback (most recent call last):
🔧 ESLint
ESLint install timed out. The project may have too many dependencies for the sandbox. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (2)
libs/common-docs/src/lib/docs-section/docs-section.component.ts (1)
26-32: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winTie the
queryParamMapsubscription to component destruction.The constructor subscription persists for the component lifetime because
Routeremits when the same route URL is navigated to again, andDocsSectionComponentno longer implementsngOnDestroy. UsetakeUntilDestroyed()here or retain explicit teardown.Proposed fix
+import { takeUntilDestroyed } from '`@angular/core/rxjs-interop`'; ... - this.activatedRoute.queryParamMap.subscribe((params) => { - this.initActiveTab(params.get('tab')?.toString()); - }); + this.activatedRoute.queryParamMap + .pipe(takeUntilDestroyed()) + .subscribe((params) => { + this.initActiveTab(params.get('tab')?.toString()); + });Source: MCP tools
apps/ngx-bootstrap-docs-e2e/src/support/base.po.ts (1)
19-25: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winReplace the fixed delay with a state assertion.
Line 24 adds one second to every
BasePonavigation yet can still race rendering. After clicking, wait for the Overview tab’s selected state (or its panel) instead. Playwright locator assertions already retry until the expected state is reached. (playwright.dev)
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: cf851651-c26f-4549-baf5-0303bd29c080
⛔ Files ignored due to path filters (1)
package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (99)
.eslintrc.json.github/workflows/on-release.ymlREADME.mdapps/ngx-bootstrap-docs-e2e/src/support/accordion.po.tsapps/ngx-bootstrap-docs-e2e/src/support/alerts.po.tsapps/ngx-bootstrap-docs-e2e/src/support/base.po.tsapps/ngx-bootstrap-docs-e2e/src/support/buttons.po.tsapps/ngx-bootstrap-docs/.eslintrc.jsonapps/ngx-bootstrap-docs/src/assets/css/style.scssapps/ngx-bootstrap-docs/src/assets/json/current-version.jsone2e/issues/issue-823.spec.tslibs/common-docs/.eslintrc.jsonlibs/common-docs/src/lib/common/discover/discover.component.tslibs/common-docs/src/lib/docs-section/docs-section.component.tslibs/doc-pages/accordion/.eslintrc.jsonlibs/doc-pages/alerts/.eslintrc.jsonlibs/doc-pages/buttons/.eslintrc.jsonlibs/doc-pages/carousel/.eslintrc.jsonlibs/doc-pages/collapse/.eslintrc.jsonlibs/doc-pages/datepicker/.eslintrc.jsonlibs/doc-pages/dropdown/.eslintrc.jsonlibs/doc-pages/modal/.eslintrc.jsonlibs/doc-pages/pagination/.eslintrc.jsonlibs/doc-pages/popover/.eslintrc.jsonlibs/doc-pages/progressbar/.eslintrc.jsonlibs/doc-pages/rating/.eslintrc.jsonlibs/doc-pages/sortable/.eslintrc.jsonlibs/doc-pages/tabs/.eslintrc.jsonlibs/doc-pages/tabs/src/lib/demos/dynamic/dynamic.tslibs/doc-pages/timepicker/.eslintrc.jsonlibs/doc-pages/tooltip/.eslintrc.jsonlibs/doc-pages/typeahead/.eslintrc.jsonpackage.jsonsrc/accordion/.eslintrc.jsonsrc/accordion/package.jsonsrc/alert/.eslintrc.jsonsrc/alert/package.jsonsrc/buttons/.eslintrc.jsonsrc/buttons/package.jsonsrc/carousel/.eslintrc.jsonsrc/carousel/package.jsonsrc/chronos/.eslintrc.jsonsrc/chronos/package.jsonsrc/chronos/utils/type-checks.tssrc/collapse/.eslintrc.jsonsrc/collapse/package.jsonsrc/component-loader/.eslintrc.jsonsrc/component-loader/package.jsonsrc/datepicker/.eslintrc.jsonsrc/datepicker/bs-datepicker-inline.component.tssrc/datepicker/bs-datepicker.component.tssrc/datepicker/bs-daterangepicker-inline.component.tssrc/datepicker/bs-daterangepicker.component.tssrc/datepicker/package.jsonsrc/datepicker/themes/bs/bs-datepicker-inline-container.component.tssrc/datepicker/themes/bs/bs-daterangepicker-container.component.tssrc/datepicker/themes/bs/bs-daterangepicker-inline-container.component.tssrc/dropdown/.eslintrc.jsonsrc/dropdown/package.jsonsrc/focus-trap/.eslintrc.jsonsrc/focus-trap/package.jsonsrc/locale/.eslintrc.jsonsrc/locale/package.jsonsrc/mini-ngrx/.eslintrc.jsonsrc/mini-ngrx/package.jsonsrc/modal/.eslintrc.jsonsrc/modal/package.jsonsrc/pagination/.eslintrc.jsonsrc/pagination/package.jsonsrc/popover/.eslintrc.jsonsrc/popover/package.jsonsrc/positioning/.eslintrc.jsonsrc/positioning/package.jsonsrc/progressbar/.eslintrc.jsonsrc/progressbar/package.jsonsrc/rating/.eslintrc.jsonsrc/rating/package.jsonsrc/root/.eslintrc.jsonsrc/root/package.jsonsrc/root/project.jsonsrc/schematics/package.jsonsrc/schematics/src/utils/current_dependency_versions.jsonsrc/sortable/.eslintrc.jsonsrc/sortable/package.jsonsrc/tabs/.eslintrc.jsonsrc/tabs/package.jsonsrc/tabs/tab.directive.tssrc/tabs/tabset.component.tssrc/tabs/testing/tab-ordering.spec.tssrc/tabs/testing/tabset.component.spec.tssrc/timepicker/.eslintrc.jsonsrc/timepicker/package.jsonsrc/tooltip/.eslintrc.jsonsrc/tooltip/package.jsonsrc/typeahead/.eslintrc.jsonsrc/typeahead/package.jsonsrc/typeahead/typeahead-container.component.tssrc/utils/.eslintrc.jsonsrc/utils/package.json
💤 Files with no reviewable changes (35)
- src/alert/.eslintrc.json
- src/chronos/.eslintrc.json
- src/mini-ngrx/.eslintrc.json
- src/collapse/.eslintrc.json
- src/datepicker/.eslintrc.json
- src/carousel/.eslintrc.json
- src/locale/.eslintrc.json
- src/popover/.eslintrc.json
- apps/ngx-bootstrap-docs/src/assets/css/style.scss
- src/buttons/.eslintrc.json
- src/sortable/.eslintrc.json
- src/pagination/.eslintrc.json
- src/root/.eslintrc.json
- libs/doc-pages/buttons/.eslintrc.json
- libs/doc-pages/carousel/.eslintrc.json
- libs/doc-pages/dropdown/.eslintrc.json
- src/utils/.eslintrc.json
- apps/ngx-bootstrap-docs/.eslintrc.json
- src/focus-trap/.eslintrc.json
- libs/doc-pages/timepicker/.eslintrc.json
- libs/doc-pages/datepicker/.eslintrc.json
- libs/doc-pages/accordion/.eslintrc.json
- libs/doc-pages/pagination/.eslintrc.json
- libs/doc-pages/alerts/.eslintrc.json
- src/timepicker/.eslintrc.json
- libs/doc-pages/sortable/.eslintrc.json
- libs/doc-pages/tabs/.eslintrc.json
- libs/doc-pages/tooltip/.eslintrc.json
- libs/doc-pages/popover/.eslintrc.json
- libs/doc-pages/collapse/.eslintrc.json
- libs/common-docs/.eslintrc.json
- libs/doc-pages/typeahead/.eslintrc.json
- libs/doc-pages/modal/.eslintrc.json
- libs/doc-pages/rating/.eslintrc.json
- libs/doc-pages/progressbar/.eslintrc.json
mattwang44
left a comment
There was a problem hiding this comment.
🤖 Suggested verdict: APPROVE
I reviewed the diff and the checked-out contents at the merge commit, focusing on the five places this PR made an actual decision: the package.json/package-lock.json stylus override (verified it still resolves to the GitHub tarball with a matching integrity hash), the hand-merged src/datepicker/.eslintrc.json, the preserved --runner=cloud removal in on-release.yml, and the coexistence of the fork's isBs3/isBs4 bindings with upstream's refactor in typeahead-container.component.ts. All five check out exactly as described in the PR body. A dedicated security pass covered CI/workflow injection, secret handling, and the typeahead innerHTML sink and found nothing reachable. The rest of the diff is upstream vendor code brought in wholesale, which davidIce has already correctly pushed back on against CodeRabbit's out-of-scope findings; I'm not re-raising those. CI is fully green. Nothing blocking from my read.
What
Merge upstream
v20.0.2intosupport-bs-3to add Angular 20 support to the BS3 fork. Prerequisite for the fms Angular 19→20 upgrade — ACE-7218, parent ACE-7170.Mirrors the
bs3-v19.0.3flow: merge the matching upstream tag intosupport-bs-3, then tag so the release workflow builds the package.This PR head is a merge commit (
3138ec47, parents = the branch tip + upstreamv20.0.2). Do not squash or rebase — either would flatten the two-parent structure and lose the "merged upstream tag" history the fork's tag/release convention relies on. All three methods are enabled on this branch; this PR must use merge.Conflict resolution
npm install --package-lock-onlyon Node 22.23.1 so thestylusoverride resolves. Verifiedstylusstill points at the GitHub tarball, not the npm registry.extends: took upstream (dropsplugin:@nx/angular, which v20 removes repo-wide; every othersrc/*/.eslintrc.jsonis now without it).rules: keptprefer-standalone: ["off"](BS3 components are non-standalone); droppedno-host-metadata-property(removed from angular-eslint in v19; repo is now on 20.0.0; no other config references it).Fork changes preserved through auto-merge (each verified vs upstream)
.github/workflows/on-release.ymlkeeps the--runner=cloudremoval fromc8a3726. Losing it puts the release workflow back in the state that failed during the v19 cut.package.jsonkeeps thestylusoverride while taking upstream's v20 bumps (@angular/* 20.0.2,@nx/angular 21.2.0).src/typeahead/typeahead-container.component.tsholds both sides — ourisBs3/isBs4host bindings and upstream'sPLACEHOLDER_CHARrefactor. The hunks are ~190 lines apart, so git merged them cleanly.The BS3 component patches (progressbar, tooltip, modal, dropdown, timepicker, carousel, accordion, theme-provider) are untouched — upstream did not change those files between v19.0.3 and v20.0.2.
Verification (local, Node 22.23.1, replicating both
on-release.ymlbuild steps)Built output checked by discriminating strings, not just a green build:
dist/ngx-bootstrap/typeahead/fesm2022/ngx-bootstrap-typeahead.mjscarriesisBs3×2 /isBs4×9, host classdropdown open bottom(the fork form, not upstream'sdropdown open bottom dropdown-menu), with upstream's placeholder constant alongside. Published metadata:ngx-bootstrap@20.0.2, peer@angular/core ^20.0.2.Not run: lint, unit tests.
After merge
Tag
bs3-v20.0.2on the merge commit andgit push --no-verifyto trigger the release workflow →bs3-v20.0.2-release, which fms then consumes asgithub:hardcoretech/ngx-bootstrap-bs3#bs3-v20.0.2-release.