Skip to content

Merge upstream v20.0.2 into support-bs-3 (Angular 20 support) [ACE-7218] - #7

Merged
davidIce merged 16 commits into
support-bs-3from
feat/ACE-7218-angular-20
Jul 27, 2026
Merged

davidIce merged 16 commits into
support-bs-3from
feat/ACE-7218-angular-20

Conversation

@davidIce

Copy link
Copy Markdown

What

Merge upstream v20.0.2 into support-bs-3 to 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.3 flow: merge the matching upstream tag into support-bs-3, then tag so the release workflow builds the package.

⚠️ Merge method: Create a merge commit only

This PR head is a merge commit (3138ec47, parents = the branch tip + upstream v20.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

  • 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, not the npm registry.
  • src/datepicker/.eslintrc.json — resolved per field:
    • extends: took upstream (drops plugin:@nx/angular, which v20 removes repo-wide; every other src/*/.eslintrc.json is now without it).
    • rules: kept prefer-standalone: ["off"] (BS3 components are non-standalone); dropped no-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.yml keeps the --runner=cloud removal from c8a3726. Losing it puts the release workflow back in the state that failed 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 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.yml build steps)

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 ×2 / isBs4 ×9, host class dropdown open bottom (the fork form, not upstream's dropdown 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.2 on the merge commit and git push --no-verify to trigger the release workflow → bs3-v20.0.2-release, which fms then consumes as github:hardcoretech/ngx-bootstrap-bs3#bs3-v20.0.2-release.

daniloff200 and others added 16 commits May 26, 2025 17:04
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>
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.
@davidIce
davidIce requested a review from a team as a code owner July 23, 2026 01:55
@coderabbitai

coderabbitai Bot commented Jul 23, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The 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.json

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'

.github/workflows/on-release.yml

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'

apps/ngx-bootstrap-docs/src/assets/json/current-version.json

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'

  • 39 others
🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Tie the queryParamMap subscription to component destruction.

The constructor subscription persists for the component lifetime because Router emits when the same route URL is navigated to again, and DocsSectionComponent no longer implements ngOnDestroy. Use takeUntilDestroyed() 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 win

Replace the fixed delay with a state assertion.

Line 24 adds one second to every BasePo navigation 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

📥 Commits

Reviewing files that changed from the base of the PR and between 6e37d29 and 3138ec4.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (99)
  • .eslintrc.json
  • .github/workflows/on-release.yml
  • README.md
  • apps/ngx-bootstrap-docs-e2e/src/support/accordion.po.ts
  • apps/ngx-bootstrap-docs-e2e/src/support/alerts.po.ts
  • apps/ngx-bootstrap-docs-e2e/src/support/base.po.ts
  • apps/ngx-bootstrap-docs-e2e/src/support/buttons.po.ts
  • apps/ngx-bootstrap-docs/.eslintrc.json
  • apps/ngx-bootstrap-docs/src/assets/css/style.scss
  • apps/ngx-bootstrap-docs/src/assets/json/current-version.json
  • e2e/issues/issue-823.spec.ts
  • libs/common-docs/.eslintrc.json
  • libs/common-docs/src/lib/common/discover/discover.component.ts
  • libs/common-docs/src/lib/docs-section/docs-section.component.ts
  • libs/doc-pages/accordion/.eslintrc.json
  • libs/doc-pages/alerts/.eslintrc.json
  • libs/doc-pages/buttons/.eslintrc.json
  • libs/doc-pages/carousel/.eslintrc.json
  • libs/doc-pages/collapse/.eslintrc.json
  • libs/doc-pages/datepicker/.eslintrc.json
  • libs/doc-pages/dropdown/.eslintrc.json
  • libs/doc-pages/modal/.eslintrc.json
  • libs/doc-pages/pagination/.eslintrc.json
  • libs/doc-pages/popover/.eslintrc.json
  • libs/doc-pages/progressbar/.eslintrc.json
  • libs/doc-pages/rating/.eslintrc.json
  • libs/doc-pages/sortable/.eslintrc.json
  • libs/doc-pages/tabs/.eslintrc.json
  • libs/doc-pages/tabs/src/lib/demos/dynamic/dynamic.ts
  • libs/doc-pages/timepicker/.eslintrc.json
  • libs/doc-pages/tooltip/.eslintrc.json
  • libs/doc-pages/typeahead/.eslintrc.json
  • package.json
  • src/accordion/.eslintrc.json
  • src/accordion/package.json
  • src/alert/.eslintrc.json
  • src/alert/package.json
  • src/buttons/.eslintrc.json
  • src/buttons/package.json
  • src/carousel/.eslintrc.json
  • src/carousel/package.json
  • src/chronos/.eslintrc.json
  • src/chronos/package.json
  • src/chronos/utils/type-checks.ts
  • src/collapse/.eslintrc.json
  • src/collapse/package.json
  • src/component-loader/.eslintrc.json
  • src/component-loader/package.json
  • src/datepicker/.eslintrc.json
  • src/datepicker/bs-datepicker-inline.component.ts
  • src/datepicker/bs-datepicker.component.ts
  • src/datepicker/bs-daterangepicker-inline.component.ts
  • src/datepicker/bs-daterangepicker.component.ts
  • src/datepicker/package.json
  • src/datepicker/themes/bs/bs-datepicker-inline-container.component.ts
  • src/datepicker/themes/bs/bs-daterangepicker-container.component.ts
  • src/datepicker/themes/bs/bs-daterangepicker-inline-container.component.ts
  • src/dropdown/.eslintrc.json
  • src/dropdown/package.json
  • src/focus-trap/.eslintrc.json
  • src/focus-trap/package.json
  • src/locale/.eslintrc.json
  • src/locale/package.json
  • src/mini-ngrx/.eslintrc.json
  • src/mini-ngrx/package.json
  • src/modal/.eslintrc.json
  • src/modal/package.json
  • src/pagination/.eslintrc.json
  • src/pagination/package.json
  • src/popover/.eslintrc.json
  • src/popover/package.json
  • src/positioning/.eslintrc.json
  • src/positioning/package.json
  • src/progressbar/.eslintrc.json
  • src/progressbar/package.json
  • src/rating/.eslintrc.json
  • src/rating/package.json
  • src/root/.eslintrc.json
  • src/root/package.json
  • src/root/project.json
  • src/schematics/package.json
  • src/schematics/src/utils/current_dependency_versions.json
  • src/sortable/.eslintrc.json
  • src/sortable/package.json
  • src/tabs/.eslintrc.json
  • src/tabs/package.json
  • src/tabs/tab.directive.ts
  • src/tabs/tabset.component.ts
  • src/tabs/testing/tab-ordering.spec.ts
  • src/tabs/testing/tabset.component.spec.ts
  • src/timepicker/.eslintrc.json
  • src/timepicker/package.json
  • src/tooltip/.eslintrc.json
  • src/tooltip/package.json
  • src/typeahead/.eslintrc.json
  • src/typeahead/package.json
  • src/typeahead/typeahead-container.component.ts
  • src/utils/.eslintrc.json
  • src/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

Comment thread e2e/issues/issue-823.spec.ts
Comment thread libs/common-docs/src/lib/common/discover/discover.component.ts
Comment thread README.md
Comment thread src/tabs/testing/tab-ordering.spec.ts
@davidIce
davidIce requested a review from mattwang44 July 23, 2026 12:25

@mattwang44 mattwang44 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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.

@davidIce
davidIce merged commit a3ab722 into support-bs-3 Jul 27, 2026
11 checks passed
@davidIce
davidIce deleted the feat/ACE-7218-angular-20 branch July 27, 2026 02:37
@CJHwong CJHwong added the gobuilders:L4 GoBuilders classification: L4 Core Builder label Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gobuilders:L4 GoBuilders classification: L4 Core Builder

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants