diff --git a/CHANGELOG.md b/CHANGELOG.md index a9a39709..e3ad0fdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ --- +#### `5.5.8` + +- fix(toaster): Unexpected state: no hydration info available for a given TNode, which represents a view container. [Expected=> null != undefined <=Actual] - ensure that the contentToasts is available before accessing it - tempfix +- refactor(toaster): provide ToasterService for ToasterComponent instead of root +- refactor(toast): migrate visible to linkedSignal +- chore(dependencies): update + +--- + #### `5.5.7` - chore(dependencies): update to `Angular 20.1.6` diff --git a/package-lock.json b/package-lock.json index 91c7323a..03e13397 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coreui-angular-dev", - "version": "5.5.7", + "version": "5.5.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coreui-angular-dev", - "version": "5.5.7", + "version": "5.5.8", "license": "MIT", "dependencies": { "@angular/animations": "^20.1.6", @@ -29,9 +29,9 @@ "zone.js": "~0.15.1" }, "devDependencies": { - "@angular-devkit/schematics": "^20.1.5", - "@angular/build": "^20.1.5", - "@angular/cli": "^20.1.5", + "@angular-devkit/schematics": "^20.1.6", + "@angular/build": "^20.1.6", + "@angular/cli": "^20.1.6", "@angular/compiler-cli": "^20.1.6", "@angular/language-service": "^20.1.6", "@types/jasmine": "^5.1.8", @@ -263,13 +263,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.2001.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.5.tgz", - "integrity": "sha512-LdjmE75wjmpHNfFsDecZB95H/DekX1hJLmRzGWid+Fd6lbyFBQyUjq+ucwD9WlHqqrD+CgKapQKnUhlBSIJxPQ==", + "version": "0.2001.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2001.6.tgz", + "integrity": "sha512-CGFDfqPvKw1Ekuk7eSYMdhBv26LiwBrnZEUnrloC8fnuT8G+s46WMj/uH3tTcQ9MHYbhOSAHynNwpnwX71wghg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.5", + "@angular-devkit/core": "20.1.6", "rxjs": "7.8.2" }, "engines": { @@ -279,9 +279,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.5.tgz", - "integrity": "sha512-458Q/pNoXIyUWVbnXktMyc7Ly3MxsYwgQcEIFzzxJu+zDLAt1PwyDe4o+rd8XHwbceW9r0XIlQa78dEjew6MPQ==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.1.6.tgz", + "integrity": "sha512-Wooe+nTmHOLvveBQWDmSsdKg39re5BUMGVkwKlPHTQ/YU9aYshvPEBu1K0l4gSqe3qtqVVAx0HlPb53bEFFa8w==", "dev": true, "license": "MIT", "dependencies": { @@ -307,13 +307,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.5.tgz", - "integrity": "sha512-fAxBFNIlete9FiqaqpQuXgjpoXwQRwKjv9MEW7DuciPYd/FFWr0858U2bzuJEk0mFNY3f9Q4vlY/RgDk9HWF2A==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.1.6.tgz", + "integrity": "sha512-Maj/yCkn3Qjum2kCYUOYMw8VYh/8725XN8/4cae9VllMwkN5D8jYDvX40qmfgQve2x0x6r3L8rmaIHn8227cHg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.5", + "@angular-devkit/core": "20.1.6", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "8.2.0", @@ -447,14 +447,14 @@ } }, "node_modules/@angular/build": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.1.5.tgz", - "integrity": "sha512-Uh0VX9HQMLt4054P03f7UL6tu5kvuJhf5UXiRUzkaK/tMk7SDokp9YtN7lErPiWvDQFtuX9o27PMFpxwEfdRcA==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.1.6.tgz", + "integrity": "sha512-xAC9uGeRmvCKNLr7D0XUK+KWixlRl9nnfZbB9MIDe00ulmHy5duVWILUwBEOeq1/wRrrJc133NAPTTEBWImwnA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.2001.5", + "@angular-devkit/architect": "0.2001.6", "@babel/core": "7.27.7", "@babel/helper-annotate-as-pure": "7.27.3", "@babel/helper-split-export-declaration": "7.24.7", @@ -496,7 +496,7 @@ "@angular/platform-browser": "^20.0.0", "@angular/platform-server": "^20.0.0", "@angular/service-worker": "^20.0.0", - "@angular/ssr": "^20.1.5", + "@angular/ssr": "^20.1.6", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^20.0.0", @@ -561,19 +561,19 @@ } }, "node_modules/@angular/cli": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.1.5.tgz", - "integrity": "sha512-1pkShcbPEkQn8wCoHsr9v+udy5EmelHVwZ5kNZjZZ2EDTcB/RC7cuuUfyWRxrYJxwT5K/jx00ORQvbVJj0L+zw==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.1.6.tgz", + "integrity": "sha512-kqncVmYtlDYLwt4l5lFBz4uEnoheMH+teSqAAD/zaDxn41KvpoRLHiEVurQhsNP/GDHxGu+8wg0s4gX3kaFOzg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.2001.5", - "@angular-devkit/core": "20.1.5", - "@angular-devkit/schematics": "20.1.5", + "@angular-devkit/architect": "0.2001.6", + "@angular-devkit/core": "20.1.6", + "@angular-devkit/schematics": "20.1.6", "@inquirer/prompts": "7.6.0", "@listr2/prompt-adapter-inquirer": "2.0.22", "@modelcontextprotocol/sdk": "1.13.3", - "@schematics/angular": "20.1.5", + "@schematics/angular": "20.1.6", "@yarnpkg/lockfile": "1.1.0", "algoliasearch": "5.32.0", "ini": "5.0.0", @@ -3957,14 +3957,14 @@ } }, "node_modules/@schematics/angular": { - "version": "20.1.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.1.5.tgz", - "integrity": "sha512-+bgbujb9F6cgP/hz0L8IEJy16aXIsgypTcHdckozbjDRUMtqjjmCNjutep0t6hfe9La/4hF8pKiOx9KLBFG+rw==", + "version": "20.1.6", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.1.6.tgz", + "integrity": "sha512-1dE+GkpSZbsQxnir/S24g3+pA5sE0XOMxa4Wxhon0dxArP/gH72hsinoVaLDfcQkYOtbbTw/Q8VV41uWBI9eGg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.1.5", - "@angular-devkit/schematics": "20.1.5", + "@angular-devkit/core": "20.1.6", + "@angular-devkit/schematics": "20.1.6", "jsonc-parser": "3.3.1" }, "engines": { diff --git a/package.json b/package.json index 2e35a401..d9e4ec66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coreui-angular-dev", - "version": "5.5.7", + "version": "5.5.8", "description": "CoreUI Components Library for Angular", "copyright": "Copyright 2025 creativeLabs Łukasz Holeczek", "license": "MIT", @@ -60,9 +60,9 @@ "zone.js": "~0.15.1" }, "devDependencies": { - "@angular-devkit/schematics": "^20.1.5", - "@angular/build": "^20.1.5", - "@angular/cli": "^20.1.5", + "@angular-devkit/schematics": "^20.1.6", + "@angular/build": "^20.1.6", + "@angular/cli": "^20.1.6", "@angular/compiler-cli": "^20.1.6", "@angular/language-service": "^20.1.6", "@types/jasmine": "^5.1.8", diff --git a/projects/coreui-angular-chartjs/package.json b/projects/coreui-angular-chartjs/package.json index e577fa1e..c85cb7df 100644 --- a/projects/coreui-angular-chartjs/package.json +++ b/projects/coreui-angular-chartjs/package.json @@ -1,6 +1,6 @@ { "name": "@coreui/angular-chartjs", - "version": "5.5.7", + "version": "5.5.8", "description": "Angular wrapper component for Chart.js", "copyright": "Copyright 2025 creativeLabs Łukasz Holeczek", "license": "MIT", diff --git a/projects/coreui-angular/package.json b/projects/coreui-angular/package.json index af99e0e8..080852ff 100644 --- a/projects/coreui-angular/package.json +++ b/projects/coreui-angular/package.json @@ -1,6 +1,6 @@ { "name": "@coreui/angular", - "version": "5.5.7", + "version": "5.5.8", "description": "CoreUI Components Library for Angular", "copyright": "Copyright 2025 creativeLabs Łukasz Holeczek", "license": "MIT", @@ -29,7 +29,7 @@ "@angular/core": "^20.1.0", "@angular/router": "^20.1.0", "@coreui/coreui": "~5.4.1", - "@coreui/icons-angular": "~5.5.7", + "@coreui/icons-angular": "~5.5.8", "rxjs": "^7.8.2" }, "repository": { diff --git a/projects/coreui-angular/src/lib/toast/toast/toast.component.ts b/projects/coreui-angular/src/lib/toast/toast/toast.component.ts index 2377174c..fb4380f0 100644 --- a/projects/coreui-angular/src/lib/toast/toast/toast.component.ts +++ b/projects/coreui-angular/src/lib/toast/toast/toast.component.ts @@ -7,6 +7,7 @@ import { ElementRef, inject, input, + linkedSignal, numberAttribute, OnDestroy, OnInit, @@ -98,26 +99,23 @@ export class ToastComponent implements OnInit, OnDestroy { */ readonly visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); - readonly #visibleInputEffect = effect(() => { - this.visible = this.visibleInput(); + readonly #visible = linkedSignal(this.visibleInput); + + readonly #visibleEffect = effect(() => { + const newValue = this.#visible(); + newValue ? this.setTimer() : this.clearTimer(); + this.visibleChange?.emit(newValue); + this.changeDetectorRef.markForCheck(); }); set visible(value: boolean) { - const newValue = value; - if (this.#visible !== newValue) { - this.#visible = newValue; - newValue ? this.setTimer() : this.clearTimer(); - this.visibleChange?.emit(newValue); - this.changeDetectorRef.markForCheck(); - } + this.#visible.set(value); } - get visible() { - return this.#visible; + get visible(): boolean { + return this.#visible(); } - #visible = false; - /** * @ignore */ diff --git a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html index 252bfa13..810fc89b 100644 --- a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html +++ b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.html @@ -1,2 +1,2 @@ - + diff --git a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.ts b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.ts index 1822c702..168aa8cd 100644 --- a/projects/coreui-angular/src/lib/toast/toaster/toaster.component.ts +++ b/projects/coreui-angular/src/lib/toast/toaster/toaster.component.ts @@ -4,6 +4,7 @@ import { computed, contentChildren, DestroyRef, + effect, ElementRef, inject, Injector, @@ -54,7 +55,8 @@ export type TToasterPlacement = host: { class: 'toaster toast-container', '[class]': 'hostClasses()' - } + }, + providers: [ToasterService] }) export class ToasterComponent implements OnInit { readonly #hostElement = inject(ElementRef); @@ -84,6 +86,12 @@ export class ToasterComponent implements OnInit { readonly toasterHost = viewChild.required(ToasterHostDirective); readonly contentToasts = contentChildren(ToastComponent, { read: ViewContainerRef }); + readonly #contentToastsEffect = effect(() => { + // Ensure that the contentToasts is available before accessing it + // temp fix for: ASSERTION ERROR: Unexpected state: no hydration info available for a given TNode, which represents a view container. [Expected=> null != undefined <=Actual] + this.contentToasts(); + }); + readonly hostClasses = computed(() => { const placement = this.placement; const position = this.position(); @@ -143,7 +151,7 @@ export class ToasterComponent implements OnInit { this.contentToasts()?.forEach((item) => { if (state.toast && item.element.nativeElement === state.toast.hostElement.nativeElement) { if (!state.toast.dynamic()) { - state.toast['visible'] = false; + state.toast.visible = false; } } }); diff --git a/projects/coreui-icons-angular/package.json b/projects/coreui-icons-angular/package.json index 0ad90c1a..24da9945 100644 --- a/projects/coreui-icons-angular/package.json +++ b/projects/coreui-icons-angular/package.json @@ -1,6 +1,6 @@ { "name": "@coreui/icons-angular", - "version": "5.5.7", + "version": "5.5.8", "description": "CoreUI Icons Angular component and service", "copyright": "Copyright 2025 creativeLabs Łukasz Holeczek", "license": "MIT",