@scania-nl/tegel-angular-extensions 0.0.1 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +5 -0
- package/esm2022/lib/toast/models/toast-state.enum.mjs +19 -0
- package/esm2022/lib/toast/models/toast-type.mjs +5 -0
- package/esm2022/lib/toast/models/toast.model.mjs +2 -0
- package/esm2022/lib/toast/provide-toast.mjs +19 -0
- package/esm2022/lib/toast/toast.component.mjs +34 -0
- package/esm2022/lib/toast/toast.config.mjs +11 -0
- package/esm2022/lib/toast/toast.service.mjs +206 -0
- package/esm2022/lib/utils/bootstrap-global-component.mjs +43 -0
- package/esm2022/scania-nl-tegel-angular-extensions.mjs +5 -0
- package/{src/index.ts → index.d.ts} +1 -1
- package/lib/toast/models/toast-state.enum.d.ts +17 -0
- package/lib/toast/models/toast-type.d.ts +8 -0
- package/lib/toast/models/toast.model.d.ts +73 -0
- package/lib/toast/provide-toast.d.ts +3 -0
- package/lib/toast/toast.component.d.ts +24 -0
- package/lib/toast/toast.config.d.ts +35 -0
- package/lib/toast/toast.service.d.ts +98 -0
- package/lib/utils/bootstrap-global-component.d.ts +23 -0
- package/package.json +16 -2
- package/eslint.config.mjs +0 -48
- package/jest.config.ts +0 -21
- package/ng-package.json +0 -7
- package/project.json +0 -36
- package/src/lib/toast/models/toast-state.enum.ts +0 -19
- package/src/lib/toast/models/toast-type.ts +0 -9
- package/src/lib/toast/models/toast.model.ts +0 -87
- package/src/lib/toast/provide-toast.ts +0 -29
- package/src/lib/toast/toast.component.html +0 -41
- package/src/lib/toast/toast.component.scss +0 -118
- package/src/lib/toast/toast.component.spec.ts +0 -28
- package/src/lib/toast/toast.component.ts +0 -37
- package/src/lib/toast/toast.config.ts +0 -50
- package/src/lib/toast/toast.service.ts +0 -275
- package/src/lib/utils/bootstrap-global-component.ts +0 -73
- package/src/test-setup.ts +0 -6
- package/tsconfig.json +0 -28
- package/tsconfig.lib.json +0 -17
- package/tsconfig.lib.prod.json +0 -7
- package/tsconfig.spec.json +0 -16
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './lib/toast/provide-toast';
|
|
2
|
+
export * from './lib/toast/toast.config';
|
|
3
|
+
export * from './lib/toast/toast.service';
|
|
4
|
+
export * from './lib/toast/models/toast.model';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL3RvYXN0L3Byb3ZpZGUtdG9hc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdG9hc3QvdG9hc3QuY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RvYXN0L3RvYXN0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdG9hc3QvbW9kZWxzL3RvYXN0Lm1vZGVsJyJdfQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents the current lifecycle state of a toast.
|
|
3
|
+
*/
|
|
4
|
+
export var ToastState;
|
|
5
|
+
(function (ToastState) {
|
|
6
|
+
/**
|
|
7
|
+
* The toast is fully visible and active.
|
|
8
|
+
*/
|
|
9
|
+
ToastState["Open"] = "open";
|
|
10
|
+
/**
|
|
11
|
+
* The toast is transitioning out (e.g., fading out).
|
|
12
|
+
*/
|
|
13
|
+
ToastState["Closing"] = "closing";
|
|
14
|
+
/**
|
|
15
|
+
* The toast is fully removed or dismissed.
|
|
16
|
+
*/
|
|
17
|
+
ToastState["Closed"] = "closed";
|
|
18
|
+
})(ToastState || (ToastState = {}));
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Qtc3RhdGUuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvbW9kZWxzL3RvYXN0LXN0YXRlLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxVQWVYO0FBZkQsV0FBWSxVQUFVO0lBQ3BCOztPQUVHO0lBQ0gsMkJBQWEsQ0FBQTtJQUViOztPQUVHO0lBQ0gsaUNBQW1CLENBQUE7SUFFbkI7O09BRUc7SUFDSCwrQkFBaUIsQ0FBQTtBQUNuQixDQUFDLEVBZlcsVUFBVSxLQUFWLFVBQVUsUUFlckIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgbGlmZWN5Y2xlIHN0YXRlIG9mIGEgdG9hc3QuXG4gKi9cbmV4cG9ydCBlbnVtIFRvYXN0U3RhdGUge1xuICAvKipcbiAgICogVGhlIHRvYXN0IGlzIGZ1bGx5IHZpc2libGUgYW5kIGFjdGl2ZS5cbiAgICovXG4gIE9wZW4gPSAnb3BlbicsXG5cbiAgLyoqXG4gICAqIFRoZSB0b2FzdCBpcyB0cmFuc2l0aW9uaW5nIG91dCAoZS5nLiwgZmFkaW5nIG91dCkuXG4gICAqL1xuICBDbG9zaW5nID0gJ2Nsb3NpbmcnLFxuXG4gIC8qKlxuICAgKiBUaGUgdG9hc3QgaXMgZnVsbHkgcmVtb3ZlZCBvciBkaXNtaXNzZWQuXG4gICAqL1xuICBDbG9zZWQgPSAnY2xvc2VkJyxcbn0iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List of available toast types (inherited from Tegel)
|
|
3
|
+
*/
|
|
4
|
+
export const TOAST_TYPES = ['success', 'information', 'warning', 'error'];
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QtdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvbW9kZWxzL3RvYXN0LXR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGlzdCBvZiBhdmFpbGFibGUgdG9hc3QgdHlwZXMgKGluaGVyaXRlZCBmcm9tIFRlZ2VsKVxuICovXG5leHBvcnQgY29uc3QgVE9BU1RfVFlQRVMgPSBbJ3N1Y2Nlc3MnLCAnaW5mb3JtYXRpb24nLCAnd2FybmluZycsICdlcnJvciddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGUgcmVwcmVzZW50aW5nIHZhbGlkIHRvYXN0IHR5cGUgdmFsdWVzLlxuICovXG5leHBvcnQgdHlwZSBUb2FzdFR5cGUgPSAodHlwZW9mIFRPQVNUX1RZUEVTKVtudW1iZXJdOyJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL3RvYXN0L21vZGVscy90b2FzdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9hc3RTdGF0ZSB9IGZyb20gJy4vdG9hc3Qtc3RhdGUuZW51bSc7XG5pbXBvcnQgeyBUb2FzdFR5cGUgfSBmcm9tICcuL3RvYXN0LXR5cGUnO1xuXG4vKipcbiAqIERlZmluZXMgdGhlIGJhc2Ugc3RydWN0dXJlIGZvciBhIHRvYXN0IG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9hc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHRvYXN0IChlLmcuLCBzdWNjZXNzLCBlcnJvcikuXG4gICAqL1xuICB0eXBlOiBUb2FzdFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIHRpdGxlIHRleHQgZGlzcGxheWVkIGluIHRoZSB0b2FzdC5cbiAgICovXG4gIHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIHRleHQgcHJvdmlkaW5nIGFkZGl0aW9uYWwgY29udGV4dC5cbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSB0b2FzdCBhdXRvLWRpc21pc3Nlcy5cbiAgICogVXNlIGAwYCBmb3IgcGVyc2lzdGVudCB0b2FzdHMuXG4gICAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBmYWRlLW91dCB0cmFuc2l0aW9uLlxuICAgKi9cbiAgY2xvc2VEdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0b2FzdCBjYW4gYmUgbWFudWFsbHkgY2xvc2VkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgY2xvc2FibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCByb3V0ZXIgbGluayB0byBuYXZpZ2F0ZSB0byB3aGVuIHRoZSB0b2FzdCBpcyBjbGlja2VkLlxuICAgKi9cbiAgbGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogQ3VzdG9tIGxpbmsgdGV4dCBzaG93biBpZiBhIGxpbmsgaXMgcHJvdmlkZWQuXG4gICAqL1xuICBsaW5rVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgdHJpZ2dlcmVkIHdoZW4gdGhlIGxpbmtUZXh0IGlzIGNsaWNrZWQuXG4gICAqIFVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYGxpbmtgIGZvciBpbnZva2luZyBjdXN0b20gYmVoYXZpb3IuXG4gICAqL1xuICBhY3Rpb24/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjYWxsYmFjayB0cmlnZ2VyZWQgd2hlbiB0aGUgdG9hc3QgaXMgY3JlYXRlZC5cbiAgICogQHBhcmFtIHRvYXN0IFRoZSBjcmVhdGVkIHRvYXN0IGluc3RhbmNlLlxuICAgKi9cbiAgb25DcmVhdGVkPzogKHRvYXN0OiBUb2FzdCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgdHJpZ2dlcmVkIHdoZW4gdGhlIHRvYXN0IGJlZ2lucyB0byBjbG9zZS5cbiAgICogQHBhcmFtIHRvYXN0IFRoZSB0b2FzdCB0aGF0IGlzIGNsb3NpbmcuXG4gICAqL1xuICBvbkNsb3NlPzogKHRvYXN0OiBUb2FzdCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgdHJpZ2dlcmVkIHdoZW4gdGhlIHRvYXN0IGhhcyBiZWVuIGZ1bGx5IHJlbW92ZWQuXG4gICAqIEBwYXJhbSB0b2FzdCBUaGUgcmVtb3ZlZCB0b2FzdCBpbnN0YW5jZS5cbiAgICovXG4gIG9uUmVtb3ZlZD86ICh0b2FzdDogVG9hc3QpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGZ1bGx5IGluc3RhbnRpYXRlZCB0b2FzdCwgaW5jbHVkaW5nIHVuaXF1ZSBJRCBhbmQgY3VycmVudCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb2FzdCBleHRlbmRzIFRvYXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRvYXN0IGluc3RhbmNlLlxuICAgKi9cbiAgaWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRvYXN0IChvcGVuLCBjbG9zaW5nLCBvciBjbG9zZWQpLlxuICAgKi9cbiAgc3RhdGU6IFRvYXN0U3RhdGU7XG59XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { makeEnvironmentProviders, provideAppInitializer, } from '@angular/core';
|
|
2
|
+
import { bootstrapGlobalComponent } from '../utils/bootstrap-global-component';
|
|
3
|
+
import { ToastComponent } from './toast.component';
|
|
4
|
+
import { DEFAULT_TOAST_CONFIG, TOAST_CONFIG, } from './toast.config';
|
|
5
|
+
export function provideToast(config = {}) {
|
|
6
|
+
return makeEnvironmentProviders([
|
|
7
|
+
{
|
|
8
|
+
provide: TOAST_CONFIG,
|
|
9
|
+
useFactory: () => ({
|
|
10
|
+
...DEFAULT_TOAST_CONFIG,
|
|
11
|
+
...(config ?? {}),
|
|
12
|
+
}),
|
|
13
|
+
},
|
|
14
|
+
provideAppInitializer(() => {
|
|
15
|
+
bootstrapGlobalComponent(ToastComponent, { reuseIfExists: true });
|
|
16
|
+
}),
|
|
17
|
+
]);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS10b2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvcHJvdmlkZS10b2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixZQUFZLEdBRWIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLFVBQVUsWUFBWSxDQUMxQixTQUErQixFQUFFO0lBRWpDLE9BQU8sd0JBQXdCLENBQUM7UUFDOUI7WUFDRSxPQUFPLEVBQUUsWUFBWTtZQUNyQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDakIsR0FBRyxvQkFBb0I7Z0JBQ3ZCLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO2FBQ2xCLENBQUM7U0FDSDtRQUNELHFCQUFxQixDQUFDLEdBQUcsRUFBRTtZQUN6Qix3QkFBd0IsQ0FBQyxjQUFjLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUM7S0FDSCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGJvb3RzdHJhcEdsb2JhbENvbXBvbmVudCB9IGZyb20gJy4uL3V0aWxzL2Jvb3RzdHJhcC1nbG9iYWwtY29tcG9uZW50JztcbmltcG9ydCB7IFRvYXN0Q29tcG9uZW50IH0gZnJvbSAnLi90b2FzdC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UT0FTVF9DT05GSUcsXG4gIFRPQVNUX0NPTkZJRyxcbiAgVG9hc3RDb25maWcsXG59IGZyb20gJy4vdG9hc3QuY29uZmlnJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVUb2FzdChcbiAgY29uZmlnOiBQYXJ0aWFsPFRvYXN0Q29uZmlnPiA9IHt9XG4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IFRPQVNUX0NPTkZJRyxcbiAgICAgIHVzZUZhY3Rvcnk6ICgpID0+ICh7XG4gICAgICAgIC4uLkRFRkFVTFRfVE9BU1RfQ09ORklHLFxuICAgICAgICAuLi4oY29uZmlnID8/IHt9KSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+IHtcbiAgICAgIGJvb3RzdHJhcEdsb2JhbENvbXBvbmVudChUb2FzdENvbXBvbmVudCwgeyByZXVzZUlmRXhpc3RzOiB0cnVlIH0pO1xuICAgIH0pLFxuICBdKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
|
|
3
|
+
import { RouterLink } from '@angular/router';
|
|
4
|
+
import { TegelModule } from '@scania/tegel-angular-17';
|
|
5
|
+
import { ToastService } from './toast.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@scania/tegel-angular-17";
|
|
8
|
+
/**
|
|
9
|
+
* Displays toast notifications provided by the ToastService.
|
|
10
|
+
*
|
|
11
|
+
* Toasts are non-blocking messages that automatically disappear after a set duration
|
|
12
|
+
* or can be dismissed manually by the user.
|
|
13
|
+
*/
|
|
14
|
+
export class ToastComponent {
|
|
15
|
+
toastService = inject(ToastService);
|
|
16
|
+
/**
|
|
17
|
+
* A reactive signal of all currently active toasts (open or closing).
|
|
18
|
+
*/
|
|
19
|
+
toastsSignal = this.toastService.activeToasts;
|
|
20
|
+
/**
|
|
21
|
+
* Initiates the closing process for the given toast.
|
|
22
|
+
*
|
|
23
|
+
* @param toast The toast to be closed.
|
|
24
|
+
* @returns void
|
|
25
|
+
*/
|
|
26
|
+
closeToast = (toast) => this.toastService.close(toast.id);
|
|
27
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
28
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.13", type: ToastComponent, isStandalone: true, selector: "tds-ext-toast", ngImport: i0, template: "<ul class=\"toast-list\" aria-live=\"polite\" aria-atomic=\"true\">\n @for (toast of toastsSignal(); track toast.id) {\n <li\n class=\"toast-item\"\n [class]=\"'toast-' + toast.type\"\n [class.toast-closing]=\"toast.state === 'closing'\"\n [style.--duration.ms]=\"toast.duration\"\n [style.--close-duration.ms]=\"toast.closeDuration\"\n role=\"status\"\n >\n <tds-toast\n [variant]=\"toast.type\"\n [header]=\"toast.title\"\n [subheader]=\"toast.description\"\n [closable]=\"toast.closable\"\n tds-close-aria-label=\"Toast close button\"\n >\n @if (toast.link) {\n <tds-link slot=\"actions\">\n <a [routerLink]=\"toast.link\">\n {{ toast.linkText ?? 'Click here' }}\n </a>\n </tds-link>\n } @else if (toast.action) {\n <tds-link slot=\"actions\">\n <a href=\"#\" (click)=\"toast.action()\">\n {{ toast.linkText ?? 'Click here' }}\n </a>\n </tds-link>\n }\n </tds-toast>\n @if (toast.closable) {\n <button\n class=\"toast-close\"\n (click)=\"closeToast(toast)\"\n aria-label=\"Close toast\"\n ></button>\n }\n </li>\n }\n</ul>\n", styles: [":host{position:fixed;right:0;bottom:0;overflow:hidden;z-index:9999}.toast-list{display:grid;grid-template-columns:1fr;gap:6px;list-style:none;padding:6px;margin:0}.toast-item{position:relative;animation:fadeIn .3s ease-in forwards}.toast-item.toast-closing{animation-name:fadeOut;animation-duration:var(--close-duration, .3s);animation-fill-mode:forwards;pointer-events:none}.toast-item:before{content:\"\";position:absolute;height:3px;width:100%;bottom:0;left:4px;right:0;animation:progress var(--duration, 7s) linear forwards;border-top-right-radius:4px;border-bottom-right-radius:4px}.toast-item.toast-information:before{background:var(--tds-information)}.toast-item.toast-success:before{background:var(--tds-positive)}.toast-item.toast-warning:before{background:var(--tds-warning)}.toast-item.toast-error:before{background:var(--tds-negative)}.toast-item .toast-close{height:20px;width:20px;box-sizing:border-box;cursor:pointer;position:absolute;top:14px;right:14px;border:0;background:transparent}.toast-item .toast-close:active{border:2px solid var(--tds-blue-400);outline-offset:-2px}@keyframes fadeIn{0%{transform:translateY(40%);opacity:0;margin-bottom:-25%}to{transform:translateY(0);opacity:1;margin-bottom:0%}}@keyframes fadeOut{0%{transform:translateY(0);opacity:1;margin-top:0}to{opacity:0;transform:translateY(75%);margin-top:-25%}}@keyframes progress{to{width:0%}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TegelModule }, { kind: "component", type: i1.TdsLink, selector: "tds-link", inputs: ["disabled", "standalone", "underline"] }, { kind: "component", type: i1.TdsToast, selector: "tds-toast", inputs: ["closable", "header", "hidden", "subheader", "tdsAriaLive", "tdsCloseAriaLabel", "toastId", "toastRole", "variant"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
29
|
+
}
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastComponent, decorators: [{
|
|
31
|
+
type: Component,
|
|
32
|
+
args: [{ selector: 'tds-ext-toast', imports: [CommonModule, TegelModule, RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ul class=\"toast-list\" aria-live=\"polite\" aria-atomic=\"true\">\n @for (toast of toastsSignal(); track toast.id) {\n <li\n class=\"toast-item\"\n [class]=\"'toast-' + toast.type\"\n [class.toast-closing]=\"toast.state === 'closing'\"\n [style.--duration.ms]=\"toast.duration\"\n [style.--close-duration.ms]=\"toast.closeDuration\"\n role=\"status\"\n >\n <tds-toast\n [variant]=\"toast.type\"\n [header]=\"toast.title\"\n [subheader]=\"toast.description\"\n [closable]=\"toast.closable\"\n tds-close-aria-label=\"Toast close button\"\n >\n @if (toast.link) {\n <tds-link slot=\"actions\">\n <a [routerLink]=\"toast.link\">\n {{ toast.linkText ?? 'Click here' }}\n </a>\n </tds-link>\n } @else if (toast.action) {\n <tds-link slot=\"actions\">\n <a href=\"#\" (click)=\"toast.action()\">\n {{ toast.linkText ?? 'Click here' }}\n </a>\n </tds-link>\n }\n </tds-toast>\n @if (toast.closable) {\n <button\n class=\"toast-close\"\n (click)=\"closeToast(toast)\"\n aria-label=\"Close toast\"\n ></button>\n }\n </li>\n }\n</ul>\n", styles: [":host{position:fixed;right:0;bottom:0;overflow:hidden;z-index:9999}.toast-list{display:grid;grid-template-columns:1fr;gap:6px;list-style:none;padding:6px;margin:0}.toast-item{position:relative;animation:fadeIn .3s ease-in forwards}.toast-item.toast-closing{animation-name:fadeOut;animation-duration:var(--close-duration, .3s);animation-fill-mode:forwards;pointer-events:none}.toast-item:before{content:\"\";position:absolute;height:3px;width:100%;bottom:0;left:4px;right:0;animation:progress var(--duration, 7s) linear forwards;border-top-right-radius:4px;border-bottom-right-radius:4px}.toast-item.toast-information:before{background:var(--tds-information)}.toast-item.toast-success:before{background:var(--tds-positive)}.toast-item.toast-warning:before{background:var(--tds-warning)}.toast-item.toast-error:before{background:var(--tds-negative)}.toast-item .toast-close{height:20px;width:20px;box-sizing:border-box;cursor:pointer;position:absolute;top:14px;right:14px;border:0;background:transparent}.toast-item .toast-close:active{border:2px solid var(--tds-blue-400);outline-offset:-2px}@keyframes fadeIn{0%{transform:translateY(40%);opacity:0;margin-bottom:-25%}to{transform:translateY(0);opacity:1;margin-bottom:0%}}@keyframes fadeOut{0%{transform:translateY(0);opacity:1;margin-top:0}to{opacity:0;transform:translateY(75%);margin-top:-25%}}@keyframes progress{to{width:0%}}\n"] }]
|
|
33
|
+
}] });
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi90b2FzdC90b2FzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL3RvYXN0L3RvYXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBRS9DOzs7OztHQUtHO0FBUUgsTUFBTSxPQUFPLGNBQWM7SUFDUixZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXJEOztPQUVHO0lBQ00sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO0lBRXZEOzs7OztPQUtHO0lBQ0gsVUFBVSxHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7d0dBZHRELGNBQWM7NEZBQWQsY0FBYyx5RUNyQjNCLDBxQ0F5Q0EsKzVDRHZCWSxZQUFZLDhCQUFFLFdBQVcsOFVBQUUsVUFBVTs7NEZBR3BDLGNBQWM7a0JBUDFCLFNBQVM7K0JBQ0UsZUFBZSxXQUdoQixDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLG1CQUMvQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUZWdlbE1vZHVsZSB9IGZyb20gJ0BzY2FuaWEvdGVnZWwtYW5ndWxhci0xNyc7XG5cbmltcG9ydCB7IFRvYXN0IH0gZnJvbSAnLi9tb2RlbHMvdG9hc3QubW9kZWwnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi90b2FzdC5zZXJ2aWNlJztcblxuLyoqXG4gKiBEaXNwbGF5cyB0b2FzdCBub3RpZmljYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBUb2FzdFNlcnZpY2UuXG4gKlxuICogVG9hc3RzIGFyZSBub24tYmxvY2tpbmcgbWVzc2FnZXMgdGhhdCBhdXRvbWF0aWNhbGx5IGRpc2FwcGVhciBhZnRlciBhIHNldCBkdXJhdGlvblxuICogb3IgY2FuIGJlIGRpc21pc3NlZCBtYW51YWxseSBieSB0aGUgdXNlci5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGRzLWV4dC10b2FzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90b2FzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RvYXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRlZ2VsTW9kdWxlLCBSb3V0ZXJMaW5rXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFRvYXN0Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0b2FzdFNlcnZpY2UgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcblxuICAvKipcbiAgICogQSByZWFjdGl2ZSBzaWduYWwgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgdG9hc3RzIChvcGVuIG9yIGNsb3NpbmcpLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9hc3RzU2lnbmFsID0gdGhpcy50b2FzdFNlcnZpY2UuYWN0aXZlVG9hc3RzO1xuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgdGhlIGNsb3NpbmcgcHJvY2VzcyBmb3IgdGhlIGdpdmVuIHRvYXN0LlxuICAgKlxuICAgKiBAcGFyYW0gdG9hc3QgVGhlIHRvYXN0IHRvIGJlIGNsb3NlZC5cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgY2xvc2VUb2FzdCA9ICh0b2FzdDogVG9hc3QpID0+IHRoaXMudG9hc3RTZXJ2aWNlLmNsb3NlKHRvYXN0LmlkKTtcbn1cbiIsIjx1bCBjbGFzcz1cInRvYXN0LWxpc3RcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWF0b21pYz1cInRydWVcIj5cbiAgQGZvciAodG9hc3Qgb2YgdG9hc3RzU2lnbmFsKCk7IHRyYWNrIHRvYXN0LmlkKSB7XG4gIDxsaVxuICAgIGNsYXNzPVwidG9hc3QtaXRlbVwiXG4gICAgW2NsYXNzXT1cIid0b2FzdC0nICsgdG9hc3QudHlwZVwiXG4gICAgW2NsYXNzLnRvYXN0LWNsb3NpbmddPVwidG9hc3Quc3RhdGUgPT09ICdjbG9zaW5nJ1wiXG4gICAgW3N0eWxlLi0tZHVyYXRpb24ubXNdPVwidG9hc3QuZHVyYXRpb25cIlxuICAgIFtzdHlsZS4tLWNsb3NlLWR1cmF0aW9uLm1zXT1cInRvYXN0LmNsb3NlRHVyYXRpb25cIlxuICAgIHJvbGU9XCJzdGF0dXNcIlxuICA+XG4gICAgPHRkcy10b2FzdFxuICAgICAgW3ZhcmlhbnRdPVwidG9hc3QudHlwZVwiXG4gICAgICBbaGVhZGVyXT1cInRvYXN0LnRpdGxlXCJcbiAgICAgIFtzdWJoZWFkZXJdPVwidG9hc3QuZGVzY3JpcHRpb25cIlxuICAgICAgW2Nsb3NhYmxlXT1cInRvYXN0LmNsb3NhYmxlXCJcbiAgICAgIHRkcy1jbG9zZS1hcmlhLWxhYmVsPVwiVG9hc3QgY2xvc2UgYnV0dG9uXCJcbiAgICA+XG4gICAgICBAaWYgKHRvYXN0LmxpbmspIHtcbiAgICAgIDx0ZHMtbGluayBzbG90PVwiYWN0aW9uc1wiPlxuICAgICAgICA8YSBbcm91dGVyTGlua109XCJ0b2FzdC5saW5rXCI+XG4gICAgICAgICAge3sgdG9hc3QubGlua1RleHQgPz8gJ0NsaWNrIGhlcmUnIH19XG4gICAgICAgIDwvYT5cbiAgICAgIDwvdGRzLWxpbms+XG4gICAgICB9IEBlbHNlIGlmICh0b2FzdC5hY3Rpb24pIHtcbiAgICAgIDx0ZHMtbGluayBzbG90PVwiYWN0aW9uc1wiPlxuICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJ0b2FzdC5hY3Rpb24oKVwiPlxuICAgICAgICAgIHt7IHRvYXN0LmxpbmtUZXh0ID8/ICdDbGljayBoZXJlJyB9fVxuICAgICAgICA8L2E+XG4gICAgICA8L3Rkcy1saW5rPlxuICAgICAgfVxuICAgIDwvdGRzLXRvYXN0PlxuICAgIEBpZiAodG9hc3QuY2xvc2FibGUpIHtcbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cInRvYXN0LWNsb3NlXCJcbiAgICAgIChjbGljayk9XCJjbG9zZVRvYXN0KHRvYXN0KVwiXG4gICAgICBhcmlhLWxhYmVsPVwiQ2xvc2UgdG9hc3RcIlxuICAgID48L2J1dHRvbj5cbiAgICB9XG4gIDwvbGk+XG4gIH1cbjwvdWw+XG4iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
export const TOAST_CONFIG = new InjectionToken('ToastConfig');
|
|
3
|
+
export const DEFAULT_TOAST_CONFIG = {
|
|
4
|
+
type: 'information',
|
|
5
|
+
title: 'Notification',
|
|
6
|
+
description: '',
|
|
7
|
+
duration: 7500,
|
|
8
|
+
closeDuration: 300,
|
|
9
|
+
closable: true,
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi90b2FzdC90b2FzdC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXdDL0MsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLElBQUksY0FBYyxDQUFjLGFBQWEsQ0FBQyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUEwQjtJQUN6RCxJQUFJLEVBQUUsYUFBYTtJQUNuQixLQUFLLEVBQUUsY0FBYztJQUNyQixXQUFXLEVBQUUsRUFBRTtJQUNmLFFBQVEsRUFBRSxJQUFJO0lBQ2QsYUFBYSxFQUFFLEdBQUc7SUFDbEIsUUFBUSxFQUFFLElBQUk7Q0FDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvYXN0VHlwZSB9IGZyb20gJy4vbW9kZWxzL3RvYXN0LXR5cGUnO1xuXG4vKipcbiAqIEdsb2JhbCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRvYXN0IGJlaGF2aW9yLlxuICogVXNlZCB3aGVuIGluZGl2aWR1YWwgdG9hc3QgcHJvcGVydGllcyBhcmUgbm90IGV4cGxpY2l0bHkgc2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvYXN0Q29uZmlnIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdG9hc3QgdHlwZSAoZS5nLiwgJ3N1Y2Nlc3MnLCAnaW5mb3JtYXRpb24nLCBldGMuKS5cbiAgICovXG4gIHR5cGU6IFRvYXN0VHlwZTtcblxuICAvKipcbiAgICogRGVmYXVsdCB0aXRsZSB0byB1c2Ugd2hlbiBub25lIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgdGl0bGU6IHN0cmluZztcblxuICAvKipcbiAgICogRGVmYXVsdCBkZXNjcmlwdGlvbiB0byB1c2Ugd2hlbiBub25lIGlzIHByb3ZpZGVkLlxuICAgKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogRGVmYXVsdCBkdXJhdGlvbiAobXMpIGJlZm9yZSBhdXRvLWRpc21pc3MuXG4gICAqIFVzZSBgMGAgZm9yIHBlcnNpc3RlbnQgdG9hc3RzLlxuICAgKi9cbiAgZHVyYXRpb246IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBkdXJhdGlvbiAobXMpIGZvciB0aGUgZmFkZS1vdXQgYW5pbWF0aW9uLlxuICAgKi9cbiAgY2xvc2VEdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvYXN0cyBhcmUgY2xvc2FibGUgYnkgZGVmYXVsdC5cbiAgICovXG4gIGNsb3NhYmxlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgVE9BU1RfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFRvYXN0Q29uZmlnPignVG9hc3RDb25maWcnKTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVE9BU1RfQ09ORklHOiBSZXF1aXJlZDxUb2FzdENvbmZpZz4gPSB7XG4gIHR5cGU6ICdpbmZvcm1hdGlvbicsXG4gIHRpdGxlOiAnTm90aWZpY2F0aW9uJyxcbiAgZGVzY3JpcHRpb246ICcnLFxuICBkdXJhdGlvbjogNzUwMCxcbiAgY2xvc2VEdXJhdGlvbjogMzAwLFxuICBjbG9zYWJsZTogdHJ1ZSxcbn07Il19
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { computed, inject, Injectable, signal } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { delay, filter, mergeMap, of, Subject, tap } from 'rxjs';
|
|
4
|
+
import { ToastState } from './models/toast-state.enum';
|
|
5
|
+
import { TOAST_TYPES } from './models/toast-type';
|
|
6
|
+
import { TOAST_CONFIG } from './toast.config';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
/**
|
|
9
|
+
* Service for creating, managing, and removing toast notifications.
|
|
10
|
+
* Supports automatic dismissal, manual control, and lifecycle hooks.
|
|
11
|
+
*/
|
|
12
|
+
export class ToastService {
|
|
13
|
+
config = inject(TOAST_CONFIG);
|
|
14
|
+
//*------------------------------------------------------------
|
|
15
|
+
//* Section: Internal variables
|
|
16
|
+
//*------------------------------------------------------------
|
|
17
|
+
/** Internal ID tracker for unique toast IDs */
|
|
18
|
+
id = 0;
|
|
19
|
+
/** Signal state holding all toasts */
|
|
20
|
+
_toasts = signal([]);
|
|
21
|
+
/** Public signal of all toasts */
|
|
22
|
+
toasts = this._toasts.asReadonly();
|
|
23
|
+
/** Signal of toasts that are not yet closed (open or closing) */
|
|
24
|
+
activeToasts = computed(() => this._toasts().filter((toast) => toast.state !== ToastState.Closed));
|
|
25
|
+
/** Internal stream for auto-closing toasts */
|
|
26
|
+
autoCloseSubject = new Subject();
|
|
27
|
+
/** Internal stream for fade-out/removal of toasts */
|
|
28
|
+
closeSubject = new Subject();
|
|
29
|
+
constructor() {
|
|
30
|
+
// Auto-close after toast.duration
|
|
31
|
+
this.autoCloseSubject
|
|
32
|
+
.pipe(takeUntilDestroyed(), filter((toast) => toast.duration > 0), mergeMap((toast) => of(toast).pipe(delay(toast.duration), filter(() => this.shouldAutoClose(toast.id)), tap(() => this.close(toast.id)))))
|
|
33
|
+
.subscribe();
|
|
34
|
+
// Remove after toast.closeDuration (fade-out)
|
|
35
|
+
this.closeSubject
|
|
36
|
+
.pipe(takeUntilDestroyed(), mergeMap((toast) => of(toast).pipe(delay(toast.closeDuration), filter(() => this.shouldRemove(toast.id)), tap(() => this.remove(toast.id)))))
|
|
37
|
+
.subscribe();
|
|
38
|
+
}
|
|
39
|
+
//*------------------------------------------------------------
|
|
40
|
+
//* Section: Public methods
|
|
41
|
+
//*------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Creates and adds a new toast.
|
|
44
|
+
* @param toastOptions Partial toast definition.
|
|
45
|
+
* @returns The toast's unique ID.
|
|
46
|
+
*/
|
|
47
|
+
create(toastOptions) {
|
|
48
|
+
const id = this.createId();
|
|
49
|
+
const toast = {
|
|
50
|
+
...this.config,
|
|
51
|
+
...toastOptions,
|
|
52
|
+
id,
|
|
53
|
+
state: ToastState.Open,
|
|
54
|
+
duration: this.normalizeDuration(toastOptions.duration, this.config.duration),
|
|
55
|
+
closeDuration: this.normalizeDuration(toastOptions.closeDuration, this.config.closeDuration),
|
|
56
|
+
};
|
|
57
|
+
this.addToast(toast);
|
|
58
|
+
toast.onCreated?.(toast);
|
|
59
|
+
// Schedule auto-close if duration > 0
|
|
60
|
+
if (toast.duration > 0) {
|
|
61
|
+
this.autoCloseSubject.next(toast);
|
|
62
|
+
}
|
|
63
|
+
return id;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Initiates the fade-out transition for a toast.
|
|
67
|
+
* @param id The toast ID.
|
|
68
|
+
*/
|
|
69
|
+
close(id) {
|
|
70
|
+
let toast = this.getToast(id);
|
|
71
|
+
if (!toast || toast.state !== ToastState.Open)
|
|
72
|
+
return;
|
|
73
|
+
toast = this.updateToastState(toast.id, ToastState.Closing);
|
|
74
|
+
toast?.onClose?.(toast);
|
|
75
|
+
// Schedule removal after close duration
|
|
76
|
+
if (toast)
|
|
77
|
+
this.closeSubject.next(toast);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Immediately marks a toast as closed and removes it from display.
|
|
81
|
+
* @param id The toast ID.
|
|
82
|
+
*/
|
|
83
|
+
remove(id) {
|
|
84
|
+
const toast = this.updateToastState(id, ToastState.Closed);
|
|
85
|
+
toast?.onRemoved?.(toast);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Closes and removes all toasts immediately without fade-out.
|
|
89
|
+
*/
|
|
90
|
+
removeAll() {
|
|
91
|
+
const closedToasts = [];
|
|
92
|
+
this._toasts.update((toasts) => toasts.map((toast) => {
|
|
93
|
+
if (toast.state !== ToastState.Closed) {
|
|
94
|
+
const updated = { ...toast, state: ToastState.Closed };
|
|
95
|
+
closedToasts.push(updated);
|
|
96
|
+
return updated;
|
|
97
|
+
}
|
|
98
|
+
return toast;
|
|
99
|
+
}));
|
|
100
|
+
closedToasts.forEach((toast) => toast.onRemoved?.(toast));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Initiates closing process for all open toasts.
|
|
104
|
+
*/
|
|
105
|
+
closeAll() {
|
|
106
|
+
const openToasts = this.toasts().filter((toast) => toast.state === ToastState.Open);
|
|
107
|
+
openToasts.forEach((toast) => this.close(toast.id));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Gets a toast by ID.
|
|
111
|
+
* @param id The toast ID.
|
|
112
|
+
* @returns The toast instance or undefined.
|
|
113
|
+
*/
|
|
114
|
+
getToast(id) {
|
|
115
|
+
return this._toasts().find((toast) => toast.id === id);
|
|
116
|
+
}
|
|
117
|
+
//*------------------------------------------------------------
|
|
118
|
+
//* Section: Internal methods
|
|
119
|
+
//*------------------------------------------------------------
|
|
120
|
+
/** Whether the toast is eligible for auto-closing */
|
|
121
|
+
shouldAutoClose(id) {
|
|
122
|
+
const currentToast = this.getToast(id);
|
|
123
|
+
return currentToast?.state === ToastState.Open;
|
|
124
|
+
}
|
|
125
|
+
/** Whether the toast is eligible for final removal */
|
|
126
|
+
shouldRemove(id) {
|
|
127
|
+
const currentToast = this.getToast(id);
|
|
128
|
+
return currentToast?.state === ToastState.Closing;
|
|
129
|
+
}
|
|
130
|
+
/** Add toast to signal list */
|
|
131
|
+
addToast(toast) {
|
|
132
|
+
this._toasts.update((prev) => [...prev, toast]);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Updates the state of a toast.
|
|
136
|
+
* @param id Toast ID
|
|
137
|
+
* @param state New state
|
|
138
|
+
* @returns The updated toast or undefined
|
|
139
|
+
*/
|
|
140
|
+
updateToastState(id, state) {
|
|
141
|
+
let updatedToast;
|
|
142
|
+
this._toasts.update((prev) => prev.map((toast) => {
|
|
143
|
+
if (toast.id === id) {
|
|
144
|
+
updatedToast = { ...toast, state };
|
|
145
|
+
return updatedToast;
|
|
146
|
+
}
|
|
147
|
+
return toast;
|
|
148
|
+
}));
|
|
149
|
+
return updatedToast;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Creates a unique id
|
|
153
|
+
* @returns New id
|
|
154
|
+
*/
|
|
155
|
+
createId() {
|
|
156
|
+
return ++this.id;
|
|
157
|
+
}
|
|
158
|
+
//*------------------------------------------------------------
|
|
159
|
+
//* Section: Public convenience methods
|
|
160
|
+
//*------------------------------------------------------------
|
|
161
|
+
/**
|
|
162
|
+
* Creates a success toast.
|
|
163
|
+
* @param props Toast props without type.
|
|
164
|
+
*/
|
|
165
|
+
success = (props = {}) => this.create({ ...props, type: 'success' });
|
|
166
|
+
/**
|
|
167
|
+
* Creates an error toast.
|
|
168
|
+
* @param props Toast props without type.
|
|
169
|
+
*/
|
|
170
|
+
error = (props = {}) => this.create({ ...props, type: 'error' });
|
|
171
|
+
/**
|
|
172
|
+
* Creates a warning toast.
|
|
173
|
+
* @param props Toast props without type.
|
|
174
|
+
*/
|
|
175
|
+
warning = (props = {}) => this.create({ ...props, type: 'warning' });
|
|
176
|
+
/**
|
|
177
|
+
* Creates an informational toast.
|
|
178
|
+
* @param props Toast props without type.
|
|
179
|
+
*/
|
|
180
|
+
info = (props = {}) => this.create({ ...props, type: 'information' });
|
|
181
|
+
/**
|
|
182
|
+
* Creates a random toast for testing/demo purposes.
|
|
183
|
+
* @param props Optional overrides
|
|
184
|
+
*/
|
|
185
|
+
createRandomToast = (props = {}) => this.create({
|
|
186
|
+
type: TOAST_TYPES[~~(Math.random() * 4)],
|
|
187
|
+
title: `Random Toast ${Math.random().toString(36).substring(7)}`,
|
|
188
|
+
...props,
|
|
189
|
+
});
|
|
190
|
+
//*------------------------------------------------------------
|
|
191
|
+
//* Section: Helper methods
|
|
192
|
+
//*------------------------------------------------------------
|
|
193
|
+
normalizeDuration(value, fallback) {
|
|
194
|
+
const num = typeof value === 'number' ? value : fallback;
|
|
195
|
+
return !Number.isFinite(num) || num < 0 ? 0 : num;
|
|
196
|
+
}
|
|
197
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
198
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastService, providedIn: 'root' });
|
|
199
|
+
}
|
|
200
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.13", ngImport: i0, type: ToastService, decorators: [{
|
|
201
|
+
type: Injectable,
|
|
202
|
+
args: [{
|
|
203
|
+
providedIn: 'root',
|
|
204
|
+
}]
|
|
205
|
+
}], ctorParameters: () => [] });
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvdG9hc3QvdG9hc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWxELE9BQU8sRUFBRSxZQUFZLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFM0Q7OztHQUdHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFDTixNQUFNLEdBQUcsTUFBTSxDQUFjLFlBQVksQ0FBQyxDQUFDO0lBRTVELCtEQUErRDtJQUMvRCwrQkFBK0I7SUFDL0IsK0RBQStEO0lBRS9ELCtDQUErQztJQUN2QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRWYsc0NBQXNDO0lBQ3JCLE9BQU8sR0FBRyxNQUFNLENBQVUsRUFBRSxDQUFDLENBQUM7SUFFL0Msa0NBQWtDO0lBQ3pCLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRTVDLGlFQUFpRTtJQUN4RCxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUNwQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMs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LEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBRWpEOzs7T0FHRztJQUNNLGlCQUFpQixHQUFHLENBQUMsUUFBK0IsRUFBRSxFQUFFLEVBQUUsQ0FDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNWLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLEtBQUssRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDaEUsR0FBRyxLQUFLO0tBQ1QsQ0FBQyxDQUFDO0lBRUwsK0RBQStEO0lBQy9ELDJCQUEyQjtJQUMzQiwrREFBK0Q7SUFDdkQsaUJBQWlCLENBQUMsS0FBYyxFQUFFLFFBQWdCO1FBQ3hELE1BQU0sR0FBRyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDekQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDcEQsQ0FBQzt3R0FsUVUsWUFBWTs0R0FBWixZQUFZLGNBRlgsTUFBTTs7NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wdXRlZCwgaW5qZWN0LCBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGRlbGF5LCBmaWx0ZXIsIG1lcmdlTWFwLCBvZiwgU3ViamVjdCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUb2FzdFN0YXRlIH0gZnJvbSAnLi9tb2RlbHMvdG9hc3Qtc3RhdGUuZW51bSc7XG5pbXBvcnQgeyBUT0FTVF9UWVBFUyB9IGZyb20gJy4vbW9kZWxzL3RvYXN0LXR5cGUnO1xuaW1wb3J0IHsgVG9hc3QsIFRvYXN0T3B0aW9ucyB9IGZyb20gJy4vbW9kZWxzL3RvYXN0Lm1vZGVsJztcbmltcG9ydCB7IFRPQVNUX0NPTkZJRywgVG9hc3RDb25maWcgfSBmcm9tICcuL3RvYXN0LmNvbmZpZyc7XG5cbi8qKlxuICogU2VydmljZSBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgcmVtb3ZpbmcgdG9hc3Qgbm90aWZpY2F0aW9ucy5cbiAqIFN1cHBvcnRzIGF1dG9tYXRpYyBkaXNtaXNzYWwsIG1hbnVhbCBjb250cm9sLCBhbmQgbGlmZWN5Y2xlIGhvb2tzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVG9hc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWcgPSBpbmplY3Q8VG9hc3RDb25maWc+KFRPQVNUX0NPTkZJRyk7XG5cbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vKiBTZWN0aW9uOiBJbnRlcm5hbCB2YXJpYWJsZXNcbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIEludGVybmFsIElEIHRyYWNrZXIgZm9yIHVuaXF1ZSB0b2FzdCBJRHMgKi9cbiAgcHJpdmF0ZSBpZCA9IDA7XG5cbiAgLyoqIFNpZ25hbCBzdGF0ZSBob2xkaW5nIGFsbCB0b2FzdHMgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdG9hc3RzID0gc2lnbmFsPFRvYXN0W10+KFtdKTtcblxuICAvKiogUHVibGljIHNpZ25hbCBvZiBhbGwgdG9hc3RzICovXG4gIHJlYWRvbmx5IHRvYXN0cyA9IHRoaXMuX3RvYXN0cy5hc1JlYWRvbmx5KCk7XG5cbiAgLyoqIFNpZ25hbCBvZiB0b2FzdHMgdGhhdCBhcmUgbm90IHlldCBjbG9zZWQgKG9wZW4gb3IgY2xvc2luZykgKi9cbiAgcmVhZG9ubHkgYWN0aXZlVG9hc3RzID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLl90b2FzdHMoKS5maWx0ZXIoKHRvYXN0KSA9PiB0b2FzdC5zdGF0ZSAhPT0gVG9hc3RTdGF0ZS5DbG9zZWQpXG4gICk7XG5cbiAgLyoqIEludGVybmFsIHN0cmVhbSBmb3IgYXV0by1jbG9zaW5nIHRvYXN0cyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9DbG9zZVN1YmplY3QgPSBuZXcgU3ViamVjdDxUb2FzdD4oKTtcblxuICAvKiogSW50ZXJuYWwgc3RyZWFtIGZvciBmYWRlLW91dC9yZW1vdmFsIG9mIHRvYXN0cyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlU3ViamVjdCA9IG5ldyBTdWJqZWN0PFRvYXN0PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEF1dG8tY2xvc2UgYWZ0ZXIgdG9hc3QuZHVyYXRpb25cbiAgICB0aGlzLmF1dG9DbG9zZVN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgICAgZmlsdGVyKCh0b2FzdCkgPT4gdG9hc3QuZHVyYXRpb24gPiAwKSxcbiAgICAgICAgbWVyZ2VNYXAoKHRvYXN0OiBUb2FzdCkgPT5cbiAgICAgICAgICBvZih0b2FzdCkucGlwZShcbiAgICAgICAgICAgIGRlbGF5KHRvYXN0LmR1cmF0aW9uKSxcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLnNob3VsZEF1dG9DbG9zZSh0b2FzdC5pZCkpLFxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMuY2xvc2UodG9hc3QuaWQpKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgLy8gUmVtb3ZlIGFmdGVyIHRvYXN0LmNsb3NlRHVyYXRpb24gKGZhZGUtb3V0KVxuICAgIHRoaXMuY2xvc2VTdWJqZWN0XG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgIG1lcmdlTWFwKCh0b2FzdDogVG9hc3QpID0+XG4gICAgICAgICAgb2YodG9hc3QpLnBpcGUoXG4gICAgICAgICAgICBkZWxheSh0b2FzdC5jbG9zZUR1cmF0aW9uKSxcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLnNob3VsZFJlbW92ZSh0b2FzdC5pZCkpLFxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMucmVtb3ZlKHRvYXN0LmlkKSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyogU2VjdGlvbjogUHVibGljIG1ldGhvZHNcbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIGFkZHMgYSBuZXcgdG9hc3QuXG4gICAqIEBwYXJhbSB0b2FzdE9wdGlvbnMgUGFydGlhbCB0b2FzdCBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgdG9hc3QncyB1bmlxdWUgSUQuXG4gICAqL1xuICBjcmVhdGUodG9hc3RPcHRpb25zOiBQYXJ0aWFsPFRvYXN0T3B0aW9ucz4pOiBudW1iZXIge1xuICAgIGNvbnN0IGlkID0gdGhpcy5jcmVhdGVJZCgpO1xuICAgIGNvbnN0IHRvYXN0OiBUb2FzdCA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgLi4udG9hc3RPcHRpb25zLFxuICAgICAgaWQsXG4gICAgICBzdGF0ZTogVG9hc3RTdGF0ZS5PcGVuLFxuICAgICAgZHVyYXRpb246IHRoaXMubm9ybWFsaXplRHVyYXRpb24oXG4gICAgICAgIHRvYXN0T3B0aW9ucy5kdXJhdGlvbixcbiAgICAgICAgdGhpcy5jb25maWcuZHVyYXRpb25cbiAgICAgICksXG4gICAgICBjbG9zZUR1cmF0aW9uOiB0aGlzLm5vcm1hbGl6ZUR1cmF0aW9uKFxuICAgICAgICB0b2FzdE9wdGlvbnMuY2xvc2VEdXJhdGlvbixcbiAgICAgICAgdGhpcy5jb25maWcuY2xvc2VEdXJhdGlvblxuICAgICAgKSxcbiAgICB9O1xuXG4gICAgdGhpcy5hZGRUb2FzdCh0b2FzdCk7XG4gICAgdG9hc3Qub25DcmVhdGVkPy4odG9hc3QpO1xuXG4gICAgLy8gU2NoZWR1bGUgYXV0by1jbG9zZSBpZiBkdXJhdGlvbiA+IDBcbiAgICBpZiAodG9hc3QuZHVyYXRpb24gPiAwKSB7XG4gICAgICB0aGlzLmF1dG9DbG9zZVN1YmplY3QubmV4dCh0b2FzdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyB0aGUgZmFkZS1vdXQgdHJhbnNpdGlvbiBmb3IgYSB0b2FzdC5cbiAgICogQHBhcmFtIGlkIFRoZSB0b2FzdCBJRC5cbiAgICovXG4gIGNsb3NlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgdG9hc3QgPSB0aGlzLmdldFRvYXN0KGlkKTtcbiAgICBpZiAoIXRvYXN0IHx8IHRvYXN0LnN0YXRlICE9PSBUb2FzdFN0YXRlLk9wZW4pIHJldHVybjtcblxuICAgIHRvYXN0ID0gdGhpcy51cGRhdGVUb2FzdFN0YXRlKHRvYXN0LmlkLCBUb2FzdFN0YXRlLkNsb3NpbmcpO1xuICAgIHRvYXN0Py5vbkNsb3NlPy4odG9hc3QpO1xuXG4gICAgLy8gU2NoZWR1bGUgcmVtb3ZhbCBhZnRlciBjbG9zZSBkdXJhdGlvblxuICAgIGlmICh0b2FzdCkgdGhpcy5jbG9zZVN1YmplY3QubmV4dCh0b2FzdCk7XG4gIH1cblxuICAvKipcbiAgICogSW1tZWRpYXRlbHkgbWFya3MgYSB0b2FzdCBhcyBjbG9zZWQgYW5kIHJlbW92ZXMgaXQgZnJvbSBkaXNwbGF5LlxuICAgKiBAcGFyYW0gaWQgVGhlIHRvYXN0IElELlxuICAgKi9cbiAgcmVtb3ZlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0b2FzdCA9IHRoaXMudXBkYXRlVG9hc3RTdGF0ZShpZCwgVG9hc3RTdGF0ZS5DbG9zZWQpO1xuICAgIHRvYXN0Py5vblJlbW92ZWQ/Lih0b2FzdCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFuZCByZW1vdmVzIGFsbCB0b2FzdHMgaW1tZWRpYXRlbHkgd2l0aG91dCBmYWRlLW91dC5cbiAgICovXG4gIHJlbW92ZUFsbCgpOiB2b2lkIHtcbiAgICBjb25zdCBjbG9zZWRUb2FzdHM6IFRvYXN0W10gPSBbXTtcblxuICAgIHRoaXMuX3RvYXN0cy51cGRhdGUoKHRvYXN0cykgPT5cbiAgICAgIHRvYXN0cy5tYXAoKHRvYXN0KSA9PiB7XG4gICAgICAgIGlmICh0b2FzdC5zdGF0ZSAhPT0gVG9hc3RTdGF0ZS5DbG9zZWQpIHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0geyAuLi50b2FzdCwgc3RhdGU6IFRvYXN0U3RhdGUuQ2xvc2VkIH07XG4gICAgICAgICAgY2xvc2VkVG9hc3RzLnB1c2godXBkYXRlZCk7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvYXN0O1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgY2xvc2VkVG9hc3RzLmZvckVhY2goKHRvYXN0KSA9PiB0b2FzdC5vblJlbW92ZWQ/Lih0b2FzdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyBjbG9zaW5nIHByb2Nlc3MgZm9yIGFsbCBvcGVuIHRvYXN0cy5cbiAgICovXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIGNvbnN0IG9wZW5Ub2FzdHMgPSB0aGlzLnRvYXN0cygpLmZpbHRlcihcbiAgICAgICh0b2FzdCkgPT4gdG9hc3Quc3RhdGUgPT09IFRvYXN0U3RhdGUuT3BlblxuICAgICk7XG4gICAgb3BlblRvYXN0cy5mb3JFYWNoKCh0b2FzdCkgPT4gdGhpcy5jbG9zZSh0b2FzdC5pZCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB0b2FzdCBieSBJRC5cbiAgICogQHBhcmFtIGlkIFRoZSB0b2FzdCBJRC5cbiAgICogQHJldHVybnMgVGhlIHRvYXN0IGluc3RhbmNlIG9yIHVuZGVmaW5lZC5cbiAgICovXG4gIGdldFRvYXN0KGlkOiBudW1iZXIpOiBUb2FzdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RvYXN0cygpLmZpbmQoKHRvYXN0KSA9PiB0b2FzdC5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vKiBTZWN0aW9uOiBJbnRlcm5hbCBtZXRob2RzXG4gIC8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB0b2FzdCBpcyBlbGlnaWJsZSBmb3IgYXV0by1jbG9zaW5nICovXG4gIHByaXZhdGUgc2hvdWxkQXV0b0Nsb3NlKGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50VG9hc3QgPSB0aGlzLmdldFRvYXN0KGlkKTtcbiAgICByZXR1cm4gY3VycmVudFRvYXN0Py5zdGF0ZSA9PT0gVG9hc3RTdGF0ZS5PcGVuO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHRvYXN0IGlzIGVsaWdpYmxlIGZvciBmaW5hbCByZW1vdmFsICovXG4gIHByaXZhdGUgc2hvdWxkUmVtb3ZlKGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50VG9hc3QgPSB0aGlzLmdldFRvYXN0KGlkKTtcbiAgICByZXR1cm4gY3VycmVudFRvYXN0Py5zdGF0ZSA9PT0gVG9hc3RTdGF0ZS5DbG9zaW5nO1xuICB9XG5cbiAgLyoqIEFkZCB0b2FzdCB0byBzaWduYWwgbGlzdCAqL1xuICBwcml2YXRlIGFkZFRvYXN0KHRvYXN0OiBUb2FzdCk6IHZvaWQge1xuICAgIHRoaXMuX3RvYXN0cy51cGRhdGUoKHByZXYpID0+IFsuLi5wcmV2LCB0b2FzdF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIGEgdG9hc3QuXG4gICAqIEBwYXJhbSBpZCBUb2FzdCBJRFxuICAgKiBAcGFyYW0gc3RhdGUgTmV3IHN0YXRlXG4gICAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIHRvYXN0IG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUb2FzdFN0YXRlKGlkOiBudW1iZXIsIHN0YXRlOiBUb2FzdFN0YXRlKTogVG9hc3QgfCB1bmRlZmluZWQge1xuICAgIGxldCB1cGRhdGVkVG9hc3Q6IFRvYXN0IHwgdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5fdG9hc3RzLnVwZGF0ZSgocHJldikgPT5cbiAgICAgIHByZXYubWFwKCh0b2FzdCkgPT4ge1xuICAgICAgICBpZiAodG9hc3QuaWQgPT09IGlkKSB7XG4gICAgICAgICAgdXBkYXRlZFRvYXN0ID0geyAuLi50b2FzdCwgc3RhdGUgfTtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlZFRvYXN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2FzdDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiB1cGRhdGVkVG9hc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHVuaXF1ZSBpZFxuICAgKiBAcmV0dXJucyBOZXcgaWRcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKyt0aGlzLmlkO1xuICB9XG5cbiAgLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vKiBTZWN0aW9uOiBQdWJsaWMgY29udmVuaWVuY2UgbWV0aG9kc1xuICAvLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN1Y2Nlc3MgdG9hc3QuXG4gICAqIEBwYXJhbSBwcm9wcyBUb2FzdCBwcm9wcyB3aXRob3V0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSBzdWNjZXNzID0gKHByb3BzOiBQYXJ0aWFsPE9taXQ8VG9hc3RPcHRpb25zLCAndHlwZSc+PiA9IHt9KSA9PlxuICAgIHRoaXMuY3JlYXRlKHsgLi4ucHJvcHMsIHR5cGU6ICdzdWNjZXNzJyB9KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlcnJvciB0b2FzdC5cbiAgICogQHBhcmFtIHByb3BzIFRvYXN0IHByb3BzIHdpdGhvdXQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yID0gKHByb3BzOiBQYXJ0aWFsPE9taXQ8VG9hc3RPcHRpb25zLCAndHlwZSc+PiA9IHt9KSA9PlxuICAgIHRoaXMuY3JlYXRlKHsgLi4ucHJvcHMsIHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB3YXJuaW5nIHRvYXN0LlxuICAgKiBAcGFyYW0gcHJvcHMgVG9hc3QgcHJvcHMgd2l0aG91dCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgd2FybmluZyA9IChwcm9wczogUGFydGlhbDxPbWl0PFRvYXN0T3B0aW9ucywgJ3R5cGUnPj4gPSB7fSkgPT5cbiAgICB0aGlzLmNyZWF0ZSh7IC4uLnByb3BzLCB0eXBlOiAnd2FybmluZycgfSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5mb3JtYXRpb25hbCB0b2FzdC5cbiAgICogQHBhcmFtIHByb3BzIFRvYXN0IHByb3BzIHdpdGhvdXQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IGluZm8gPSAocHJvcHM6IFBhcnRpYWw8T21pdDxUb2FzdE9wdGlvbnMsICd0eXBlJz4+ID0ge30pID0+XG4gICAgdGhpcy5jcmVhdGUoeyAuLi5wcm9wcywgdHlwZTogJ2luZm9ybWF0aW9uJyB9KTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJhbmRvbSB0b2FzdCBmb3IgdGVzdGluZy9kZW1vIHB1cnBvc2VzLlxuICAgKiBAcGFyYW0gcHJvcHMgT3B0aW9uYWwgb3ZlcnJpZGVzXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVSYW5kb21Ub2FzdCA9IChwcm9wczogUGFydGlhbDxUb2FzdE9wdGlvbnM+ID0ge30pID0+XG4gICAgdGhpcy5jcmVhdGUoe1xuICAgICAgdHlwZTogVE9BU1RfVFlQRVNbfn4oTWF0aC5yYW5kb20oKSAqIDQpXSxcbiAgICAgIHRpdGxlOiBgUmFuZG9tIFRvYXN0ICR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpfWAsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcblxuICAvLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8qIFNlY3Rpb246IEhlbHBlciBtZXRob2RzXG4gIC8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBwcml2YXRlIG5vcm1hbGl6ZUR1cmF0aW9uKHZhbHVlOiB1bmtub3duLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBudW0gPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiBmYWxsYmFjaztcbiAgICByZXR1cm4gIU51bWJlci5pc0Zpbml0ZShudW0pIHx8IG51bSA8IDAgPyAwIDogbnVtO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ApplicationRef, EnvironmentInjector, createComponent, inject, } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* Internal map to track which global components have been bootstrapped.
|
|
4
|
+
*/
|
|
5
|
+
const bootstrappedComponents = new WeakMap();
|
|
6
|
+
/**
|
|
7
|
+
* Bootstraps a global Angular component directly into the <body> element.
|
|
8
|
+
* Useful for toasts, modals, and other global overlays.
|
|
9
|
+
*
|
|
10
|
+
* @param component - The component class to bootstrap.
|
|
11
|
+
* @param options - Optional settings like preventing duplicates.
|
|
12
|
+
* @returns The created ComponentRef.
|
|
13
|
+
*/
|
|
14
|
+
export function bootstrapGlobalComponent(component, options) {
|
|
15
|
+
const appRef = inject(ApplicationRef);
|
|
16
|
+
const injector = inject(EnvironmentInjector);
|
|
17
|
+
const existing = bootstrappedComponents.get(component);
|
|
18
|
+
if (existing && options?.reuseIfExists) {
|
|
19
|
+
return existing;
|
|
20
|
+
}
|
|
21
|
+
const cmpRef = createComponent(component, {
|
|
22
|
+
environmentInjector: injector,
|
|
23
|
+
});
|
|
24
|
+
appRef.attachView(cmpRef.hostView);
|
|
25
|
+
const viewRef = cmpRef.hostView;
|
|
26
|
+
const element = viewRef.rootNodes[0];
|
|
27
|
+
document.body.appendChild(element);
|
|
28
|
+
bootstrappedComponents.set(component, cmpRef);
|
|
29
|
+
return cmpRef;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Destroys a previously bootstrapped global component.
|
|
33
|
+
*
|
|
34
|
+
* @param component - The component class to remove from DOM.
|
|
35
|
+
*/
|
|
36
|
+
export function destroyGlobalComponent(component) {
|
|
37
|
+
const cmpRef = bootstrappedComponents.get(component);
|
|
38
|
+
if (cmpRef) {
|
|
39
|
+
cmpRef.destroy();
|
|
40
|
+
bootstrappedComponents.delete(component);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLWdsb2JhbC1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL3V0aWxzL2Jvb3RzdHJhcC1nbG9iYWwtY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxjQUFjLEVBR2QsbUJBQW1CLEVBRW5CLGVBQWUsRUFDZixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkI7O0dBRUc7QUFDSCxNQUFNLHNCQUFzQixHQUFHLElBQUksT0FBTyxFQUd2QyxDQUFDO0FBU0o7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsU0FBa0IsRUFDbEIsT0FBeUM7SUFFekMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN2RCxJQUFJLFFBQVEsSUFBSSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDdkMsT0FBTyxRQUEyQixDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsU0FBUyxFQUFFO1FBQ3hDLG1CQUFtQixFQUFFLFFBQVE7S0FDOUIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFbkMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQW9DLENBQUM7SUFDNUQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQWdCLENBQUM7SUFFcEQsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFbkMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUU5QyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBSSxTQUFrQjtJQUMxRCxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckQsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixzQkFBc0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFwcGxpY2F0aW9uUmVmLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBFbWJlZGRlZFZpZXdSZWYsXG4gICAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICBUeXBlLFxuICAgIGNyZWF0ZUNvbXBvbmVudCxcbiAgICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIEludGVybmFsIG1hcCB0byB0cmFjayB3aGljaCBnbG9iYWwgY29tcG9uZW50cyBoYXZlIGJlZW4gYm9vdHN0cmFwcGVkLlxuICovXG5jb25zdCBib290c3RyYXBwZWRDb21wb25lbnRzID0gbmV3IFdlYWtNYXA8XG4gIFR5cGU8dW5rbm93bj4sXG4gIENvbXBvbmVudFJlZjx1bmtub3duPlxuPigpO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwR2xvYmFsQ29tcG9uZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCBhdm9pZHMgcmUtY3JlYXRpbmcgdGhlIGNvbXBvbmVudCBpZiBpdCdzIGFscmVhZHkgbW91bnRlZC5cbiAgICovXG4gIHJldXNlSWZFeGlzdHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJvb3RzdHJhcHMgYSBnbG9iYWwgQW5ndWxhciBjb21wb25lbnQgZGlyZWN0bHkgaW50byB0aGUgPGJvZHk+IGVsZW1lbnQuXG4gKiBVc2VmdWwgZm9yIHRvYXN0cywgbW9kYWxzLCBhbmQgb3RoZXIgZ2xvYmFsIG92ZXJsYXlzLlxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGNsYXNzIHRvIGJvb3RzdHJhcC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgbGlrZSBwcmV2ZW50aW5nIGR1cGxpY2F0ZXMuXG4gKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBDb21wb25lbnRSZWYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXBHbG9iYWxDb21wb25lbnQ8VD4oXG4gIGNvbXBvbmVudDogVHlwZTxUPixcbiAgb3B0aW9ucz86IEJvb3RzdHJhcEdsb2JhbENvbXBvbmVudE9wdGlvbnNcbik6IENvbXBvbmVudFJlZjxUPiB7XG4gIGNvbnN0IGFwcFJlZiA9IGluamVjdChBcHBsaWNhdGlvblJlZik7XG4gIGNvbnN0IGluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xuXG4gIGNvbnN0IGV4aXN0aW5nID0gYm9vdHN0cmFwcGVkQ29tcG9uZW50cy5nZXQoY29tcG9uZW50KTtcbiAgaWYgKGV4aXN0aW5nICYmIG9wdGlvbnM/LnJldXNlSWZFeGlzdHMpIHtcbiAgICByZXR1cm4gZXhpc3RpbmcgYXMgQ29tcG9uZW50UmVmPFQ+O1xuICB9XG5cbiAgY29uc3QgY21wUmVmID0gY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCwge1xuICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGluamVjdG9yLFxuICB9KTtcblxuICBhcHBSZWYuYXR0YWNoVmlldyhjbXBSZWYuaG9zdFZpZXcpO1xuXG4gIGNvbnN0IHZpZXdSZWYgPSBjbXBSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuICBjb25zdCBlbGVtZW50ID0gdmlld1JlZi5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG5cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVtZW50KTtcblxuICBib290c3RyYXBwZWRDb21wb25lbnRzLnNldChjb21wb25lbnQsIGNtcFJlZik7XG5cbiAgcmV0dXJuIGNtcFJlZjtcbn1cblxuLyoqXG4gKiBEZXN0cm95cyBhIHByZXZpb3VzbHkgYm9vdHN0cmFwcGVkIGdsb2JhbCBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgY2xhc3MgdG8gcmVtb3ZlIGZyb20gRE9NLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzdHJveUdsb2JhbENvbXBvbmVudDxUPihjb21wb25lbnQ6IFR5cGU8VD4pOiB2b2lkIHtcbiAgY29uc3QgY21wUmVmID0gYm9vdHN0cmFwcGVkQ29tcG9uZW50cy5nZXQoY29tcG9uZW50KTtcbiAgaWYgKGNtcFJlZikge1xuICAgIGNtcFJlZi5kZXN0cm95KCk7XG4gICAgYm9vdHN0cmFwcGVkQ29tcG9uZW50cy5kZWxldGUoY29tcG9uZW50KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbmlhLW5sLXRlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9zY2FuaWEtbmwtdGVnZWwtYW5ndWxhci1leHRlbnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents the current lifecycle state of a toast.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ToastState {
|
|
5
|
+
/**
|
|
6
|
+
* The toast is fully visible and active.
|
|
7
|
+
*/
|
|
8
|
+
Open = "open",
|
|
9
|
+
/**
|
|
10
|
+
* The toast is transitioning out (e.g., fading out).
|
|
11
|
+
*/
|
|
12
|
+
Closing = "closing",
|
|
13
|
+
/**
|
|
14
|
+
* The toast is fully removed or dismissed.
|
|
15
|
+
*/
|
|
16
|
+
Closed = "closed"
|
|
17
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List of available toast types (inherited from Tegel)
|
|
3
|
+
*/
|
|
4
|
+
export declare const TOAST_TYPES: readonly ["success", "information", "warning", "error"];
|
|
5
|
+
/**
|
|
6
|
+
* Type representing valid toast type values.
|
|
7
|
+
*/
|
|
8
|
+
export type ToastType = (typeof TOAST_TYPES)[number];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ToastState } from './toast-state.enum';
|
|
2
|
+
import { ToastType } from './toast-type';
|
|
3
|
+
/**
|
|
4
|
+
* Defines the base structure for a toast message.
|
|
5
|
+
*/
|
|
6
|
+
export interface ToastOptions {
|
|
7
|
+
/**
|
|
8
|
+
* The visual style of the toast (e.g., success, error).
|
|
9
|
+
*/
|
|
10
|
+
type: ToastType;
|
|
11
|
+
/**
|
|
12
|
+
* The main title text displayed in the toast.
|
|
13
|
+
*/
|
|
14
|
+
title: string;
|
|
15
|
+
/**
|
|
16
|
+
* Optional description text providing additional context.
|
|
17
|
+
*/
|
|
18
|
+
description?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Duration in milliseconds before the toast auto-dismisses.
|
|
21
|
+
* Use `0` for persistent toasts.
|
|
22
|
+
*/
|
|
23
|
+
duration: number;
|
|
24
|
+
/**
|
|
25
|
+
* Duration in milliseconds for the fade-out transition.
|
|
26
|
+
*/
|
|
27
|
+
closeDuration: number;
|
|
28
|
+
/**
|
|
29
|
+
* Whether the toast can be manually closed by the user.
|
|
30
|
+
*/
|
|
31
|
+
closable?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Optional router link to navigate to when the toast is clicked.
|
|
34
|
+
*/
|
|
35
|
+
link?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Custom link text shown if a link is provided.
|
|
38
|
+
*/
|
|
39
|
+
linkText?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Optional callback triggered when the linkText is clicked.
|
|
42
|
+
* Used as an alternative to `link` for invoking custom behavior.
|
|
43
|
+
*/
|
|
44
|
+
action?: () => void;
|
|
45
|
+
/**
|
|
46
|
+
* Optional callback triggered when the toast is created.
|
|
47
|
+
* @param toast The created toast instance.
|
|
48
|
+
*/
|
|
49
|
+
onCreated?: (toast: Toast) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Optional callback triggered when the toast begins to close.
|
|
52
|
+
* @param toast The toast that is closing.
|
|
53
|
+
*/
|
|
54
|
+
onClose?: (toast: Toast) => void;
|
|
55
|
+
/**
|
|
56
|
+
* Optional callback triggered when the toast has been fully removed.
|
|
57
|
+
* @param toast The removed toast instance.
|
|
58
|
+
*/
|
|
59
|
+
onRemoved?: (toast: Toast) => void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Represents a fully instantiated toast, including unique ID and current state.
|
|
63
|
+
*/
|
|
64
|
+
export interface Toast extends ToastOptions {
|
|
65
|
+
/**
|
|
66
|
+
* Unique identifier for the toast instance.
|
|
67
|
+
*/
|
|
68
|
+
id: number;
|
|
69
|
+
/**
|
|
70
|
+
* The current state of the toast (open, closing, or closed).
|
|
71
|
+
*/
|
|
72
|
+
state: ToastState;
|
|
73
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Toast } from './models/toast.model';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Displays toast notifications provided by the ToastService.
|
|
5
|
+
*
|
|
6
|
+
* Toasts are non-blocking messages that automatically disappear after a set duration
|
|
7
|
+
* or can be dismissed manually by the user.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ToastComponent {
|
|
10
|
+
private readonly toastService;
|
|
11
|
+
/**
|
|
12
|
+
* A reactive signal of all currently active toasts (open or closing).
|
|
13
|
+
*/
|
|
14
|
+
readonly toastsSignal: import("@angular/core").Signal<Toast[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Initiates the closing process for the given toast.
|
|
17
|
+
*
|
|
18
|
+
* @param toast The toast to be closed.
|
|
19
|
+
* @returns void
|
|
20
|
+
*/
|
|
21
|
+
closeToast: (toast: Toast) => void;
|
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ToastComponent, never>;
|
|
23
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ToastComponent, "tds-ext-toast", never, {}, {}, never, never, true, never>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { ToastType } from './models/toast-type';
|
|
3
|
+
/**
|
|
4
|
+
* Global default configuration for toast behavior.
|
|
5
|
+
* Used when individual toast properties are not explicitly set.
|
|
6
|
+
*/
|
|
7
|
+
export interface ToastConfig {
|
|
8
|
+
/**
|
|
9
|
+
* Default toast type (e.g., 'success', 'information', etc.).
|
|
10
|
+
*/
|
|
11
|
+
type: ToastType;
|
|
12
|
+
/**
|
|
13
|
+
* Default title to use when none is provided.
|
|
14
|
+
*/
|
|
15
|
+
title: string;
|
|
16
|
+
/**
|
|
17
|
+
* Default description to use when none is provided.
|
|
18
|
+
*/
|
|
19
|
+
description: string;
|
|
20
|
+
/**
|
|
21
|
+
* Default duration (ms) before auto-dismiss.
|
|
22
|
+
* Use `0` for persistent toasts.
|
|
23
|
+
*/
|
|
24
|
+
duration: number;
|
|
25
|
+
/**
|
|
26
|
+
* Default duration (ms) for the fade-out animation.
|
|
27
|
+
*/
|
|
28
|
+
closeDuration: number;
|
|
29
|
+
/**
|
|
30
|
+
* Whether toasts are closable by default.
|
|
31
|
+
*/
|
|
32
|
+
closable: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare const TOAST_CONFIG: InjectionToken<ToastConfig>;
|
|
35
|
+
export declare const DEFAULT_TOAST_CONFIG: Required<ToastConfig>;
|